From 9c510d8356fe029ee14c06c0ca5b06bd2b3aff4a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 20 Feb 2021 21:00:12 +0100 Subject: [PATCH] Make VersionScheme a component Instead to ad-hoc create the instance as needed, it is thread safe, so is fine to have it shared across whole system. Moreover, touched class got converted from ancient plexus-field-like injection to proper immutable components, something we really need start doing --- .../DefaultPluginVersionResolver.java | 30 ++++--- .../internal/DefaultRuntimeInformation.java | 83 ++++++++++--------- .../internal/DefaultVersionRangeResolver.java | 8 +- .../internal/MavenResolverModule.java | 3 + .../internal/VersionSchemeProvider.java | 49 +++++++++++ 5 files changed, 123 insertions(+), 50 deletions(-) create mode 100644 maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/VersionSchemeProvider.java diff --git a/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java b/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java index 17186dde6a3e..5d0a3bae9117 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.TreeSet; import javax.inject.Inject; @@ -56,7 +57,6 @@ import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.resolution.MetadataRequest; import org.eclipse.aether.resolution.MetadataResult; -import org.eclipse.aether.util.version.GenericVersionScheme; import org.eclipse.aether.version.InvalidVersionSpecificationException; import org.eclipse.aether.version.Version; import org.eclipse.aether.version.VersionScheme; @@ -75,17 +75,29 @@ public class DefaultPluginVersionResolver private static final String REPOSITORY_CONTEXT = "plugin"; - @Inject - private Logger logger; + private final Logger logger; - @Inject - private RepositorySystem repositorySystem; + private final RepositorySystem repositorySystem; - @Inject - private MetadataReader metadataReader; + private final MetadataReader metadataReader; + + private final MavenPluginManager pluginManager; + + private final VersionScheme versionScheme; @Inject - private MavenPluginManager pluginManager; + public DefaultPluginVersionResolver( final Logger logger, + final RepositorySystem repositorySystem, + final MetadataReader metadataReader, + final MavenPluginManager pluginManager, + final VersionScheme versionScheme ) + { + this.logger = Objects.requireNonNull( logger ); + this.repositorySystem = Objects.requireNonNull( repositorySystem ); + this.metadataReader = Objects.requireNonNull( metadataReader ); + this.pluginManager = Objects.requireNonNull( pluginManager ); + this.versionScheme = Objects.requireNonNull( versionScheme ); + } public PluginVersionResult resolve( PluginVersionRequest request ) throws PluginVersionResolutionException @@ -175,8 +187,6 @@ else if ( StringUtils.isNotEmpty( versions.latestVersion ) ) if ( version == null ) { - VersionScheme versionScheme = new GenericVersionScheme(); - TreeSet releases = new TreeSet<>( Collections.reverseOrder() ); TreeSet snapshots = new TreeSet<>( Collections.reverseOrder() ); diff --git a/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java b/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java index fbb817e699d2..59adc4d3655d 100644 --- a/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java +++ b/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java @@ -23,7 +23,6 @@ import org.apache.commons.lang3.Validate; import org.apache.maven.rtinfo.RuntimeInformation; import org.codehaus.plexus.logging.Logger; -import org.eclipse.aether.util.version.GenericVersionScheme; import org.eclipse.aether.version.InvalidVersionSpecificationException; import org.eclipse.aether.version.Version; import org.eclipse.aether.version.VersionConstraint; @@ -31,6 +30,7 @@ import java.io.IOException; import java.io.InputStream; +import java.util.Objects; import java.util.Properties; import javax.inject.Inject; @@ -45,64 +45,73 @@ public class DefaultRuntimeInformation implements RuntimeInformation { + private final Logger logger; - @Inject - private Logger logger; + private final VersionScheme versionScheme; - private String mavenVersion; + private final String mavenVersion; - public String getMavenVersion() + @Inject + public DefaultRuntimeInformation( final Logger logger, + final VersionScheme versionScheme ) { - if ( mavenVersion == null ) - { - Properties props = new Properties(); + this.logger = Objects.requireNonNull( logger ); + this.versionScheme = Objects.requireNonNull( versionScheme ); + this.mavenVersion = locateMavenVersion(); + } + + private String locateMavenVersion() + { + Properties props = new Properties(); - String resource = "META-INF/maven/org.apache.maven/maven-core/pom.properties"; + String resource = "META-INF/maven/org.apache.maven/maven-core/pom.properties"; - try ( InputStream is = DefaultRuntimeInformation.class.getResourceAsStream( "/" + resource ) ) + try ( InputStream is = DefaultRuntimeInformation.class.getResourceAsStream( "/" + resource ) ) + { + if ( is != null ) { - if ( is != null ) - { - props.load( is ); - } - else - { - logger.warn( - "Could not locate " + resource + " on classpath, Maven runtime information not available" ); - } + props.load( is ); } - catch ( IOException e ) + else { - String msg = "Could not parse " + resource + ", Maven runtime information not available"; - if ( logger.isDebugEnabled() ) - { - logger.warn( msg, e ); - } - else - { - logger.warn( msg ); - } + logger.warn( + "Could not locate " + resource + " on classpath, Maven runtime information not available" ); } - - String version = props.getProperty( "version", "" ).trim(); - - if ( !version.startsWith( "${" ) ) + } + catch ( IOException e ) + { + String msg = "Could not parse " + resource + ", Maven runtime information not available"; + if ( logger.isDebugEnabled() ) { - mavenVersion = version; + logger.warn( msg, e ); } else { - mavenVersion = ""; + logger.warn( msg ); } } + String version = props.getProperty( "version", "" ).trim(); + + if ( !version.startsWith( "${" ) ) + { + return version; + } + else + { + return ""; + } + } + + @Override + public String getMavenVersion() + { return mavenVersion; } + @Override public boolean isMavenVersion( String versionRange ) { - VersionScheme versionScheme = new GenericVersionScheme(); - Validate.notBlank( versionRange, "versionRange can neither be null, empty nor blank" ); VersionConstraint constraint; diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java index b53d5a5073e8..70cf1d0e7a8e 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java @@ -78,18 +78,22 @@ public class DefaultVersionRangeResolver private RepositoryEventDispatcher repositoryEventDispatcher; + private final VersionScheme versionScheme; + public DefaultVersionRangeResolver() { // enable default constructor + this.versionScheme = new GenericVersionScheme(); } @Inject DefaultVersionRangeResolver( MetadataResolver metadataResolver, SyncContextFactory syncContextFactory, - RepositoryEventDispatcher repositoryEventDispatcher ) + RepositoryEventDispatcher repositoryEventDispatcher, VersionScheme versionScheme ) { setMetadataResolver( metadataResolver ); setSyncContextFactory( syncContextFactory ); setRepositoryEventDispatcher( repositoryEventDispatcher ); + this.versionScheme = Objects.requireNonNull( versionScheme ); } public void initService( ServiceLocator locator ) @@ -124,8 +128,6 @@ public VersionRangeResult resolveVersionRange( RepositorySystemSession session, { VersionRangeResult result = new VersionRangeResult( request ); - VersionScheme versionScheme = new GenericVersionScheme(); - VersionConstraint versionConstraint; try { 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..475799dedd03 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 @@ -34,6 +34,8 @@ import org.eclipse.aether.impl.VersionRangeResolver; import org.eclipse.aether.impl.VersionResolver; import org.eclipse.aether.impl.guice.AetherModule; +import org.eclipse.aether.util.version.GenericVersionScheme; +import org.eclipse.aether.version.VersionScheme; /** * MavenResolverModule @@ -46,6 +48,7 @@ public final class MavenResolverModule protected void configure() { install( new AetherModule() ); + bind( VersionScheme.class ).toInstance( new GenericVersionScheme() ); bind( ArtifactDescriptorReader.class ).to( DefaultArtifactDescriptorReader.class ).in( Singleton.class ); bind( VersionResolver.class ).to( DefaultVersionResolver.class ).in( Singleton.class ); bind( VersionRangeResolver.class ).to( DefaultVersionRangeResolver.class ).in( Singleton.class ); diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/VersionSchemeProvider.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/VersionSchemeProvider.java new file mode 100644 index 000000000000..f7c6f4ef2356 --- /dev/null +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/VersionSchemeProvider.java @@ -0,0 +1,49 @@ +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.eclipse.aether.util.version.GenericVersionScheme; +import org.eclipse.aether.version.VersionScheme; + +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +/** + * Provider of {@link org.eclipse.aether.util.version.GenericVersionScheme}. + */ +@Named +@Singleton +public class VersionSchemeProvider + implements Provider +{ + private final VersionScheme genericVersionScheme; + + public VersionSchemeProvider() + { + this.genericVersionScheme = new GenericVersionScheme(); + } + + @Override + public VersionScheme get() + { + return genericVersionScheme; + } +}