Skip to content

Commit

Permalink
mojohaus#704: Remove WagonManager
Browse files Browse the repository at this point in the history
  • Loading branch information
jarmoniuk committed Dec 4, 2022
1 parent bc10d1a commit b6b6dd0
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 147 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand All @@ -35,6 +35,7 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
Expand All @@ -61,10 +62,6 @@
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.authentication.AuthenticationInfo;
import org.apache.maven.wagon.observers.Debug;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.codehaus.mojo.versions.model.IgnoreVersion;
import org.codehaus.mojo.versions.model.Rule;
import org.codehaus.mojo.versions.model.RuleSet;
Expand All @@ -80,17 +77,18 @@
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.eclipse.aether.repository.AuthenticationContext;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResolutionException;
import org.eclipse.aether.spi.connector.transport.GetTask;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.transfer.NoTransporterException;

import static java.util.Collections.singletonList;
import static java.util.Optional.empty;
import static java.util.Optional.of;
import static java.util.Optional.ofNullable;

import static org.apache.maven.RepositoryUtils.toArtifact;

/**
Expand Down Expand Up @@ -144,6 +142,7 @@ public class DefaultVersionsHelper
* @since 2.12
*/
private final Map<String, Rule> artifactBestFitRule = new HashMap<>();

/**
* Private constructor used by the builder
*/
Expand Down Expand Up @@ -689,7 +688,6 @@ public static class Builder
private MavenSession mavenSession;
private MojoExecution mojoExecution;
private org.eclipse.aether.RepositorySystem aetherRepositorySystem;
private Map<String, Wagon> wagonMap;

