Skip to content

Commit 08e74c8

Browse files
committed
Move Features into the api and add a feature to be able to disable XInclude support
1 parent 5d38a70 commit 08e74c8

File tree

17 files changed

+191
-112
lines changed

17 files changed

+191
-112
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.maven.api.feature;
20+
21+
import java.util.Map;
22+
import java.util.Objects;
23+
import java.util.Properties;
24+
25+
import org.apache.maven.api.Session;
26+
import org.apache.maven.api.annotations.Nonnull;
27+
28+
/**
29+
* Centralized class for feature information
30+
*
31+
* @since 4.0.0
32+
*/
33+
public final class Features {
34+
35+
public static final String BUILDCONSUMER = "maven.experimental.buildconsumer";
36+
37+
public static final String XINCLUDE = "maven.experimental.xinclude";
38+
39+
public static final String TRUE = "true";
40+
41+
private Features() {}
42+
43+
@Nonnull
44+
public static boolean buildConsumer(@Nonnull Properties userProperties) {
45+
return TRUE.equals(Objects.requireNonNull(userProperties).getOrDefault(BUILDCONSUMER, TRUE));
46+
}
47+
48+
@Nonnull
49+
public static boolean buildConsumer(@Nonnull Map<String, String> userProperties) {
50+
return TRUE.equals(Objects.requireNonNull(userProperties).getOrDefault(BUILDCONSUMER, TRUE));
51+
}
52+
53+
@Nonnull
54+
public static boolean buildConsumer(@Nonnull Session session) {
55+
return buildConsumer(Objects.requireNonNull(session).getUserProperties());
56+
}
57+
58+
@Nonnull
59+
public static boolean xinclude(@Nonnull Properties userProperties) {
60+
return TRUE.equals(Objects.requireNonNull(userProperties).getOrDefault(XINCLUDE, TRUE));
61+
}
62+
63+
@Nonnull
64+
public static boolean xinclude(@Nonnull Map<String, String> userProperties) {
65+
return TRUE.equals(Objects.requireNonNull(userProperties).getOrDefault(XINCLUDE, TRUE));
66+
}
67+
68+
@Nonnull
69+
public static boolean xinclude(@Nonnull Session session) {
70+
return xinclude(Objects.requireNonNull(session).getUserProperties());
71+
}
72+
}

maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,18 @@
3535
import org.apache.maven.artifact.repository.ArtifactRepository;
3636
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
3737
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
38+
import org.apache.maven.bridge.MavenRepositorySystem;
3839
import org.apache.maven.execution.DefaultMavenExecutionRequest;
3940
import org.apache.maven.execution.DefaultMavenExecutionResult;
4041
import org.apache.maven.execution.MavenSession;
42+
import org.apache.maven.internal.impl.DefaultSessionFactory;
4143
import org.apache.maven.plugin.LegacySupport;
4244
import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
45+
import org.apache.maven.rtinfo.RuntimeInformation;
4346
import org.codehaus.plexus.PlexusContainer;
4447
import org.codehaus.plexus.testing.PlexusTest;
4548
import org.eclipse.aether.DefaultRepositorySystemSession;
49+
import org.eclipse.aether.RepositorySystem;
4650
import org.eclipse.aether.RepositorySystemSession;
4751
import org.eclipse.aether.collection.DependencyGraphTransformer;
4852
import org.eclipse.aether.collection.DependencyManager;
@@ -101,6 +105,12 @@ public void setUp() throws Exception {
101105
RepositorySystemSession repoSession = initRepoSession();
102106
MavenSession session = new MavenSession(
103107
getContainer(), repoSession, new DefaultMavenExecutionRequest(), new DefaultMavenExecutionResult());
108+
new DefaultSessionFactory(
109+
getContainer().lookup(RepositorySystem.class),
110+
getContainer().lookup(MavenRepositorySystem.class),
111+
getContainer(),
112+
getContainer().lookup(RuntimeInformation.class))
113+
.getSession(session);
104114

105115
legacySupport.setSession(session);
106116
}

