diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
index 1add18cb12fb..579097f1d871 100644
--- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
+++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
@@ -35,4 +35,18 @@ public interface ProjectBuilderSource
InputStream getInputStream() throws IOException;
String getLocation();
+
+ /**
+ * Returns a new source identified by a relative path. Implementation MUST
+ * be able to accept relPath parameter values that
+ *
null if no such source.
+ */
+ ProjectBuilderSource resolve( String relative );
}
diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
index d9911c20148d..2fed6e25b4b4 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
@@ -24,6 +24,7 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.nio.file.Path;
import java.util.Collection;
import java.util.List;
@@ -46,7 +47,7 @@
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.building.ModelProblem;
-import org.apache.maven.model.building.ModelSource;
+import org.apache.maven.model.building.ModelSource2;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ProjectBuildingRequest;
@@ -88,20 +89,7 @@ public ProjectBuilderResult build( ProjectBuilderRequest request )
else if ( request.getSource().isPresent() )
{
ProjectBuilderSource source = request.getSource().get();
- ModelSource modelSource = new ModelSource()
- {
- @Override
- public InputStream getInputStream() throws IOException
- {
- return source.getInputStream();
- }
-
- @Override
- public String getLocation()
- {
- return source.getLocation();
- }
- };
+ ModelSource2 modelSource = new ProjectBuilderSourceWrapper( source );
res = builder.build( modelSource, req );
}
else if ( request.getArtifact().isPresent() )
@@ -264,4 +252,39 @@ public Node getRoot()
throw new ProjectBuilderException( "Unable to build project", e );
}
}
+
+ private static class ProjectBuilderSourceWrapper implements ModelSource2
+ {
+ private final ProjectBuilderSource source;
+
+ ProjectBuilderSourceWrapper( ProjectBuilderSource source )
+ {
+ this.source = source;
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException
+ {
+ return source.getInputStream();
+ }
+
+ @Override
+ public String getLocation()
+ {
+ return source.getLocation();
+ }
+
+ @Override
+ public ModelSource2 getRelatedSource( String relPath )
+ {
+ ProjectBuilderSource rel = source.resolve( relPath );
+ return rel != null ? new ProjectBuilderSourceWrapper( rel ) : null;
+ }
+
+ @Override
+ public URI getLocationURI()
+ {
+ return null;
+ }
+ }
}
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index 7fe5a23b1314..860b7440d4a4 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -19,6 +19,10 @@
* under the License.
*/
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
import java.io.File;
import java.io.IOException;
import java.util.AbstractMap;
@@ -32,12 +36,12 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.ForkJoinTask;
import java.util.stream.Collectors;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
+import org.apache.maven.ProjectCycleException;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidArtifactRTException;
@@ -56,7 +60,6 @@
import org.apache.maven.model.Profile;
import org.apache.maven.model.ReportPlugin;
import org.apache.maven.model.building.ArtifactModelSource;
-import org.apache.maven.model.building.TransformerContextBuilder;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.DefaultModelProblem;
import org.apache.maven.model.building.FileModelSource;
@@ -69,11 +72,13 @@
import org.apache.maven.model.building.ModelSource;
import org.apache.maven.model.building.StringModelSource;
import org.apache.maven.model.building.TransformerContext;
+import org.apache.maven.model.building.TransformerContextBuilder;
import org.apache.maven.model.resolution.ModelResolver;
import org.apache.maven.repository.internal.ArtifactDescriptorUtils;
import org.apache.maven.repository.internal.ModelCacheFactory;
import org.codehaus.plexus.util.Os;
import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.dag.CycleDetectedException;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RequestTrace;
@@ -94,6 +99,8 @@
public class DefaultProjectBuilder
implements ProjectBuilder
{
+ private static final String BUILDER_PARALLELISM = "maven.projectBuilder.parallelism";
+
private final Logger logger = LoggerFactory.getLogger( getClass() );
private final ModelBuilder modelBuilder;
private final ModelProcessor modelProcessor;
@@ -133,488 +140,471 @@ public DefaultProjectBuilder(
public ProjectBuildingResult build( File pomFile, ProjectBuildingRequest request )
throws ProjectBuildingException
{
- return build( pomFile, new FileModelSource( pomFile ),
- new InternalConfig( request, null, null ) );
+ return new BuildSession( request, false ).build( pomFile, new FileModelSource( pomFile ) );
}
@Override
public ProjectBuildingResult build( ModelSource modelSource, ProjectBuildingRequest request )
throws ProjectBuildingException
{
- return build( null, modelSource,
- new InternalConfig( request, null, null ) );
+ return new BuildSession( request, false ).build( null, modelSource );
}
- private ProjectBuildingResult build( File pomFile, ModelSource modelSource, InternalConfig config )
+ @Override
+ public ProjectBuildingResult build( Artifact artifact, ProjectBuildingRequest request )
throws ProjectBuildingException
{
- ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
-
- try
- {
- ProjectBuildingRequest projectBuildingRequest = config.request;
-
- MavenProject project = projectBuildingRequest.getProject();
-
- List
@@ -46,19 +46,20 @@ class ParentXMLFilter
extends NodeBufferingParser
{
- private final Function