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 7e18f1ef3ce2..616dad121892 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 @@ -56,12 +56,14 @@ import org.apache.maven.model.building.ModelBuildingException; import org.apache.maven.model.building.ModelBuildingRequest; import org.apache.maven.model.building.ModelBuildingResult; +import org.apache.maven.model.building.ModelCache; import org.apache.maven.model.building.ModelProblem; import org.apache.maven.model.building.ModelProcessor; import org.apache.maven.model.building.ModelSource; import org.apache.maven.model.building.StringModelSource; 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.component.annotations.Component; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; @@ -111,7 +113,8 @@ public class DefaultProjectBuilder @Requirement private ProjectDependenciesResolver dependencyResolver; - private final ReactorModelCache modelCache = new ReactorModelCache(); + @Requirement + private ModelCacheFactory modelCacheFactory; // ---------------------------------------------------------------------- // MavenProjectBuilder Implementation @@ -122,7 +125,8 @@ public ProjectBuildingResult build( File pomFile, ProjectBuildingRequest request throws ProjectBuildingException { return build( pomFile, new FileModelSource( pomFile ), - new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null ) ); + new InternalConfig( request, null, + useGlobalModelCache() ? createModelCache( request.getRepositorySession() ) : null ) ); } private boolean useGlobalModelCache() @@ -135,7 +139,8 @@ public ProjectBuildingResult build( ModelSource modelSource, ProjectBuildingRequ throws ProjectBuildingException { return build( null, modelSource, - new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null ) ); + new InternalConfig( request, null, + useGlobalModelCache() ? createModelCache( request.getRepositorySession() ) : null ) ); } private ProjectBuildingResult build( File pomFile, ModelSource modelSource, InternalConfig config ) @@ -306,7 +311,8 @@ public ProjectBuildingResult build( Artifact artifact, boolean allowStubModel, P org.eclipse.aether.artifact.Artifact pomArtifact = RepositoryUtils.toArtifact( artifact ); pomArtifact = ArtifactDescriptorUtils.toPomArtifact( pomArtifact ); - InternalConfig config = new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null ); + InternalConfig config = new InternalConfig( request, null, + useGlobalModelCache() ? createModelCache( request.getRepositorySession() ) : null ); boolean localProject; @@ -369,7 +375,7 @@ public List build( List pomFiles, boolean recursive ReactorModelPool modelPool = new ReactorModelPool(); InternalConfig config = new InternalConfig( request, modelPool, - useGlobalModelCache() ? getModelCache() : new ReactorModelCache() ); + useGlobalModelCache() ? createModelCache( request.getRepositorySession() ) : new ReactorModelCache() ); Map projectIndex = new HashMap<>( 256 ); @@ -1058,9 +1064,9 @@ class InternalConfig private final ReactorModelPool modelPool; - private final ReactorModelCache modelCache; + private final ModelCache modelCache; - InternalConfig( ProjectBuildingRequest request, ReactorModelPool modelPool, ReactorModelCache modelCache ) + InternalConfig( ProjectBuildingRequest request, ReactorModelPool modelPool, ModelCache modelCache ) { this.request = request; this.modelPool = modelPool; @@ -1073,9 +1079,9 @@ class InternalConfig } - private ReactorModelCache getModelCache() + private ModelCache createModelCache( RepositorySystemSession session ) { - return this.modelCache; + return modelCacheFactory.createCache( session ); } } diff --git a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java index 2feeae1a1291..db7a17f8ec63 100644 --- a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java +++ b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java @@ -146,6 +146,8 @@ protected MavenSession createMavenSession( File pom, Properties executionPropert .setSystemProperties( executionProperties ) .setUserProperties( new Properties() ); + initRepoSession( configuration ); + List projects = new ArrayList<>(); if ( pom != null ) @@ -174,8 +176,6 @@ protected MavenSession createMavenSession( File pom, Properties executionPropert projects.add( project ); } - initRepoSession( configuration ); - MavenSession session = new MavenSession( getContainer(), configuration.getRepositorySession(), request, new DefaultMavenExecutionResult() ); diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java index 8d57b6086790..9e56b03b7c60 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java @@ -89,6 +89,8 @@ public class DefaultArtifactDescriptorReader private ModelBuilder modelBuilder; + private ModelCacheFactory modelCacheFactory; + public DefaultArtifactDescriptorReader() { // enable no-arg constructor @@ -97,7 +99,8 @@ public DefaultArtifactDescriptorReader() @Inject DefaultArtifactDescriptorReader( RemoteRepositoryManager remoteRepositoryManager, VersionResolver versionResolver, VersionRangeResolver versionRangeResolver, ArtifactResolver artifactResolver, - ModelBuilder modelBuilder, RepositoryEventDispatcher repositoryEventDispatcher ) + ModelBuilder modelBuilder, RepositoryEventDispatcher repositoryEventDispatcher, + ModelCacheFactory modelCacheFactory ) { setRemoteRepositoryManager( remoteRepositoryManager ); setVersionResolver( versionResolver ); @@ -105,6 +108,7 @@ public DefaultArtifactDescriptorReader() setArtifactResolver( artifactResolver ); setModelBuilder( modelBuilder ); setRepositoryEventDispatcher( repositoryEventDispatcher ); + setModelCacheFactory( modelCacheFactory ); } public void initService( ServiceLocator locator ) @@ -119,6 +123,7 @@ public void initService( ServiceLocator locator ) setModelBuilder( new DefaultModelBuilderFactory().newInstance() ); } setRepositoryEventDispatcher( locator.getService( RepositoryEventDispatcher.class ) ); + setModelCacheFactory( locator.getService( ModelCacheFactory.class ) ); } public DefaultArtifactDescriptorReader setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager ) @@ -162,6 +167,13 @@ public DefaultArtifactDescriptorReader setModelBuilder( ModelBuilder modelBuilde return this; } + public DefaultArtifactDescriptorReader setModelCacheFactory( ModelCacheFactory modelCacheFactory ) + { + this.modelCacheFactory = Objects.requireNonNull( modelCacheFactory, + "modelCacheFactory cannot be null" ); + return this; + } + public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session, ArtifactDescriptorRequest request ) throws ArtifactDescriptorException @@ -276,7 +288,7 @@ private Model loadPom( RepositorySystemSession session, ArtifactDescriptorReques modelRequest.setTwoPhaseBuilding( false ); modelRequest.setSystemProperties( toProperties( session.getSystemProperties() ) ); modelRequest.setUserProperties( toProperties( session.getUserProperties() ) ); - modelRequest.setModelCache( DefaultModelCache.newInstance( session ) ); + modelRequest.setModelCache( modelCacheFactory.createCache( session ) ); modelRequest.setModelResolver( new DefaultModelResolver( session, trace.newChild( modelRequest ), request.getRequestContext(), artifactResolver, versionRangeResolver, remoteRepositoryManager, diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCacheFactory.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCacheFactory.java new file mode 100644 index 000000000000..785a4e023582 --- /dev/null +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCacheFactory.java @@ -0,0 +1,41 @@ +package org.apache.maven.repository.internal; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import javax.inject.Named; +import javax.inject.Singleton; + +import org.apache.maven.model.building.ModelCache; +import org.eclipse.aether.RepositorySystemSession; + +/** + * Default implementation of {@link ModelCacheFactory}. + */ +@Singleton +@Named +public class DefaultModelCacheFactory implements ModelCacheFactory +{ + @Override + public ModelCache createCache( RepositorySystemSession session ) + { + return DefaultModelCache.newInstance( session ); + } + +} diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenAetherModule.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenAetherModule.java index 41e98aaea8ae..10b322cfa572 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenAetherModule.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenAetherModule.java @@ -62,6 +62,8 @@ protected void configure() .to( VersionsMetadataGeneratorFactory.class ).in( Singleton.class ); bind( ModelBuilder.class ) // .toInstance( new DefaultModelBuilderFactory().newInstance() ); + bind( ModelCacheFactory.class ) + .to( DefaultModelCacheFactory.class ).in( Singleton.class ); } @Provides diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java index 97035b3cc821..5e28b5913156 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java @@ -77,6 +77,7 @@ public static DefaultServiceLocator newServiceLocator() locator.addService( VersionRangeResolver.class, DefaultVersionRangeResolver.class ); locator.addService( MetadataGeneratorFactory.class, SnapshotMetadataGeneratorFactory.class ); locator.addService( MetadataGeneratorFactory.class, VersionsMetadataGeneratorFactory.class ); + locator.addService( ModelCacheFactory.class, DefaultModelCacheFactory.class ); return locator; } diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenResolverModule.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenResolverModule.java index 1e49bfce3586..c7120c99a46d 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenResolverModule.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenResolverModule.java @@ -56,6 +56,7 @@ protected void configure() .to( VersionsMetadataGeneratorFactory.class ).in( Singleton.class ); bind( ModelBuilder.class ).toInstance( new DefaultModelBuilderFactory().newInstance() ); + bind( ModelCacheFactory.class ).to( DefaultModelCacheFactory.class ).in( Singleton.class ); } @Provides diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ModelCacheFactory.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ModelCacheFactory.java new file mode 100644 index 000000000000..0e4299042ed2 --- /dev/null +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ModelCacheFactory.java @@ -0,0 +1,33 @@ +package org.apache.maven.repository.internal; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.model.building.ModelCache; +import org.eclipse.aether.RepositorySystemSession; + +/** + * Factory for {@link ModelCache} objects. + */ +public interface ModelCacheFactory +{ + + ModelCache createCache( RepositorySystemSession session ); + +}