public Builder()
{
Expand Down Expand Up @@ -766,93 +764,29 @@ private static RuleSet enrichRuleSet( Collection<String> ignoredVersions, RuleSe

private static class RulesUri
{
String basePath;
String resource;
String baseUri;
URI fileUri;

private RulesUri( String basePath, String resource )
private RulesUri( String baseUri, URI fileUri )
{
this.basePath = basePath;
this.resource = resource;
this.baseUri = baseUri;
this.fileUri = fileUri;
}

static RulesUri build( String rulesUri ) throws URISyntaxException
{
int split = rulesUri.lastIndexOf( '/' );
return split == -1
? new RulesUri( rulesUri, "" )
? new RulesUri( rulesUri, new URI( "" ) )
: new RulesUri( rulesUri.substring( 0, split ) + '/',
split + 1 < rulesUri.length()
new URI( split + 1 < rulesUri.length()
? rulesUri.substring( split + 1 )
: "" ) ;
: "" ) );
}
}

private RemoteRepository remoteRepository( RulesUri uri )
{
RemoteRepository prototype = new RemoteRepository.Builder( serverId, null, uri.basePath ).build();
RemoteRepository.Builder builder = new RemoteRepository.Builder( prototype );
ofNullable( mavenSession.getRepositorySession().getProxySelector().getProxy( prototype ) )
.ifPresent( builder::setProxy );
ofNullable( mavenSession.getRepositorySession().getAuthenticationSelector().getAuthentication( prototype ) )
.ifPresent( builder::setAuthentication );
ofNullable( mavenSession.getRepositorySession().getMirrorSelector().getMirror( prototype ) )
.ifPresent( mirror -> builder.setMirroredRepositories( singletonList( mirror ) ) );
return builder.build();
}

private Optional<ProxyInfo> getProxyInfo( RemoteRepository repository )
{
return ofNullable( repository.getProxy() )
.map( proxy -> new ProxyInfo()
{{
setHost( proxy.getHost() );
setPort( proxy.getPort() );
setType( proxy.getType() );
ofNullable( proxy.getAuthentication() )
.ifPresent( auth ->
{
try ( AuthenticationContext authCtx = AuthenticationContext
.forProxy( mavenSession.getRepositorySession(), repository ) )
{
ofNullable( authCtx.get( AuthenticationContext.USERNAME ) )
.ifPresent( this::setUserName );
ofNullable( authCtx.get( AuthenticationContext.PASSWORD ) )
.ifPresent( this::setPassword );
ofNullable( authCtx.get( AuthenticationContext.NTLM_DOMAIN ) )
.ifPresent( this::setNtlmDomain );
ofNullable( authCtx.get( AuthenticationContext
.NTLM_WORKSTATION ) ).ifPresent( this::setNtlmHost );
}
} );
}} );
}

private Optional<AuthenticationInfo> getAuthenticationInfo( RemoteRepository repository )
{
return ofNullable( repository.getAuthentication() )
.map( authentication -> new AuthenticationInfo()
{{
try ( AuthenticationContext authCtx = AuthenticationContext
.forProxy( mavenSession.getRepositorySession(), repository ) )
{
ofNullable( authCtx.get( AuthenticationContext.USERNAME ) )
.ifPresent( this::setUserName );
ofNullable( authCtx.get( AuthenticationContext.PASSWORD ) )
.ifPresent( this::setPassword );
ofNullable( authCtx.get( AuthenticationContext.PRIVATE_KEY_PASSPHRASE ) )
.ifPresent( this::setPassphrase );
ofNullable( authCtx.get( AuthenticationContext.PRIVATE_KEY_PATH ) )
.ifPresent( this::setPrivateKey );
}
}} );
}

private org.apache.maven.wagon.repository.Repository wagonRepository( RemoteRepository repository )
{
return new org.apache.maven.wagon.repository.Repository( repository.getId(), repository.getUrl() );
}

private RuleSet getRulesUsingWagon() throws MojoExecutionException
private RuleSet getRulesUsingTransporter()
{
RulesUri uri;
try
Expand All @@ -865,58 +799,44 @@ private RuleSet getRulesUsingWagon() throws MojoExecutionException
return null;
}

RemoteRepository repository = remoteRepository( uri );
return ofNullable( wagonMap.get( repository.getProtocol() ) )
.map( wagon ->
RemoteRepository repository = new RemoteRepository.Builder( serverId, null, uri.baseUri )
.build();
return transporterFactoryMap
.values()
.stream()
// highest priority first -> reversing the order of arguments:
.sorted( ( f1, f2 ) -> Float.compare( f2.getPriority(), f1.getPriority() ) )
.map( factory ->
{
if ( log.isDebugEnabled() )
try
{
Debug debug = new Debug();
wagon.addSessionListener( debug );
wagon.addTransferListener( debug );
return factory.newInstance( mavenSession.getRepositorySession(), repository );
}

catch ( NoTransporterException e )
{
log.warn( "No transporter possible for " + uri.baseUri + ": "
+ e.getMessage() );
return null;
}
} )
.filter( Objects::nonNull )
.map( transporter ->
{
try
{
Optional<ProxyInfo> proxyInfo = getProxyInfo( repository );
Optional<AuthenticationInfo> authenticationInfo = getAuthenticationInfo( repository );
if ( log.isDebugEnabled() )
{
log.debug( "Connecting to remote repository \"" + repository.getId() + "\""
+ proxyInfo.map( pi -> " using proxy " + pi.getHost() + ":"
+ pi.getPort() ).orElse( "" )
+ authenticationInfo.map( ai -> " as " + ai.getUserName() ).orElse( "" ) );
}
wagon.connect( wagonRepository( repository ), getAuthenticationInfo( repository )
.orElse( null ), getProxyInfo( repository ).orElse( null ) );
try
{
Path tempFile = Files.createTempFile( "rules-", ".xml" );
wagon.get( uri.resource, tempFile.toFile() );
try ( BufferedInputStream is = new BufferedInputStream(
Files.newInputStream( tempFile ) ) )
{
return new RuleXpp3Reader().read( is );
}
finally
{
Files.deleteIfExists( tempFile );
}

}
finally
{
wagon.disconnect();
}
GetTask getTask = new GetTask( uri.fileUri );
transporter.get( getTask );
return new RuleXpp3Reader().read( new StringReader( getTask.getDataString() ) );
}
catch ( Exception e )
{
log.warn( e.getMessage() );
log.warn( "Error while reading the rules string: " + e.getMessage() );
return null;
}
} )
.orElseThrow( () -> new MojoExecutionException( "Could not load specified rules from "
+ rulesUri ) );
.filter( Objects::nonNull )
.findFirst()
.orElse( null );
}

public static Optional<String> protocol( final String url )
Expand Down Expand Up @@ -981,12 +901,6 @@ public Builder withAetherRepositorySystem( org.eclipse.aether.RepositorySystem a
return this;
}

public Builder withWagonMap( Map<String, Wagon> wagonMap )
{
this.wagonMap = wagonMap;
return this;
}

/**
* Builds the constructed {@linkplain DefaultVersionsHelper} object
* @return constructed {@linkplain DefaultVersionsHelper}
Expand All @@ -1012,7 +926,7 @@ public DefaultVersionsHelper build() throws MojoExecutionException
? new RuleSet()
: isClasspathUri( rulesUri )
? getRulesFromClasspath( rulesUri, log )
: getRulesUsingWagon();
: getRulesUsingTransporter();
}
if ( ignoredVersions != null && !ignoredVersions.isEmpty() )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ The following parameters are supported by this rule:
| `pluginDependencyExcludes` | (empty) | List of plugin dependency exclusion patterns. Only dependencies matching none of the patterns will be considered.<br/>The wildcard (`*`) can be used as the only, first, last or both characters in each token. The version token does support version ranges. |
| `pluginManagementDependencyIncludes` | `*` | List of plugin management dependency inclusion patterns. Only dependencies matching all the patterns will be considered.<br/>The wildcard (`*`) can be used as the only, first, last or both characters in each token. The version token does support version ranges. |
| `pluginManagementDependencyExcludes` | (empty) | List of plugin management dependency exclusion patterns. Only dependencies matching none of the patterns will be considered.<br/>The wildcard (`*`) can be used as the only, first, last or both characters in each token. The version token does support version ranges. |
| `serverId` | `serverId` | *settings.xml*'s server id for the URL. This is used when Wagon needs extra authentication information. |
| `serverId` | `serverId` | *settings.xml*'s server id for the URL. This is used when there is extra authentication information needed. |
| `rulesUri` | | URI of a ruleSet file containing the rules that control how to compare version numbers. The URI could be either a Wagon URI or a classpath URI (e.g. *classpath:\/\/\/package/sub/package/rules.xml*). |
| `ruleSet` | | Allows specifying the `RuleSet` object describing rules on artifact versions to ignore when considering updates.<br/> See: [Using the ruleSet element in the POM](../version-rules.html#Using_the_ruleSet_element_in_the_POM) |

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:use-latest-releases
invoker.mavenOpts = -Dmaven.version.rules=file:rules.xml
18 changes: 18 additions & 0 deletions versions-maven-plugin/src/it/it-transporter-001/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>localhost</groupId>
<artifactId>it-transporter-001</artifactId>
<version>1.0</version>
<packaging>pom</packaging>

<dependencies>
<dependency>
<groupId>localhost</groupId>
<artifactId>dummy-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>

</project>
12 changes: 12 additions & 0 deletions versions-maven-plugin/src/it/it-transporter-001/rules.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<ruleset comparisonMethod="maven"
xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0 http://www.mojohaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
<rules>
<rule groupId="localhost" artifactId="dummy-api" comparisonMethod="maven">
<ignoreVersions>
<ignoreVersion type="regex">3.*</ignoreVersion>
</ignoreVersions>
</rule>
</rules>
</ruleset>
3 changes: 3 additions & 0 deletions versions-maven-plugin/src/it/it-transporter-001/verify.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) )

assert !( project.dependencies.dependency.find { node -> node.artifactId == 'dummy-api' }.version =~ /3.*/ )
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:use-latest-releases
invoker.mavenOpts = -Dmaven.version.rules=file:rules.xml
38 changes: 38 additions & 0 deletions versions-maven-plugin/src/it/it-transporter-002/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>localhost</groupId>
<artifactId>it-transporter-001</artifactId>
<version>1.0</version>
<packaging>pom</packaging>

<dependencies>
<dependency>
<groupId>localhost</groupId>
<artifactId>dummy-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>@project.groupId@</groupId>
<artifactId>@project.artifactId@</artifactId>
<version>@project.version@</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-transport-file</artifactId>
<version>1.8.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>

</project>
12 changes: 12 additions & 0 deletions versions-maven-plugin/src/it/it-transporter-002/rules.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<ruleset comparisonMethod="maven"
xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0 http://www.mojohaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
<rules>
<rule groupId="localhost" artifactId="dummy-api" comparisonMethod="maven">
<ignoreVersions>
<ignoreVersion type="regex">3.*</ignoreVersion>
</ignoreVersions>
</rule>
</rules>
</ruleset>
3 changes: 3 additions & 0 deletions versions-maven-plugin/src/it/it-transporter-002/verify.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) )

assert !( project.dependencies.dependency.find { node -> node.artifactId == 'dummy-api' }.version =~ /3.*/ )
Loading

0 comments on commit b6b6dd0

Please sign in to comment.