maven-compat/src/test/java/org/apache/maven/artifact/installer/ArtifactInstallerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ protected String component() {
4949
void testArtifactInstallation() throws Exception {
5050
sessionScope.enter();
5151
try {
52-
sessionScope.seed(MavenSession.class, mock(MavenSession.class));
52+
MavenSession mavenSession = mock(MavenSession.class);
53+
sessionScope.seed(MavenSession.class, mavenSession);
5354

5455
String artifactBasedir = new File(getBasedir(), "src/test/resources/artifact-install").getAbsolutePath();
5556

maven-core/src/main/java/org/apache/maven/internal/aether/MavenDeployer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import javax.inject.Named;
2323
import javax.inject.Singleton;
2424

25+
import org.apache.maven.api.Session;
26+
import org.apache.maven.internal.impl.DefaultSession;
2527
import org.apache.maven.internal.transformation.ConsumerPomArtifactTransformer;
2628
import org.eclipse.aether.RepositorySystemSession;
2729
import org.eclipse.aether.deployment.DeployRequest;
@@ -53,6 +55,7 @@ final class MavenDeployer implements Deployer {
5355

5456
@Override
5557
public DeployResult deploy(RepositorySystemSession session, DeployRequest request) throws DeploymentException {
56-
return deployer.deploy(session, consumerPomArtifactTransformer.remapDeployArtifacts(session, request));
58+
Session s = (Session) session.getData().get(DefaultSession.class);
59+
return deployer.deploy(session, consumerPomArtifactTransformer.remapDeployArtifacts(s, request));
5760
}
5861
}

maven-core/src/main/java/org/apache/maven/internal/aether/MavenInstaller.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import javax.inject.Named;
2323
import javax.inject.Singleton;
2424

25+
import org.apache.maven.api.Session;
26+
import org.apache.maven.internal.impl.DefaultSession;
2527
import org.apache.maven.internal.transformation.ConsumerPomArtifactTransformer;
2628
import org.eclipse.aether.RepositorySystemSession;
2729
import org.eclipse.aether.impl.Installer;
@@ -53,6 +55,7 @@ final class MavenInstaller implements Installer {
5355

5456
@Override
5557
public InstallResult install(RepositorySystemSession session, InstallRequest request) throws InstallationException {
56-
return installer.install(session, consumerPomArtifactTransformer.remapInstallArtifacts(session, request));
58+
Session s = (Session) session.getData().get(DefaultSession.class);
59+
return installer.install(session, consumerPomArtifactTransformer.remapInstallArtifacts(s, request));
5760
}
5861
}

maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
import java.util.function.BiConsumer;
4141

4242
import com.ctc.wstx.api.WstxInputProperties;
43-
import org.apache.maven.feature.Features;
43+
import org.apache.maven.api.Session;
44+
import org.apache.maven.api.feature.Features;
4445
import org.apache.maven.model.building.DefaultBuildPomXMLFilterFactory;
4546
import org.apache.maven.model.building.TransformerContext;
4647
import org.apache.maven.model.io.LocalXmlResolver;
@@ -51,7 +52,6 @@
5152
import org.apache.maven.stax.xinclude.XIncludeStreamReader;
5253
import org.codehaus.stax2.XMLInputFactory2;
5354
import org.codehaus.stax2.io.Stax2FileSource;
54-
import org.eclipse.aether.RepositorySystemSession;
5555
import org.eclipse.aether.artifact.Artifact;
5656
import org.eclipse.aether.artifact.DefaultArtifact;
5757
import org.eclipse.aether.deployment.DeployRequest;
@@ -70,7 +70,7 @@ public final class ConsumerPomArtifactTransformer {
7070

7171
private final Set<Path> toDelete = new CopyOnWriteArraySet<>();
7272

73-
public void injectTransformedArtifacts(MavenProject project, RepositorySystemSession session) throws IOException {
73+
public void injectTransformedArtifacts(MavenProject project, Session session) throws IOException {
7474
if (project.getFile() == null) {
7575
// If there is no build POM there is no reason to inject artifacts for the consumer POM.
7676
return;
@@ -109,22 +109,22 @@ private void doDeleteFiles() {
109109
}
110110
}
111111

112-
public InstallRequest remapInstallArtifacts(RepositorySystemSession session, InstallRequest request) {
112+
public InstallRequest remapInstallArtifacts(Session session, InstallRequest request) {
113113
if (isActive(session) && consumerPomPresent(request.getArtifacts())) {
114114
request.setArtifacts(replacePom(request.getArtifacts()));
115115
}
116116
return request;
117117
}
118118

119-
public DeployRequest remapDeployArtifacts(RepositorySystemSession session, DeployRequest request) {
119+
public DeployRequest remapDeployArtifacts(Session session, DeployRequest request) {
120120
if (isActive(session) && consumerPomPresent(request.getArtifacts())) {
121121
request.setArtifacts(replacePom(request.getArtifacts()));
122122
}
123123
return request;
124124
}
125125

126-
private boolean isActive(RepositorySystemSession session) {
127-
return Features.buildConsumer(session.getUserProperties()).isActive();
126+
private boolean isActive(Session session) {
127+
return Features.buildConsumer(session.getUserProperties());
128128
}
129129

130130
private boolean consumerPomPresent(Collection<Artifact> artifacts) {
@@ -163,7 +163,7 @@ private Collection<Artifact> replacePom(Collection<Artifact> artifacts) {
163163
*/
164164
private static class ConsumerPomArtifact extends TransformedArtifact {
165165

166-
private ConsumerPomArtifact(MavenProject mavenProject, Path target, RepositorySystemSession session) {
166+
private ConsumerPomArtifact(MavenProject mavenProject, Path target, Session session) {
167167
super(
168168
new ProjectArtifact(mavenProject),
169169
() -> mavenProject.getFile().toPath(),
@@ -181,10 +181,10 @@ static Path getRootDirectory(MavenProject project) {
181181
}
182182
}
183183

184-
private static BiConsumer<Path, Path> transformer(Path rootDirectory, RepositorySystemSession session) {
184+
private static BiConsumer<Path, Path> transformer(Path rootDirectory, Session session) {
185185
TransformerContext context = (TransformerContext) session.getData().get(TransformerContext.KEY);
186186
return (src, dest) -> {
187-
try (InputStream inputStream = transform(rootDirectory, src, context)) {
187+
try (InputStream inputStream = transform(rootDirectory, src, context, Features.xinclude(session))) {
188188
Files.createDirectories(dest.getParent());
189189
Files.copy(inputStream, dest, StandardCopyOption.REPLACE_EXISTING);
190190
} catch (XMLStreamException | IOException e) {
@@ -197,19 +197,23 @@ private static BiConsumer<Path, Path> transformer(Path rootDirectory, Repository
197197
/**
198198
* The actual transformation: visible for testing.
199199
*/
200-
static InputStream transform(Path rootDirectory, Path pomFile, TransformerContext context)
200+
static InputStream transform(Path rootDirectory, Path pomFile, TransformerContext context, boolean xinclude)
201201
throws IOException, XMLStreamException {
202202
XMLInputFactory2 factory = new com.ctc.wstx.stax.WstxInputFactory();
203203
factory.configureForRoundTripping();
204-
factory.setProperty(WstxInputProperties.P_TREAT_CHAR_REFS_AS_ENTS, false);
205-
factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, true);
206-
factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, true);
207-
factory.setProperty(WstxInputProperties.P_ENTITY_RESOLVER, new LocalXmlResolver(rootDirectory));
204+
if (xinclude) {
205+
factory.setProperty(WstxInputProperties.P_TREAT_CHAR_REFS_AS_ENTS, false);
206+
factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, true);
207+
factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, true);
208+
factory.setProperty(WstxInputProperties.P_ENTITY_RESOLVER, new LocalXmlResolver(rootDirectory));
209+
}
208210
Source source = new Stax2FileSource(pomFile.toFile());
209211
XMLStreamReader reader = factory.createXMLStreamReader(source);
210212
XMLOutputFactory outputFactory = new com.ctc.wstx.stax.WstxOutputFactory();
211-
reader =
212-
new XIncludeStreamReader(factory, outputFactory, pomFile.toUri().toString(), reader);
213+
if (xinclude) {
214+
reader = new XIncludeStreamReader(
215+
factory, outputFactory, pomFile.toUri().toString(), reader);
216+
}
213217
reader = new RawToConsumerPomXMLFilterFactory(new DefaultBuildPomXMLFilterFactory(context, true))
214218
.get(reader, pomFile);
215219
return XmlUtils.writeDocument(reader);

maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public void buildProject(
9797
return;
9898
}
9999

100-
consumerPomArtifactTransformer.injectTransformedArtifacts(currentProject, session.getRepositorySession());
100+
consumerPomArtifactTransformer.injectTransformedArtifacts(currentProject, session.getSession());
101101

102102
BuilderCommon.attachToThread(currentProject);
103103

maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,13 @@
3838
import java.util.stream.Collectors;
3939

4040
import org.apache.maven.RepositoryUtils;
41+
import org.apache.maven.api.feature.Features;
4142
import org.apache.maven.artifact.Artifact;
4243
import org.apache.maven.artifact.InvalidArtifactRTException;
4344
import org.apache.maven.artifact.InvalidRepositoryException;
4445
import org.apache.maven.artifact.repository.ArtifactRepository;
4546
import org.apache.maven.bridge.MavenRepositorySystem;
46-
import org.apache.maven.feature.Features;
47+
import org.apache.maven.internal.impl.DefaultSession;
4748
import org.apache.maven.model.Build;
4849
import org.apache.maven.model.Dependency;
4950
import org.apache.maven.model.DependencyManagement;
@@ -277,6 +278,14 @@ private ModelBuildingRequest getModelBuildingRequest(InternalConfig config) {
277278
request.setModelCache(modelCacheFactory.createCache(config.session));
278279
}
279280
request.setTransformerContextBuilder(config.transformerContextBuilder);
281+
DefaultSession session = (DefaultSession) config.session.getData().get(DefaultSession.class);
282+
if (session != null) {
283+
try {
284+
request.setRootDirectory(session.getRootDirectory());
285+
} catch (IllegalStateException e) {
286+
// can happen if root directory can not be found, just ignore
287+
}
288+
}
280289

281290
return request;
282291
}
@@ -390,7 +399,7 @@ public List<ProjectBuildingResult> build(List<File> pomFiles, boolean recursive,
390399
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
391400
}
392401

393-
if (Features.buildConsumer(request.getUserProperties()).isActive()) {
402+
if (Features.buildConsumer(request.getUserProperties())) {
394403
request.getRepositorySession()
395404
.getData()
396405
.set(TransformerContext.KEY, config.transformerContextBuilder.build());

maven-core/src/test/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformerTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
import java.nio.file.Path;
2525
import java.nio.file.Paths;
2626

27+
import org.apache.maven.api.Session;
28+
import org.apache.maven.api.SessionData;
2729
import org.apache.maven.model.Model;
2830
import org.apache.maven.model.building.TransformerContext;
2931
import org.apache.maven.project.MavenProject;
30-
import org.eclipse.aether.RepositorySystemSession;
31-
import org.eclipse.aether.SessionData;
3232
import org.junit.jupiter.api.Test;
3333
import org.mockito.Mockito;
3434
import org.xmlunit.assertj.XmlAssert;
@@ -47,7 +47,7 @@ void transform() throws Exception {
4747

4848
try (InputStream expected = Files.newInputStream(afterPomFile);
4949
InputStream result = ConsumerPomArtifactTransformer.transform(
50-
Paths.get("."), beforePomFile, new NoTransformerContext())) {
50+
Paths.get("."), beforePomFile, new NoTransformerContext(), true)) {
5151
XmlAssert.assertThat(result).and(expected).areIdentical();
5252
}
5353
}
@@ -56,12 +56,12 @@ void transform() throws Exception {
5656
void injectTransformedArtifactsWithoutPomShouldNotInjectAnyArtifacts() throws IOException {
5757
MavenProject emptyProject = new MavenProject();
5858

59-
RepositorySystemSession systemSessionMock = Mockito.mock(RepositorySystemSession.class);
59+
Session sessionMock = Mockito.mock(Session.class);
6060
SessionData sessionDataMock = Mockito.mock(SessionData.class);
61-
when(systemSessionMock.getData()).thenReturn(sessionDataMock);
61+
when(sessionMock.getData()).thenReturn(sessionDataMock);
6262
when(sessionDataMock.get(any())).thenReturn(new NoTransformerContext());
6363

64-
new ConsumerPomArtifactTransformer().injectTransformedArtifacts(emptyProject, systemSessionMock);
64+
new ConsumerPomArtifactTransformer().injectTransformedArtifacts(emptyProject, sessionMock);
6565

6666
assertThat(emptyProject.getAttachedArtifacts()).isEmpty();
6767
}

maven-model-builder/pom.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ under the License.
3232
<description>The effective model builder, with inheritance, profile activation, interpolation, ...</description>
3333

3434
<dependencies>
35+
<dependency>
36+
<groupId>org.apache.maven</groupId>
37+
<artifactId>maven-api-core</artifactId>
38+
</dependency>
3539
<dependency>
3640
<groupId>org.apache.maven</groupId>
3741
<artifactId>maven-xml-impl</artifactId>
38-
<version>4.0.0-alpha-8-SNAPSHOT</version>
3942
</dependency>
4043
<dependency>
4144
<groupId>org.codehaus.plexus</groupId>

0 commit comments

Comments
 (0)