From 89cc1bbf33ba31fc5dc68074985c7bb87a7c1155 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 2 Dec 2021 14:45:17 +0100 Subject: [PATCH] [MNG-7350] Introduce a factory for ModelCache --- .../maven/project/DefaultProjectBuilder.java | 24 +++++++---- .../AbstractCoreMavenComponentTestCase.java | 4 +- .../DefaultArtifactDescriptorReader.java | 16 +++++++- .../internal/DefaultModelCacheFactory.java | 41 +++++++++++++++++++ .../internal/MavenAetherModule.java | 2 + .../internal/MavenRepositorySystemUtils.java | 1 + .../internal/MavenResolverModule.java | 1 + .../internal/ModelCacheFactory.java | 33 +++++++++++++++ 8 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCacheFactory.java create mode 100644 maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ModelCacheFactory.java 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 179b8f974180..73274993182b 100644 --- a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java +++ b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java @@ -145,6 +145,8 @@ protected MavenSession createMavenSession( File pom, Properties executionPropert .setPluginArtifactRepositories( request.getPluginArtifactRepositories() ) .setSystemProperties( executionProperties ); + initRepoSession( configuration ); + List projects = new ArrayList<>(); if ( pom != null ) @@ -173,8 +175,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 888f4581b460..878ab1f78a45 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 @@ -93,6 +93,8 @@ public class DefaultArtifactDescriptorReader private ModelBuilder modelBuilder; + private ModelCacheFactory modelCacheFactory; + public DefaultArtifactDescriptorReader() { // enable no-arg constructor @@ -101,7 +103,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 ); @@ -109,6 +112,7 @@ public DefaultArtifactDescriptorReader() setArtifactResolver( artifactResolver ); setModelBuilder( modelBuilder ); setRepositoryEventDispatcher( repositoryEventDispatcher ); + setModelCacheFactory( modelCacheFactory ); } public void initService( ServiceLocator locator ) @@ -123,6 +127,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 ) @@ -166,6 +171,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 @@ -280,7 +292,7 @@ private Model loadPom( RepositorySystemSession session, ArtifactDescriptorReques modelRequest.setTwoPhaseBuilding( false ); modelRequest.setSystemProperties( toProperties( session.getUserProperties(), session.getSystemProperties() ) ); - 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 ); + +}