[MNG-4756] Aether integration

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-3/trunk@988749 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Benjamin Bentmann 2010-08-24 22:46:07 +00:00
parent c85a6a4ec2
commit 6c37a89744
156 changed files with 7429 additions and 3180 deletions

View File

@ -13,7 +13,7 @@ The Apache Software Foundation (http://www.apache.org/).
This product includes software (Plexus and Classworlds) developed by
The Codehaus Foundation (http://www.codehaus.org/).
This product includes software (Spice, Plexus Ciper and Sec Dispatcher) developed by
This product includes software (Aether, Spice, Plexus Ciper and Sec Dispatcher) developed by
Sonatype Inc. (http://www.sonatype.org/).
This product includes software (NekoHTML) developed by

View File

@ -59,6 +59,10 @@
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-file</artifactId>
</dependency>
<dependency>
<groupId>org.sonatype.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -195,7 +195,7 @@ Do you want to continue?</input>
<modello file="maven-model-builder/src/main/mdo/profiles.mdo" />
<modello file="maven-settings/src/main/mdo/settings.mdo" version="1.1.0" />
<modello file="maven-core/src/main/mdo/toolchains.mdo" />
<modello file="maven-repository-metadata/src/main/mdo/metadata.mdo" />
<modello file="maven-repository-metadata/src/main/mdo/metadata.mdo" version="1.1.0" />
<modello file="maven-compat/src/main/mdo/profiles.mdo" />
<modello file="maven-compat/src/main/mdo/paramdoc.mdo" />
</target>

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<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>
<parent>
<groupId>org.apache.maven</groupId>
<artifactId>maven</artifactId>
<version>3.0-SNAPSHOT</version>
</parent>
<artifactId>maven-aether-provider</artifactId>
<name>Maven Aether Provider</name>
<description>
This module provides extensions to Aether for utilizing the Maven POM and Maven metadata.
</description>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model-builder</artifactId>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-repository-metadata</artifactId>
</dependency>
<dependency>
<groupId>org.sonatype.aether</groupId>
<artifactId>aether-api</artifactId>
</dependency>
<dependency>
<groupId>org.sonatype.aether</groupId>
<artifactId>aether-util</artifactId>
</dependency>
<dependency>
<groupId>org.sonatype.aether</groupId>
<artifactId>aether-impl</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-annotations</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,449 @@
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 java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.DistributionManagement;
import org.apache.maven.model.License;
import org.apache.maven.model.Model;
import org.apache.maven.model.Relocation;
import org.apache.maven.model.Repository;
import org.apache.maven.model.building.DefaultModelBuilderFactory;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.FileModelSource;
import org.apache.maven.model.building.ModelBuilder;
import org.apache.maven.model.building.ModelBuildingException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.building.ModelProblem;
import org.apache.maven.model.resolution.UnresolvableModelException;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.sonatype.aether.RepositoryException;
import org.sonatype.aether.RepositoryListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.artifact.ArtifactType;
import org.sonatype.aether.artifact.ArtifactTypeRegistry;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.graph.Exclusion;
import org.sonatype.aether.impl.ArtifactDescriptorReader;
import org.sonatype.aether.impl.ArtifactResolver;
import org.sonatype.aether.impl.RemoteRepositoryManager;
import org.sonatype.aether.impl.VersionResolver;
import org.sonatype.aether.transfer.ArtifactNotFoundException;
import org.sonatype.aether.util.artifact.ArtifactProperties;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.artifact.DefaultArtifactType;
import org.sonatype.aether.util.artifact.SubArtifact;
import org.sonatype.aether.util.listener.DefaultRepositoryEvent;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.RepositoryPolicy;
import org.sonatype.aether.repository.WorkspaceRepository;
import org.sonatype.aether.resolution.ArtifactDescriptorException;
import org.sonatype.aether.resolution.ArtifactDescriptorRequest;
import org.sonatype.aether.resolution.ArtifactDescriptorResult;
import org.sonatype.aether.resolution.ArtifactRequest;
import org.sonatype.aether.resolution.ArtifactResolutionException;
import org.sonatype.aether.resolution.ArtifactResult;
import org.sonatype.aether.resolution.VersionRequest;
import org.sonatype.aether.resolution.VersionResolutionException;
import org.sonatype.aether.spi.locator.Service;
import org.sonatype.aether.spi.locator.ServiceLocator;
import org.sonatype.aether.spi.log.Logger;
import org.sonatype.aether.spi.log.NullLogger;
/**
* @author Benjamin Bentmann
*/
@Component( role = ArtifactDescriptorReader.class )
public class DefaultArtifactDescriptorReader
implements ArtifactDescriptorReader, Service
{
@Requirement
private Logger logger = NullLogger.INSTANCE;
@Requirement
private RemoteRepositoryManager remoteRepositoryManager;
@Requirement
private VersionResolver versionResolver;
@Requirement
private ArtifactResolver artifactResolver;
@Requirement
private ModelBuilder modelBuilder;
public void initService( ServiceLocator locator )
{
setLogger( locator.getService( Logger.class ) );
setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) );
setVersionResolver( locator.getService( VersionResolver.class ) );
setArtifactResolver( locator.getService( ArtifactResolver.class ) );
modelBuilder = locator.getService( ModelBuilder.class );
if ( modelBuilder == null )
{
setModelBuilder( new DefaultModelBuilderFactory().newInstance() );
}
}
public DefaultArtifactDescriptorReader setLogger( Logger logger )
{
this.logger = ( logger != null ) ? logger : NullLogger.INSTANCE;
return this;
}
public DefaultArtifactDescriptorReader setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
{
if ( remoteRepositoryManager == null )
{
throw new IllegalArgumentException( "remote repository manager has not been specified" );
}
this.remoteRepositoryManager = remoteRepositoryManager;
return this;
}
public DefaultArtifactDescriptorReader setVersionResolver( VersionResolver versionResolver )
{
if ( versionResolver == null )
{
throw new IllegalArgumentException( "version resolver has not been specified" );
}
this.versionResolver = versionResolver;
return this;
}
public DefaultArtifactDescriptorReader setArtifactResolver( ArtifactResolver artifactResolver )
{
if ( artifactResolver == null )
{
throw new IllegalArgumentException( "artifact resolver has not been specified" );
}
this.artifactResolver = artifactResolver;
return this;
}
public DefaultArtifactDescriptorReader setModelBuilder( ModelBuilder modelBuilder )
{
if ( modelBuilder == null )
{
throw new IllegalArgumentException( "model builder has not been specified" );
}
this.modelBuilder = modelBuilder;
return this;
}
public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
ArtifactDescriptorRequest request )
throws ArtifactDescriptorException
{
ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
Model model = loadPom( session, request, result );
if ( model != null )
{
ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry();
for ( Repository r : model.getRepositories() )
{
result.addRepository( convert( r ) );
}
for ( org.apache.maven.model.Dependency dependency : model.getDependencies() )
{
result.addDependency( convert( dependency, stereotypes ) );
}
DependencyManagement mngt = model.getDependencyManagement();
if ( mngt != null )
{
for ( org.apache.maven.model.Dependency dependency : mngt.getDependencies() )
{
result.addManagedDependency( convert( dependency, stereotypes ) );
}
}
Map<String, Object> properties = new LinkedHashMap<String, Object>();
List<License> licenses = model.getLicenses();
properties.put( "license.count", Integer.valueOf( licenses.size() ) );
for ( int i = 0; i < licenses.size(); i++ )
{
License license = licenses.get( i );
properties.put( "license." + i + ".name", license.getName() );
properties.put( "license." + i + ".url", license.getUrl() );
properties.put( "license." + i + ".comments", license.getComments() );
properties.put( "license." + i + ".distribution", license.getDistribution() );
}
result.setProperties( properties );
}
return result;
}
private Model loadPom( RepositorySystemSession session, ArtifactDescriptorRequest request,
ArtifactDescriptorResult result )
throws ArtifactDescriptorException
{
Set<String> visited = new LinkedHashSet<String>();
for ( Artifact artifact = request.getArtifact();; )
{
try
{
VersionRequest versionRequest =
new VersionRequest( artifact, request.getRepositories(), request.getRequestContext() );
versionResolver.resolveVersion( session, versionRequest );
}
catch ( VersionResolutionException e )
{
result.addException( e );
throw new ArtifactDescriptorException( result );
}
if ( !visited.add( artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getBaseVersion() ) )
{
RepositoryException exception =
new RepositoryException( "Artifact relocations form a cycle: " + visited );
invalidDescriptor( session, artifact, exception );
if ( session.isIgnoreInvalidArtifactDescriptor() )
{
return null;
}
result.addException( exception );
throw new ArtifactDescriptorException( result );
}
Artifact pomArtifact = artifact;
if ( pomArtifact.getClassifier().length() > 0 || !"pom".equals( pomArtifact.getExtension() ) )
{
pomArtifact = new SubArtifact( artifact, "", "pom" );
}
ArtifactResult resolveResult;
try
{
ArtifactRequest resolveRequest =
new ArtifactRequest( pomArtifact, request.getRepositories(), request.getRequestContext() );
resolveResult = artifactResolver.resolveArtifact( session, resolveRequest );
pomArtifact = resolveResult.getArtifact();
result.setRepository( resolveResult.getRepository() );
}
catch ( ArtifactResolutionException e )
{
if ( e.getCause() instanceof ArtifactNotFoundException )
{
missingDescriptor( session, artifact );
if ( session.isIgnoreMissingArtifactDescriptor() )
{
return null;
}
}
result.addException( e );
throw new ArtifactDescriptorException( result );
}
Model model;
try
{
ModelBuildingRequest modelRequest = new DefaultModelBuildingRequest();
modelRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
modelRequest.setProcessPlugins( false );
modelRequest.setTwoPhaseBuilding( false );
modelRequest.setSystemProperties( toProperties( session.getSystemProperties() ) );
modelRequest.setUserProperties( toProperties( session.getUserProperties() ) );
modelRequest.setModelCache( DefaultModelCache.newInstance( session ) );
modelRequest.setModelResolver( new DefaultModelResolver( session, request.getRequestContext(),
artifactResolver, remoteRepositoryManager,
request.getRepositories() ) );
if ( resolveResult.getRepository() instanceof WorkspaceRepository )
{
modelRequest.setPomFile( pomArtifact.getFile() );
}
else
{
modelRequest.setModelSource( new FileModelSource( pomArtifact.getFile() ) );
}
model = modelBuilder.build( modelRequest ).getEffectiveModel();
}
catch ( ModelBuildingException e )
{
for ( ModelProblem problem : e.getProblems() )
{
if ( problem.getException() instanceof UnresolvableModelException )
{
result.addException( problem.getException() );
throw new ArtifactDescriptorException( result );
}
}
invalidDescriptor( session, artifact, e );
if ( session.isIgnoreInvalidArtifactDescriptor() )
{
return null;
}
result.addException( e );
throw new ArtifactDescriptorException( result );
}
Relocation relocation = getRelocation( model );
if ( relocation != null )
{
result.addRelocation( artifact );
artifact =
new RelocatedArtifact( artifact, relocation.getGroupId(), relocation.getArtifactId(),
relocation.getVersion() );
result.setArtifact( artifact );
}
else
{
return model;
}
}
}
private Properties toProperties( Map<String, String> map )
{
Properties props = new Properties();
if ( map != null )
{
props.putAll( map );
}
return props;
}
private Relocation getRelocation( Model model )
{
Relocation relocation = null;
DistributionManagement distMngt = model.getDistributionManagement();
if ( distMngt != null )
{
relocation = distMngt.getRelocation();
}
return relocation;
}
private Dependency convert( org.apache.maven.model.Dependency dependency, ArtifactTypeRegistry stereotypes )
{
ArtifactType stereotype = stereotypes.get( dependency.getType() );
if ( stereotype == null )
{
stereotype = new DefaultArtifactType( dependency.getType() );
}
boolean system = dependency.getSystemPath() != null && dependency.getSystemPath().length() > 0;
Map<String, String> props = null;
if ( system )
{
props = Collections.singletonMap( ArtifactProperties.LACKS_DESCRIPTOR, Boolean.TRUE.toString() );
}
Artifact artifact =
new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null,
dependency.getVersion(), props, stereotype );
if ( system )
{
artifact = artifact.setFile( new File( dependency.getSystemPath() ) );
}
List<Exclusion> exclusions = new ArrayList<Exclusion>( dependency.getExclusions().size() );
for ( org.apache.maven.model.Exclusion exclusion : dependency.getExclusions() )
{
exclusions.add( convert( exclusion ) );
}
Dependency result = new Dependency( artifact, dependency.getScope(), dependency.isOptional(), exclusions );
return result;
}
private Exclusion convert( org.apache.maven.model.Exclusion exclusion )
{
return new Exclusion( exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*" );
}
static RemoteRepository convert( Repository repository )
{
RemoteRepository result =
new RemoteRepository( repository.getId(), repository.getLayout(), repository.getUrl() );
result.setPolicy( true, convert( repository.getSnapshots() ) );
result.setPolicy( false, convert( repository.getReleases() ) );
return result;
}
private static RepositoryPolicy convert( org.apache.maven.model.RepositoryPolicy policy )
{
boolean enabled = true;
String checksums = RepositoryPolicy.CHECKSUM_POLICY_WARN;
String updates = RepositoryPolicy.UPDATE_POLICY_DAILY;
if ( policy != null )
{
enabled = policy.isEnabled();
if ( policy.getUpdatePolicy() != null )
{
updates = policy.getUpdatePolicy();
}
if ( policy.getChecksumPolicy() != null )
{
checksums = policy.getChecksumPolicy();
}
}
return new RepositoryPolicy( enabled, updates, checksums );
}
private void missingDescriptor( RepositorySystemSession session, Artifact artifact )
{
RepositoryListener listener = session.getRepositoryListener();
if ( listener != null )
{
DefaultRepositoryEvent event = new DefaultRepositoryEvent( session, artifact );
listener.artifactDescriptorMissing( event );
}
}
private void invalidDescriptor( RepositorySystemSession session, Artifact artifact, Exception exception )
{
RepositoryListener listener = session.getRepositoryListener();
if ( listener != null )
{
DefaultRepositoryEvent event = new DefaultRepositoryEvent( session, artifact );
event.setException( exception );
listener.artifactDescriptorInvalid( event );
}
}
}

View File

@ -0,0 +1,119 @@
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.sonatype.aether.RepositoryCache;
import org.sonatype.aether.RepositorySystemSession;
/**
* A model builder cache backed by the repository system cache.
*
* @author Benjamin Bentmann
*/
class DefaultModelCache
implements ModelCache
{
private final RepositorySystemSession session;
private final RepositoryCache cache;
public static ModelCache newInstance( RepositorySystemSession session )
{
if ( session.getCache() == null )
{
return null;
}
else
{
return new DefaultModelCache( session );
}
}
private DefaultModelCache( RepositorySystemSession session )
{
this.session = session;
this.cache = session.getCache();
}
public Object get( String groupId, String artifactId, String version, String tag )
{
return cache.get( session, new Key( groupId, artifactId, version, tag ) );
}
public void put( String groupId, String artifactId, String version, String tag, Object data )
{
cache.put( session, new Key( groupId, artifactId, version, tag ), data );
}
static class Key
{
private final String groupId;
private final String artifactId;
private final String version;
private final String tag;
private final int hash;
public Key( String groupId, String artifactId, String version, String tag )
{
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.tag = tag;
int h = 17;
h = h * 31 + this.groupId.hashCode();
h = h * 31 + this.artifactId.hashCode();
h = h * 31 + this.version.hashCode();
h = h * 31 + this.tag.hashCode();
hash = h;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
{
return true;
}
if ( null == obj || !getClass().equals( obj.getClass() ) )
{
return false;
}
Key that = (Key) obj;
return artifactId.equals( that.artifactId ) && groupId.equals( that.groupId )
&& version.equals( that.version ) && tag.equals( that.tag );
}
@Override
public int hashCode()
{
return hash;
}
}
}

View File

@ -0,0 +1,128 @@
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 java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.maven.model.Repository;
import org.apache.maven.model.building.FileModelSource;
import org.apache.maven.model.building.ModelSource;
import org.apache.maven.model.resolution.InvalidRepositoryException;
import org.apache.maven.model.resolution.ModelResolver;
import org.apache.maven.model.resolution.UnresolvableModelException;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.impl.ArtifactResolver;
import org.sonatype.aether.impl.RemoteRepositoryManager;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.resolution.ArtifactRequest;
import org.sonatype.aether.resolution.ArtifactResolutionException;
import org.sonatype.aether.util.artifact.DefaultArtifact;
/**
* A model resolver to assist building of dependency POMs. This resolver gives priority to those repositories that have
* been initially specified and repositories discovered in dependency POMs are recessively merged into the search chain.
*
* @author Benjamin Bentmann
* @see DefaultArtifactDescriptorReader
*/
class DefaultModelResolver
implements ModelResolver
{
private final RepositorySystemSession session;
private final String context;
private List<RemoteRepository> repositories;
private final ArtifactResolver resolver;
private final RemoteRepositoryManager remoteRepositoryManager;
private final Set<String> repositoryIds;
public DefaultModelResolver( RepositorySystemSession session, String context, ArtifactResolver resolver,
RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories )
{
this.session = session;
this.context = context;
this.resolver = resolver;
this.remoteRepositoryManager = remoteRepositoryManager;
this.repositories = repositories;
this.repositoryIds = new HashSet<String>();
}
private DefaultModelResolver( DefaultModelResolver original )
{
this.session = original.session;
this.context = original.context;
this.resolver = original.resolver;
this.remoteRepositoryManager = original.remoteRepositoryManager;
this.repositories = original.repositories;
this.repositoryIds = new HashSet<String>( original.repositoryIds );
}
public void addRepository( Repository repository )
throws InvalidRepositoryException
{
if ( !repositoryIds.add( repository.getId() ) )
{
return;
}
List<RemoteRepository> newRepositories =
Collections.singletonList( DefaultArtifactDescriptorReader.convert( repository ) );
this.repositories =
remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true );
}
public ModelResolver newCopy()
{
return new DefaultModelResolver( this );
}
public ModelSource resolveModel( String groupId, String artifactId, String version )
throws UnresolvableModelException
{
Artifact pomArtifact = new DefaultArtifact( groupId, artifactId, "", "pom", version );
try
{
ArtifactRequest request = new ArtifactRequest( pomArtifact, repositories, context );
pomArtifact = resolver.resolveArtifact( session, request ).getArtifact();
}
catch ( ArtifactResolutionException e )
{
throw new UnresolvableModelException( "Failed to resolve POM for " + groupId + ":" + artifactId + ":"
+ version + " due to " + e.getMessage(), groupId, artifactId, version, e );
}
File pomFile = pomArtifact.getFile();
return new FileModelSource( pomFile );
}
}

View File

@ -0,0 +1,51 @@
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.sonatype.aether.impl.ArtifactDescriptorReader;
import org.sonatype.aether.impl.MetadataGeneratorFactory;
import org.sonatype.aether.impl.VersionRangeResolver;
import org.sonatype.aether.impl.VersionResolver;
/**
* A simple service locator that is already setup with all components from this library. To acquire a complete
* repository system, clients need to add some repository connectors for remote transfers. <em>Note:</em> This component
* is meant to assists those clients that employ the repository systems outside of an IoC container, Maven plugins
* should instead always use regular dependency injection to acquire the repository system.
*
* @author Benjamin Bentmann
*/
public class DefaultServiceLocator
extends org.sonatype.aether.impl.internal.DefaultServiceLocator
{
/**
* Creates a new service locator that already knows about all service implementations included this library.
*/
public DefaultServiceLocator()
{
addService( ArtifactDescriptorReader.class, DefaultArtifactDescriptorReader.class );
addService( VersionResolver.class, DefaultVersionResolver.class );
addService( VersionRangeResolver.class, DefaultVersionRangeResolver.class );
addService( MetadataGeneratorFactory.class, SnapshotMetadataGeneratorFactory.class );
addService( MetadataGeneratorFactory.class, VersionsMetadataGeneratorFactory.class );
}
}

View File

@ -0,0 +1,269 @@
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 java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.util.IOUtil;
import org.sonatype.aether.RepositoryListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.util.listener.DefaultRepositoryEvent;
import org.sonatype.aether.util.metadata.DefaultMetadata;
import org.sonatype.aether.util.version.GenericVersionScheme;
import org.sonatype.aether.version.InvalidVersionSpecificationException;
import org.sonatype.aether.version.Version;
import org.sonatype.aether.version.VersionConstraint;
import org.sonatype.aether.version.VersionRange;
import org.sonatype.aether.version.VersionScheme;
import org.sonatype.aether.impl.MetadataResolver;
import org.sonatype.aether.impl.VersionRangeResolver;
import org.sonatype.aether.metadata.Metadata;
import org.sonatype.aether.repository.ArtifactRepository;
import org.sonatype.aether.repository.LocalRepositoryManager;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.WorkspaceReader;
import org.sonatype.aether.resolution.MetadataRequest;
import org.sonatype.aether.resolution.MetadataResult;
import org.sonatype.aether.resolution.VersionRangeRequest;
import org.sonatype.aether.resolution.VersionRangeResolutionException;
import org.sonatype.aether.resolution.VersionRangeResult;
import org.sonatype.aether.spi.locator.Service;
import org.sonatype.aether.spi.locator.ServiceLocator;
import org.sonatype.aether.spi.log.Logger;
import org.sonatype.aether.spi.log.NullLogger;
/**
* @author Benjamin Bentmann
*/
@Component( role = VersionRangeResolver.class )
public class DefaultVersionRangeResolver
implements VersionRangeResolver, Service
{
private static final String MAVEN_METADATA_XML = "maven-metadata.xml";
@Requirement
private Logger logger = NullLogger.INSTANCE;
@Requirement
private MetadataResolver metadataResolver;
public void initService( ServiceLocator locator )
{
setLogger( locator.getService( Logger.class ) );
setMetadataResolver( locator.getService( MetadataResolver.class ) );
}
public DefaultVersionRangeResolver setLogger( Logger logger )
{
this.logger = ( logger != null ) ? logger : NullLogger.INSTANCE;
return this;
}
public DefaultVersionRangeResolver setMetadataResolver( MetadataResolver metadataResolver )
{
if ( metadataResolver == null )
{
throw new IllegalArgumentException( "metadata resolver has not been specified" );
}
this.metadataResolver = metadataResolver;
return this;
}
public VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request )
throws VersionRangeResolutionException
{
VersionRangeResult result = new VersionRangeResult( request );
VersionScheme versionScheme = new GenericVersionScheme();
VersionConstraint versionConstraint;
try
{
versionConstraint = versionScheme.parseVersionConstraint( request.getArtifact().getVersion() );
}
catch ( InvalidVersionSpecificationException e )
{
result.addException( e );
throw new VersionRangeResolutionException( result );
}
result.setVersionConstraint( versionConstraint );
if ( versionConstraint.getRanges().isEmpty() )
{
result.addVersion( versionConstraint.getVersion() );
}
else
{
Map<String, ArtifactRepository> versionIndex =
getVersions( session, result, request, getNature( session, versionConstraint.getRanges() ) );
List<Version> versions = new ArrayList<Version>();
for ( Map.Entry<String, ArtifactRepository> v : versionIndex.entrySet() )
{
try
{
Version ver = versionScheme.parseVersion( v.getKey() );
if ( versionConstraint.containsVersion( ver ) )
{
versions.add( ver );
result.setRepository( ver, v.getValue() );
}
}
catch ( InvalidVersionSpecificationException e )
{
result.addException( e );
}
}
Collections.sort( versions );
result.setVersions( versions );
}
return result;
}
private Map<String, ArtifactRepository> getVersions( RepositorySystemSession session, VersionRangeResult result,
VersionRangeRequest request, Metadata.Nature nature )
{
Map<String, ArtifactRepository> versionIndex = new HashMap<String, ArtifactRepository>();
Metadata metadata =
new DefaultMetadata( request.getArtifact().getGroupId(), request.getArtifact().getArtifactId(),
MAVEN_METADATA_XML, nature );
List<MetadataRequest> metadataRequests = new ArrayList<MetadataRequest>( request.getRepositories().size() );
for ( RemoteRepository repository : request.getRepositories() )
{
MetadataRequest metadataRequest = new MetadataRequest( metadata, repository, request.getRequestContext() );
metadataRequest.setDeleteLocalCopyIfMissing( true );
metadataRequests.add( metadataRequest );
}
List<MetadataResult> metadataResults = metadataResolver.resolveMetadata( session, metadataRequests );
WorkspaceReader workspace = session.getWorkspaceReader();
if ( workspace != null )
{
List<String> versions = workspace.findVersions( request.getArtifact() );
for ( String version : versions )
{
versionIndex.put( version, workspace.getRepository() );
}
}
LocalRepositoryManager lrm = session.getLocalRepositoryManager();
File localMetadataFile = new File( lrm.getRepository().getBasedir(), lrm.getPathForLocalMetadata( metadata ) );
if ( localMetadataFile.isFile() )
{
metadata = metadata.setFile( localMetadataFile );
Versioning versioning = readVersions( session, metadata, result );
for ( String version : versioning.getVersions() )
{
if ( !versionIndex.containsKey( version ) )
{
versionIndex.put( version, lrm.getRepository() );
}
}
}
for ( MetadataResult metadataResult : metadataResults )
{
result.addException( metadataResult.getException() );
Versioning versioning = readVersions( session, metadataResult.getMetadata(), result );
for ( String version : versioning.getVersions() )
{
if ( !versionIndex.containsKey( version ) )
{
versionIndex.put( version, metadataResult.getRequest().getRepository() );
}
}
}
return versionIndex;
}
private Metadata.Nature getNature( RepositorySystemSession session, Collection<VersionRange> ranges )
{
for ( VersionRange range : ranges )
{
if ( range.acceptsSnapshots() )
{
return Metadata.Nature.RELEASE_OR_SNAPSHOT;
}
}
return Metadata.Nature.RELEASE;
}
private Versioning readVersions( RepositorySystemSession session, Metadata metadata, VersionRangeResult result )
{
Versioning versioning = null;
FileInputStream fis = null;
try
{
if ( metadata != null && metadata.getFile() != null )
{
fis = new FileInputStream( metadata.getFile() );
org.apache.maven.artifact.repository.metadata.Metadata m = new MetadataXpp3Reader().read( fis, false );
versioning = m.getVersioning();
}
}
catch ( FileNotFoundException e )
{
// tolerable
}
catch ( Exception e )
{
invalidMetadata( session, metadata, e );
result.addException( e );
}
finally
{
IOUtil.close( fis );
}
return ( versioning != null ) ? versioning : new Versioning();
}
private void invalidMetadata( RepositorySystemSession session, Metadata metadata, Exception exception )
{
RepositoryListener listener = session.getRepositoryListener();
if ( listener != null )
{
DefaultRepositoryEvent event = new DefaultRepositoryEvent( session, metadata );
event.setException( exception );
listener.metadataInvalid( event );
}
}
}

View File

@ -0,0 +1,487 @@
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 java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.repository.metadata.Snapshot;
import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.sonatype.aether.RepositoryCache;
import org.sonatype.aether.RepositoryListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.util.listener.DefaultRepositoryEvent;
import org.sonatype.aether.util.metadata.DefaultMetadata;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.impl.MetadataResolver;
import org.sonatype.aether.impl.VersionResolver;
import org.sonatype.aether.impl.internal.CacheUtils;
import org.sonatype.aether.metadata.Metadata;
import org.sonatype.aether.repository.ArtifactRepository;
import org.sonatype.aether.repository.LocalRepositoryManager;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.WorkspaceReader;
import org.sonatype.aether.repository.WorkspaceRepository;
import org.sonatype.aether.resolution.MetadataRequest;
import org.sonatype.aether.resolution.MetadataResult;
import org.sonatype.aether.resolution.VersionRequest;
import org.sonatype.aether.resolution.VersionResolutionException;
import org.sonatype.aether.resolution.VersionResult;
import org.sonatype.aether.spi.locator.Service;
import org.sonatype.aether.spi.locator.ServiceLocator;
import org.sonatype.aether.spi.log.Logger;
import org.sonatype.aether.spi.log.NullLogger;
/**
* @author Benjamin Bentmann
*/
@Component( role = VersionResolver.class )
public class DefaultVersionResolver
implements VersionResolver, Service
{
private static final String MAVEN_METADATA_XML = "maven-metadata.xml";
private static final String RELEASE = "RELEASE";
private static final String LATEST = "LATEST";
private static final String SNAPSHOT = "SNAPSHOT";
@Requirement
private Logger logger = NullLogger.INSTANCE;
@Requirement
private MetadataResolver metadataResolver;
public void initService( ServiceLocator locator )
{
setLogger( locator.getService( Logger.class ) );
setMetadataResolver( locator.getService( MetadataResolver.class ) );
}
public DefaultVersionResolver setLogger( Logger logger )
{
this.logger = ( logger != null ) ? logger : NullLogger.INSTANCE;
return this;
}
public DefaultVersionResolver setMetadataResolver( MetadataResolver metadataResolver )
{
if ( metadataResolver == null )
{
throw new IllegalArgumentException( "metadata resolver has not been specified" );
}
this.metadataResolver = metadataResolver;
return this;
}
public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
throws VersionResolutionException
{
Artifact artifact = request.getArtifact();
String version = artifact.getVersion();
VersionResult result = new VersionResult( request );
Key cacheKey = null;
RepositoryCache cache = session.getCache();
if ( cache != null )
{
cacheKey = new Key( session, request );
Object obj = cache.get( session, cacheKey );
if ( obj instanceof Record )
{
Record record = (Record) obj;
result.setVersion( record.version );
result.setRepository( CacheUtils.getRepository( session, request.getRepositories(), record.repoClass,
record.repoId ) );
return result;
}
}
Metadata metadata;
if ( RELEASE.equals( version ) )
{
metadata =
new DefaultMetadata( artifact.getGroupId(), artifact.getArtifactId(), MAVEN_METADATA_XML,
Metadata.Nature.RELEASE );
}
else if ( LATEST.equals( version ) )
{
metadata =
new DefaultMetadata( artifact.getGroupId(), artifact.getArtifactId(), MAVEN_METADATA_XML,
Metadata.Nature.RELEASE_OR_SNAPSHOT );
}
else if ( version.endsWith( SNAPSHOT ) )
{
WorkspaceReader workspace = session.getWorkspaceReader();
if ( workspace != null && workspace.findVersions( artifact ).contains( version ) )
{
metadata = null;
result.setRepository( workspace.getRepository() );
}
else
{
metadata =
new DefaultMetadata( artifact.getGroupId(), artifact.getArtifactId(), version, MAVEN_METADATA_XML,
Metadata.Nature.SNAPSHOT );
}
}
else
{
metadata = null;
}
if ( metadata == null )
{
result.setVersion( version );
}
else
{
List<MetadataRequest> metadataRequests = new ArrayList<MetadataRequest>( request.getRepositories().size() );
for ( RemoteRepository repository : request.getRepositories() )
{
MetadataRequest metadataRequest =
new MetadataRequest( metadata, repository, request.getRequestContext() );
metadataRequest.setDeleteLocalCopyIfMissing( true );
metadataRequest.setFavorLocalRepository( true );
metadataRequests.add( metadataRequest );
}
List<MetadataResult> metadataResults = metadataResolver.resolveMetadata( session, metadataRequests );
LocalRepositoryManager lrm = session.getLocalRepositoryManager();
File localMetadataFile =
new File( lrm.getRepository().getBasedir(), lrm.getPathForLocalMetadata( metadata ) );
if ( localMetadataFile.isFile() )
{
metadata = metadata.setFile( localMetadataFile );
}
Map<String, VersionInfo> infos = new HashMap<String, VersionInfo>();
merge( artifact, infos, readVersions( session, metadata, result ),
session.getLocalRepositoryManager().getRepository() );
for ( MetadataResult metadataResult : metadataResults )
{
result.addException( metadataResult.getException() );
merge( artifact, infos, readVersions( session, metadataResult.getMetadata(), result ),
metadataResult.getRequest().getRepository() );
}
if ( RELEASE.equals( version ) )
{
resolve( result, infos, RELEASE );
}
else if ( LATEST.equals( version ) )
{
if ( !resolve( result, infos, LATEST ) )
{
resolve( result, infos, RELEASE );
}
if ( result.getVersion() != null && result.getVersion().endsWith( SNAPSHOT ) )
{
VersionRequest subRequest = new VersionRequest();
subRequest.setArtifact( artifact.setVersion( result.getVersion() ) );
if ( result.getRepository() instanceof RemoteRepository )
{
subRequest.setRepositories( Collections.singletonList( (RemoteRepository) result.getRepository() ) );
}
else
{
subRequest.setRepositories( request.getRepositories() );
}
VersionResult subResult = resolveVersion( session, subRequest );
result.setVersion( subResult.getVersion() );
result.setRepository( subResult.getRepository() );
for ( Exception exception : subResult.getExceptions() )
{
result.addException( exception );
}
}
}
else
{
if ( !resolve( result, infos, SNAPSHOT + artifact.getClassifier() )
&& !resolve( result, infos, SNAPSHOT ) )
{
result.setVersion( version );
}
}
if ( StringUtils.isEmpty( result.getVersion() ) )
{
throw new VersionResolutionException( result );
}
}
if ( cacheKey != null && metadata != null )
{
cache.put( session, cacheKey, new Record( result.getVersion(), result.getRepository() ) );
}
return result;
}
private boolean resolve( VersionResult result, Map<String, VersionInfo> infos, String key )
{
VersionInfo info = infos.get( key );
if ( info != null )
{
result.setVersion( info.version );
result.setRepository( info.repository );
}
return info != null;
}
private Versioning readVersions( RepositorySystemSession session, Metadata metadata, VersionResult result )
{
Versioning versioning = null;
FileInputStream fis = null;
try
{
if ( metadata != null && metadata.getFile() != null )
{
fis = new FileInputStream( metadata.getFile() );
org.apache.maven.artifact.repository.metadata.Metadata m = new MetadataXpp3Reader().read( fis, false );
versioning = m.getVersioning();
}
}
catch ( FileNotFoundException e )
{
// tolerable
}
catch ( Exception e )
{
invalidMetadata( session, metadata, e );
result.addException( e );
}
finally
{
IOUtil.close( fis );
}
return ( versioning != null ) ? versioning : new Versioning();
}
private void invalidMetadata( RepositorySystemSession session, Metadata metadata, Exception exception )
{
RepositoryListener listener = session.getRepositoryListener();
if ( listener != null )
{
DefaultRepositoryEvent event = new DefaultRepositoryEvent( session, metadata );
event.setException( exception );
listener.metadataInvalid( event );
}
}
private void merge( Artifact artifact, Map<String, VersionInfo> infos, Versioning versioning,
ArtifactRepository repository )
{
if ( StringUtils.isNotEmpty( versioning.getRelease() ) )
{
merge( RELEASE, infos, versioning.getLastUpdated(), versioning.getRelease(), repository );
}
if ( StringUtils.isNotEmpty( versioning.getLatest() ) )
{
merge( LATEST, infos, versioning.getLastUpdated(), versioning.getLatest(), repository );
}
boolean mainSnapshot = false;
for ( SnapshotVersion sv : versioning.getSnapshotVersions() )
{
if ( StringUtils.isNotEmpty( sv.getVersion() ) )
{
mainSnapshot |= sv.getClassifier().length() <= 0;
merge( SNAPSHOT + sv.getClassifier(), infos, sv.getUpdated(), sv.getVersion(), repository );
}
}
Snapshot snapshot = versioning.getSnapshot();
if ( !mainSnapshot && snapshot != null )
{
String version = artifact.getVersion();
if ( snapshot.getTimestamp() != null && snapshot.getBuildNumber() > 0 )
{
String qualifier = snapshot.getTimestamp() + '-' + snapshot.getBuildNumber();
version = version.substring( 0, version.length() - SNAPSHOT.length() ) + qualifier;
}
merge( SNAPSHOT, infos, versioning.getLastUpdated(), version, repository );
}
}
private void merge( String key, Map<String, VersionInfo> infos, String timestamp, String version,
ArtifactRepository repository )
{
VersionInfo info = infos.get( key );
if ( info == null )
{
info = new VersionInfo( timestamp, version, repository );
infos.put( key, info );
}
else if ( info.isOutdated( timestamp ) )
{
info.version = version;
info.repository = repository;
}
}
private static class VersionInfo
{
String timestamp;
String version;
ArtifactRepository repository;
public VersionInfo( String timestamp, String version, ArtifactRepository repository )
{
this.timestamp = ( timestamp != null ) ? timestamp : "";
this.version = version;
this.repository = repository;
}
public boolean isOutdated( String timestamp )
{
return timestamp != null && timestamp.compareTo( this.timestamp ) > 0;
}
}
private static class Key
{
private final String groupId;
private final String artifactId;
private final String version;
private final String context;
private final File localRepo;
private final WorkspaceRepository workspace;
private final List<RemoteRepository> repositories;
private final int hashCode;
public Key( RepositorySystemSession session, VersionRequest request )
{
groupId = request.getArtifact().getGroupId();
artifactId = request.getArtifact().getArtifactId();
version = request.getArtifact().getVersion();
context = request.getRequestContext();
localRepo = session.getLocalRepository().getBasedir();
workspace = CacheUtils.getWorkspace( session );
repositories = new ArrayList<RemoteRepository>( request.getRepositories().size() );
for ( RemoteRepository repository : request.getRepositories() )
{
if ( repository.isRepositoryManager() )
{
repositories.addAll( repository.getMirroredRepositories() );
}
else
{
repositories.add( repository );
}
}
int hash = 17;
hash = hash * 31 + groupId.hashCode();
hash = hash * 31 + artifactId.hashCode();
hash = hash * 31 + version.hashCode();
hash = hash * 31 + localRepo.hashCode();
hash = hash * 31 + CacheUtils.repositoriesHashCode( repositories );
hashCode = hash;
}
@Override
public boolean equals( Object obj )
{
if ( obj == this )
{
return true;
}
else if ( obj == null || !getClass().equals( obj.getClass() ) )
{
return false;
}
Key that = (Key) obj;
return artifactId.equals( that.artifactId ) && groupId.equals( that.groupId )
&& version.equals( that.version ) && context.equals( that.context )
&& localRepo.equals( that.localRepo ) && CacheUtils.eq( workspace, that.workspace )
&& CacheUtils.repositoriesEquals( repositories, that.repositories );
}
@Override
public int hashCode()
{
return hashCode;
}
}
private static class Record
{
final String version;
final String repoId;
final Class<?> repoClass;
public Record( String version, ArtifactRepository repository )
{
this.version = version;
if ( repository != null )
{
repoId = repository.getId();
repoClass = repository.getClass();
}
else
{
repoId = null;
repoClass = null;
}
}
}
}

View File

@ -0,0 +1,102 @@
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 java.io.File;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Snapshot;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.sonatype.aether.artifact.Artifact;
/**
* @author Benjamin Bentmann
*/
final class LocalSnapshotMetadata
extends MavenMetadata
{
private final Artifact artifact;
public LocalSnapshotMetadata( Artifact artifact )
{
super( createMetadata( artifact ), null );
this.artifact = artifact;
}
public LocalSnapshotMetadata( Artifact artifact, File file )
{
super( createMetadata( artifact ), file );
this.artifact = artifact;
}
private static Metadata createMetadata( Artifact artifact )
{
Snapshot snapshot = new Snapshot();
snapshot.setLocalCopy( true );
Versioning versioning = new Versioning();
versioning.setSnapshot( snapshot );
Metadata metadata = new Metadata();
metadata.setModelVersion( "1.0.0" );
metadata.setVersioning( versioning );
metadata.setGroupId( artifact.getGroupId() );
metadata.setArtifactId( artifact.getArtifactId() );
metadata.setVersion( artifact.getBaseVersion() );
return metadata;
}
public MavenMetadata setFile( File file )
{
return new LocalSnapshotMetadata( artifact, file );
}
public Object getKey()
{
return getGroupId() + ':' + getArtifactId() + ':' + getVersion();
}
public static Object getKey( Artifact artifact )
{
return artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getBaseVersion();
}
public String getGroupId()
{
return artifact.getGroupId();
}
public String getArtifactId()
{
return artifact.getArtifactId();
}
public String getVersion()
{
return artifact.getBaseVersion();
}
public Nature getNature()
{
return Nature.SNAPSHOT;
}
}

View File

@ -0,0 +1,76 @@
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 java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.impl.MetadataGenerator;
import org.sonatype.aether.installation.InstallRequest;
import org.sonatype.aether.metadata.Metadata;
/**
* @author Benjamin Bentmann
*/
class LocalSnapshotMetadataGenerator
implements MetadataGenerator
{
private Map<Object, LocalSnapshotMetadata> snapshots;
public LocalSnapshotMetadataGenerator( RepositorySystemSession session, InstallRequest request )
{
snapshots = new LinkedHashMap<Object, LocalSnapshotMetadata>();
}
public Collection<? extends Metadata> prepare( Collection<? extends Artifact> artifacts )
{
for ( Artifact artifact : artifacts )
{
if ( artifact.isSnapshot() )
{
Object key = LocalSnapshotMetadata.getKey( artifact );
LocalSnapshotMetadata snapshotMetadata = snapshots.get( key );
if ( snapshotMetadata == null )
{
snapshotMetadata = new LocalSnapshotMetadata( artifact );
snapshots.put( key, snapshotMetadata );
}
}
}
return Collections.emptyList();
}
public Artifact transformArtifact( Artifact artifact )
{
return artifact;
}
public Collection<? extends Metadata> finish( Collection<? extends Artifact> artifacts )
{
return snapshots.values();
}
}

View File

@ -0,0 +1,171 @@
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 java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.sonatype.aether.RepositoryException;
import org.sonatype.aether.metadata.MergeableMetadata;
/**
* @author Benjamin Bentmann
*/
abstract class MavenMetadata
implements MergeableMetadata
{
private final File file;
protected Metadata metadata;
private boolean merged;
protected MavenMetadata( Metadata metadata, File file )
{
this.metadata = metadata;
this.file = file;
}
public String getType()
{
return "maven-metadata.xml";
}
public File getFile()
{
return file;
}
public void merge( File existing, File result )
throws RepositoryException
{
Metadata recessive = read( existing );
merge( recessive );
write( result, metadata );
merged = true;
}
public boolean isMerged()
{
return merged;
}
protected void merge( Metadata recessive )
{
Versioning versioning = recessive.getVersioning();
if ( versioning != null )
{
versioning.setLastUpdated( null );
}
Metadata dominant = metadata;
versioning = dominant.getVersioning();
if ( versioning != null )
{
versioning.updateTimestamp();
}
dominant.merge( recessive );
}
private Metadata read( File metadataFile )
throws RepositoryException
{
if ( metadataFile.length() <= 0 )
{
return new Metadata();
}
Reader reader = null;
try
{
reader = ReaderFactory.newXmlReader( metadataFile );
return new MetadataXpp3Reader().read( reader, false );
}
catch ( IOException e )
{
throw new RepositoryException( "Could not read metadata " + metadataFile + ": " + e.getMessage(), e );
}
catch ( XmlPullParserException e )
{
throw new RepositoryException( "Could not parse metadata " + metadataFile + ": " + e.getMessage(), e );
}
finally
{
IOUtil.close( reader );
}
}
private void write( File metadataFile, Metadata metadata )
throws RepositoryException
{
Writer writer = null;
try
{
metadataFile.getParentFile().mkdirs();
writer = WriterFactory.newXmlWriter( metadataFile );
new MetadataXpp3Writer().write( writer, metadata );
}
catch ( IOException e )
{
throw new RepositoryException( "Could not write metadata " + metadataFile + ": " + e.getMessage(), e );
}
finally
{
IOUtil.close( writer );
}
}
@Override
public String toString()
{
StringBuilder buffer = new StringBuilder( 128 );
if ( getGroupId().length() > 0 )
{
buffer.append( getGroupId() );
}
if ( getArtifactId().length() > 0 )
{
buffer.append( ':' ).append( getArtifactId() );
}
if ( getVersion().length() > 0 )
{
buffer.append( ':' ).append( getVersion() );
}
buffer.append( '/' ).append( getType() );
return buffer.toString();
}
}

View File

@ -0,0 +1,104 @@
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.sonatype.aether.collection.DependencyGraphTransformer;
import org.sonatype.aether.collection.DependencyManager;
import org.sonatype.aether.collection.DependencySelector;
import org.sonatype.aether.collection.DependencyTraverser;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.artifact.DefaultArtifactType;
import org.sonatype.aether.util.artifact.DefaultArtifactTypeRegistry;
import org.sonatype.aether.util.graph.manager.ClassicDependencyManager;
import org.sonatype.aether.util.graph.selector.AndDependencySelector;
import org.sonatype.aether.util.graph.selector.ExclusionDependencySelector;
import org.sonatype.aether.util.graph.selector.OptionalDependencySelector;
import org.sonatype.aether.util.graph.selector.ScopeDependencySelector;
import org.sonatype.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
import org.sonatype.aether.util.graph.transformer.ConflictMarker;
import org.sonatype.aether.util.graph.transformer.JavaDependencyContextRefiner;
import org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator;
import org.sonatype.aether.util.graph.transformer.NearestVersionConflictResolver;
import org.sonatype.aether.util.graph.traverser.FatArtifactTraverser;
import org.sonatype.aether.util.repository.DefaultAuthenticationSelector;
import org.sonatype.aether.util.repository.DefaultMirrorSelector;
import org.sonatype.aether.util.repository.DefaultProxySelector;
/**
* A simplistic repository system session that mimics Maven's behavior to help third-party developers that want to embed
* Maven's dependency resolution into their own applications. <strong>Warning:</strong> This class is not intended for
* usage by Maven plugins, those should always acquire the current repository system session via parameter injection.
*
* @author Benjamin Bentmann
*/
public class MavenRepositorySystemSession
extends DefaultRepositorySystemSession
{
/**
* Creates a new Maven-like repository system session by initializing the session with values typical for
* Maven-based resolution.
*/
public MavenRepositorySystemSession()
{
setMirrorSelector( new DefaultMirrorSelector() );
setAuthenticationSelector( new DefaultAuthenticationSelector() );
setProxySelector( new DefaultProxySelector() );
DependencyTraverser depTraverser = new FatArtifactTraverser();
setDependencyTraverser( depTraverser );
DependencyManager depManager = new ClassicDependencyManager();
setDependencyManager( depManager );
DependencySelector depFilter =
new AndDependencySelector( new ScopeDependencySelector( "test", "provided" ),
new OptionalDependencySelector(), new ExclusionDependencySelector() );
setDependencySelector( depFilter );
DependencyGraphTransformer transformer =
new ChainedDependencyGraphTransformer( new ConflictMarker(), new JavaEffectiveScopeCalculator(),
new NearestVersionConflictResolver(),
new JavaDependencyContextRefiner() );
setDependencyGraphTransformer( transformer );
DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
stereotypes.add( new DefaultArtifactType( "pom" ) );
stereotypes.add( new DefaultArtifactType( "maven-plugin", "jar", "", "java" ) );
stereotypes.add( new DefaultArtifactType( "jar", "jar", "", "java" ) );
stereotypes.add( new DefaultArtifactType( "ejb", "jar", "", "java" ) );
stereotypes.add( new DefaultArtifactType( "ejb-client", "jar", "client", "java" ) );
stereotypes.add( new DefaultArtifactType( "test-jar", "jar", "tests", "java" ) );
stereotypes.add( new DefaultArtifactType( "javadoc", "jar", "javadoc", "java" ) );
stereotypes.add( new DefaultArtifactType( "java-source", "jar", "sources", "java", false, false ) );
stereotypes.add( new DefaultArtifactType( "war", "war", "", "java", false, true ) );
stereotypes.add( new DefaultArtifactType( "ear", "ear", "", "java", false, true ) );
stereotypes.add( new DefaultArtifactType( "rar", "rar", "", "java", false, true ) );
stereotypes.add( new DefaultArtifactType( "par", "par", "", "java", false, true ) );
setArtifactTypeRegistry( stereotypes );
setIgnoreInvalidArtifactDescriptor( true );
setIgnoreMissingArtifactDescriptor( true );
setSystemProps( System.getProperties() );
setConfigProps( System.getProperties() );
}
}

View File

@ -0,0 +1,126 @@
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 java.io.File;
import java.util.Map;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.util.artifact.AbstractArtifact;
/**
* @author Benjamin Bentmann
*/
final class RelocatedArtifact
extends AbstractArtifact
{
private final Artifact artifact;
private final String groupId;
private final String artifactId;
private final String version;
public RelocatedArtifact( Artifact artifact, String groupId, String artifactId, String version )
{
if ( artifact == null )
{
throw new IllegalArgumentException( "no artifact specified" );
}
this.artifact = artifact;
this.groupId = ( groupId != null && groupId.length() > 0 ) ? groupId : null;
this.artifactId = ( artifactId != null && artifactId.length() > 0 ) ? artifactId : null;
this.version = ( version != null && version.length() > 0 ) ? version : null;
}
public String getGroupId()
{
if ( groupId != null )
{
return groupId;
}
else
{
return artifact.getGroupId();
}
}
public String getArtifactId()
{
if ( artifactId != null )
{
return artifactId;
}
else
{
return artifact.getArtifactId();
}
}
public String getVersion()
{
if ( version != null )
{
return version;
}
else
{
return artifact.getVersion();
}
}
public String getBaseVersion()
{
return toBaseVersion( getVersion() );
}
public boolean isSnapshot()
{
return isSnapshot( getVersion() );
}
public String getClassifier()
{
return artifact.getClassifier();
}
public String getExtension()
{
return artifact.getExtension();
}
public File getFile()
{
return artifact.getFile();
}
public String getProperty( String key, String defaultValue )
{
return artifact.getProperty( key, defaultValue );
}
public Map<String, String> getProperties()
{
return artifact.getProperties();
}
}

View File

@ -0,0 +1,196 @@
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 java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TimeZone;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Snapshot;
import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.sonatype.aether.artifact.Artifact;
/**
* @author Benjamin Bentmann
*/
final class RemoteSnapshotMetadata
extends MavenMetadata
{
private static final String SNAPSHOT = "SNAPSHOT";
private final Collection<Artifact> artifacts = new ArrayList<Artifact>();
private final Map<String, SnapshotVersion> versions = new LinkedHashMap<String, SnapshotVersion>();
public RemoteSnapshotMetadata( Artifact artifact )
{
super( createMetadata( artifact ), null );
}
private RemoteSnapshotMetadata( Metadata metadata, File file )
{
super( metadata, file );
}
private static Metadata createMetadata( Artifact artifact )
{
Metadata metadata = new Metadata();
metadata.setModelVersion( "1.1.0" );
metadata.setGroupId( artifact.getGroupId() );
metadata.setArtifactId( artifact.getArtifactId() );
metadata.setVersion( artifact.getBaseVersion() );
return metadata;
}
public void bind( Artifact artifact )
{
artifacts.add( artifact );
}
public MavenMetadata setFile( File file )
{
return new RemoteSnapshotMetadata( metadata, file );
}
public Object getKey()
{
return getGroupId() + ':' + getArtifactId() + ':' + getVersion();
}
public static Object getKey( Artifact artifact )
{
return artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getBaseVersion();
}
public String getExpandedVersion( Artifact artifact )
{
return versions.get( artifact.getClassifier() ).getVersion();
}
@Override
protected void merge( Metadata recessive )
{
Snapshot snapshot;
String lastUpdated = "";
if ( metadata.getVersioning() == null )
{
DateFormat utcDateFormatter = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
utcDateFormatter.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
snapshot = new Snapshot();
snapshot.setBuildNumber( getBuildNumber( recessive ) + 1 );
snapshot.setTimestamp( utcDateFormatter.format( new Date() ) );
Versioning versioning = new Versioning();
versioning.setSnapshot( snapshot );
versioning.setLastUpdated( snapshot.getTimestamp().replace( ".", "" ) );
lastUpdated = versioning.getLastUpdated();
metadata.setVersioning( versioning );
}
else
{
snapshot = metadata.getVersioning().getSnapshot();
lastUpdated = metadata.getVersioning().getLastUpdated();
}
for ( Artifact artifact : artifacts )
{
String version = artifact.getVersion();
if ( version.endsWith( SNAPSHOT ) )
{
String qualifier = snapshot.getTimestamp() + "-" + snapshot.getBuildNumber();
version = version.substring( 0, version.length() - SNAPSHOT.length() ) + qualifier;
}
SnapshotVersion sv = new SnapshotVersion();
sv.setClassifier( artifact.getClassifier() );
sv.setVersion( version );
sv.setUpdated( lastUpdated );
versions.put( sv.getClassifier(), sv );
}
artifacts.clear();
Versioning versioning = recessive.getVersioning();
if ( versioning != null )
{
for ( SnapshotVersion sv : versioning.getSnapshotVersions() )
{
if ( !versions.containsKey( sv.getClassifier() ) )
{
versions.put( sv.getClassifier(), sv );
}
}
}
metadata.getVersioning().setSnapshotVersions( new ArrayList<SnapshotVersion>( versions.values() ) );
}
private static int getBuildNumber( Metadata metadata )
{
int number = 0;
Versioning versioning = metadata.getVersioning();
if ( versioning != null )
{
Snapshot snapshot = versioning.getSnapshot();
if ( snapshot != null && snapshot.getBuildNumber() > 0 )
{
number = snapshot.getBuildNumber();
}
}
return number;
}
public String getGroupId()
{
return metadata.getGroupId();
}
public String getArtifactId()
{
return metadata.getArtifactId();
}
public String getVersion()
{
return metadata.getVersion();
}
public Nature getNature()
{
return Nature.SNAPSHOT;
}
}

View File

@ -0,0 +1,102 @@
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 java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.deployment.DeployRequest;
import org.sonatype.aether.impl.MetadataGenerator;
import org.sonatype.aether.metadata.Metadata;
/**
* @author Benjamin Bentmann
*/
class RemoteSnapshotMetadataGenerator
implements MetadataGenerator
{
private Map<Object, RemoteSnapshotMetadata> snapshots;
public RemoteSnapshotMetadataGenerator( RepositorySystemSession session, DeployRequest request )
{
snapshots = new LinkedHashMap<Object, RemoteSnapshotMetadata>();
/*
* NOTE: This should be considered a quirk to support interop with Maven's legacy ArtifactDeployer which
* processes one artifact at a time and hence cannot associate the artifacts from the same project to use the
* same timestamp+buildno for the snapshot versions. Allowing the caller to pass in metadata from a previous
* deployment allows to re-establish the association between the artifacts of the same project.
*/
for ( Metadata metadata : request.getMetadata() )
{
if ( metadata instanceof RemoteSnapshotMetadata )
{
RemoteSnapshotMetadata snapshotMetadata = (RemoteSnapshotMetadata) metadata;
snapshots.put( snapshotMetadata.getKey(), snapshotMetadata );
}
}
}
public Collection<? extends Metadata> prepare( Collection<? extends Artifact> artifacts )
{
for ( Artifact artifact : artifacts )
{
if ( artifact.isSnapshot() )
{
Object key = RemoteSnapshotMetadata.getKey( artifact );
RemoteSnapshotMetadata snapshotMetadata = snapshots.get( key );
if ( snapshotMetadata == null )
{
snapshotMetadata = new RemoteSnapshotMetadata( artifact );
snapshots.put( key, snapshotMetadata );
}
snapshotMetadata.bind( artifact );
}
}
return snapshots.values();
}
public Artifact transformArtifact( Artifact artifact )
{
if ( artifact.isSnapshot() && artifact.getVersion().equals( artifact.getBaseVersion() ) )
{
Object key = RemoteSnapshotMetadata.getKey( artifact );
RemoteSnapshotMetadata snapshotMetadata = snapshots.get( key );
if ( snapshotMetadata != null )
{
artifact = artifact.setVersion( snapshotMetadata.getExpandedVersion( artifact ) );
}
}
return artifact;
}
public Collection<? extends Metadata> finish( Collection<? extends Artifact> artifacts )
{
return Collections.emptyList();
}
}

View File

@ -0,0 +1,52 @@
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.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.deployment.DeployRequest;
import org.sonatype.aether.impl.MetadataGenerator;
import org.sonatype.aether.impl.MetadataGeneratorFactory;
import org.sonatype.aether.installation.InstallRequest;
/**
* @author Benjamin Bentmann
*/
@Component( role = MetadataGeneratorFactory.class, hint = "snapshot" )
public class SnapshotMetadataGeneratorFactory
implements MetadataGeneratorFactory
{
public MetadataGenerator newInstance( RepositorySystemSession session, InstallRequest request )
{
return new LocalSnapshotMetadataGenerator( session, request );
}
public MetadataGenerator newInstance( RepositorySystemSession session, DeployRequest request )
{
return new RemoteSnapshotMetadataGenerator( session, request );
}
public int getPriority()
{
return 10;
}
}

View File

@ -0,0 +1,102 @@
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 java.io.File;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.sonatype.aether.artifact.Artifact;
/**
* @author Benjamin Bentmann
*/
final class VersionsMetadata
extends MavenMetadata
{
private final Artifact artifact;
public VersionsMetadata( Artifact artifact )
{
super( createMetadata( artifact ), null );
this.artifact = artifact;
}
public VersionsMetadata( Artifact artifact, File file )
{
super( createMetadata( artifact ), file );
this.artifact = artifact;
}
private static Metadata createMetadata( Artifact artifact )
{
Versioning versioning = new Versioning();
versioning.addVersion( artifact.getBaseVersion() );
if ( !artifact.isSnapshot() )
{
versioning.setRelease( artifact.getVersion() );
}
Metadata metadata = new Metadata();
metadata.setModelVersion( "1.0.0" );
metadata.setVersioning( versioning );
metadata.setGroupId( artifact.getGroupId() );
metadata.setArtifactId( artifact.getArtifactId() );
return metadata;
}
public Object getKey()
{
return getGroupId() + ':' + getArtifactId();
}
public static Object getKey( Artifact artifact )
{
return artifact.getGroupId() + ':' + artifact.getArtifactId();
}
public MavenMetadata setFile( File file )
{
return new VersionsMetadata( artifact, file );
}
public String getGroupId()
{
return artifact.getGroupId();
}
public String getArtifactId()
{
return artifact.getArtifactId();
}
public String getVersion()
{
return "";
}
public Nature getNature()
{
return artifact.isSnapshot() ? Nature.RELEASE_OR_SNAPSHOT : Nature.RELEASE;
}
}

View File

@ -0,0 +1,99 @@
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 java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.deployment.DeployRequest;
import org.sonatype.aether.impl.MetadataGenerator;
import org.sonatype.aether.installation.InstallRequest;
import org.sonatype.aether.metadata.Metadata;
/**
* @author Benjamin Bentmann
*/
class VersionsMetadataGenerator
implements MetadataGenerator
{
private Map<Object, VersionsMetadata> versions;
public VersionsMetadataGenerator( RepositorySystemSession session, InstallRequest request )
{
this( session, request.getMetadata() );
}
public VersionsMetadataGenerator( RepositorySystemSession session, DeployRequest request )
{
this( session, request.getMetadata() );
}
private VersionsMetadataGenerator( RepositorySystemSession session, Collection<? extends Metadata> metadatas )
{
versions = new LinkedHashMap<Object, VersionsMetadata>();
/*
* NOTE: This should be considered a quirk to support interop with Maven's legacy ArtifactDeployer which
* processes one artifact at a time and hence cannot associate the artifacts from the same project to use the
* same timestamp+buildno for the snapshot versions. Allowing the caller to pass in metadata from a previous
* deployment allows to re-establish the association between the artifacts of the same project.
*/
for ( Metadata metadata : metadatas )
{
if ( metadata instanceof VersionsMetadata )
{
VersionsMetadata versionsMetadata = (VersionsMetadata) metadata;
versions.put( versionsMetadata.getKey(), versionsMetadata );
}
}
}
public Collection<? extends Metadata> prepare( Collection<? extends Artifact> artifacts )
{
return Collections.emptyList();
}
public Artifact transformArtifact( Artifact artifact )
{
return artifact;
}
public Collection<? extends Metadata> finish( Collection<? extends Artifact> artifacts )
{
for ( Artifact artifact : artifacts )
{
Object key = VersionsMetadata.getKey( artifact );
VersionsMetadata versionsMetadata = versions.get( key );
if ( versionsMetadata == null )
{
versionsMetadata = new VersionsMetadata( artifact );
versions.put( key, versionsMetadata );
}
}
return versions.values();
}
}

View File

@ -0,0 +1,52 @@
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.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.deployment.DeployRequest;
import org.sonatype.aether.impl.MetadataGenerator;
import org.sonatype.aether.impl.MetadataGeneratorFactory;
import org.sonatype.aether.installation.InstallRequest;
/**
* @author Benjamin Bentmann
*/
@Component( role = MetadataGeneratorFactory.class, hint = "versions" )
public class VersionsMetadataGeneratorFactory
implements MetadataGeneratorFactory
{
public MetadataGenerator newInstance( RepositorySystemSession session, InstallRequest request )
{
return new VersionsMetadataGenerator( session, request );
}
public MetadataGenerator newInstance( RepositorySystemSession session, DeployRequest request )
{
return new VersionsMetadataGenerator( session, request );
}
public int getPriority()
{
return 5;
}
}

View File

@ -493,7 +493,6 @@ public class DefaultArtifact
public void setVersionRange( VersionRange versionRange )
{
this.versionRange = versionRange;
selectVersionFromNewRangeIfAvailable();
}

View File

@ -69,6 +69,12 @@
<artifactId>wagon-file</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.sonatype.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
<version>${aetherVersion}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>easymock</groupId>
<artifactId>easymock</artifactId>

View File

@ -20,50 +20,46 @@ package org.apache.maven.artifact.deployer;
*/
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataDeploymentException;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.MetadataBridge;
import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.legacy.TransferListenerAdapter;
import org.apache.maven.repository.legacy.WagonManager;
import org.apache.maven.repository.legacy.resolver.transform.ArtifactTransformationManager;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.events.TransferListener;
import org.apache.maven.project.artifact.ProjectArtifactMetadata;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.FileUtils;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.deployment.DeployRequest;
import org.sonatype.aether.deployment.DeployResult;
import org.sonatype.aether.deployment.DeploymentException;
import org.sonatype.aether.metadata.MergeableMetadata;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.artifact.SubArtifact;
@Component( role = ArtifactDeployer.class )
@Component( role = ArtifactDeployer.class, instantiationStrategy = "per-lookup" )
public class DefaultArtifactDeployer
extends AbstractLogEnabled
implements ArtifactDeployer
{
@Requirement
private WagonManager wagonManager;
@Requirement
private ArtifactTransformationManager transformationManager;
@Requirement
private RepositoryMetadataManager repositoryMetadataManager;
@Requirement
private RepositorySystem repositorySystem;
private RepositorySystem repoSystem;
@Requirement
private LegacySupport legacySupport;
private Map<Object, MergeableMetadata> snapshots = new ConcurrentHashMap<Object, MergeableMetadata>();
/**
* @deprecated we want to use the artifact method only, and ensure artifact.file is set
* correctly.
@ -82,79 +78,78 @@ public class DefaultArtifactDeployer
ArtifactRepository localRepository )
throws ArtifactDeploymentException
{
deploymentRepository = injectSession( deploymentRepository );
DefaultRepositorySystemSession session =
new DefaultRepositorySystemSession( legacySupport.getRepositorySession() );
LocalRepository localRepo = new LocalRepository( localRepository.getBasedir() );
session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( localRepo ) );
try
{
transformationManager.transformForDeployment( artifact, deploymentRepository, localRepository );
DeployRequest request = new DeployRequest();
// Copy the original file to the new one if it was transformed
File artifactFile = new File( localRepository.getBasedir(), localRepository.pathOf( artifact ) );
if ( !artifactFile.equals( source ) )
org.sonatype.aether.artifact.Artifact mainArtifact = RepositoryUtils.toArtifact( artifact );
mainArtifact = mainArtifact.setFile( source );
request.addArtifact( mainArtifact );
String snapshotKey = null;
if ( artifact.isSnapshot() )
{
FileUtils.copyFile( source, artifactFile );
snapshotKey = artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getBaseVersion();
request.addMetadata( snapshots.get( snapshotKey ) );
}
wagonManager.putArtifact( source, artifact, deploymentRepository, getTransferListener() );
// must be after the artifact is installed
for ( ArtifactMetadata metadata : artifact.getMetadataList() )
{
repositoryMetadataManager.deploy( metadata, localRepository, deploymentRepository );
}
}
catch ( TransferFailedException e )
if ( metadata instanceof ProjectArtifactMetadata )
{
throw new ArtifactDeploymentException( "Error deploying artifact: " + e.getMessage(), e );
org.sonatype.aether.artifact.Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" );
pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() );
request.addArtifact( pomArtifact );
}
catch ( IOException e )
else if ( metadata instanceof SnapshotArtifactRepositoryMetadata
|| metadata instanceof ArtifactRepositoryMetadata )
{
throw new ArtifactDeploymentException( "Error deploying artifact: " + e.getMessage(), e );
// eaten, handled by repo system
}
catch ( RepositoryMetadataDeploymentException e )
else
{
throw new ArtifactDeploymentException( "Error installing artifact's metadata: " + e.getMessage(), e );
request.addMetadata( new MetadataBridge( metadata ) );
}
}
private TransferListener getTransferListener()
{
MavenSession session = legacySupport.getSession();
if ( session == null )
{
return null;
}
return TransferListenerAdapter.newAdapter( session.getRequest().getTransferListener() );
}
private ArtifactRepository injectSession( ArtifactRepository repository )
{
RemoteRepository remoteRepo = RepositoryUtils.toRepo( deploymentRepository );
/*
* NOTE: This provides backward-compat with maven-deploy-plugin:2.4 which bypasses the repository factory when
* using an alternative deployment location.
*/
if ( repository instanceof DefaultArtifactRepository && repository.getAuthentication() == null )
if ( deploymentRepository instanceof DefaultArtifactRepository
&& deploymentRepository.getAuthentication() == null )
{
MavenSession session = legacySupport.getSession();
remoteRepo.setAuthentication( session.getAuthenticationSelector().getAuthentication( remoteRepo ) );
remoteRepo.setProxy( session.getProxySelector().getProxy( remoteRepo ) );
}
request.setRepository( remoteRepo );
if ( session != null )
DeployResult result;
try
{
MavenExecutionRequest request = session.getRequest();
if ( request != null )
result = repoSystem.deploy( session, request );
}
catch ( DeploymentException e )
{
List<ArtifactRepository> repositories = Arrays.asList( repository );
throw new ArtifactDeploymentException( e.getMessage(), e );
}
repositorySystem.injectProxy( repositories, request.getProxies() );
repositorySystem.injectAuthentication( repositories, request.getServers() );
if ( snapshotKey != null )
{
for ( Object metadata : result.getMetadata() )
{
if ( metadata.getClass().getName().endsWith( ".internal.RemoteSnapshotMetadata" ) )
{
snapshots.put( snapshotKey, (MergeableMetadata) metadata );
}
}
}
return repository;
artifact.setResolvedVersion( result.getArtifacts().iterator().next().getVersion() );
}
}

View File

@ -20,21 +20,27 @@ package org.apache.maven.artifact.installer;
*/
import java.io.File;
import java.io.IOException;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataInstallationException;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
import org.apache.maven.repository.DefaultLocalRepositoryMaintainerEvent;
import org.apache.maven.repository.LocalRepositoryMaintainer;
import org.apache.maven.repository.LocalRepositoryMaintainerEvent;
import org.apache.maven.repository.legacy.resolver.transform.ArtifactTransformationManager;
import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.MetadataBridge;
import org.apache.maven.artifact.repository.metadata.Snapshot;
import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.project.artifact.ProjectArtifactMetadata;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.FileUtils;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.installation.InstallRequest;
import org.sonatype.aether.installation.InstallationException;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.artifact.SubArtifact;
/**
* @author Jason van Zyl
@ -44,14 +50,12 @@ public class DefaultArtifactInstaller
extends AbstractLogEnabled
implements ArtifactInstaller
{
@Requirement
private ArtifactTransformationManager transformationManager;
@Requirement
private RepositoryMetadataManager repositoryMetadataManager;
private RepositorySystem repoSystem;
@Requirement( optional = true )
private LocalRepositoryMaintainer localRepositoryMaintainer;
@Requirement
private LegacySupport legacySupport;
/** @deprecated we want to use the artifact method only, and ensure artifact.file is set correctly. */
@Deprecated
@ -67,59 +71,64 @@ public class DefaultArtifactInstaller
public void install( File source, Artifact artifact, ArtifactRepository localRepository )
throws ArtifactInstallationException
{
try
{
transformationManager.transformForInstall( artifact, localRepository );
DefaultRepositorySystemSession session =
new DefaultRepositorySystemSession( legacySupport.getRepositorySession() );
LocalRepository localRepo = new LocalRepository( localRepository.getBasedir() );
session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( localRepo ) );
String localPath = localRepository.pathOf( artifact );
InstallRequest request = new InstallRequest();
// TODO: use a file: wagon and the wagon manager?
File destination = new File( localRepository.getBasedir(), localPath );
if ( !destination.getParentFile().exists() )
org.sonatype.aether.artifact.Artifact mainArtifact = RepositoryUtils.toArtifact( artifact );
mainArtifact = mainArtifact.setFile( source );
request.addArtifact( mainArtifact );
for ( ArtifactMetadata metadata : artifact.getMetadataList() )
{
destination.getParentFile().mkdirs();
if ( metadata instanceof ProjectArtifactMetadata )
{
org.sonatype.aether.artifact.Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" );
pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() );
request.addArtifact( pomArtifact );
}
boolean copy =
!destination.exists() || "pom".equals( artifact.getType() )
|| source.lastModified() != destination.lastModified() || source.length() != destination.length();
if ( copy )
else if ( metadata instanceof SnapshotArtifactRepositoryMetadata
|| metadata instanceof ArtifactRepositoryMetadata )
{
getLogger().info( "Installing " + source + " to " + destination );
FileUtils.copyFile( source, destination );
destination.setLastModified( source.lastModified() );
// eaten, handled by repo system
}
else
{
getLogger().info( "Skipped re-installing " + source + " to " + destination + ", seems unchanged" );
request.addMetadata( new MetadataBridge( metadata ) );
}
}
// must be after the artifact is installed
for ( ArtifactMetadata metadata : artifact.getMetadataList() )
try
{
repositoryMetadataManager.install( metadata, localRepository );
repoSystem.install( session, request );
}
catch ( InstallationException e )
{
throw new ArtifactInstallationException( e.getMessage(), e );
}
// TODO: would like to flush this, but the plugin metadata is added in advance, not as an install/deploy
// transformation
// This would avoid the need to merge and clear out the state during deployment
// artifact.getMetadataList().clear();
if ( localRepositoryMaintainer != null )
/*
* NOTE: Not used by Maven core, only here to provide backward-compat with plugins like the Install Plugin.
*/
if ( artifact.isSnapshot() )
{
LocalRepositoryMaintainerEvent event =
new DefaultLocalRepositoryMaintainerEvent( localRepository, artifact, destination );
localRepositoryMaintainer.artifactInstalled( event );
Snapshot snapshot = new Snapshot();
snapshot.setLocalCopy( true );
artifact.addMetadata( new SnapshotArtifactRepositoryMetadata( artifact, snapshot ) );
}
}
catch ( IOException e )
Versioning versioning = new Versioning();
versioning.updateTimestamp();
versioning.addVersion( artifact.getBaseVersion() );
if ( artifact.isRelease() )
{
throw new ArtifactInstallationException( "Error installing artifact: " + e.getMessage(), e );
}
catch ( RepositoryMetadataInstallationException e )
{
throw new ArtifactInstallationException( "Error installing artifact's metadata: " + e.getMessage(), e );
versioning.setRelease( artifact.getBaseVersion() );
}
artifact.addMetadata( new ArtifactRepositoryMetadata( artifact, versioning ) );
}
}

View File

@ -22,7 +22,6 @@ import java.io.Reader;
import java.io.Writer;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -30,7 +29,6 @@ import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
@ -60,8 +58,7 @@ public class DefaultRepositoryMetadataManager
@Requirement
private UpdateCheckManager updateCheckManager;
public void resolve( RepositoryMetadata metadata, List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository )
public void resolve( RepositoryMetadata metadata, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository )
throws RepositoryMetadataResolutionException
{
RepositoryRequest request = new DefaultRepositoryRequest();
@ -73,41 +70,6 @@ public class DefaultRepositoryMetadataManager
public void resolve( RepositoryMetadata metadata, RepositoryRequest request )
throws RepositoryMetadataResolutionException
{
RepositoryCache cache = request.getCache();
CacheKey cacheKey = null;
if ( cache != null )
{
cacheKey = new CacheKey( metadata, request );
CacheRecord cacheRecord = (CacheRecord) cache.get( request, cacheKey );
if ( cacheRecord != null )
{
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "Resolved metadata from cache: " + metadata + " @ " + cacheRecord.repository );
}
metadata.setMetadata( MetadataUtils.cloneMetadata( cacheRecord.metadata ) );
if ( cacheRecord.repository != null )
{
for ( ArtifactRepository repository : request.getRemoteRepositories() )
{
if ( cacheRecord.repository.equals( repository.getId() ) )
{
metadata.setRepository( repository );
break;
}
}
}
return;
}
}
ArtifactRepository localRepository = request.getLocalRepository();
List<ArtifactRepository> remoteRepositories = request.getRemoteRepositories();
@ -209,13 +171,7 @@ public class DefaultRepositoryMetadataManager
}
catch ( RepositoryMetadataStoreException e )
{
throw new RepositoryMetadataResolutionException( "Unable to store local copy of metadata: "
+ e.getMessage(), e );
}
if ( cache != null )
{
cache.put( request, cacheKey, new CacheRecord( metadata ) );
throw new RepositoryMetadataResolutionException( "Unable to store local copy of metadata: " + e.getMessage(), e );
}
}
@ -226,130 +182,7 @@ public class DefaultRepositoryMetadataManager
return metadataFile.isFile() ? new Date( metadataFile.lastModified() ) : null;
}
private static final class CacheKey
{
final Object metadataKey;
final ArtifactRepository localRepository;
final List<ArtifactRepository> remoteRepositories;
final int hashCode;
CacheKey( RepositoryMetadata metadata, RepositoryRequest request )
{
metadataKey = metadata.getKey();
localRepository = request.getLocalRepository();
remoteRepositories = request.getRemoteRepositories();
int hash = 17;
hash = hash * 31 + metadata.getKey().hashCode();
hash = hash * 31 + repoHashCode( localRepository );
for ( ArtifactRepository remoteRepository : remoteRepositories )
{
hash = hash * 31 + repoHashCode( remoteRepository );
}
hashCode = hash;
}
int repoHashCode( ArtifactRepository repository )
{
return ( repository != null && repository.getUrl() != null ) ? repository.getUrl().hashCode() : 0;
}
boolean repoEquals( ArtifactRepository repo1, ArtifactRepository repo2 )
{
if ( repo1 == repo2 )
{
return true;
}
if ( repo1 == null || repo2 == null )
{
return false;
}
return equal( repo1.getUrl(), repo2.getUrl() ) && repo1.getClass() == repo2.getClass();
}
private static <T> boolean equal( T s1, T s2 )
{
return s1 != null ? s1.equals( s2 ) : s2 == null;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
{
return true;
}
if ( !( obj instanceof CacheKey ) )
{
return false;
}
CacheKey that = (CacheKey) obj;
if ( !this.metadataKey.equals( that.metadataKey ) )
{
return false;
}
if ( !repoEquals( this.localRepository, that.localRepository ) )
{
return false;
}
for ( Iterator<ArtifactRepository> it1 = this.remoteRepositories.iterator(), it2 =
that.remoteRepositories.iterator();; )
{
if ( !it1.hasNext() || !it2.hasNext() )
{
if ( it1.hasNext() != it2.hasNext() )
{
return false;
}
break;
}
ArtifactRepository repo1 = it1.next();
ArtifactRepository repo2 = it2.next();
if ( !repoEquals( repo1, repo2 ) )
{
return false;
}
}
return true;
}
@Override
public int hashCode()
{
return hashCode;
}
}
private static final class CacheRecord
{
final Metadata metadata;
final String repository;
CacheRecord( RepositoryMetadata metadata )
{
this.metadata = MetadataUtils.cloneMetadata( metadata.getMetadata() );
this.repository = ( metadata.getRepository() != null ) ? metadata.getRepository().getId() : null;
}
}
private void mergeMetadata( RepositoryMetadata metadata, List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository )
private void mergeMetadata( RepositoryMetadata metadata, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository )
throws RepositoryMetadataStoreException
{
// TODO: currently this is first wins, but really we should take the latest by comparing either the
@ -378,9 +211,7 @@ public class DefaultRepositoryMetadataManager
updateSnapshotMetadata( metadata, previousMetadata, selected, localRepository );
}
private void updateSnapshotMetadata( RepositoryMetadata metadata,
Map<ArtifactRepository, Metadata> previousMetadata,
ArtifactRepository selected, ArtifactRepository localRepository )
private void updateSnapshotMetadata( RepositoryMetadata metadata, Map<ArtifactRepository, Metadata> previousMetadata, ArtifactRepository selected, ArtifactRepository localRepository )
throws RepositoryMetadataStoreException
{
// TODO: this could be a lot nicer... should really be in the snapshot transformation?
@ -405,8 +236,7 @@ public class DefaultRepositoryMetadataManager
}
else
{
if ( ( m.getVersioning() != null ) && ( m.getVersioning().getSnapshot() != null )
&& m.getVersioning().getSnapshot().isLocalCopy() )
if ( ( m.getVersioning() != null ) && ( m.getVersioning().getSnapshot() != null ) && m.getVersioning().getSnapshot().isLocalCopy() )
{
m.getVersioning().getSnapshot().setLocalCopy( false );
metadata.setMetadata( m );
@ -419,14 +249,11 @@ public class DefaultRepositoryMetadataManager
}
}
private boolean loadMetadata( RepositoryMetadata repoMetadata, ArtifactRepository remoteRepository,
ArtifactRepository localRepository, Map<ArtifactRepository, Metadata> previousMetadata )
private boolean loadMetadata( RepositoryMetadata repoMetadata, ArtifactRepository remoteRepository, ArtifactRepository localRepository, Map<ArtifactRepository, Metadata> previousMetadata )
{
boolean setRepository = false;
File metadataFile =
new File( localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata( repoMetadata,
remoteRepository ) );
File metadataFile = new File( localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata( repoMetadata, remoteRepository ) );
if ( metadataFile.exists() )
{
@ -488,13 +315,11 @@ public class DefaultRepositoryMetadataManager
}
catch ( IOException e )
{
throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "': "
+ e.getMessage(), e );
throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "': " + e.getMessage(), e );
}
catch ( XmlPullParserException e )
{
throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "': "
+ e.getMessage(), e );
throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "': " + e.getMessage(), e );
}
finally
{
@ -505,8 +330,8 @@ public class DefaultRepositoryMetadataManager
}
/**
* Ensures the last updated timestamp of the specified metadata does not refer to the future and fixes the local
* metadata if necessary to allow proper merging/updating of metadata during deployment.
* Ensures the last updated timestamp of the specified metadata does not refer to the future and fixes the local metadata if necessary to allow
* proper merging/updating of metadata during deployment.
*/
private void fixTimestamp( File metadataFile, Metadata metadata, Metadata reference )
{
@ -562,8 +387,7 @@ public class DefaultRepositoryMetadataManager
}
}
public void resolveAlways( RepositoryMetadata metadata, ArtifactRepository localRepository,
ArtifactRepository remoteRepository )
public void resolveAlways( RepositoryMetadata metadata, ArtifactRepository localRepository, ArtifactRepository remoteRepository )
throws RepositoryMetadataResolutionException
{
File file;
@ -573,8 +397,7 @@ public class DefaultRepositoryMetadataManager
}
catch ( TransferFailedException e )
{
throw new RepositoryMetadataResolutionException( metadata + " could not be retrieved from repository: "
+ remoteRepository.getId() + " due to an error: " + e.getMessage(), e );
throw new RepositoryMetadataResolutionException( metadata + " could not be retrieved from repository: " + remoteRepository.getId() + " due to an error: " + e.getMessage(), e );
}
try
@ -591,24 +414,18 @@ public class DefaultRepositoryMetadataManager
}
}
private File getArtifactMetadataFromDeploymentRepository( ArtifactMetadata metadata,
ArtifactRepository localRepository,
ArtifactRepository remoteRepository )
private File getArtifactMetadataFromDeploymentRepository( ArtifactMetadata metadata, ArtifactRepository localRepository, ArtifactRepository remoteRepository )
throws TransferFailedException
{
File file =
new File( localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata( metadata,
remoteRepository ) );
File file = new File( localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata( metadata, remoteRepository ) );
try
{
wagonManager.getArtifactMetadataFromDeploymentRepository( metadata, remoteRepository, file,
ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
wagonManager.getArtifactMetadataFromDeploymentRepository( metadata, remoteRepository, file, ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
}
catch ( ResourceDoesNotExistException e )
{
getLogger().info( metadata + " could not be found on repository: " + remoteRepository.getId()
+ ", so will be created" );
getLogger().info( metadata + " could not be found on repository: " + remoteRepository.getId() + ", so will be created" );
// delete the local copy so the old details aren't used.
if ( file.exists() )
@ -626,8 +443,7 @@ public class DefaultRepositoryMetadataManager
return file;
}
public void deploy( ArtifactMetadata metadata, ArtifactRepository localRepository,
ArtifactRepository deploymentRepository )
public void deploy( ArtifactMetadata metadata, ArtifactRepository localRepository, ArtifactRepository deploymentRepository )
throws RepositoryMetadataDeploymentException
{
File file;
@ -640,8 +456,7 @@ public class DefaultRepositoryMetadataManager
}
catch ( TransferFailedException e )
{
throw new RepositoryMetadataDeploymentException( metadata + " could not be retrieved from repository: "
+ deploymentRepository.getId() + " due to an error: " + e.getMessage(), e );
throw new RepositoryMetadataDeploymentException( metadata + " could not be retrieved from repository: " + deploymentRepository.getId() + " due to an error: " + e.getMessage(), e );
}
if ( file.isFile() )
@ -659,9 +474,7 @@ public class DefaultRepositoryMetadataManager
else
{
// It's a POM - we don't need to retrieve it first
file =
new File( localRepository.getBasedir(),
localRepository.pathOfLocalRepositoryMetadata( metadata, deploymentRepository ) );
file = new File( localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata( metadata, deploymentRepository ) );
}
try

View File

@ -0,0 +1,157 @@
package org.apache.maven.artifact.repository.metadata;
/*
* 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 java.io.File;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
import org.codehaus.plexus.util.FileUtils;
import org.sonatype.aether.RepositoryException;
import org.sonatype.aether.metadata.MergeableMetadata;
/**
* <strong>Warning:</strong> This is an internal utility class that is only public for technical reasons, it is not part
* of the public API. In particular, this class can be changed or deleted without prior notice.
*
* @author Benjamin Bentmann
*/
public final class MetadataBridge
implements MergeableMetadata
{
private ArtifactMetadata metadata;
private boolean merged;
public MetadataBridge( ArtifactMetadata metadata )
{
this.metadata = metadata;
}
public void merge( File current, File result )
throws RepositoryException
{
try
{
if ( current.exists() )
{
FileUtils.copyFile( current, result );
}
ArtifactRepository localRepo = new MetadataRepository( result );
metadata.storeInLocalRepository( localRepo, localRepo );
merged = true;
}
catch ( Exception e )
{
throw new RepositoryException( e.getMessage(), e );
}
}
public boolean isMerged()
{
return merged;
}
public String getGroupId()
{
return emptify( metadata.getGroupId() );
}
public String getArtifactId()
{
return metadata.storedInGroupDirectory() ? "" : emptify( metadata.getArtifactId() );
}
public String getVersion()
{
return metadata.storedInArtifactVersionDirectory() ? emptify( metadata.getBaseVersion() ) : "";
}
public String getType()
{
return metadata.getRemoteFilename();
}
private String emptify( String string )
{
return ( string != null ) ? string : "";
}
public File getFile()
{
return null;
}
public MetadataBridge setFile( File file )
{
return this;
}
public Nature getNature()
{
if ( metadata instanceof RepositoryMetadata )
{
switch ( ( (RepositoryMetadata) metadata ).getNature() )
{
case RepositoryMetadata.RELEASE_OR_SNAPSHOT:
return Nature.RELEASE_OR_SNAPSHOT;
case RepositoryMetadata.SNAPSHOT:
return Nature.SNAPSHOT;
default:
return Nature.RELEASE;
}
}
else
{
return Nature.RELEASE;
}
}
@SuppressWarnings( "deprecation" )
static class MetadataRepository
extends DefaultArtifactRepository
{
private File metadataFile;
public MetadataRepository( File metadataFile )
{
super( "local", "", null );
this.metadataFile = metadataFile;
}
@Override
public String getBasedir()
{
return metadataFile.getParent();
}
@Override
public String pathOfLocalRepositoryMetadata( ArtifactMetadata metadata, ArtifactRepository repository )
{
return metadataFile.getName();
}
}
}

View File

@ -1,26 +1,21 @@
package org.apache.maven.artifact.resolver;
/*
* 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
* 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.
* 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 java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
@ -37,40 +32,32 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.metadata.ResolutionGroup;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Snapshot;
import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.repository.DefaultLocalRepositoryMaintainerEvent;
import org.apache.maven.repository.LocalRepositoryMaintainer;
import org.apache.maven.repository.LocalRepositoryMaintainerEvent;
import org.apache.maven.repository.legacy.TransferListenerAdapter;
import org.apache.maven.repository.legacy.WagonManager;
import org.apache.maven.repository.legacy.metadata.ArtifactMetadata;
import org.apache.maven.repository.legacy.metadata.DefaultMetadataResolutionRequest;
import org.apache.maven.repository.legacy.metadata.MetadataResolutionRequest;
import org.apache.maven.repository.legacy.resolver.conflict.ConflictResolver;
import org.apache.maven.repository.legacy.resolver.transform.ArtifactTransformationManager;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.events.TransferListener;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.FileUtils;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.resolution.ArtifactRequest;
import org.sonatype.aether.resolution.ArtifactResult;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
/**
* @author Jason van Zyl
@ -82,12 +69,6 @@ public class DefaultArtifactResolver
@Requirement
private Logger logger;
@Requirement
private WagonManager wagonManager;
@Requirement
private ArtifactTransformationManager transformationManager;
@Requirement
protected ArtifactFactory artifactFactory;
@ -103,12 +84,12 @@ public class DefaultArtifactResolver
@Requirement
private PlexusContainer container;
@Requirement( optional = true )
private LocalRepositoryMaintainer localRepositoryMaintainer;
@Requirement
private LegacySupport legacySupport;
@Requirement
private RepositorySystem repoSystem;
private final Executor executor;
public DefaultArtifactResolver()
@ -141,13 +122,32 @@ public class DefaultArtifactResolver
}
}
private RepositorySystemSession getSession( ArtifactRepository localRepository )
{
MavenSession mavenSession = legacySupport.getSession();
DefaultRepositorySystemSession session;
if ( mavenSession != null )
{
session = new DefaultRepositorySystemSession( mavenSession.getRepositorySession() );
}
else
{
session = new DefaultRepositorySystemSession();
}
if ( localRepository != null && localRepository.getBasedir() != null )
{
LocalRepository localRepo = new LocalRepository( localRepository.getBasedir() );
session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( localRepo ) );
}
return session;
}
private void injectSession1( RepositoryRequest request, MavenSession session )
{
if ( session != null )
{
request.setOffline( session.isOffline() );
request.setForceUpdate( session.getRequest().isUpdateSnapshots() );
request.setTransferListener( session.getRequest().getTransferListener() );
}
}
@ -163,30 +163,19 @@ public class DefaultArtifactResolver
}
}
public void resolve( Artifact artifact, List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository, TransferListener resolutionListener )
public void resolve( Artifact artifact, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository, TransferListener resolutionListener )
throws ArtifactResolutionException, ArtifactNotFoundException
{
RepositoryRequest request = new DefaultRepositoryRequest();
injectSession1( request, legacySupport.getSession() );
request.setLocalRepository( localRepository );
request.setRemoteRepositories( remoteRepositories );
resolve( artifact, request, resolutionListener, false );
resolve( artifact, remoteRepositories, getSession( localRepository ) );
}
public void resolveAlways( Artifact artifact, List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository )
public void resolveAlways( Artifact artifact, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository )
throws ArtifactResolutionException, ArtifactNotFoundException
{
RepositoryRequest request = new DefaultRepositoryRequest();
injectSession1( request, legacySupport.getSession() );
request.setLocalRepository( localRepository );
request.setRemoteRepositories( remoteRepositories );
resolve( artifact, request, null, true );
resolve( artifact, remoteRepositories, getSession( localRepository ) );
}
private void resolve( Artifact artifact, RepositoryRequest request, TransferListener downloadMonitor,
boolean force )
private void resolve( Artifact artifact, List<ArtifactRepository> remoteRepositories, RepositorySystemSession session )
throws ArtifactResolutionException, ArtifactNotFoundException
{
if ( artifact == null )
@ -194,28 +183,23 @@ public class DefaultArtifactResolver
return;
}
File destination;
if ( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
{
File systemFile = artifact.getFile();
if ( systemFile == null )
{
throw new ArtifactNotFoundException( "System artifact: " + artifact + " has no file attached",
artifact );
throw new ArtifactNotFoundException( "System artifact: " + artifact + " has no file attached", artifact );
}
if ( !systemFile.exists() )
{
throw new ArtifactNotFoundException( "System artifact: " + artifact + " not found in path: "
+ systemFile, artifact );
throw new ArtifactNotFoundException( "System artifact: " + artifact + " not found in path: " + systemFile, artifact );
}
if ( !systemFile.isFile() )
{
throw new ArtifactNotFoundException( "System artifact: " + artifact + " is not a file: " + systemFile,
artifact );
throw new ArtifactNotFoundException( "System artifact: " + artifact + " is not a file: " + systemFile, artifact );
}
artifact.setResolved( true );
@ -223,237 +207,81 @@ public class DefaultArtifactResolver
return;
}
ArtifactRepository localRepository = request.getLocalRepository();
List<ArtifactRepository> remoteRepositories = request.getRemoteRepositories();
if ( !artifact.isResolved() )
{
// ----------------------------------------------------------------------
// Check for the existence of the artifact in the specified local
// ArtifactRepository. If it is present then simply return as the
// request for resolution has been satisfied.
// ----------------------------------------------------------------------
ArtifactResult result;
artifact = localRepository.find( artifact );
if ( artifact.isResolved() )
{
return;
}
transformationManager.transformForResolve( artifact, request );
destination = artifact.getFile();
if ( !request.isOffline() && ( force || !destination.exists() || isMutable( artifact ) ) )
{
try
{
if ( artifact.getRepository() != null )
ArtifactRequest artifactRequest = new ArtifactRequest();
artifactRequest.setArtifact( RepositoryUtils.toArtifact( artifact ) );
artifactRequest.setRepositories( RepositoryUtils.toRepos( remoteRepositories ) );
result = repoSystem.resolveArtifact( session, artifactRequest );
}
catch ( org.sonatype.aether.resolution.ArtifactResolutionException e )
{
// the transformations discovered the artifact - so use it exclusively
wagonManager.getArtifact( artifact, artifact.getRepository(), downloadMonitor,
request.isForceUpdate() );
}
else
{
wagonManager.getArtifact( artifact, remoteRepositories, downloadMonitor,
request.isForceUpdate() );
}
if ( localRepositoryMaintainer != null )
{
LocalRepositoryMaintainerEvent event =
new DefaultLocalRepositoryMaintainerEvent( localRepository, artifact, null );
localRepositoryMaintainer.artifactDownloaded( event );
}
}
catch ( ResourceDoesNotExistException e )
if ( e.getCause() instanceof org.sonatype.aether.transfer.ArtifactNotFoundException )
{
throw new ArtifactNotFoundException( e.getMessage(), artifact, remoteRepositories, e );
}
catch ( TransferFailedException e )
else
{
throw new ArtifactResolutionException( e.getMessage(), artifact, remoteRepositories, e );
}
}
if ( destination.exists() )
{
artifact.selectVersion( result.getArtifact().getVersion() );
artifact.setFile( result.getArtifact().getFile() );
artifact.setResolved( true );
}
else
{
if ( request.isOffline() )
{
throw new ArtifactResolutionException( "The repository system is offline"
+ " and the requested artifact is not locally available at " + destination, artifact,
remoteRepositories );
}
else
{
throw new ArtifactResolutionException( "Failed to resolve artifact, possibly due to a "
+ "repository list that is not appropriately equipped for this artifact's metadata.", artifact,
remoteRepositories );
}
}
// 1.0-SNAPSHOT
//
// 1) pom = 1.0-SNAPSHOT
// 2) pom = 1.0-yyyymmdd.hhmmss
// 3) baseVersion = 1.0-SNAPSHOT
if ( artifact.isSnapshot() && isTimestamped( artifact ) )
{
String version = artifact.getVersion();
// 1.0-SNAPSHOT
artifact.selectVersion( artifact.getBaseVersion() );
// Make a file with a 1.0-SNAPSHOT format
File copy = new File( localRepository.getBasedir(), localRepository.pathOf( artifact ) );
// if the timestamped version was resolved or the copy doesn't exist then copy a version
// of the file like 1.0-SNAPSHOT. Even if there is a timestamped version the non-timestamped
// version will be created.
if ( !copy.exists() || copy.lastModified() != destination.lastModified()
|| copy.length() != destination.length() )
{
// recopy file if it was reresolved, or doesn't exist.
try
{
FileUtils.copyFile( destination, copy );
copy.setLastModified( destination.lastModified() );
}
catch ( IOException e )
{
throw new ArtifactResolutionException( "Unable to copy resolved artifact for local use: "
+ e.getMessage(), artifact, remoteRepositories, e );
}
}
// We are only going to use the 1.0-SNAPSHOT version
artifact.setFile( copy );
// Set the version to the 1.0-yyyymmdd.hhmmss version
artifact.selectVersion( version );
}
}
}
private boolean isMutable( Artifact artifact )
{
return artifact.isSnapshot() && !isTimestamped( artifact ) && !isLocalCopy( artifact );
}
private boolean isTimestamped( Artifact artifact )
{
return !artifact.getBaseVersion().equals( artifact.getVersion() );
}
private boolean isLocalCopy( Artifact artifact )
{
boolean localCopy = false;
for ( ArtifactMetadata m : artifact.getMetadataList() )
{
if ( m instanceof SnapshotArtifactRepositoryMetadata )
{
SnapshotArtifactRepositoryMetadata snapshotMetadata = (SnapshotArtifactRepositoryMetadata) m;
Metadata metadata = snapshotMetadata.getMetadata();
if ( metadata != null )
{
Versioning versioning = metadata.getVersioning();
if ( versioning != null )
{
Snapshot snapshot = versioning.getSnapshot();
if ( snapshot != null )
{
// TODO is it possible to have more than one SnapshotArtifactRepositoryMetadata
localCopy = snapshot.isLocalCopy();
}
}
}
}
}
return localCopy;
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories,
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter )
throws ArtifactResolutionException, ArtifactNotFoundException
{
return resolveTransitively( artifacts, originatingArtifact, Collections.EMPTY_MAP, localRepository,
remoteRepositories, source, filter );
return resolveTransitively( artifacts, originatingArtifact, Collections.EMPTY_MAP, localRepository, remoteRepositories, source, filter );
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories,
ArtifactMetadataSource source )
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ArtifactMetadataSource source )
throws ArtifactResolutionException, ArtifactNotFoundException
{
return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository,
remoteRepositories, source, null );
return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository, remoteRepositories, source, null );
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter )
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter )
throws ArtifactResolutionException, ArtifactNotFoundException
{
return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository,
remoteRepositories, source, filter, null );
return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository, remoteRepositories, source, filter, null );
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository,
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository,
ArtifactMetadataSource source )
throws ArtifactResolutionException, ArtifactNotFoundException
{
return resolveTransitively( artifacts, originatingArtifact, localRepository, remoteRepositories, source, null );
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository,
ArtifactMetadataSource source,
List<ResolutionListener> listeners )
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository,
ArtifactMetadataSource source, List<ResolutionListener> listeners )
throws ArtifactResolutionException, ArtifactNotFoundException
{
return resolveTransitively( artifacts, originatingArtifact, Collections.EMPTY_MAP, localRepository,
remoteRepositories, source, null, listeners );
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter,
List<ResolutionListener> listeners )
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter, List<ResolutionListener> listeners )
throws ArtifactResolutionException, ArtifactNotFoundException
{
return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository,
remoteRepositories, source, filter, listeners, null );
return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository, remoteRepositories, source, filter, listeners, null );
}
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact,
Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter,
List<ResolutionListener> listeners,
public ArtifactResolutionResult resolveTransitively( Set<Artifact> artifacts, Artifact originatingArtifact, Map managedVersions, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter, List<ResolutionListener> listeners,
List<ConflictResolver> conflictResolvers )
throws ArtifactResolutionException, ArtifactNotFoundException
{
@ -499,7 +327,7 @@ public class DefaultArtifactResolver
List<ResolutionListener> listeners = request.getListeners();
ArtifactFilter collectionFilter = request.getCollectionFilter();
ArtifactFilter resolutionFilter = request.getResolutionFilter();
TransferListener transferListener = TransferListenerAdapter.newAdapter( request.getTransferListener() );
RepositorySystemSession session = getSession( request.getLocalRepository() );
//TODO: hack because metadata isn't generated in m2e correctly and i want to run the maven i have in the workspace
if ( source == null )
@ -537,7 +365,7 @@ public class DefaultArtifactResolver
{
try
{
resolve( rootArtifact, request, transferListener, false );
resolve( rootArtifact, request.getRemoteRepositories(), session );
}
catch ( ArtifactResolutionException e )
{
@ -628,8 +456,7 @@ public class DefaultArtifactResolver
// so we give this back to the calling code and let them deal with this information
// appropriately.
if ( result.hasMetadataResolutionExceptions() || result.hasVersionRangeViolations()
|| result.hasCircularDependencyExceptions() )
if ( result.hasMetadataResolutionExceptions() || result.hasVersionRangeViolations() || result.hasCircularDependencyExceptions() )
{
return result;
}
@ -646,11 +473,8 @@ public class DefaultArtifactResolver
if ( resolutionFilter == null || resolutionFilter.include( artifact ) )
{
ArtifactResolutionRequest childRequest = new ArtifactResolutionRequest( request );
childRequest.setRemoteRepositories( node.getRemoteRepositories() );
executor.execute( new ResolveTask( classLoader, latch, artifact, transferListener, childRequest,
result ) );
executor.execute( new ResolveTask( classLoader, latch, artifact, session,
node.getRemoteRepositories(), result ) );
}
else
{
@ -682,8 +506,7 @@ public class DefaultArtifactResolver
return result;
}
public void resolve( Artifact artifact, List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository )
public void resolve( Artifact artifact, List<ArtifactRepository> remoteRepositories, ArtifactRepository localRepository )
throws ArtifactResolutionException, ArtifactNotFoundException
{
resolve( artifact, remoteRepositories, localRepository, null );
@ -719,21 +542,20 @@ public class DefaultArtifactResolver
private final Artifact artifact;
private final TransferListener transferListener;
private final RepositorySystemSession session;
private final ArtifactResolutionRequest request;
private final List<ArtifactRepository> remoteRepositories;
private final ArtifactResolutionResult result;
public ResolveTask( ClassLoader classLoader, CountDownLatch latch, Artifact artifact,
TransferListener transferListener, ArtifactResolutionRequest request,
ArtifactResolutionResult result )
public ResolveTask( ClassLoader classLoader, CountDownLatch latch, Artifact artifact, RepositorySystemSession session,
List<ArtifactRepository> remoteRepositories, ArtifactResolutionResult result )
{
this.classLoader = classLoader;
this.latch = latch;
this.artifact = artifact;
this.transferListener = transferListener;
this.request = request;
this.session = session;
this.remoteRepositories = remoteRepositories;
this.result = result;
}
@ -742,7 +564,7 @@ public class DefaultArtifactResolver
try
{
Thread.currentThread().setContextClassLoader( classLoader );
resolve( artifact, request, transferListener, false );
resolve( artifact, remoteRepositories, session );
}
catch ( ArtifactNotFoundException anfe )
{

View File

@ -94,6 +94,7 @@ public class DefaultMavenProjectBuilder
MavenSession session = legacySupport.getSession();
if ( session != null )
{
request.setRepositorySession( session.getRepositorySession() );
request.setOffline( session.isOffline() );
request.setSystemProperties( session.getSystemProperties() );
if ( request.getUserProperties().isEmpty() )
@ -108,7 +109,6 @@ public class DefaultMavenProjectBuilder
request.setMirrors( req.getMirrors() );
request.setProxies( req.getProxies() );
request.setRemoteRepositories( req.getRemoteRepositories() );
request.setTransferListener( req.getTransferListener() );
request.setForceUpdate( req.isUpdateSnapshots() );
}
}

View File

@ -83,7 +83,6 @@ public class DefaultLegacyArtifactCollector
request.setServers( session.getRequest().getServers() );
request.setMirrors( session.getRequest().getMirrors() );
request.setProxies( session.getRequest().getProxies() );
request.setTransferListener( session.getRequest().getTransferListener() );
}
}

View File

@ -29,11 +29,33 @@ import java.util.List;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenSession;
import org.codehaus.plexus.PlexusTestCase;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.collection.DependencyGraphTransformer;
import org.sonatype.aether.collection.DependencyManager;
import org.sonatype.aether.collection.DependencySelector;
import org.sonatype.aether.collection.DependencyTraverser;
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.graph.manager.ClassicDependencyManager;
import org.sonatype.aether.util.graph.selector.AndDependencySelector;
import org.sonatype.aether.util.graph.selector.ExclusionDependencySelector;
import org.sonatype.aether.util.graph.selector.OptionalDependencySelector;
import org.sonatype.aether.util.graph.selector.ScopeDependencySelector;
import org.sonatype.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
import org.sonatype.aether.util.graph.transformer.NearestVersionConflictResolver;
import org.sonatype.aether.util.graph.transformer.ConflictMarker;
import org.sonatype.aether.util.graph.transformer.JavaDependencyContextRefiner;
import org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator;
import org.sonatype.aether.util.graph.traverser.FatArtifactTraverser;
/**
* @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
@ -53,6 +75,14 @@ public abstract class AbstractArtifactComponentTestCase
super.setUp();
artifactFactory = lookup( ArtifactFactory.class);
artifactRepositoryFactory = lookup( ArtifactRepositoryFactory.class );
RepositorySystemSession repoSession = initRepoSession();
MavenSession session =
new MavenSession( getContainer(), repoSession, new DefaultMavenExecutionRequest(),
new DefaultMavenExecutionResult() );
LegacySupport legacySupport = lookup(LegacySupport.class);
legacySupport.setSession( session );
}
@Override
@ -297,4 +327,33 @@ public abstract class AbstractArtifactComponentTestCase
}
}
}
protected RepositorySystemSession initRepoSession()
throws Exception
{
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
session.setIgnoreMissingArtifactDescriptor( true );
session.setIgnoreInvalidArtifactDescriptor( true );
DependencyTraverser depTraverser = new FatArtifactTraverser();
session.setDependencyTraverser( depTraverser );
DependencyManager depManager = new ClassicDependencyManager();
session.setDependencyManager( depManager );
DependencySelector depFilter =
new AndDependencySelector( new ScopeDependencySelector( "test", "provided" ),
new OptionalDependencySelector(), new ExclusionDependencySelector() );
session.setDependencySelector( depFilter );
DependencyGraphTransformer transformer =
new ChainedDependencyGraphTransformer( new ConflictMarker(), new JavaEffectiveScopeCalculator(),
new NearestVersionConflictResolver(),
new JavaDependencyContextRefiner() );
session.setDependencyGraphTransformer( transformer );
session.setLocalRepositoryManager( new SimpleLocalRepositoryManager( localRepository().getBasedir() ) );
return session;
}
}

View File

@ -27,6 +27,7 @@ import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.model.building.ModelBuildingException;
import org.apache.maven.model.building.ModelProblem;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.internal.MavenRepositorySystemSession;
import org.codehaus.plexus.PlexusTestCase;
/**
@ -129,6 +130,7 @@ public abstract class AbstractMavenProjectTestCase
configuration.setRemoteRepositories( Arrays.asList( new ArtifactRepository[] {} ) );
configuration.setProcessPlugins( false );
configuration.setResolveDependencies( true );
initRepoSession( configuration );
try
{
@ -157,8 +159,17 @@ public abstract class AbstractMavenProjectTestCase
{
ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
configuration.setLocalRepository( getLocalRepository() );
initRepoSession( configuration );
return projectBuilder.build( pom, configuration ).getProject();
}
protected void initRepoSession( ProjectBuildingRequest request )
{
File localRepo = new File( request.getLocalRepository().getBasedir() );
MavenRepositorySystemSession session = new MavenRepositorySystemSession();
session.setLocalRepositoryManager( new LegacyLocalRepositoryManager( localRepo ) );
request.setRepositorySession( session );
}
}

View File

@ -0,0 +1,82 @@
package org.apache.maven.project;
/*
* 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 java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.impl.ArtifactResolver;
import org.sonatype.aether.impl.internal.DefaultArtifactResolver;
import org.sonatype.aether.resolution.ArtifactRequest;
import org.sonatype.aether.resolution.ArtifactResolutionException;
import org.sonatype.aether.resolution.ArtifactResult;
import org.sonatype.aether.transfer.ArtifactNotFoundException;
/**
* @author Benjamin Bentmann
*/
@Component( role = ArtifactResolver.class, hint = "classpath" )
public class ClasspathArtifactResolver
extends DefaultArtifactResolver
{
public List<ArtifactResult> resolveArtifacts( RepositorySystemSession session,
Collection<? extends ArtifactRequest> requests )
throws ArtifactResolutionException
{
List<ArtifactResult> results = new ArrayList<ArtifactResult>();
for ( ArtifactRequest request : requests )
{
ArtifactResult result = new ArtifactResult( request );
results.add( result );
Artifact artifact = request.getArtifact();
if ( "maven-test".equals( artifact.getGroupId() ) )
{
String scope = artifact.getArtifactId().substring( "scope-".length() );
try
{
artifact = artifact.setFile( ProjectClasspathTest.getFileForClasspathResource( ProjectClasspathTest.dir
+ "transitive-" + scope + "-dep.xml" ) );
result.setArtifact( artifact );
}
catch ( FileNotFoundException e )
{
throw new IllegalStateException( "Missing test POM for " + artifact );
}
}
else
{
result.addException( new ArtifactNotFoundException( artifact, null ) );
throw new ArtifactResolutionException( results );
}
}
return results;
}
}

View File

@ -26,17 +26,9 @@ import java.util.Set;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.*;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
/**
* A stub implementation that assumes an empty lifecycle to bypass interaction with the plugin manager and to avoid
@ -49,8 +41,6 @@ public class EmptyLifecycleExecutor
{
public MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
MojoNotFoundException
{
return new MavenExecutionPlan(null, null, null, new DefaultLifecycles() );
}
@ -102,14 +92,10 @@ public class EmptyLifecycleExecutor
}
public void calculateForkedExecutions( MojoExecution mojoExecution, MavenSession session )
throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
{
}
public List<MavenProject> executeForkedExecutions( MojoExecution mojoExecution, MavenSession session )
throws LifecycleExecutionException
{
return Collections.emptyList();
}

View File

@ -0,0 +1,78 @@
package org.apache.maven.project;
/*
* 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 java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.maven.lifecycle.LifeCyclePluginAnalyzer;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
/**
* @author Benjamin Bentmann
*/
public class EmptyLifecyclePluginAnalyzer
implements LifeCyclePluginAnalyzer
{
public Set<Plugin> getPluginsBoundByDefaultToAllLifecycles( String packaging )
{
Set<Plugin> plugins;
// NOTE: The upper-case packaging name is intentional, that's a special hinting mode used for certain tests
if ( "JAR".equals( packaging ) )
{
plugins = new LinkedHashSet<Plugin>();
plugins.add( newPlugin( "maven-compiler-plugin", "compile", "testCompile" ) );
plugins.add( newPlugin( "maven-resources-plugin", "resources", "testResources" ) );
plugins.add( newPlugin( "maven-surefire-plugin", "test" ) );
plugins.add( newPlugin( "maven-jar-plugin", "jar" ) );
plugins.add( newPlugin( "maven-install-plugin", "install" ) );
plugins.add( newPlugin( "maven-deploy-plugin", "deploy" ) );
}
else
{
plugins = Collections.emptySet();
}
return plugins;
}
private Plugin newPlugin( String artifactId, String... goals )
{
Plugin plugin = new Plugin();
plugin.setGroupId( "org.apache.maven.plugins" );
plugin.setArtifactId( artifactId );
for ( String goal : goals )
{
PluginExecution pluginExecution = new PluginExecution();
pluginExecution.setId( "default-" + goal );
pluginExecution.addGoal( goal );
plugin.addExecution( pluginExecution );
}
return plugin;
}
}

View File

@ -0,0 +1,59 @@
package org.apache.maven.project;
/*
* 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 java.io.File;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
/**
* @author Benjamin Bentmann
*/
public class LegacyLocalRepositoryManager
extends SimpleLocalRepositoryManager
{
public LegacyLocalRepositoryManager( File basedir )
{
super( basedir );
}
public String getPathForLocalArtifact( Artifact artifact )
{
StringBuilder path = new StringBuilder( 128 );
path.append( artifact.getGroupId() ).append( '/' );
path.append( artifact.getExtension() ).append( 's' ).append( '/' );
path.append( artifact.getArtifactId() ).append( '-' ).append( artifact.getVersion() );
if ( artifact.getClassifier().length() > 0 )
{
path.append( '-' ).append( artifact.getClassifier() );
}
path.append( '.' ).append( artifact.getExtension() );
return path.toString();
}
}

View File

@ -24,6 +24,9 @@ import java.util.Iterator;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader;
import org.sonatype.aether.impl.ArtifactDescriptorReader;
import org.sonatype.aether.impl.ArtifactResolver;
public class ProjectClasspathTest
extends AbstractMavenProjectTestCase
@ -33,6 +36,10 @@ public class ProjectClasspathTest
public void setUp()
throws Exception
{
ArtifactResolver resolver = lookup( ArtifactResolver.class, "classpath" );
DefaultArtifactDescriptorReader pomReader = (DefaultArtifactDescriptorReader)lookup(ArtifactDescriptorReader.class);
pomReader.setArtifactResolver( resolver );
projectBuilder = lookup( ProjectBuilder.class, "classpath" );
// the metadata source looks up the default impl, so we have to trick it

View File

@ -24,11 +24,17 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryPolicy;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.PlexusTestCase;
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
/**
* Tests {@link LegacyRepositorySystem}.
@ -107,6 +113,12 @@ public class LegacyRepositorySystemTest
.setRemoteRepositories( getRemoteRepositories() )
.setLocalRepository( getLocalRepository() );
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
session.setLocalRepositoryManager( new SimpleLocalRepositoryManager( request.getLocalRepository().getBasedir() ) );
LegacySupport legacySupport = lookup( LegacySupport.class );
legacySupport.setSession( new MavenSession( getContainer(), session, new DefaultMavenExecutionRequest(),
new DefaultMavenExecutionResult() ) );
ArtifactResolutionResult result = repositorySystem.resolve( request );
resolutionErrorHandler.throwErrors( request, result );
assertEquals( 2, result.getArtifacts().size() );

View File

@ -1,83 +0,0 @@
package org.apache.maven.repository.ideworkspace;
import java.io.File;
import java.util.ArrayList;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.repository.DelegatingLocalArtifactRepository;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.PlexusTestCase;
public class IdeWorkspaceRepositoryTest
extends PlexusTestCase
{
private RepositorySystem repositorySystem;
private ArtifactRepository localRepository;
@Override
protected void setUp()
throws Exception
{
super.setUp();
repositorySystem = lookup( RepositorySystem.class );
localRepository = repositorySystem.createLocalRepository( new File( "target/IdeWorkspaceRepositoryTest" ).getCanonicalFile() );
}
@Override
protected void tearDown()
throws Exception
{
repositorySystem = null;
localRepository = null;
super.tearDown();
}
public void testResolveFromWorkspace()
throws Exception
{
Artifact artifact =
repositorySystem.createArtifact( TestIdeWorkspaceRepository.GROUP_ID, TestIdeWorkspaceRepository.ARTIFACT_ID,
TestIdeWorkspaceRepository.VERSION, "jar" );
ArtifactResolutionRequest request = new ArtifactResolutionRequest();
request.setArtifact( artifact );
request.setLocalRepository( localRepository );
request.setRemoteRepositories( new ArrayList<ArtifactRepository>() );
repositorySystem.resolve( request );
assertTrue( artifact.isResolved() );
assertEquals( TestIdeWorkspaceRepository.ARTIFACT_FILE, artifact.getFile() );
assertSame( localRepository, request.getLocalRepository() );
}
public void testDelegatingLocalRepo()
throws Exception
{
Artifact artifact =
repositorySystem.createArtifact( TestIdeWorkspaceRepository.GROUP_ID, TestIdeWorkspaceRepository.ARTIFACT_ID,
TestIdeWorkspaceRepository.VERSION, "jar" );
DelegatingLocalArtifactRepository delegatingLocalArtifactRepository = new DelegatingLocalArtifactRepository( localRepository );
ArtifactResolutionRequest request = new ArtifactResolutionRequest();
request.setArtifact( artifact );
request.setLocalRepository( delegatingLocalArtifactRepository );
request.setRemoteRepositories( new ArrayList<ArtifactRepository>() );
repositorySystem.resolve( request );
assertTrue( artifact.isResolved() );
assertEquals( TestIdeWorkspaceRepository.ARTIFACT_FILE, artifact.getFile() );
// make sure we restore original repository
assertSame( delegatingLocalArtifactRepository, request.getLocalRepository() );
assertNull( delegatingLocalArtifactRepository.getIdeWorspace() );
}
}

View File

@ -1,40 +0,0 @@
package org.apache.maven.repository.ideworkspace;
import java.io.File;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.repository.LocalArtifactRepository;
import org.codehaus.plexus.component.annotations.Component;
@Component( role = LocalArtifactRepository.class, hint = LocalArtifactRepository.IDE_WORKSPACE )
public class TestIdeWorkspaceRepository
extends LocalArtifactRepository
{
public static final String GROUP_ID = "test";
public static final String ARTIFACT_ID = "test";
public static final String VERSION = "1.0.0-SNAPSHOT";
public static final File ARTIFACT_FILE = new File( "/a/b/c/d" );
@Override
public Artifact find( Artifact artifact )
{
if ( GROUP_ID.equals( artifact.getGroupId() ) && ARTIFACT_ID.equals( artifact.getArtifactId() )
&& VERSION.equals( artifact.getVersion() ) )
{
artifact.setFile( ARTIFACT_FILE );
artifact.setResolved( true );
}
return artifact;
}
@Override
public boolean hasLocalMetadata()
{
return false;
}
}

View File

@ -30,16 +30,6 @@ under the License.
<role-hint>default</role-hint>
<field-name>logger</field-name>
</requirement>
<requirement>
<role>org.apache.maven.repository.legacy.WagonManager</role>
<role-hint>default</role-hint>
<field-name>wagonManager</field-name>
</requirement>
<requirement>
<role>org.apache.maven.repository.legacy.resolver.transform.ArtifactTransformationManager</role>
<role-hint>default</role-hint>
<field-name>transformationManager</field-name>
</requirement>
<requirement>
<role>org.apache.maven.artifact.factory.ArtifactFactory</role>
<role-hint>default</role-hint>
@ -65,17 +55,16 @@ under the License.
<role-hint>default</role-hint>
<field-name>container</field-name>
</requirement>
<requirement>
<role>org.apache.maven.repository.LocalRepositoryMaintainer</role>
<role-hint>default</role-hint>
<field-name>localRepositoryMaintainer</field-name>
<optional>true</optional>
</requirement>
<requirement>
<role>org.apache.maven.plugin.LegacySupport</role>
<role-hint>default</role-hint>
<field-name>legacySupport</field-name>
</requirement>
<requirement>
<role>org.sonatype.aether.RepositorySystem</role>
<role-hint>default</role-hint>
<field-name>repoSystem</field-name>
</requirement>
</requirements>
</component>
</components>

View File

@ -2,8 +2,8 @@
<plexus>
<components>
<component>
<role>org.apache.maven.lifecycle.LifecycleExecutor</role>
<implementation>org.apache.maven.project.EmptyLifecycleExecutor</implementation>
<role>org.apache.maven.lifecycle.LifeCyclePluginAnalyzer</role>
<implementation>org.apache.maven.project.EmptyLifecyclePluginAnalyzer</implementation>
</component>
</components>
</plexus>

View File

@ -53,6 +53,15 @@
<groupId>org.apache.maven</groupId>
<artifactId>maven-model-builder</artifactId>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
</dependency>
<dependency>
<groupId>org.sonatype.aether</groupId>
<artifactId>aether-impl</artifactId>
<version>${aetherVersion}</version>
</dependency>
<!-- Plexus -->
<dependency>
<groupId>org.sonatype.spice</groupId>

View File

@ -19,6 +19,8 @@ package org.apache.maven;
* under the License.
*/
import java.util.Set;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
public interface ArtifactFilterManager
@ -39,4 +41,7 @@ public interface ArtifactFilterManager
* @param artifactId
*/
void excludeArtifact( String artifactId );
Set<String> getCoreArtifactExcludes();
}

View File

@ -59,6 +59,7 @@ public class DefaultArtifactFilterManager
artifacts.add( "plexus:plexus-container-default" );
artifacts.add( "org.sonatype.spice:spice-inject-plexus" );
artifacts.add( "org.apache.maven:maven-artifact" );
artifacts.add( "org.apache.maven:maven-aether-provider" );
artifacts.add( "org.apache.maven:maven-artifact-manager" );
artifacts.add( "org.apache.maven:maven-compat" );
artifacts.add( "org.apache.maven:maven-core" );
@ -78,6 +79,8 @@ public class DefaultArtifactFilterManager
artifacts.add( "org.apache.maven:maven-settings-builder" );
artifacts.add( "org.apache.maven:maven-toolchain" );
artifacts.add( "org.apache.maven.wagon:wagon-provider-api" );
artifacts.add( "org.sonatype.aether:aether-api" );
artifacts.add( "org.sonatype.aether:aether-spi" );
/*
* NOTE: Don't exclude the wagons or any of their dependencies (apart from the wagon API). This would otherwise
@ -120,18 +123,11 @@ public class DefaultArtifactFilterManager
/**
* Returns the artifact filter for the standard core artifacts.
*
* @see org.apache.maven.ArtifactFilterManager#getExtensionArtifactFilter()
* @see org.apache.maven.ArtifactFilterManager#getExtensionDependencyFilter()
*/
public ArtifactFilter getCoreArtifactFilter()
{
Set<String> excludes = new LinkedHashSet<String>( DEFAULT_EXCLUSIONS );
for ( ArtifactFilterManagerDelegate delegate : getDelegates() )
{
delegate.addCoreExcludes( excludes );
}
return new ExclusionSetFilter( excludes );
return new ExclusionSetFilter( getCoreArtifactExcludes() );
}
private List<ArtifactFilterManagerDelegate> getDelegates()
@ -154,4 +150,16 @@ public class DefaultArtifactFilterManager
excludedArtifacts.add( artifactId );
}
public Set<String> getCoreArtifactExcludes()
{
Set<String> excludes = new LinkedHashSet<String>( DEFAULT_EXCLUSIONS );
for ( ArtifactFilterManagerDelegate delegate : getDelegates() )
{
delegate.addCoreExcludes( excludes );
}
return excludes;
}
}

View File

@ -1,22 +1,18 @@
package org.apache.maven;
/*
* 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
* 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.
* 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 java.io.File;
@ -33,6 +29,7 @@ import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.ExecutionEvent;
import org.apache.maven.execution.MavenExecutionRequest;
@ -47,6 +44,7 @@ import org.apache.maven.model.building.ModelProblem;
import org.apache.maven.model.building.ModelProblemUtils;
import org.apache.maven.model.building.ModelSource;
import org.apache.maven.model.building.UrlModelSource;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
@ -56,6 +54,13 @@ import org.apache.maven.project.ProjectBuildingResult;
import org.apache.maven.project.ProjectSorter;
import org.apache.maven.repository.DelegatingLocalArtifactRepository;
import org.apache.maven.repository.LocalRepositoryNotAccessibleException;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.building.SettingsProblem;
import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
@ -63,6 +68,34 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupExcepti
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import org.sonatype.aether.RepositoryEvent;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.collection.DependencyGraphTransformer;
import org.sonatype.aether.collection.DependencyManager;
import org.sonatype.aether.collection.DependencySelector;
import org.sonatype.aether.collection.DependencyTraverser;
import org.sonatype.aether.repository.Authentication;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RepositoryPolicy;
import org.sonatype.aether.repository.WorkspaceReader;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.graph.manager.ClassicDependencyManager;
import org.sonatype.aether.util.graph.selector.AndDependencySelector;
import org.sonatype.aether.util.graph.selector.ExclusionDependencySelector;
import org.sonatype.aether.util.graph.selector.OptionalDependencySelector;
import org.sonatype.aether.util.graph.selector.ScopeDependencySelector;
import org.sonatype.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
import org.sonatype.aether.util.graph.transformer.NearestVersionConflictResolver;
import org.sonatype.aether.util.graph.transformer.ConflictMarker;
import org.sonatype.aether.util.graph.transformer.JavaDependencyContextRefiner;
import org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator;
import org.sonatype.aether.util.graph.traverser.FatArtifactTraverser;
import org.sonatype.aether.util.listener.AbstractRepositoryListener;
import org.sonatype.aether.util.repository.ChainedWorkspaceReader;
import org.sonatype.aether.util.repository.DefaultAuthenticationSelector;
import org.sonatype.aether.util.repository.DefaultMirrorSelector;
import org.sonatype.aether.util.repository.DefaultProxySelector;
/**
* @author Jason van Zyl
@ -78,7 +111,6 @@ public class DefaultMaven
@Requirement
protected ProjectBuilder projectBuilder;
@Requirement
private LifecycleStarter lifecycleStarter;
@ -91,6 +123,21 @@ public class DefaultMaven
@Requirement
private ExecutionEventCatapult eventCatapult;
@Requirement
private ArtifactHandlerManager artifactHandlerManager;
@Requirement( optional = true, hint = "ide" )
private WorkspaceReader workspaceRepository;
@Requirement
private RepositorySystem repoSystem;
@Requirement
private SettingsDecrypter settingsDecrypter;
@Requirement
private LegacySupport legacySupport;
public MavenExecutionResult execute( MavenExecutionRequest request )
{
MavenExecutionResult result;
@ -113,6 +160,10 @@ public class DefaultMaven
processResult( new DefaultMavenExecutionResult(),
new InternalErrorException( "Internal error: " + e, e ) );
}
finally
{
legacySupport.setSession( null );
}
return result;
}
@ -123,8 +174,7 @@ public class DefaultMaven
//TODO: Need a general way to inject standard properties
if ( request.getStartTime() != null )
{
request.getSystemProperties().put( "${build.timestamp}",
new SimpleDateFormat( "yyyyMMdd-hhmm" ).format( request.getStartTime() ) );
request.getSystemProperties().put( "${build.timestamp}", new SimpleDateFormat( "yyyyMMdd-hhmm" ).format( request.getStartTime() ) );
}
request.setStartTime( new Date() );
@ -145,7 +195,10 @@ public class DefaultMaven
request.setLocalRepository( delegatingLocalArtifactRepository );
MavenSession session = new MavenSession( container, request, result );
DefaultRepositorySystemSession repoSession = (DefaultRepositorySystemSession) newRepositorySession( request );
MavenSession session = new MavenSession( container, repoSession, request, result );
legacySupport.setSession( session );
try
{
@ -161,6 +214,8 @@ public class DefaultMaven
eventCatapult.fire( ExecutionEvent.Type.ProjectDiscoveryStarted, session, null );
request.getProjectBuildingRequest().setRepositorySession( session.getRepositorySession() );
//TODO: optimize for the single project or no project
List<MavenProject> projects;
@ -189,7 +244,10 @@ public class DefaultMaven
// Reactor
// Workspace
// User Local Repository
delegatingLocalArtifactRepository.setBuildReactor( new ReactorArtifactRepository( projectMap ) );
ReactorReader reactorRepository = new ReactorReader( projectMap );
repoSession.setWorkspaceReader( ChainedWorkspaceReader.newInstance( reactorRepository,
repoSession.getWorkspaceReader() ) );
}
catch ( org.apache.maven.DuplicateProjectException e )
{
@ -261,6 +319,132 @@ public class DefaultMaven
return result;
}
public RepositorySystemSession newRepositorySession( MavenExecutionRequest request )
{
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
session.setCache( request.getRepositoryCache() );
session.setIgnoreInvalidArtifactDescriptor( true ).setIgnoreMissingArtifactDescriptor( true );
session.setUserProps( request.getUserProperties() );
session.setSystemProps( request.getSystemProperties() );
session.setConfigProps( request.getSystemProperties() );
session.setOffline( request.isOffline() );
session.setChecksumPolicy( request.getGlobalChecksumPolicy() );
session.setUpdatePolicy( request.isUpdateSnapshots() ? RepositoryPolicy.UPDATE_POLICY_ALWAYS : null );
session.setNotFoundCachingEnabled( !request.isUpdateSnapshots() );
session.setTransferErrorCachingEnabled( !request.isUpdateSnapshots() );
session.setArtifactTypeRegistry( RepositoryUtils.newArtifactTypeRegistry( artifactHandlerManager ) );
LocalRepository localRepo = new LocalRepository( request.getLocalRepository().getBasedir() );
session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( localRepo ) );
session.setWorkspaceReader( workspaceRepository );
DefaultSettingsDecryptionRequest decrypt = new DefaultSettingsDecryptionRequest();
decrypt.setProxies( request.getProxies() );
decrypt.setServers( request.getServers() );
SettingsDecryptionResult decrypted = settingsDecrypter.decrypt( decrypt );
if ( logger.isDebugEnabled() )
{
for ( SettingsProblem problem : decrypted.getProblems() )
{
logger.debug( problem.getMessage(), problem.getException() );
}
}
DefaultMirrorSelector mirrorSelector = new DefaultMirrorSelector();
for ( Mirror mirror : request.getMirrors() )
{
mirrorSelector.add( mirror.getId(), mirror.getUrl(), mirror.getLayout(), false, mirror.getMirrorOf(),
mirror.getMirrorOfLayouts() );
}
session.setMirrorSelector( mirrorSelector );
DefaultProxySelector proxySelector = new DefaultProxySelector();
for ( Proxy proxy : decrypted.getProxies() )
{
Authentication proxyAuth = new Authentication( proxy.getUsername(), proxy.getPassword() );
proxySelector.add( new org.sonatype.aether.repository.Proxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(),
proxyAuth ), proxy.getNonProxyHosts() );
}
session.setProxySelector( proxySelector );
DefaultAuthenticationSelector authSelector = new DefaultAuthenticationSelector();
for ( Server server : decrypted.getServers() )
{
Authentication auth =
new Authentication( server.getUsername(), server.getPassword(), server.getPrivateKey(),
server.getPassphrase() );
authSelector.add( server.getId(), auth );
}
session.setAuthenticationSelector( authSelector );
DependencyTraverser depTraverser = new FatArtifactTraverser();
session.setDependencyTraverser( depTraverser );
DependencyManager depManager = new ClassicDependencyManager();
session.setDependencyManager( depManager );
DependencySelector depFilter =
new AndDependencySelector( new ScopeDependencySelector( "test", "provided" ), new OptionalDependencySelector(),
new ExclusionDependencySelector() );
session.setDependencySelector( depFilter );
DependencyGraphTransformer transformer =
new ChainedDependencyGraphTransformer( new ConflictMarker(), new JavaEffectiveScopeCalculator(),
new NearestVersionConflictResolver(),
new JavaDependencyContextRefiner() );
session.setDependencyGraphTransformer( transformer );
session.setTransferListener( request.getTransferListener() );
session.setRepositoryListener( new AbstractRepositoryListener()
{
@Override
public void artifactInstalling( RepositoryEvent event )
{
logger.info( "Installing " + event.getArtifact().getFile() + " to " + event.getFile() );
}
@Override
public void metadataInstalling( RepositoryEvent event )
{
logger.debug( "Installing " + event.getMetadata() + " to " + event.getFile() );
}
@Override
public void artifactDescriptorInvalid( RepositoryEvent event )
{
if ( logger.isDebugEnabled() )
{
logger.warn( "The POM for " + event.getArtifact() + " is invalid"
+ ", transitive dependencies (if any) will not be available: "
+ event.getException().getMessage() );
}
else
{
logger.warn( "The POM for " + event.getArtifact() + " is invalid"
+ ", transitive dependencies (if any) will not be available"
+ ", enable debug logging for more details" );
}
}
@Override
public void artifactDescriptorMissing( RepositoryEvent event )
{
logger.warn( "The POM for " + event.getArtifact() + " is missing, no dependency information available" );
}
} );
return session;
}
@SuppressWarnings({"ResultOfMethodCallIgnored"})
private void validateLocalRepository( MavenExecutionRequest request )
throws LocalRepositoryNotAccessibleException
@ -405,8 +589,7 @@ public class DefaultMaven
{
ProjectBuildingRequest projectBuildingRequest = request.getProjectBuildingRequest();
List<ProjectBuildingResult> results =
projectBuilder.build( files, request.isRecursive(), projectBuildingRequest );
List<ProjectBuildingResult> results = projectBuilder.build( files, request.isRecursive(), projectBuildingRequest );
boolean problems = false;
@ -423,8 +606,7 @@ public class DefaultMaven
for ( ModelProblem problem : result.getProblems() )
{
String location = ModelProblemUtils.formatLocation( problem, result.getProjectId() );
logger.warn( problem.getMessage()
+ ( StringUtils.isNotEmpty( location ) ? " @ " + location : "" ) );
logger.warn( problem.getMessage() + ( StringUtils.isNotEmpty( location ) ? " @ " + location : "" ) );
}
problems = true;

View File

@ -97,15 +97,15 @@ public class DefaultProjectDependenciesResolver
return resolved;
}
if ( ( scopesToCollect == null || scopesToCollect.isEmpty() )
&& ( scopesToResolve == null || scopesToResolve.isEmpty() ) )
if ( ( scopesToCollect == null || scopesToCollect.isEmpty() ) &&
( scopesToResolve == null || scopesToResolve.isEmpty() ) )
{
return resolved;
}
/*
Logic for transitive global exclusions
Logic for transitve global exclusions
List<String> exclusions = new ArrayList<String>();
@ -126,8 +126,7 @@ public class DefaultProjectDependenciesResolver
if ( ! exclusions.isEmpty() )
{
filter = new AndArtifactFilter( Arrays.asList( new ArtifactFilter[]{ new ExcludesArtifactFilter( exclusions ),
scopeFilter } ) );
filter = new AndArtifactFilter( Arrays.asList( new ArtifactFilter[]{ new ExcludesArtifactFilter( exclusions ), scopeFilter } ) );
}
else
{
@ -141,11 +140,10 @@ public class DefaultProjectDependenciesResolver
collectionScopeFilter = new CumulativeScopeArtifactFilter( collectionScopeFilter, resolutionScopeFilter );
ArtifactResolutionRequest request =
new ArtifactResolutionRequest().setResolveRoot( false ).setResolveTransitively( true )
.setCollectionFilter( collectionScopeFilter ).setResolutionFilter( resolutionScopeFilter )
.setLocalRepository( session.getLocalRepository() ).setOffline( session.isOffline() )
.setForceUpdate( session.getRequest().isUpdateSnapshots() ).setCache( session.getRepositoryCache() );
request.setTransferListener( session.getRequest().getTransferListener() );
new ArtifactResolutionRequest().setResolveRoot( false ).setResolveTransitively( true ).setCollectionFilter(
collectionScopeFilter ).setResolutionFilter( resolutionScopeFilter ).setLocalRepository(
session.getLocalRepository() ).setOffline( session.isOffline() ).setForceUpdate(
session.getRequest().isUpdateSnapshots() );
request.setServers( session.getRequest().getServers() );
request.setMirrors( session.getRequest().getMirrors() );
request.setProxies( session.getRequest().getProxies() );

View File

@ -19,39 +19,40 @@ package org.apache.maven;
* under the License.
*/
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.LocalArtifactRepository;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.repository.WorkspaceReader;
import org.sonatype.aether.repository.WorkspaceRepository;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
/**
* An implementation of a repository that knows how to search the Maven reactor for artifacts.
* An implementation of a workspace reader that knows how to search the Maven reactor for artifacts.
*
* @author Jason van Zyl
*/
public class ReactorArtifactRepository
extends LocalArtifactRepository
class ReactorReader
implements WorkspaceReader
{
private Map<String, MavenProject> projectsByGAV;
private Map<String, List<MavenProject>> projectsByGA;
private final int hashCode;
private WorkspaceRepository repository;
@SuppressWarnings( { "ConstantConditions" } )
public ReactorArtifactRepository( Map<String, MavenProject> reactorProjects )
public ReactorReader( Map<String, MavenProject> reactorProjects )
{
projectsByGAV = reactorProjects;
hashCode = ( reactorProjects != null ) ? reactorProjects.keySet().hashCode() : 0;
projectsByGA = new HashMap<String, List<MavenProject>>( reactorProjects.size() * 2 );
for ( MavenProject project : reactorProjects.values() )
@ -68,35 +69,18 @@ public class ReactorArtifactRepository
projects.add( project );
}
}
@Override
public Artifact find( Artifact artifact )
{
String projectKey = ArtifactUtils.key( artifact );
MavenProject project = projectsByGAV.get( projectKey );
if ( project != null )
{
File file = find( project, artifact );
if ( file != null )
{
resolve( artifact, file );
}
}
return artifact;
repository = new WorkspaceRepository( "reactor", new HashSet<String>( projectsByGAV.keySet() ) );
}
private File find( MavenProject project, Artifact artifact )
{
if ( "pom".equals( artifact.getType() ) )
if ( "pom".equals( artifact.getExtension() ) )
{
return project.getFile();
}
Artifact projectArtifact = findMatchingArtifact( project, artifact );
org.apache.maven.artifact.Artifact projectArtifact = findMatchingArtifact( project, artifact );
if ( hasArtifactFileFromPackagePhase( projectArtifact ) )
{
@ -125,24 +109,120 @@ public class ReactorArtifactRepository
return null;
}
private boolean hasArtifactFileFromPackagePhase( Artifact projectArtifact )
private boolean hasArtifactFileFromPackagePhase( org.apache.maven.artifact.Artifact projectArtifact )
{
return projectArtifact != null && projectArtifact.getFile() != null && projectArtifact.getFile().exists();
}
private void resolve( Artifact artifact, File file )
/**
* Tries to resolve the specified artifact from the artifacts of the given project.
*
* @param project The project to try to resolve the artifact from, must not be <code>null</code>.
* @param requestedArtifact The artifact to resolve, must not be <code>null</code>.
* @return The matching artifact from the project or <code>null</code> if not found.
*/
private org.apache.maven.artifact.Artifact findMatchingArtifact( MavenProject project, Artifact requestedArtifact )
{
artifact.setFile( file );
String requestedRepositoryConflictId = getConflictId( requestedArtifact );
artifact.setResolved( true );
artifact.setRepository( this );
org.apache.maven.artifact.Artifact mainArtifact = project.getArtifact();
if ( requestedRepositoryConflictId.equals( getConflictId( mainArtifact ) ) )
{
return mainArtifact;
}
Collection<org.apache.maven.artifact.Artifact> attachedArtifacts = project.getAttachedArtifacts();
if ( attachedArtifacts != null && !attachedArtifacts.isEmpty() )
{
for ( org.apache.maven.artifact.Artifact attachedArtifact : attachedArtifacts )
{
if ( requestedRepositoryConflictId.equals( getConflictId( attachedArtifact ) ) )
{
return attachedArtifact;
}
}
}
return null;
}
/**
* Gets the repository conflict id of the specified artifact. Unlike the dependency conflict id, the repository
* conflict id uses the artifact file extension instead of the artifact type. Hence, the repository conflict id more
* closely reflects the identity of artifacts as perceived by a repository.
*
* @param artifact The artifact, must not be <code>null</code>.
* @return The repository conflict id, never <code>null</code>.
*/
private String getConflictId( org.apache.maven.artifact.Artifact artifact )
{
StringBuilder buffer = new StringBuilder( 128 );
buffer.append( artifact.getGroupId() );
buffer.append( ':' ).append( artifact.getArtifactId() );
if ( artifact.getArtifactHandler() != null )
{
buffer.append( ':' ).append( artifact.getArtifactHandler().getExtension() );
}
else
{
buffer.append( ':' ).append( artifact.getType() );
}
if ( artifact.hasClassifier() )
{
buffer.append( ':' ).append( artifact.getClassifier() );
}
return buffer.toString();
}
private String getConflictId( Artifact artifact )
{
StringBuilder buffer = new StringBuilder( 128 );
buffer.append( artifact.getGroupId() );
buffer.append( ':' ).append( artifact.getArtifactId() );
buffer.append( ':' ).append( artifact.getExtension() );
if ( artifact.getClassifier().length() > 0 )
{
buffer.append( ':' ).append( artifact.getClassifier() );
}
return buffer.toString();
}
/**
* Determines whether the specified artifact refers to test classes.
*
* @param artifact The artifact to check, must not be {@code null}.
* @return {@code true} if the artifact refers to test classes, {@code false} otherwise.
*/
private static boolean isTestArtifact( Artifact artifact )
{
if ( "test-jar".equals( artifact.getProperty( "type", "" ) ) )
{
return true;
}
else if ( "jar".equals( artifact.getExtension() ) && "tests".equals( artifact.getClassifier() ) )
{
return true;
}
return false;
}
public File findArtifact( Artifact artifact )
{
String projectKey = artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getVersion();
MavenProject project = projectsByGAV.get( projectKey );
if ( project != null )
{
return find( project, artifact );
}
return null;
}
@Override
public List<String> findVersions( Artifact artifact )
{
String key = ArtifactUtils.versionlessKey( artifact );
String key = artifact.getGroupId() + ':' + artifact.getArtifactId();
List<MavenProject> projects = projectsByGA.get( key );
if ( projects == null || projects.isEmpty() )
@ -163,148 +243,9 @@ public class ReactorArtifactRepository
return Collections.unmodifiableList( versions );
}
@Override
public String getId()
public WorkspaceRepository getRepository()
{
return "reactor";
}
@Override
public boolean hasLocalMetadata()
{
return false;
}
/**
* Tries to resolve the specified artifact from the artifacts of the given project.
*
* @param project The project to try to resolve the artifact from, must not be <code>null</code>.
* @param requestedArtifact The artifact to resolve, must not be <code>null</code>.
* @return The matching artifact from the project or <code>null</code> if not found.
*/
private Artifact findMatchingArtifact( MavenProject project, Artifact requestedArtifact )
{
String requestedDependencyConflictId = requestedArtifact.getDependencyConflictId();
// check for match with project's main artifact by dependency conflict id
Artifact mainArtifact = project.getArtifact();
if ( requestedDependencyConflictId.equals( mainArtifact.getDependencyConflictId() ) )
{
return mainArtifact;
}
String requestedRepositoryConflictId = getRepositoryConflictId( requestedArtifact );
// check for match with project's main artifact by repository conflict id
if ( requestedRepositoryConflictId.equals( getRepositoryConflictId( mainArtifact ) ) )
{
return mainArtifact;
}
// check for match with one of the attached artifacts
Collection<Artifact> attachedArtifacts = project.getAttachedArtifacts();
if ( attachedArtifacts != null && !attachedArtifacts.isEmpty() )
{
// first try matching by dependency conflict id
for ( Artifact attachedArtifact : attachedArtifacts )
{
if ( requestedDependencyConflictId.equals( attachedArtifact.getDependencyConflictId() ) )
{
return attachedArtifact;
}
}
// next try matching by repository conflict id
for ( Artifact attachedArtifact : attachedArtifacts )
{
if ( requestedRepositoryConflictId.equals( getRepositoryConflictId( attachedArtifact ) ) )
{
return attachedArtifact;
}
}
}
return null;
}
/**
* Gets the repository conflict id of the specified artifact. Unlike the dependency conflict id, the repository
* conflict id uses the artifact file extension instead of the artifact type. Hence, the repository conflict id more
* closely reflects the identity of artifacts as perceived by a repository.
*
* @param artifact The artifact, must not be <code>null</code>.
* @return The repository conflict id, never <code>null</code>.
*/
private String getRepositoryConflictId( Artifact artifact )
{
StringBuilder buffer = new StringBuilder( 128 );
buffer.append( artifact.getGroupId() );
buffer.append( ':' ).append( artifact.getArtifactId() );
if ( artifact.getArtifactHandler() != null )
{
buffer.append( ':' ).append( artifact.getArtifactHandler().getExtension() );
}
else
{
buffer.append( ':' ).append( artifact.getType() );
}
if ( artifact.hasClassifier() )
{
buffer.append( ':' ).append( artifact.getClassifier() );
}
return buffer.toString();
}
/**
* Determines whether the specified artifact refers to test classes.
*
* @param artifact The artifact to check, must not be {@code null}.
* @return {@code true} if the artifact refers to test classes, {@code false} otherwise.
*/
private static boolean isTestArtifact( Artifact artifact )
{
if ( "test-jar".equals( artifact.getType() ) )
{
return true;
}
else if ( "jar".equals( artifact.getType() ) && "tests".equals( artifact.getClassifier() ) )
{
return true;
}
return false;
}
@Override
public int hashCode()
{
return hashCode;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
{
return true;
}
if ( obj == null )
{
return false;
}
if ( getClass() != obj.getClass() )
{
return false;
}
ReactorArtifactRepository other = (ReactorArtifactRepository) obj;
return eq( projectsByGAV.keySet(), other.projectsByGAV.keySet() );
}
@Override
public boolean isProjectAware()
{
return true;
return repository;
}
}

View File

@ -0,0 +1,325 @@
package org.apache.maven;
/*
* 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 java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.artifact.ArtifactType;
import org.sonatype.aether.artifact.ArtifactTypeRegistry;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.graph.Exclusion;
import org.sonatype.aether.repository.Authentication;
import org.sonatype.aether.repository.Proxy;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.RepositoryPolicy;
import org.sonatype.aether.util.artifact.ArtifactProperties;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.artifact.DefaultArtifactType;
/**
* <strong>Warning:</strong> This is an internal utility class that is only public for technical reasons, it is not part
* of the public API. In particular, this class can be changed or deleted without prior notice.
*
* @author Benjamin Bentmann
*/
public class RepositoryUtils
{
private static String nullify( String string )
{
return ( string == null || string.length() <= 0 ) ? null : string;
}
private static org.apache.maven.artifact.Artifact toArtifact( Dependency dependency )
{
if ( dependency == null )
{
return null;
}
org.apache.maven.artifact.Artifact result = toArtifact( dependency.getArtifact() );
result.setScope( dependency.getScope() );
result.setOptional( dependency.isOptional() );
return result;
}
public static org.apache.maven.artifact.Artifact toArtifact( Artifact artifact )
{
if ( artifact == null )
{
return null;
}
ArtifactHandler handler = newHandler( artifact );
/*
* NOTE: From Artifact.hasClassifier(), an empty string and a null both denote "no classifier". However, some
* plugins only check for null, so be sure to nullify an empty classifier.
*/
org.apache.maven.artifact.Artifact result =
new org.apache.maven.artifact.DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion(), null,
artifact.getProperty( ArtifactProperties.TYPE,
artifact.getExtension() ),
nullify( artifact.getClassifier() ), handler );
result.setFile( artifact.getFile() );
result.setResolved( artifact.getFile() != null );
List<String> trail = new ArrayList<String>( 1 );
trail.add( result.getId() );
result.setDependencyTrail( trail );
return result;
}
public static void toArtifacts( Collection<org.apache.maven.artifact.Artifact> artifacts,
Collection<? extends DependencyNode> nodes, List<String> trail,
DependencyFilter filter )
{
for ( DependencyNode node : nodes )
{
org.apache.maven.artifact.Artifact artifact = toArtifact( node.getDependency() );
List<String> nodeTrail = new ArrayList<String>( trail.size() + 1 );
nodeTrail.addAll( trail );
nodeTrail.add( artifact.getId() );
if ( filter == null || filter.accept( node, Collections.<DependencyNode> emptyList() ) )
{
artifact.setDependencyTrail( nodeTrail );
artifacts.add( artifact );
}
toArtifacts( artifacts, node.getChildren(), nodeTrail, filter );
}
}
public static Artifact toArtifact( org.apache.maven.artifact.Artifact artifact )
{
if ( artifact == null )
{
return null;
}
String version = artifact.getVersion();
if ( version == null && artifact.getVersionRange() != null )
{
version = artifact.getVersionRange().toString();
}
Map<String, String> props = null;
if ( org.apache.maven.artifact.Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
{
props = Collections.singletonMap( ArtifactProperties.LACKS_DESCRIPTOR, Boolean.TRUE.toString() );
}
Artifact result =
new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getClassifier(),
artifact.getArtifactHandler().getExtension(), version, props,
newArtifactType( artifact.getType(), artifact.getArtifactHandler() ) );
result = result.setFile( artifact.getFile() );
return result;
}
public static Dependency toDependency( org.apache.maven.artifact.Artifact artifact,
Collection<org.apache.maven.model.Exclusion> exclusions )
{
if ( artifact == null )
{
return null;
}
Artifact result = toArtifact( artifact );
List<Exclusion> excl = null;
if ( exclusions != null )
{
excl = new ArrayList<Exclusion>( exclusions.size() );
for ( org.apache.maven.model.Exclusion exclusion : exclusions )
{
excl.add( toExclusion( exclusion ) );
}
}
return new Dependency( result, artifact.getScope(), artifact.isOptional(), excl );
}
public static List<RemoteRepository> toRepos( List<ArtifactRepository> repos )
{
if ( repos == null )
{
return null;
}
List<RemoteRepository> results = new ArrayList<RemoteRepository>( repos.size() );
for ( ArtifactRepository repo : repos )
{
results.add( toRepo( repo ) );
}
return results;
}
public static RemoteRepository toRepo( ArtifactRepository repo )
{
RemoteRepository result = null;
if ( repo != null )
{
result = new RemoteRepository( repo.getId(), repo.getLayout().getId(), repo.getUrl() );
result.setPolicy( true, toPolicy( repo.getSnapshots() ) );
result.setPolicy( false, toPolicy( repo.getReleases() ) );
result.setAuthentication( toAuthentication( repo.getAuthentication() ) );
result.setProxy( toProxy( repo.getProxy() ) );
}
return result;
}
private static RepositoryPolicy toPolicy( ArtifactRepositoryPolicy policy )
{
RepositoryPolicy result = null;
if ( policy != null )
{
result = new RepositoryPolicy( policy.isEnabled(), policy.getUpdatePolicy(), policy.getChecksumPolicy() );
}
return result;
}
private static Authentication toAuthentication( org.apache.maven.artifact.repository.Authentication auth )
{
Authentication result = null;
if ( auth != null )
{
result = new Authentication( auth.getUsername(), auth.getPassword() );
}
return result;
}
private static Proxy toProxy( org.apache.maven.repository.Proxy proxy )
{
Proxy result = null;
if ( proxy != null )
{
Authentication auth = new Authentication( proxy.getUserName(), proxy.getPassword() );
result = new Proxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(), auth );
}
return result;
}
public static ArtifactHandler newHandler( Artifact artifact )
{
String type = artifact.getProperty( ArtifactProperties.TYPE, artifact.getExtension() );
DefaultArtifactHandler handler = new DefaultArtifactHandler( type );
handler.setExtension( artifact.getExtension() );
handler.setLanguage( artifact.getProperty( ArtifactProperties.LANGUAGE, null ) );
handler.setAddedToClasspath( Boolean.parseBoolean( artifact.getProperty( ArtifactProperties.CONSTITUTES_BUILD_PATH,
"" ) ) );
handler.setIncludesDependencies( Boolean.parseBoolean( artifact.getProperty( ArtifactProperties.INCLUDES_DEPENDENCIES,
"" ) ) );
return handler;
}
public static ArtifactType newArtifactType( String id, ArtifactHandler handler )
{
return new DefaultArtifactType( id, handler.getExtension(), handler.getClassifier(), handler.getLanguage(),
handler.isAddedToClasspath(), handler.isIncludesDependencies() );
}
public static Dependency toDependency( org.apache.maven.model.Dependency dependency,
ArtifactTypeRegistry stereotypes )
{
ArtifactType stereotype = stereotypes.get( dependency.getType() );
if ( stereotype == null )
{
stereotype = new DefaultArtifactType( dependency.getType() );
}
boolean system = dependency.getSystemPath() != null && dependency.getSystemPath().length() > 0;
Map<String, String> props = null;
if ( system )
{
props = Collections.singletonMap( ArtifactProperties.LACKS_DESCRIPTOR, Boolean.TRUE.toString() );
}
Artifact artifact =
new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null,
dependency.getVersion(), props, stereotype );
if ( system )
{
artifact = artifact.setFile( new File( dependency.getSystemPath() ) );
}
List<Exclusion> exclusions = new ArrayList<Exclusion>( dependency.getExclusions().size() );
for ( org.apache.maven.model.Exclusion exclusion : dependency.getExclusions() )
{
exclusions.add( toExclusion( exclusion ) );
}
Dependency result = new Dependency( artifact, dependency.getScope(), dependency.isOptional(), exclusions );
return result;
}
private static Exclusion toExclusion( org.apache.maven.model.Exclusion exclusion )
{
return new Exclusion( exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*" );
}
public static ArtifactTypeRegistry newArtifactTypeRegistry( ArtifactHandlerManager handlerManager )
{
return new MavenArtifactTypeRegistry( handlerManager );
}
static class MavenArtifactTypeRegistry
implements ArtifactTypeRegistry
{
private final ArtifactHandlerManager handlerManager;
public MavenArtifactTypeRegistry( ArtifactHandlerManager handlerManager )
{
this.handlerManager = handlerManager;
}
public ArtifactType get( String stereotypeId )
{
ArtifactHandler handler = handlerManager.getArtifactHandler( stereotypeId );
return newArtifactType( stereotypeId, handler );
}
}
}

View File

@ -64,6 +64,11 @@ public class DefaultArtifactHandler
return extension;
}
public void setExtension( String extension )
{
this.extension = extension;
}
public String getType()
{
return type;
@ -97,6 +102,11 @@ public class DefaultArtifactHandler
return includesDependencies;
}
public void setIncludesDependencies( boolean includesDependencies )
{
this.includesDependencies = includesDependencies;
}
public String getLanguage()
{
if ( language == null )
@ -107,8 +117,19 @@ public class DefaultArtifactHandler
return language;
}
public void setLanguage( String language )
{
this.language = language;
}
public boolean isAddedToClasspath()
{
return addedToClasspath;
}
public void setAddedToClasspath( boolean addedToClasspath )
{
this.addedToClasspath = addedToClasspath;
}
}

View File

@ -24,7 +24,6 @@ import java.util.List;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.ArtifactTransferListener;
/**
* Collects basic settings to access the repository system.
@ -43,10 +42,6 @@ public class DefaultRepositoryRequest
private List<ArtifactRepository> remoteRepositories;
private RepositoryCache cache;
private ArtifactTransferListener transferListener;
/**
* Creates an empty repository request.
*/
@ -65,16 +60,13 @@ public class DefaultRepositoryRequest
setLocalRepository( repositoryRequest.getLocalRepository() );
setRemoteRepositories( repositoryRequest.getRemoteRepositories() );
setOffline( repositoryRequest.isOffline() );
setCache( repositoryRequest.getCache() );
setForceUpdate( repositoryRequest.isForceUpdate() );
setTransferListener( repositoryRequest.getTransferListener() );
}
public static RepositoryRequest getRepositoryRequest( MavenSession session, MavenProject project )
{
RepositoryRequest request = new DefaultRepositoryRequest();
request.setCache( session.getRepositoryCache() );
request.setLocalRepository( session.getLocalRepository() );
if ( project != null )
{
@ -82,7 +74,6 @@ public class DefaultRepositoryRequest
}
request.setOffline( session.isOffline() );
request.setForceUpdate( session.getRequest().isUpdateSnapshots() );
request.setTransferListener( session.getRequest().getTransferListener() );
return request;
}
@ -140,28 +131,4 @@ public class DefaultRepositoryRequest
return this;
}
public RepositoryCache getCache()
{
return cache;
}
public DefaultRepositoryRequest setCache( RepositoryCache cache )
{
this.cache = cache;
return this;
}
public ArtifactTransferListener getTransferListener()
{
return transferListener;
}
public DefaultRepositoryRequest setTransferListener( ArtifactTransferListener transferListener )
{
this.transferListener = transferListener;
return this;
}
}

View File

@ -25,6 +25,7 @@ package org.apache.maven.artifact.repository;
*
* @author Benjamin Bentmann
*/
@Deprecated
public interface RepositoryCache
{

View File

@ -21,8 +21,6 @@ package org.apache.maven.artifact.repository;
import java.util.List;
import org.apache.maven.repository.ArtifactTransferListener;
/**
* Collects basic settings to access the repository system.
*
@ -94,34 +92,4 @@ public interface RepositoryRequest
*/
RepositoryRequest setRemoteRepositories( List<ArtifactRepository> remoteRepositories );
/**
* Gets the repository cache to use.
*
* @return The repository cache to use or {@code null} if none.
*/
RepositoryCache getCache();
/**
* Sets the repository cache to use.
*
* @param cache The repository cache to use, may be {@code null}.
* @return This request, never {@code null}.
*/
RepositoryRequest setCache( RepositoryCache cache );
/**
* Gets the listener to notify of transfer events.
*
* @return The transfer listener or {@code null} if none.
*/
ArtifactTransferListener getTransferListener();
/**
* Sets the listener to notify of transfer events.
*
* @param transferListener The transfer listener to notify, may be {@code null}.
* @return This request, never {@code null}.
*/
RepositoryRequest setTransferListener( ArtifactTransferListener transferListener );
}

View File

@ -29,7 +29,6 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.repository.ArtifactTransferListener;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
@ -55,8 +54,6 @@ public class ArtifactResolutionRequest
private List<ArtifactRepository> remoteRepositories;
private RepositoryCache cache;
private ArtifactFilter collectionFilter;
private ArtifactFilter resolutionFilter;
@ -67,8 +64,6 @@ public class ArtifactResolutionRequest
// This is like a filter but overrides all transitive versions
private Map managedVersionMap;
private ArtifactTransferListener transferListener;
private boolean resolveRoot = true;
private boolean resolveTransitively = false;
@ -92,10 +87,8 @@ public class ArtifactResolutionRequest
{
setLocalRepository( request.getLocalRepository() );
setRemoteRepositories( request.getRemoteRepositories() );
setCache( request.getCache() );
setOffline( request.isOffline() );
setForceUpdate( request.isForceUpdate() );
setTransferListener( request.getTransferListener() );
}
public Artifact getArtifact()
@ -238,17 +231,6 @@ public class ArtifactResolutionRequest
return resolveTransitively;
}
public ArtifactTransferListener getTransferListener()
{
return transferListener;
}
public ArtifactResolutionRequest setTransferListener( ArtifactTransferListener transferListener )
{
this.transferListener = transferListener;
return this;
}
public String toString()
{
StringBuilder sb = new StringBuilder()
@ -263,13 +245,11 @@ public class ArtifactResolutionRequest
public RepositoryCache getCache()
{
return cache;
return null;
}
public ArtifactResolutionRequest setCache( RepositoryCache cache )
{
this.cache = cache;
return this;
}

View File

@ -21,7 +21,7 @@ package org.apache.maven.classrealm;
import java.io.File;
import org.apache.maven.artifact.Artifact;
import org.sonatype.aether.artifact.Artifact;
/**
* @author Benjamin Bentmann
@ -49,12 +49,12 @@ class ArtifactClassRealmConstituent
public String getType()
{
return artifact.getType();
return artifact.getExtension();
}
public String getClassifier()
{
return artifact.hasClassifier() ? artifact.getClassifier() : "";
return artifact.getClassifier();
}
public String getVersion()
@ -70,7 +70,7 @@ class ArtifactClassRealmConstituent
@Override
public String toString()
{
return artifact.getId();
return artifact.toString();
}
}

View File

@ -21,10 +21,10 @@ package org.apache.maven.classrealm;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.sonatype.aether.artifact.Artifact;
/**
* Manages the class realms used by Maven. <strong>Warning:</strong> This is an internal utility interface that is only

View File

@ -28,7 +28,6 @@ import java.util.List;
import java.util.Random;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.classrealm.ClassRealmRequest.RealmType;
import org.apache.maven.model.Model;
@ -43,11 +42,12 @@ import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
import org.sonatype.aether.artifact.Artifact;
/**
* Manages the class realms used by Maven. <strong>Warning:</strong> This is an internal utility class that is only
* public for technical reasons, it is not part of the public API. In particular, this interface can be changed or
* deleted without prior notice.
* public for technical reasons, it is not part of the public API. In particular, this class can be changed or deleted
* without prior notice.
*
* @author Benjamin Bentmann
*/
@ -133,7 +133,7 @@ public class DefaultClassRealmManager
{
for ( Artifact artifact : artifacts )
{
artifactIds.add( artifact.getId() );
artifactIds.add( getId( artifact ) );
if ( artifact.getFile() != null )
{
constituents.add( new ArtifactClassRealmConstituent( artifact ) );
@ -260,6 +260,9 @@ public class DefaultClassRealmManager
// maven-*
importingRealm.importFrom( coreRealm, "org.apache.maven" );
// aether
importingRealm.importFrom( coreRealm, "org.sonatype.aether" );
// plexus-classworlds
importingRealm.importFrom( coreRealm, "org.codehaus.plexus.classworlds" );
@ -334,11 +337,21 @@ public class DefaultClassRealmManager
+ version;
}
private static String getId( Artifact artifact )
{
return getId( artifact.getGroupId(), artifact.getArtifactId(), artifact.getExtension(), artifact.getClassifier(),
artifact.getBaseVersion() );
}
private static String getId( ClassRealmConstituent constituent )
{
return constituent.getGroupId() + ':' + constituent.getArtifactId() + ':' + constituent.getType()
+ ( StringUtils.isNotEmpty( constituent.getClassifier() ) ? ':' + constituent.getClassifier() : "" ) + ':'
+ constituent.getVersion();
return getId( constituent.getGroupId(), constituent.getArtifactId(), constituent.getType(),
constituent.getClassifier(), constituent.getVersion() );
}
private static String getId( String gid, String aid, String type, String cls, String ver )
{
return gid + ':' + aid + ':' + type + ( StringUtils.isNotEmpty( cls ) ? ':' + cls : "" ) + ':' + ver;
}
private List<ClassRealmManagerDelegate> getDelegates()

View File

@ -26,14 +26,15 @@ import java.util.List;
import java.util.Properties;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.model.Profile;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.repository.ArtifactTransferListener;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.sonatype.aether.RepositoryCache;
import org.sonatype.aether.transfer.TransferListener;
import org.sonatype.aether.util.DefaultRepositoryCache;
/**
* @author Jason van Zyl
@ -42,7 +43,7 @@ public class DefaultMavenExecutionRequest
implements MavenExecutionRequest
{
private RepositoryCache repositoryCache = new SessionRepositoryCache();
private RepositoryCache repositoryCache = new DefaultRepositoryCache();
private ArtifactRepository localRepository;
@ -110,7 +111,7 @@ public class DefaultMavenExecutionRequest
private List<String> inactiveProfiles;
private ArtifactTransferListener transferListener;
private TransferListener transferListener;
private int loggingLevel = LOGGING_LEVEL_INFO;
@ -350,7 +351,7 @@ public class DefaultMavenExecutionRequest
return inactiveProfiles;
}
public ArtifactTransferListener getTransferListener()
public TransferListener getTransferListener()
{
return transferListener;
}
@ -592,7 +593,7 @@ public class DefaultMavenExecutionRequest
return this;
}
public MavenExecutionRequest setTransferListener( ArtifactTransferListener transferListener )
public MavenExecutionRequest setTransferListener( TransferListener transferListener )
{
this.transferListener = transferListener;
@ -953,7 +954,6 @@ public class DefaultMavenExecutionRequest
projectBuildingRequest.setUserProperties( getUserProperties() );
projectBuildingRequest.setRemoteRepositories( getRemoteRepositories() );
projectBuildingRequest.setPluginArtifactRepositories( getPluginArtifactRepositories() );
projectBuildingRequest.setRepositoryCache( getRepositoryCache() );
projectBuildingRequest.setOffline( isOffline() );
projectBuildingRequest.setForceUpdate( isUpdateSnapshots() );
projectBuildingRequest.setServers( getServers() );
@ -964,7 +964,6 @@ public class DefaultMavenExecutionRequest
projectBuildingRequest.setProfiles( getProfiles() );
projectBuildingRequest.setProcessPlugins( true );
projectBuildingRequest.setBuildStartTime( getStartTime() );
projectBuildingRequest.setTransferListener( getTransferListener() );
}
return projectBuildingRequest;

View File

@ -25,7 +25,7 @@ import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.project.DependencyResolutionResult;
import org.apache.maven.project.MavenProject;
/** @author Jason van Zyl */
@ -36,7 +36,7 @@ public class DefaultMavenExecutionResult
private List<MavenProject> topologicallySortedProjects;
private ArtifactResolutionResult artifactResolutionResult;
private DependencyResolutionResult dependencyResolutionResult;
private List<Throwable> exceptions;
@ -66,14 +66,14 @@ public class DefaultMavenExecutionResult
return topologicallySortedProjects;
}
public ArtifactResolutionResult getArtifactResolutionResult()
public DependencyResolutionResult getDependencyResolutionResult()
{
return artifactResolutionResult;
return dependencyResolutionResult;
}
public MavenExecutionResult setArtifactResolutionResult( ArtifactResolutionResult artifactResolutionResult )
public MavenExecutionResult setDependencyResolutionResult( DependencyResolutionResult dependencyResolutionResult )
{
this.artifactResolutionResult = artifactResolutionResult;
this.dependencyResolutionResult = dependencyResolutionResult;
return this;
}

View File

@ -26,14 +26,14 @@ import java.util.Properties;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.model.Profile;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.repository.ArtifactTransferListener;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.codehaus.plexus.logging.Logger;
import org.sonatype.aether.RepositoryCache;
import org.sonatype.aether.transfer.TransferListener;
/**
* @author Jason van Zyl
@ -170,8 +170,8 @@ public interface MavenExecutionRequest
boolean isShowErrors();
// Transfer listeners
MavenExecutionRequest setTransferListener( ArtifactTransferListener transferListener );
ArtifactTransferListener getTransferListener();
MavenExecutionRequest setTransferListener( TransferListener transferListener );
TransferListener getTransferListener();
// Logging
MavenExecutionRequest setLoggingLevel( int loggingLevel );

View File

@ -21,7 +21,7 @@ package org.apache.maven.execution;
import java.util.List;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.project.DependencyResolutionResult;
import org.apache.maven.project.MavenProject;
/**
@ -35,8 +35,8 @@ public interface MavenExecutionResult
MavenExecutionResult setTopologicallySortedProjects( List<MavenProject> projects );
List<MavenProject> getTopologicallySortedProjects();
MavenExecutionResult setArtifactResolutionResult( ArtifactResolutionResult result );
ArtifactResolutionResult getArtifactResolutionResult();
MavenExecutionResult setDependencyResolutionResult( DependencyResolutionResult result );
DependencyResolutionResult getDependencyResolutionResult();
// for each exception
// - knowing what artifacts are missing

View File

@ -36,6 +36,7 @@ import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.sonatype.aether.RepositorySystemSession;
/**
* @author Jason van Zyl
@ -50,6 +51,8 @@ public class MavenSession
private MavenExecutionResult result;
private RepositorySystemSession repositorySession;
private final Settings settings;
private Properties executionProperties;
@ -115,12 +118,14 @@ public class MavenSession
setProjects( projects );
}
public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result )
public MavenSession( PlexusContainer container, RepositorySystemSession repositorySession, MavenExecutionRequest request,
MavenExecutionResult result )
{
this.container = container;
this.request = request;
this.result = result;
this.settings = new SettingsAdapter( request );
this.repositorySession = repositorySession;
}
public void setProjects( List<MavenProject> projects )
@ -180,9 +185,10 @@ public class MavenSession
return container.lookupMap( role );
}
@Deprecated
public RepositoryCache getRepositoryCache()
{
return request.getRepositoryCache();
return null;
}
public ArtifactRepository getLocalRepository()
@ -277,7 +283,7 @@ public class MavenSession
public ProjectBuildingRequest getProjectBuildingRequest()
{
return request.getProjectBuildingRequest();
return request.getProjectBuildingRequest().setRepositorySession( getRepositorySession() );
}
public List<String> getPluginGroups()
@ -382,4 +388,10 @@ public class MavenSession
{
this.parallel = parallel;
}
public RepositorySystemSession getRepositorySession()
{
return repositorySession;
}
}

View File

@ -21,14 +21,7 @@ package org.apache.maven.lifecycle;
import org.apache.maven.lifecycle.internal.BuilderCommon;
import org.apache.maven.lifecycle.internal.ExecutionPlanItem;
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.project.MavenProject;
import java.util.ArrayList;
@ -55,9 +48,6 @@ public class DefaultSchedules
}
public List<ExecutionPlanItem> createExecutionPlanItem( MavenProject mavenProject, List<MojoExecution> executions )
throws PluginNotFoundException, PluginResolutionException, LifecyclePhaseNotFoundException,
PluginDescriptorParsingException, MojoNotFoundException, InvalidPluginDescriptorException,
NoPluginFoundForPrefixException, LifecycleNotFoundException, PluginVersionResolutionException
{
BuilderCommon.attachToThread( mavenProject );

View File

@ -1,25 +1,19 @@
package org.apache.maven.lifecycle.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
* 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.
* 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.
*/
package org.apache.maven.lifecycle.internal;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.DefaultLifecycles;
import org.apache.maven.lifecycle.DefaultSchedules;
@ -147,9 +141,10 @@ public class DefaultLifecycleExecutionPlanCalculator
if ( mojoDescriptor == null )
{
mojoDescriptor = pluginManager.getMojoDescriptor( mojoExecution.getPlugin(), mojoExecution.getGoal(),
DefaultRepositoryRequest.getRepositoryRequest(
session, project ) );
mojoDescriptor =
pluginManager.getMojoDescriptor( mojoExecution.getPlugin(), mojoExecution.getGoal(),
project.getRemotePluginRepositories(),
session.getRepositorySession() );
mojoExecution.setMojoDescriptor( mojoDescriptor );
}
@ -251,10 +246,11 @@ public class DefaultLifecycleExecutionPlanCalculator
if ( lifecycle == null )
{
throw new LifecyclePhaseNotFoundException( "Unknown lifecycle phase \"" + lifecyclePhase
+ "\". You must specify a valid lifecycle phase" + " or a goal in the format <plugin-prefix>:<goal> or"
+ " <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: "
+ defaultLifeCycles.getLifecyclePhaseList() + ".", lifecyclePhase );
throw new LifecyclePhaseNotFoundException(
"Unknown lifecycle phase \"" + lifecyclePhase + "\". You must specify a valid lifecycle phase" +
" or a goal in the format <plugin-prefix>:<goal> or" +
" <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: " +
defaultLifeCycles.getLifecyclePhaseList() + ".", lifecyclePhase );
}
/*
@ -309,9 +305,8 @@ public class DefaultLifecycleExecutionPlanCalculator
for ( String goal : execution.getGoals() )
{
MojoDescriptor mojoDescriptor =
pluginManager.getMojoDescriptor( plugin, goal,
DefaultRepositoryRequest.getRepositoryRequest( session,
project ) );
pluginManager.getMojoDescriptor( plugin, goal, project.getRemotePluginRepositories(),
session.getRepositorySession() );
Map<Integer, List<MojoExecution>> phaseBindings = mappings.get( mojoDescriptor.getPhase() );
if ( phaseBindings != null )
@ -464,8 +459,8 @@ public class DefaultLifecycleExecutionPlanCalculator
{
parameterConfiguration = new Xpp3Dom( parameterConfiguration, parameter.getName() );
if ( StringUtils.isEmpty( parameterConfiguration.getAttribute( "implementation" ) )
&& StringUtils.isNotEmpty( parameter.getImplementation() ) )
if ( StringUtils.isEmpty( parameterConfiguration.getAttribute( "implementation" ) ) &&
StringUtils.isNotEmpty( parameter.getImplementation() ) )
{
parameterConfiguration.setAttribute( "implementation", parameter.getImplementation() );
}
@ -489,6 +484,7 @@ public class DefaultLifecycleExecutionPlanCalculator
LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
{
calculateForkedExecutions( mojoExecution, session, session.getCurrentProject(), new HashSet<MojoDescriptor>() );
}
@ -556,8 +552,8 @@ public class DefaultLifecycleExecutionPlanCalculator
{
MojoDescriptor forkedMojoDescriptor =
pluginManager.getMojoDescriptor( forkedExecution.getPlugin(), forkedExecution.getGoal(),
DefaultRepositoryRequest.getRepositoryRequest( session,
project ) );
project.getRemotePluginRepositories(),
session.getRepositorySession() );
forkedExecution.setMojoDescriptor( forkedMojoDescriptor );
}

View File

@ -1,39 +1,41 @@
package org.apache.maven.lifecycle.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
* 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.
* 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.ProjectDependenciesResolver;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.lifecycle.MavenExecutionPlan;
import org.apache.maven.project.DefaultDependencyResolutionRequest;
import org.apache.maven.project.DependencyResolutionException;
import org.apache.maven.project.DependencyResolutionResult;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectDependenciesResolver;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.util.filter.AndDependencyFilter;
import org.sonatype.aether.util.filter.ScopeDependencyFilter;
import java.util.*;
@ -50,8 +52,9 @@ import java.util.*;
@Component(role = LifecycleDependencyResolver.class)
public class LifecycleDependencyResolver
{
@Requirement
private ProjectDependenciesResolver projectDependenciesResolver;
private ProjectDependenciesResolver dependenciesResolver;
@Requirement
private Logger logger;
@ -66,7 +69,7 @@ public class LifecycleDependencyResolver
public LifecycleDependencyResolver( ProjectDependenciesResolver projectDependenciesResolver, Logger logger )
{
this.projectDependenciesResolver = projectDependenciesResolver;
this.dependenciesResolver = projectDependenciesResolver;
this.logger = logger;
}
@ -136,87 +139,112 @@ public class LifecycleDependencyResolver
}
Set<Artifact> artifacts =
getProjectDependencies( project, scopesToCollect, scopesToResolve, session, aggregating,
projectArtifacts );
getDependencies( project, scopesToCollect, scopesToResolve, session, aggregating, projectArtifacts );
project.setResolvedArtifacts( artifacts );
Map<String, Artifact> map = new HashMap<String, Artifact>();
for ( Artifact artifact : artifacts )
{
map.put( artifact.getId(), artifact );
}
for ( Artifact artifact : project.getDependencyArtifacts() )
{
if ( artifact.getFile() == null )
{
Artifact resolved = map.get( artifact.getId() );
if ( resolved != null )
{
artifact.setFile( resolved.getFile() );
artifact.setDependencyTrail( resolved.getDependencyTrail() );
artifact.setResolvedVersion( resolved.getVersion() );
artifact.setResolved( true );
}
}
}
}
private Set<Artifact> getProjectDependencies( MavenProject project, Collection<String> scopesToCollect,
private Set<Artifact> getDependencies( MavenProject project, Collection<String> scopesToCollect,
Collection<String> scopesToResolve, MavenSession session,
boolean aggregating, Set<Artifact> projectArtifacts )
throws LifecycleExecutionException
{
Set<Artifact> artifacts;
if ( scopesToCollect == null )
{
scopesToCollect = Collections.emptySet();
}
if ( scopesToResolve == null )
{
scopesToResolve = Collections.emptySet();
}
if ( scopesToCollect.isEmpty() && scopesToResolve.isEmpty() )
{
return new LinkedHashSet<Artifact>();
}
scopesToCollect = new HashSet<String>( scopesToCollect );
scopesToCollect.addAll( scopesToResolve );
DependencyFilter collectionFilter = new ScopeDependencyFilter( null, negate( scopesToCollect ) );
DependencyFilter resolutionFilter = new ScopeDependencyFilter( null, negate( scopesToResolve ) );
resolutionFilter = AndDependencyFilter.newInstance( collectionFilter, resolutionFilter );
resolutionFilter =
AndDependencyFilter.newInstance( resolutionFilter, new ReactorDependencyFilter( projectArtifacts ) );
DependencyResolutionResult result;
try
{
try
{
artifacts = projectDependenciesResolver.resolve( project , scopesToCollect,
scopesToResolve, session, projectArtifacts );
}
catch ( MultipleArtifactsNotFoundException e )
{
/*
* MNG-2277, the check below compensates for our bad plugin support where we ended up with aggregator
* plugins that require dependency resolution although they usually run in phases of the build where
* project artifacts haven't been assembled yet. The prime example of this is "mvn release:prepare".
*/
artifacts = handleException( session, aggregating, e );
}
DefaultDependencyResolutionRequest request =
new DefaultDependencyResolutionRequest( project, session.getRepositorySession() );
request.setResolutionFilter( resolutionFilter );
return artifacts;
result = dependenciesResolver.resolve( request );
}
catch ( ArtifactResolutionException e )
catch ( DependencyResolutionException e )
{
throw new LifecycleExecutionException( null, project, e );
}
catch ( ArtifactNotFoundException e )
{
throw new LifecycleExecutionException( null, project, e );
}
result = e.getResult();
}
private Set<Artifact> handleException( MavenSession session, boolean aggregating,
MultipleArtifactsNotFoundException e )
throws MultipleArtifactsNotFoundException
{
Set<Artifact> artifacts;
/*
* MNG-2277, the check below compensates for our bad plugin support where we ended up with aggregator
* plugins that require dependency resolution although they usually run in phases of the build where project
* artifacts haven't been assembled yet. The prime example of this is "mvn release:prepare".
*/
if ( aggregating && areAllArtifactsInReactor( session.getProjects(), e.getMissingArtifacts() ) )
if ( aggregating && areAllDependenciesInReactor( session.getProjects(), result.getUnresolvedDependencies() ) )
{
logger.warn( "The following artifacts could not be resolved at this point of the build"
logger.warn( "The following dependencies could not be resolved at this point of the build"
+ " but seem to be part of the reactor:" );
for ( Artifact artifact : e.getMissingArtifacts() )
for ( Dependency dependency : result.getUnresolvedDependencies() )
{
logger.warn( "o " + artifact.getId() );
logger.warn( "o " + dependency );
}
logger.warn( "Try running the build up to the lifecycle phase \"package\"" );
artifacts = new LinkedHashSet<Artifact>( e.getResolvedArtifacts() );
}
else
{
throw e;
throw new LifecycleExecutionException( null, project, e );
}
}
Set<Artifact> artifacts = new LinkedHashSet<Artifact>();
if ( result.getDependencyGraph() != null && !result.getDependencyGraph().getChildren().isEmpty() )
{
RepositoryUtils.toArtifacts( artifacts, result.getDependencyGraph().getChildren(),
Collections.singletonList( project.getArtifact().getId() ), collectionFilter );
}
return artifacts;
}
private boolean areAllArtifactsInReactor( Collection<MavenProject> projects, Collection<Artifact> artifacts )
private boolean areAllDependenciesInReactor( Collection<MavenProject> projects, Collection<Dependency> dependencies )
{
Set<String> projectKeys = getReactorProjectKeys( projects );
for ( Artifact artifact : artifacts )
for ( Dependency dependency : dependencies )
{
String key = ArtifactUtils.key( artifact );
org.sonatype.aether.artifact.Artifact a = dependency.getArtifact();
String key = ArtifactUtils.key( a.getGroupId(), a.getArtifactId(), a.getVersion() );
if ( !projectKeys.contains( key ) )
{
return false;
@ -237,4 +265,73 @@ public class LifecycleDependencyResolver
return projectKeys;
}
private Collection<String> negate( Collection<String> scopes )
{
Collection<String> result = new HashSet<String>();
Collections.addAll( result, "system", "compile", "provided", "runtime", "test" );
for ( String scope : scopes )
{
if ( "compile".equals( scope ) )
{
result.remove( "compile" );
result.remove( "system" );
result.remove( "provided" );
}
else if ( "runtime".equals( scope ) )
{
result.remove( "compile" );
result.remove( "runtime" );
}
else if ( "compile+runtime".equals( scope ) )
{
result.remove( "compile" );
result.remove( "system" );
result.remove( "provided" );
result.remove( "runtime" );
}
else if ( "runtime+system".equals( scope ) )
{
result.remove( "compile" );
result.remove( "system" );
result.remove( "runtime" );
}
else if ( "test".equals( scope ) )
{
result.clear();
}
}
return result;
}
private static class ReactorDependencyFilter
implements DependencyFilter
{
private Set<String> keys = new HashSet<String>();
public ReactorDependencyFilter( Collection<Artifact> artifacts )
{
for ( Artifact artifact : artifacts )
{
String key = ArtifactUtils.key( artifact );
keys.add( key );
}
}
public boolean accept( DependencyNode node, List<DependencyNode> parents )
{
Dependency dependency = node.getDependency();
if ( dependency != null )
{
org.sonatype.aether.artifact.Artifact a = dependency.getArtifact();
String key = ArtifactUtils.key( a.getGroupId(), a.getArtifactId(), a.getVersion() );
return !keys.contains( key );
}
return false;
}
}
}

View File

@ -66,7 +66,9 @@ public class LifecyclePluginResolver
{
if ( plugin.getVersion() == null )
{
PluginVersionRequest request = new DefaultPluginVersionRequest( plugin, session );
PluginVersionRequest request =
new DefaultPluginVersionRequest( plugin, session.getRepositorySession(),
project.getRemotePluginRepositories() );
plugin.setVersion( pluginVersionResolver.resolve( request ).getVersion() );
}
versions.put( plugin.getKey(), plugin.getVersion() );
@ -82,7 +84,9 @@ public class LifecyclePluginResolver
plugin.setVersion( versions.get( plugin.getKey() ) );
if ( plugin.getVersion() == null )
{
PluginVersionRequest request = new DefaultPluginVersionRequest( plugin, session );
PluginVersionRequest request =
new DefaultPluginVersionRequest( plugin, session.getRepositorySession(),
project.getRemotePluginRepositories() );
plugin.setVersion( pluginVersionResolver.resolve( request ).getVersion() );
}
}

View File

@ -19,8 +19,6 @@ package org.apache.maven.lifecycle.internal;
* under the License.
*/
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
@ -202,17 +200,16 @@ public class MojoDescriptorCreator
injectPluginDeclarationFromProject( plugin, project );
RepositoryRequest repositoryRequest = DefaultRepositoryRequest.getRepositoryRequest( session, project );
// If there is no version to be found then we need to look in the repository metadata for
// this plugin and see what's specified as the latest release.
//
if ( plugin.getVersion() == null )
{
resolvePluginVersion( plugin, repositoryRequest );
resolvePluginVersion( plugin, session, project );
}
return pluginManager.getMojoDescriptor( plugin, goal, repositoryRequest );
return pluginManager.getMojoDescriptor( plugin, goal, project.getRemotePluginRepositories(),
session.getRepositorySession() );
}
// TODO: take repo mans into account as one may be aggregating prefixes of many
@ -234,10 +231,12 @@ public class MojoDescriptorCreator
return plugin;
}
private void resolvePluginVersion( Plugin plugin, RepositoryRequest repositoryRequest )
private void resolvePluginVersion( Plugin plugin, MavenSession session, MavenProject project )
throws PluginVersionResolutionException
{
PluginVersionRequest versionRequest = new DefaultPluginVersionRequest( plugin, repositoryRequest );
PluginVersionRequest versionRequest =
new DefaultPluginVersionRequest( plugin, session.getRepositorySession(),
project.getRemotePluginRepositories() );
plugin.setVersion( pluginVersionResolver.resolve( versionRequest ).getVersion() );
}

View File

@ -27,7 +27,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.lifecycle.LifecycleExecutor;
import org.apache.maven.lifecycle.LifeCyclePluginAnalyzer;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
@ -54,7 +54,7 @@ public class DefaultLifecycleBindingsInjector
private LifecycleBindingsMerger merger = new LifecycleBindingsMerger();
@Requirement
private LifecycleExecutor lifecycle;
private LifeCyclePluginAnalyzer lifecycle;
public void injectLifecycleBindings( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
{

View File

@ -1,30 +1,29 @@
package org.apache.maven.plugin;
/*
* 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
* 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.
* 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.artifact.repository.RepositoryRequest;
import java.util.List;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
/**
* @author Jason van Zyl
@ -32,12 +31,13 @@ import org.codehaus.plexus.classworlds.realm.ClassRealm;
public interface BuildPluginManager
{
// igorf: Way too many declared exceptions!
PluginDescriptor loadPlugin( Plugin plugin, RepositoryRequest repositoryRequest )
PluginDescriptor loadPlugin( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
InvalidPluginDescriptorException;
// igorf: Way too many declared exceptions!
MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, RepositoryRequest repositoryRequest )
MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, List<RemoteRepository> repositories,
RepositorySystemSession session )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
MojoNotFoundException, InvalidPluginDescriptorException;

View File

@ -0,0 +1,211 @@
package org.apache.maven.plugin;
/*
* 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 java.util.Iterator;
import java.util.List;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Plugin;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.RepositoryPolicy;
import org.sonatype.aether.repository.WorkspaceReader;
import org.sonatype.aether.repository.WorkspaceRepository;
/**
* @author Benjamin Bentmann
*/
class CacheUtils
{
public static <T> boolean eq( T s1, T s2 )
{
return s1 != null ? s1.equals( s2 ) : s2 == null;
}
public static int hash( Object obj )
{
return obj != null ? obj.hashCode() : 0;
}
public static int repositoriesHashCode( List<RemoteRepository> repositories )
{
int result = 17;
for ( RemoteRepository repository : repositories )
{
result = 31 * result + repositoryHashCode( repository );
}
return result;
}
private static int repositoryHashCode( RemoteRepository repository )
{
int result = 17;
result = 31 * result + hash( repository.getUrl() );
return result;
}
private static boolean repositoryEquals( RemoteRepository r1, RemoteRepository r2 )
{
if ( r1 == r2 )
{
return true;
}
return eq( r1.getId(), r2.getId() ) && eq( r1.getUrl(), r2.getUrl() )
&& policyEquals( r1.getPolicy( false ), r2.getPolicy( false ) )
&& policyEquals( r1.getPolicy( true ), r2.getPolicy( true ) );
}
private static boolean policyEquals( RepositoryPolicy p1, RepositoryPolicy p2 )
{
if ( p1 == p2 )
{
return true;
}
// update policy doesn't affect contents
return p1.isEnabled() == p2.isEnabled() && eq( p1.getChecksumPolicy(), p2.getChecksumPolicy() );
}
public static boolean repositoriesEquals( List<RemoteRepository> r1, List<RemoteRepository> r2 )
{
if ( r1.size() != r2.size() )
{
return false;
}
for ( Iterator<RemoteRepository> it1 = r1.iterator(), it2 = r2.iterator(); it1.hasNext(); )
{
if ( !repositoryEquals( it1.next(), it2.next() ) )
{
return false;
}
}
return true;
}
public static int pluginHashCode( Plugin plugin )
{
int hash = 17;
hash = hash * 31 + hash( plugin.getGroupId() );
hash = hash * 31 + hash( plugin.getArtifactId() );
hash = hash * 31 + hash( plugin.getVersion() );
hash = hash * 31 + ( plugin.isExtensions() ? 1 : 0 );
for ( Dependency dependency : plugin.getDependencies() )
{
hash = hash * 31 + hash( dependency.getGroupId() );
hash = hash * 31 + hash( dependency.getArtifactId() );
hash = hash * 31 + hash( dependency.getVersion() );
hash = hash * 31 + hash( dependency.getType() );
hash = hash * 31 + hash( dependency.getClassifier() );
hash = hash * 31 + hash( dependency.getScope() );
for ( Exclusion exclusion : dependency.getExclusions() )
{
hash = hash * 31 + hash( exclusion.getGroupId() );
hash = hash * 31 + hash( exclusion.getArtifactId() );
}
}
return hash;
}
public static boolean pluginEquals( Plugin a, Plugin b )
{
return eq( a.getArtifactId(), b.getArtifactId() ) //
&& eq( a.getGroupId(), b.getGroupId() ) //
&& eq( a.getVersion(), b.getVersion() ) //
&& a.isExtensions() == b.isExtensions() //
&& dependenciesEquals( a.getDependencies(), b.getDependencies() );
}
private static boolean dependenciesEquals( List<Dependency> a, List<Dependency> b )
{
if ( a.size() != b.size() )
{
return false;
}
Iterator<Dependency> aI = a.iterator();
Iterator<Dependency> bI = b.iterator();
while ( aI.hasNext() )
{
Dependency aD = aI.next();
Dependency bD = bI.next();
boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
&& eq( aD.getArtifactId(), bD.getArtifactId() ) //
&& eq( aD.getVersion(), bD.getVersion() ) //
&& eq( aD.getType(), bD.getType() ) //
&& eq( aD.getClassifier(), bD.getClassifier() ) //
&& eq( aD.getScope(), bD.getScope() );
r &= exclusionsEquals( aD.getExclusions(), bD.getExclusions() );
if ( !r )
{
return false;
}
}
return true;
}
private static boolean exclusionsEquals( List<Exclusion> a, List<Exclusion> b )
{
if ( a.size() != b.size() )
{
return false;
}
Iterator<Exclusion> aI = a.iterator();
Iterator<Exclusion> bI = b.iterator();
while ( aI.hasNext() )
{
Exclusion aD = aI.next();
Exclusion bD = bI.next();
boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
&& eq( aD.getArtifactId(), bD.getArtifactId() );
if ( !r )
{
return false;
}
}
return true;
}
public static WorkspaceRepository getWorkspace( RepositorySystemSession session )
{
WorkspaceReader reader = session.getWorkspaceReader();
return ( reader != null ) ? reader.getRepository() : null;
}
}

View File

@ -1,28 +1,24 @@
package org.apache.maven.plugin;
/*
* 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
* 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.
* 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 java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
@ -32,6 +28,8 @@ import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
// TODO: the antrun plugin has its own configurator, the only plugin that does. might need to think about how that works
// TODO: remove the coreArtifactFilterManager
@ -59,11 +57,10 @@ public class DefaultBuildPluginManager
* @throws PluginResolutionException The plugin could be found but could not be resolved.
* @throws InvalidPluginDescriptorException
*/
public PluginDescriptor loadPlugin( Plugin plugin, RepositoryRequest repositoryRequest )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
InvalidPluginDescriptorException
public PluginDescriptor loadPlugin( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, InvalidPluginDescriptorException
{
return mavenPluginManager.getPluginDescriptor( plugin, repositoryRequest );
return mavenPluginManager.getPluginDescriptor( plugin, repositories, session );
}
// ----------------------------------------------------------------------
@ -192,11 +189,12 @@ public class DefaultBuildPluginManager
return pluginDescriptor.getClassRealm();
}
public MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, RepositoryRequest repositoryRequest )
public MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, List<RemoteRepository> repositories,
RepositorySystemSession session )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
MojoNotFoundException, InvalidPluginDescriptorException
{
return mavenPluginManager.getMojoDescriptor( plugin, goal, repositoryRequest );
return mavenPluginManager.getMojoDescriptor( plugin, goal, repositories, session );
}
}

View File

@ -25,11 +25,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.ExtensionDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.artifact.Artifact;
/**
* Default extension realm cache implementation. Assumes cached data does not change.

View File

@ -22,19 +22,18 @@ package org.apache.maven.plugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.WorkspaceRepository;
/**
* @author Igor Fedorenko
@ -46,36 +45,67 @@ public class DefaultPluginArtifactsCache
{
private static class CacheKey
implements Key
{
private final Plugin plugin;
private final List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
private final WorkspaceRepository workspace;
private final ArtifactFilter extensionArtifactFilter;
private final LocalRepository localRepo;
private final List<RemoteRepository> repositories;
private final DependencyFilter filter;
private final int hashCode;
public CacheKey( Plugin plugin, RepositoryRequest repositoryRequest, ArtifactFilter extensionArtifactFilter )
public CacheKey( Plugin plugin, DependencyFilter extensionFilter, List<RemoteRepository> repositories,
RepositorySystemSession session )
{
this.plugin = plugin.clone();
this.repositories.add( repositoryRequest.getLocalRepository() );
this.repositories.addAll( repositoryRequest.getRemoteRepositories() );
this.extensionArtifactFilter = extensionArtifactFilter;
workspace = CacheUtils.getWorkspace( session );
this.localRepo = session.getLocalRepository();
this.repositories = new ArrayList<RemoteRepository>( repositories.size() );
for ( RemoteRepository repository : repositories )
{
if ( repository.isRepositoryManager() )
{
this.repositories.addAll( repository.getMirroredRepositories() );
}
else
{
this.repositories.add( repository );
}
}
this.filter = extensionFilter;
int hash = 17;
hash = hash * 31 + pluginHashCode( plugin );
hash = hash * 31 + repositories.hashCode();
hash = hash * 31 + ( extensionArtifactFilter != null ? extensionArtifactFilter.hashCode() : 0 );
hash = hash * 31 + CacheUtils.pluginHashCode( plugin );
hash = hash * 31 + hash( workspace );
hash = hash * 31 + hash( localRepo );
hash = hash * 31 + CacheUtils.repositoriesHashCode( repositories );
hash = hash * 31 + hash( extensionFilter );
this.hashCode = hash;
}
@Override
public String toString()
{
return plugin.getId();
}
@Override
public int hashCode()
{
return hashCode;
}
private static int hash( Object obj )
{
return obj != null ? obj.hashCode() : 0;
}
@Override
public boolean equals( Object o )
{
@ -89,34 +119,43 @@ public class DefaultPluginArtifactsCache
return false;
}
CacheKey other = (CacheKey) o;
CacheKey that = (CacheKey) o;
return pluginEquals( plugin, other.plugin ) && eq( repositories, other.repositories )
&& eq( extensionArtifactFilter, other.extensionArtifactFilter );
return CacheUtils.pluginEquals( plugin, that.plugin ) && eq( workspace, that.workspace )
&& eq( localRepo, that.localRepo ) && CacheUtils.repositoriesEquals( repositories, that.repositories )
&& eq( filter, that.filter );
}
}
protected final Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
public CacheRecord get( Plugin plugin, RepositoryRequest repositoryRequest, ArtifactFilter extensionArtifactFilter )
private static <T> boolean eq( T s1, T s2 )
{
return cache.get( new CacheKey( plugin, repositoryRequest, extensionArtifactFilter ) );
return s1 != null ? s1.equals( s2 ) : s2 == null;
}
public CacheRecord put( Plugin plugin, RepositoryRequest repositoryRequest, ArtifactFilter extensionArtifactFilter,
List<Artifact> pluginArtifacts )
}
protected final Map<Key, CacheRecord> cache = new HashMap<Key, CacheRecord>();
public Key createKey( Plugin plugin, DependencyFilter extensionFilter, List<RemoteRepository> repositories,
RepositorySystemSession session )
{
return new CacheKey( plugin, extensionFilter, repositories, session );
}
public CacheRecord get( Key key )
{
return cache.get( key );
}
public CacheRecord put( Key key, List<Artifact> pluginArtifacts )
{
if ( pluginArtifacts == null )
{
throw new NullPointerException();
}
CacheKey key = new CacheKey( plugin, repositoryRequest, extensionArtifactFilter );
if ( cache.containsKey( key ) )
{
throw new IllegalStateException( "Duplicate artifact resolution result for plugin " + plugin.getId() );
throw new IllegalStateException( "Duplicate artifact resolution result for plugin " + key );
}
CacheRecord record =
@ -134,102 +173,12 @@ public class DefaultPluginArtifactsCache
protected static int pluginHashCode( Plugin plugin )
{
int hash = 17;
hash = hash * 31 + plugin.getGroupId().hashCode();
hash = hash * 31 + plugin.getArtifactId().hashCode();
hash = hash * 31 + plugin.getVersion().hashCode();
for ( Dependency dependency : plugin.getDependencies() )
{
hash = hash * 31 + dependency.getGroupId().hashCode();
hash = hash * 31 + dependency.getArtifactId().hashCode();
hash = hash * 31 + dependency.getVersion().hashCode();
hash = hash * 31 + dependency.getType().hashCode();
hash = hash * 31 + ( dependency.getClassifier() != null ? dependency.getClassifier().hashCode() : 0 );
hash = hash * 31 + ( dependency.getScope() != null ? dependency.getScope().hashCode() : 0 );
for ( Exclusion exclusion : dependency.getExclusions() )
{
hash = hash * 31 + exclusion.getGroupId().hashCode();
hash = hash * 31 + exclusion.getArtifactId().hashCode();
}
}
return hash;
return CacheUtils.pluginHashCode( plugin );
}
protected static boolean pluginEquals( Plugin a, Plugin b )
{
return eq( a.getGroupId(), b.getGroupId() ) //
&& eq( a.getArtifactId(), b.getArtifactId() ) //
&& eq( a.getVersion(), b.getVersion() ) //
&& dependenciesEquals( a.getDependencies(), b.getDependencies() );
}
private static boolean dependenciesEquals( List<Dependency> a, List<Dependency> b )
{
if ( a.size() != b.size() )
{
return false;
}
Iterator<Dependency> aI = a.iterator();
Iterator<Dependency> bI = b.iterator();
while ( aI.hasNext() )
{
Dependency aD = aI.next();
Dependency bD = bI.next();
boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
&& eq( aD.getArtifactId(), bD.getArtifactId() ) //
&& eq( aD.getVersion(), bD.getVersion() ) //
&& eq( aD.getType(), bD.getType() ) //
&& eq( aD.getClassifier(), bD.getClassifier() ) //
&& eq( aD.getScope(), bD.getScope() );
r &= exclusionsEquals( aD.getExclusions(), bD.getExclusions() );
if ( !r )
{
return false;
}
}
return true;
}
private static boolean exclusionsEquals( List<Exclusion> a, List<Exclusion> b )
{
if ( a.size() != b.size() )
{
return false;
}
Iterator<Exclusion> aI = a.iterator();
Iterator<Exclusion> bI = b.iterator();
while ( aI.hasNext() )
{
Exclusion aD = aI.next();
Exclusion bD = bI.next();
boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
&& eq( aD.getArtifactId(), bD.getArtifactId() );
if ( !r )
{
return false;
}
}
return true;
}
private static <T> boolean eq( T s1, T s2 )
{
return s1 != null ? s1.equals( s2 ) : s2 == null;
return CacheUtils.pluginEquals( a, b );
}
public void register( MavenProject project, CacheRecord record )

View File

@ -21,19 +21,19 @@ package org.apache.maven.plugin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.WorkspaceRepository;
/**
* Caches raw plugin descriptors. A raw plugin descriptor is a descriptor that has just been extracted from the plugin
@ -57,14 +57,9 @@ public class DefaultPluginDescriptorCache
descriptors.clear();
}
public Key createKey( Plugin plugin, RepositoryRequest repositoryRequest )
public Key createKey( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
{
return new CacheKey( plugin, repositoryRequest );
}
public void put( Key cacheKey, PluginDescriptor pluginDescriptor )
{
descriptors.put( cacheKey, clone( pluginDescriptor ) );
return new CacheKey( plugin, repositories, session );
}
public PluginDescriptor get( Key cacheKey )
@ -72,6 +67,11 @@ public class DefaultPluginDescriptorCache
return clone( descriptors.get( cacheKey ) );
}
public void put( Key cacheKey, PluginDescriptor pluginDescriptor )
{
descriptors.put( cacheKey, clone( pluginDescriptor ) );
}
private static PluginDescriptor clone( PluginDescriptor original )
{
PluginDescriptor clone = null;
@ -129,25 +129,42 @@ public class DefaultPluginDescriptorCache
private final String version;
private final List<ArtifactRepository> repositories;
private final WorkspaceRepository workspace;
private final LocalRepository localRepo;
private final List<RemoteRepository> repositories;
private final int hashCode;
public CacheKey( Plugin plugin, RepositoryRequest repositoryRequest )
public CacheKey( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
{
groupId = plugin.getGroupId();
artifactId = plugin.getArtifactId();
version = plugin.getVersion();
repositories = new ArrayList<ArtifactRepository>( repositoryRequest.getRemoteRepositories().size() + 1 );
repositories.add( repositoryRequest.getLocalRepository() );
repositories.addAll( repositoryRequest.getRemoteRepositories() );
workspace = CacheUtils.getWorkspace( session );
localRepo = session.getLocalRepository();
this.repositories = new ArrayList<RemoteRepository>( repositories.size() );
for ( RemoteRepository repository : repositories )
{
if ( repository.isRepositoryManager() )
{
this.repositories.addAll( repository.getMirroredRepositories() );
}
else
{
this.repositories.add( repository );
}
}
int hash = 17;
hash = hash * 31 + groupId.hashCode();
hash = hash * 31 + artifactId.hashCode();
hash = hash * 31 + version.hashCode();
hash = hash * 31 + repositoriesHashCode( repositories );
hash = hash * 31 + hash( workspace );
hash = hash * 31 + localRepo.hashCode();
hash = hash * 31 + CacheUtils.repositoriesHashCode( repositories );
this.hashCode = hash;
}
@ -172,8 +189,10 @@ public class DefaultPluginDescriptorCache
CacheKey that = (CacheKey) obj;
return this.artifactId.equals( that.artifactId ) && this.groupId.equals( that.groupId )
&& this.version.equals( that.version ) && repositoriesEquals( this.repositories, that.repositories );
return eq( this.artifactId, that.artifactId ) && eq( this.groupId, that.groupId )
&& eq( this.version, that.version ) && eq( this.localRepo, that.localRepo )
&& eq( this.workspace, that.workspace )
&& CacheUtils.repositoriesEquals( this.repositories, that.repositories );
}
@Override
@ -182,61 +201,9 @@ public class DefaultPluginDescriptorCache
return groupId + ':' + artifactId + ':' + version;
}
private static int repositoryHashCode( ArtifactRepository repository )
private static int hash( Object obj )
{
int result = 17;
result = 31 * result + ( repository.getId() != null ? repository.getId().hashCode() : 0 );
return result;
}
private static int repositoriesHashCode( List<ArtifactRepository> repositories )
{
int result = 17;
for ( ArtifactRepository repository : repositories )
{
result = 31 * result + repositoryHashCode( repository );
}
return result;
}
private static boolean repositoryEquals( ArtifactRepository r1, ArtifactRepository r2 )
{
if ( r1 == r2 )
{
return true;
}
return eq( r1.getId(), r2.getId() ) && eq( r1.getUrl(), r2.getUrl() )
&& repositoryPolicyEquals( r1.getReleases(), r2.getReleases() )
&& repositoryPolicyEquals( r1.getSnapshots(), r2.getSnapshots() );
}
private static boolean repositoryPolicyEquals( ArtifactRepositoryPolicy p1, ArtifactRepositoryPolicy p2 )
{
if ( p1 == p2 )
{
return true;
}
return p1.isEnabled() == p2.isEnabled() && eq( p1.getUpdatePolicy(), p2.getUpdatePolicy() );
}
private static boolean repositoriesEquals( List<ArtifactRepository> r1, List<ArtifactRepository> r2 )
{
if ( r1.size() != r2.size() )
{
return false;
}
for ( Iterator<ArtifactRepository> it1 = r1.iterator(), it2 = r2.iterator(); it1.hasNext(); )
{
if ( !repositoryEquals( it1.next(), it2.next() ) )
{
return false;
}
}
return true;
return obj != null ? obj.hashCode() : 0;
}
private static <T> boolean eq( T s1, T s2 )

View File

@ -21,20 +21,20 @@ package org.apache.maven.plugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.WorkspaceRepository;
/**
* Default PluginCache implementation. Assumes cached data does not change.
@ -45,45 +45,76 @@ public class DefaultPluginRealmCache
{
protected static class CacheKey
implements Key
{
private final Plugin plugin;
private final List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
private final WorkspaceRepository workspace;
private final LocalRepository localRepo;
private final List<RemoteRepository> repositories;
private final ClassLoader parentRealm;
private final List<String> parentImports;
private final ArtifactFilter filter;
private final DependencyFilter filter;
private final int hashCode;
public CacheKey( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
ArtifactFilter dependencyFilter, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories )
DependencyFilter dependencyFilter, List<RemoteRepository> repositories,
RepositorySystemSession session )
{
this.plugin = plugin.clone();
this.repositories.add( localRepository );
this.repositories.addAll( remoteRepositories );
this.workspace = CacheUtils.getWorkspace( session );
this.localRepo = session.getLocalRepository();
this.repositories = new ArrayList<RemoteRepository>( repositories.size() );
for ( RemoteRepository repository : repositories )
{
if ( repository.isRepositoryManager() )
{
this.repositories.addAll( repository.getMirroredRepositories() );
}
else
{
this.repositories.add( repository );
}
}
this.parentRealm = parentRealm;
this.parentImports = ( parentImports != null ) ? parentImports : Collections.<String> emptyList();
this.filter = dependencyFilter;
int hash = 17;
hash = hash * 31 + pluginHashCode( plugin );
hash = hash * 31 + repositories.hashCode();
hash = hash * 31 + ( parentRealm != null ? parentRealm.hashCode() : 0 );
hash = hash * 31 + CacheUtils.pluginHashCode( plugin );
hash = hash * 31 + hash( workspace );
hash = hash * 31 + hash( localRepo );
hash = hash * 31 + CacheUtils.repositoriesHashCode( repositories );
hash = hash * 31 + hash( parentRealm );
hash = hash * 31 + this.parentImports.hashCode();
hash = hash * 31 + ( dependencyFilter != null ? dependencyFilter.hashCode() : 0 );
hash = hash * 31 + hash( dependencyFilter );
this.hashCode = hash;
}
@Override
public String toString()
{
return plugin.getId();
}
@Override
public int hashCode()
{
return hashCode;
}
private static int hash( Object obj )
{
return obj != null ? obj.hashCode() : 0;
}
@Override
public boolean equals( Object o )
{
@ -97,40 +128,45 @@ public class DefaultPluginRealmCache
return false;
}
CacheKey other = (CacheKey) o;
CacheKey that = (CacheKey) o;
return parentRealm == other.parentRealm && pluginEquals( plugin, other.plugin )
&& eq( repositories, other.repositories ) && eq( filter, other.filter )
&& eq( parentImports, other.parentImports );
}
return parentRealm == that.parentRealm && CacheUtils.pluginEquals( plugin, that.plugin )
&& eq( workspace, that.workspace ) && eq( localRepo, that.localRepo )
&& CacheUtils.repositoriesEquals( this.repositories, that.repositories ) && eq( filter, that.filter )
&& eq( parentImports, that.parentImports );
}
protected final Map<CacheKey, CacheRecord> cache = new ConcurrentHashMap<CacheKey, CacheRecord>();
public CacheRecord get( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
ArtifactFilter dependencyFilter, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories )
private static <T> boolean eq( T s1, T s2 )
{
return cache.get( new CacheKey( plugin, parentRealm, parentImports, dependencyFilter, localRepository,
remoteRepositories ) );
return s1 != null ? s1.equals( s2 ) : s2 == null;
}
public CacheRecord put( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
ArtifactFilter dependencyFilter, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ClassRealm pluginRealm,
List<Artifact> pluginArtifacts )
}
protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<Key, CacheRecord>();
public Key createKey( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
DependencyFilter dependencyFilter, List<RemoteRepository> repositories,
RepositorySystemSession session )
{
return new CacheKey( plugin, parentRealm, parentImports, dependencyFilter, repositories, session );
}
public CacheRecord get( Key key )
{
return cache.get( key );
}
public CacheRecord put( Key key, ClassRealm pluginRealm, List<Artifact> pluginArtifacts )
{
if ( pluginRealm == null || pluginArtifacts == null )
{
throw new NullPointerException();
throw new IllegalArgumentException();
}
CacheKey key =
new CacheKey( plugin, parentRealm, parentImports, dependencyFilter, localRepository, remoteRepositories );
if ( cache.containsKey( key ) )
{
throw new IllegalStateException( "Duplicate plugin realm for plugin " + plugin.getId() );
throw new IllegalStateException( "Duplicate plugin realm for plugin " + key );
}
CacheRecord record = new CacheRecord( pluginRealm, pluginArtifacts );
@ -147,105 +183,12 @@ public class DefaultPluginRealmCache
protected static int pluginHashCode( Plugin plugin )
{
int hash = 17;
hash = hash * 31 + plugin.getGroupId().hashCode();
hash = hash * 31 + plugin.getArtifactId().hashCode();
hash = hash * 31 + plugin.getVersion().hashCode();
hash = hash * 31 + ( plugin.isExtensions() ? 1 : 0 );
for ( Dependency dependency : plugin.getDependencies() )
{
hash = hash * 31 + dependency.getGroupId().hashCode();
hash = hash * 31 + dependency.getArtifactId().hashCode();
hash = hash * 31 + dependency.getVersion().hashCode();
hash = hash * 31 + dependency.getType().hashCode();
hash = hash * 31 + ( dependency.getClassifier() != null ? dependency.getClassifier().hashCode() : 0 );
hash = hash * 31 + ( dependency.getScope() != null ? dependency.getScope().hashCode() : 0 );
for ( Exclusion exclusion : dependency.getExclusions() )
{
hash = hash * 31 + exclusion.getGroupId().hashCode();
hash = hash * 31 + exclusion.getArtifactId().hashCode();
}
}
return hash;
return CacheUtils.pluginHashCode( plugin );
}
protected static boolean pluginEquals( Plugin a, Plugin b )
{
return eq( a.getGroupId(), b.getGroupId() ) //
&& eq( a.getArtifactId(), b.getArtifactId() ) //
&& eq( a.getVersion(), b.getVersion() ) //
&& a.isExtensions() == b.isExtensions() //
&& dependenciesEquals( a.getDependencies(), b.getDependencies() );
}
private static boolean dependenciesEquals( List<Dependency> a, List<Dependency> b )
{
if ( a.size() != b.size() )
{
return false;
}
Iterator<Dependency> aI = a.iterator();
Iterator<Dependency> bI = b.iterator();
while ( aI.hasNext() )
{
Dependency aD = aI.next();
Dependency bD = bI.next();
boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
&& eq( aD.getArtifactId(), bD.getArtifactId() ) //
&& eq( aD.getVersion(), bD.getVersion() ) //
&& eq( aD.getType(), bD.getType() ) //
&& eq( aD.getClassifier(), bD.getClassifier() ) //
&& eq( aD.getScope(), bD.getScope() );
r &= exclusionsEquals( aD.getExclusions(), bD.getExclusions() );
if ( !r )
{
return false;
}
}
return true;
}
private static boolean exclusionsEquals( List<Exclusion> a, List<Exclusion> b )
{
if ( a.size() != b.size() )
{
return false;
}
Iterator<Exclusion> aI = a.iterator();
Iterator<Exclusion> bI = b.iterator();
while ( aI.hasNext() )
{
Exclusion aD = aI.next();
Exclusion bD = bI.next();
boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
&& eq( aD.getArtifactId(), bD.getArtifactId() );
if ( !r )
{
return false;
}
}
return true;
}
private static <T> boolean eq( T s1, T s2 )
{
return s1 != null ? s1.equals( s2 ) : s2 == null;
return CacheUtils.pluginEquals( a, b );
}
public void register( MavenProject project, CacheRecord record )

View File

@ -21,10 +21,10 @@ package org.apache.maven.plugin;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.ExtensionDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.sonatype.aether.artifact.Artifact;
/**
* Caches extension class realms. <strong>Warning:</strong> This is an internal utility interface that is only public

View File

@ -24,12 +24,10 @@ import java.util.List;
public class InvalidPluginDescriptorException
extends Exception
{
private List<String> errors;
public InvalidPluginDescriptorException( String message, List<String> errors )
{
super( toMessage( message, errors ) );
this.errors = errors;
}
private static String toMessage( String message, List<String> errors )

View File

@ -20,6 +20,7 @@ package org.apache.maven.plugin;
*/
import org.apache.maven.execution.MavenSession;
import org.sonatype.aether.RepositorySystemSession;
/**
* Helps to provide backward-compatibility with plugins that use legacy components. <strong>Warning:</strong> This is an
@ -48,4 +49,11 @@ public interface LegacySupport
*/
MavenSession getSession();
/**
* Gets the currently active repository session.
*
* @return The currently active repository session or {@code null} if none.
*/
RepositorySystemSession getRepositorySession();
}

View File

@ -21,12 +21,13 @@ package org.apache.maven.plugin;
import java.util.List;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Provides basic services to manage Maven plugins and their mojos. This component is kept general in its design such
@ -43,11 +44,12 @@ public interface MavenPluginManager
* Retrieves the descriptor for the specified plugin from its main artifact.
*
* @param plugin The plugin whose descriptor should be retrieved, must not be {@code null}.
* @param repositoryRequest The repository request to use for resolving the plugin's main artifact, must not be
* {@code null}.
* @param repositories The plugin repositories to use for resolving the plugin's main artifact, must not be {@code
* null}.
* @param session The repository session to use for resolving the plugin's main artifact, must not be {@code null}.
* @return The plugin descriptor, never {@code null}.
*/
PluginDescriptor getPluginDescriptor( Plugin plugin, RepositoryRequest repositoryRequest )
PluginDescriptor getPluginDescriptor( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginResolutionException, PluginDescriptorParsingException, InvalidPluginDescriptorException;
/**
@ -55,11 +57,13 @@ public interface MavenPluginManager
*
* @param plugin The plugin whose mojo descriptor should be retrieved, must not be {@code null}.
* @param goal The simple name of the mojo whose descriptor should be retrieved, must not be {@code null}.
* @param repositoryRequest The repository request to use for resolving the plugin's main artifact, must not be
* {@code null}.
* @param repositories The plugin repositories to use for resolving the plugin's main artifact, must not be {@code
* null}.
* @param session The repository session to use for resolving the plugin's main artifact, must not be {@code null}.
* @return The mojo descriptor, never {@code null}.
*/
MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, RepositoryRequest repositoryRequest )
MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, List<RemoteRepository> repositories,
RepositorySystemSession session )
throws MojoNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
InvalidPluginDescriptorException;
@ -76,7 +80,7 @@ public interface MavenPluginManager
* @param filter The filter used to exclude certain plugin dependencies, may be {@code null}.
*/
void setupPluginRealm( PluginDescriptor pluginDescriptor, MavenSession session, ClassLoader parent,
List<String> imports, ArtifactFilter filter )
List<String> imports, DependencyFilter filter )
throws PluginResolutionException, PluginContainerException;
/**

View File

@ -21,11 +21,12 @@ package org.apache.maven.plugin;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Caches plugin artifacts. <strong>Warning:</strong> This is an internal utility interface that is only public for
@ -38,6 +39,14 @@ import org.apache.maven.project.MavenProject;
public interface PluginArtifactsCache
{
/**
* A cache key.
*/
interface Key
{
// marker interface for cache keys
}
public static class CacheRecord
{
@ -50,10 +59,12 @@ public interface PluginArtifactsCache
}
CacheRecord get( Plugin plugin, RepositoryRequest repositoryRequest, ArtifactFilter extensionArtifactFilter );
Key createKey( Plugin plugin, DependencyFilter extensionFilter, List<RemoteRepository> repositories,
RepositorySystemSession session );
CacheRecord put( Plugin plugin, RepositoryRequest repositoryRequest, ArtifactFilter extensionArtifactFilter,
List<Artifact> pluginArtifacts );
CacheRecord get( Key key );
CacheRecord put( Key key, List<Artifact> pluginArtifacts );
void flush();

View File

@ -19,9 +19,12 @@ package org.apache.maven.plugin;
* under the License.
*/
import org.apache.maven.artifact.repository.RepositoryRequest;
import java.util.List;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Caches raw plugin descriptors. A raw plugin descriptor is a descriptor that has just been extracted from the plugin
@ -44,11 +47,11 @@ public interface PluginDescriptorCache
// marker interface for cache keys
}
Key createKey( Plugin plugin, RepositoryRequest repositoryRequest );
Key createKey( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session );
void put( Key cacheKey, PluginDescriptor pluginDescriptor );
void put( Key key, PluginDescriptor pluginDescriptor );
PluginDescriptor get( Key cacheKey );
PluginDescriptor get( Key key );
void flush();

View File

@ -28,12 +28,9 @@ public class PluginDescriptorParsingException
extends Exception
{
private Plugin plugin;
public PluginDescriptorParsingException( Plugin plugin, String descriptorLocation, Throwable e )
{
super( createMessage( plugin, descriptorLocation, e ), e );
this.plugin = plugin;
}
private static String createMessage( Plugin plugin, String descriptorLocation, Throwable e )

View File

@ -229,6 +229,10 @@ public class PluginParameterExpressionEvaluator
e );
}
}
else if ( expression.equals( "repositorySystemSession" ) )
{
value = session.getRepositorySession();
}
else if ( expression.equals( "mojo" ) )
{
value = mojoExecution;

View File

@ -22,11 +22,12 @@ package org.apache.maven.plugin;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Caches plugin class realms. <strong>Warning:</strong> This is an internal utility interface that is only public for
@ -42,6 +43,7 @@ public interface PluginRealmCache
public static class CacheRecord
{
public final ClassRealm realm;
public final List<Artifact> artifacts;
public CacheRecord( ClassRealm realm, List<Artifact> artifacts )
@ -51,14 +53,20 @@ public interface PluginRealmCache
}
}
CacheRecord get( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
ArtifactFilter dependencyFilter, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories );
/**
* A cache key.
*/
interface Key
{
// marker interface for cache keys
}
CacheRecord put( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
ArtifactFilter dependencyFilter, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ClassRealm pluginRealm,
List<Artifact> pluginArtifacts );
Key createKey( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
DependencyFilter dependencyFilter, List<RemoteRepository> repositories, RepositorySystemSession session );
CacheRecord get( Key key );
CacheRecord put( Key key, ClassRealm pluginRealm, List<Artifact> pluginArtifacts );
void flush();

View File

@ -19,8 +19,6 @@ package org.apache.maven.plugin;
* under the License.
*/
import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.model.Plugin;
/**
@ -30,15 +28,15 @@ import org.apache.maven.model.Plugin;
* @version $Id$
*/
public class PluginResolutionException
extends AbstractArtifactResolutionException
extends Exception
{
private final Plugin plugin;
public PluginResolutionException( Plugin plugin, ArtifactResolutionException e )
public PluginResolutionException( Plugin plugin, Throwable cause )
{
super( "Plugin " + plugin.getId() + " or one of its dependencies could not be resolved: " + e.getMessage(),
e.getGroupId(), e.getArtifactId(), e.getVersion(), e.getType(), null, e.getRemoteRepositories(), null,
e );
super( "Plugin " + plugin.getId() + " or one of its dependencies could not be resolved: " + cause.getMessage(),
cause );
this.plugin = plugin;
}
@ -46,4 +44,5 @@ public class PluginResolutionException
{
return plugin;
}
}

View File

@ -22,6 +22,7 @@ package org.apache.maven.plugin.internal;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.LegacySupport;
import org.codehaus.plexus.component.annotations.Component;
import org.sonatype.aether.RepositorySystemSession;
/**
* Helps to provide backward-compatibility with plugins that use legacy components. <strong>Warning:</strong> This is an
@ -55,4 +56,10 @@ public class DefaultLegacySupport
return session.get();
}
public RepositorySystemSession getRepositorySession()
{
MavenSession session = getSession();
return ( session != null ) ? session.getRepositorySession() : null;
}
}

View File

@ -28,18 +28,16 @@ import java.io.InputStream;
import java.io.PrintStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.classrealm.ClassRealmManager;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
@ -86,6 +84,12 @@ import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.util.filter.AndDependencyFilter;
import org.sonatype.aether.util.graph.PreorderNodeListGenerator;
/**
* Provides basic services to manage Maven plugins and their mojos. This component is kept general in its design such
@ -120,17 +124,17 @@ public class DefaultMavenPluginManager
private PluginDescriptorBuilder builder = new PluginDescriptorBuilder();
public synchronized PluginDescriptor getPluginDescriptor( Plugin plugin, RepositoryRequest repositoryRequest )
public synchronized PluginDescriptor getPluginDescriptor( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginResolutionException, PluginDescriptorParsingException, InvalidPluginDescriptorException
{
PluginDescriptorCache.Key cacheKey = pluginDescriptorCache.createKey( plugin, repositoryRequest );
PluginDescriptorCache.Key cacheKey = pluginDescriptorCache.createKey( plugin, repositories, session );
PluginDescriptor pluginDescriptor = pluginDescriptorCache.get( cacheKey );
if ( pluginDescriptor == null )
{
Artifact pluginArtifact =
pluginDependenciesResolver.resolve( plugin, new ArtifactResolutionRequest( repositoryRequest ) );
RepositoryUtils.toArtifact( pluginDependenciesResolver.resolve( plugin, repositories, session ) );
pluginDescriptor = extractPluginDescriptor( pluginArtifact, plugin );
@ -239,11 +243,12 @@ public class DefaultMavenPluginManager
}
}
public MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, RepositoryRequest repositoryRequest )
public MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, List<RemoteRepository> repositories,
RepositorySystemSession session )
throws MojoNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
InvalidPluginDescriptorException
{
PluginDescriptor pluginDescriptor = getPluginDescriptor( plugin, repositoryRequest );
PluginDescriptor pluginDescriptor = getPluginDescriptor( plugin, repositories, session );
MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( goal );
@ -256,16 +261,18 @@ public class DefaultMavenPluginManager
}
public synchronized void setupPluginRealm( PluginDescriptor pluginDescriptor, MavenSession session,
ClassLoader parent, List<String> imports, ArtifactFilter filter )
ClassLoader parent, List<String> imports, DependencyFilter filter )
throws PluginResolutionException, PluginContainerException
{
Plugin plugin = pluginDescriptor.getPlugin();
MavenProject project = session.getCurrentProject();
PluginRealmCache.CacheRecord cacheRecord =
pluginRealmCache.get( plugin, parent, imports, filter, session.getLocalRepository(),
project.getPluginArtifactRepositories() );
PluginRealmCache.Key cacheKey =
pluginRealmCache.createKey( plugin, parent, imports, filter, project.getRemotePluginRepositories(),
session.getRepositorySession() );
PluginRealmCache.CacheRecord cacheRecord = pluginRealmCache.get( cacheKey );
if ( cacheRecord != null )
{
@ -277,16 +284,14 @@ public class DefaultMavenPluginManager
createPluginRealm( pluginDescriptor, session, parent, imports, filter );
cacheRecord =
pluginRealmCache.put( plugin, parent, imports, filter, session.getLocalRepository(),
project.getPluginArtifactRepositories(), pluginDescriptor.getClassRealm(),
pluginDescriptor.getArtifacts() );
pluginRealmCache.put( cacheKey, pluginDescriptor.getClassRealm(), pluginDescriptor.getArtifacts() );
}
pluginRealmCache.register( project, cacheRecord );
}
private void createPluginRealm( PluginDescriptor pluginDescriptor, MavenSession session, ClassLoader parent,
List<String> imports, ArtifactFilter filter )
List<String> imports, DependencyFilter filter )
throws PluginResolutionException, PluginContainerException
{
Plugin plugin = pluginDescriptor.getPlugin();
@ -305,42 +310,32 @@ public class DefaultMavenPluginManager
MavenProject project = session.getCurrentProject();
ArtifactResolutionRequest request = new ArtifactResolutionRequest();
request.setLocalRepository( session.getLocalRepository() );
request.setRemoteRepositories( project.getPluginArtifactRepositories() );
request.setCache( session.getRepositoryCache() );
request.setOffline( session.isOffline() );
request.setForceUpdate( session.getRequest().isUpdateSnapshots() );
request.setServers( session.getRequest().getServers() );
request.setMirrors( session.getRequest().getMirrors() );
request.setProxies( session.getRequest().getProxies() );
request.setTransferListener( session.getRequest().getTransferListener() );
DependencyFilter dependencyFilter = project.getExtensionDependencyFilter();
dependencyFilter = AndDependencyFilter.newInstance( dependencyFilter, filter );
ArtifactFilter dependencyFilter = project.getExtensionArtifactFilter();
if ( dependencyFilter == null )
DependencyNode root =
pluginDependenciesResolver.resolve( plugin, RepositoryUtils.toArtifact( pluginArtifact ), dependencyFilter,
project.getRemotePluginRepositories(), session.getRepositorySession() );
PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
root.accept( nlg );
List<Artifact> exposedPluginArtifacts = new ArrayList<Artifact>( nlg.getNodes().size() );
RepositoryUtils.toArtifacts( exposedPluginArtifacts, Collections.singleton( root ),
Collections.<String> emptyList(), null );
for ( Iterator<Artifact> it = exposedPluginArtifacts.iterator(); it.hasNext(); )
{
dependencyFilter = filter;
Artifact artifact = it.next();
if ( artifact.getFile() == null )
{
it.remove();
}
else if ( filter != null )
{
dependencyFilter = new AndArtifactFilter( Arrays.asList( dependencyFilter, filter ) );
}
List<Artifact> pluginArtifacts =
pluginDependenciesResolver.resolve( plugin, pluginArtifact, request, dependencyFilter );
List<org.sonatype.aether.artifact.Artifact> pluginArtifacts = nlg.getArtifacts( true );
ClassRealm pluginRealm = classRealmManager.createPluginRealm( plugin, parent, imports, pluginArtifacts );
List<Artifact> exposedPluginArtifacts = new ArrayList<Artifact>();
for ( Artifact artifact : pluginArtifacts )
{
if ( artifact.getFile() != null )
{
exposedPluginArtifacts.add( artifact );
}
}
pluginDescriptor.setClassRealm( pluginRealm );
pluginDescriptor.setArtifacts( exposedPluginArtifacts );

View File

@ -19,28 +19,37 @@ package org.apache.maven.plugin.internal;
* under the License.
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.maven.ArtifactFilterManager;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.collection.CollectRequest;
import org.sonatype.aether.collection.DependencyCollectionException;
import org.sonatype.aether.collection.DependencyGraphTransformer;
import org.sonatype.aether.collection.DependencySelector;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.graph.DependencyVisitor;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.resolution.ArtifactRequest;
import org.sonatype.aether.resolution.ArtifactResolutionException;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.artifact.JavaScopes;
import org.sonatype.aether.util.filter.AndDependencyFilter;
import org.sonatype.aether.util.filter.ExclusionsDependencyFilter;
import org.sonatype.aether.util.filter.ScopeDependencyFilter;
import org.sonatype.aether.util.graph.selector.AndDependencySelector;
import org.sonatype.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
/**
* Assists in resolving the dependencies of a plugin. <strong>Warning:</strong> This is an internal utility class that
@ -55,29 +64,32 @@ public class DefaultPluginDependenciesResolver
implements PluginDependenciesResolver
{
@Requirement
protected RepositorySystem repositorySystem;
private static final String REPOSITORY_CONTEXT = "plugin";
@Requirement
private ResolutionErrorHandler resolutionErrorHandler;
private Logger logger;
@Requirement
private ArtifactFilterManager artifactFilterManager;
public Artifact resolve( Plugin plugin, ArtifactResolutionRequest request )
@Requirement
private RepositorySystem repoSystem;
private Artifact toArtifact( Plugin plugin, RepositorySystemSession session )
{
return new DefaultArtifact( plugin.getGroupId(), plugin.getArtifactId(), null, "jar", plugin.getVersion(),
session.getArtifactTypeRegistry().get( "maven-plugin" ) );
}
public Artifact resolve( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginResolutionException
{
Artifact pluginArtifact = repositorySystem.createPluginArtifact( plugin );
request.setArtifact( pluginArtifact );
request.setResolveRoot( true );
request.setResolveTransitively( false );
ArtifactResolutionResult result = repositorySystem.resolve( request );
Artifact pluginArtifact = toArtifact( plugin, session );
try
{
resolutionErrorHandler.throwErrors( request, result );
ArtifactRequest request = new ArtifactRequest( pluginArtifact, repositories, REPOSITORY_CONTEXT );
pluginArtifact = repoSystem.resolveArtifact( session, request ).getArtifact();
}
catch ( ArtifactResolutionException e )
{
@ -87,96 +99,113 @@ public class DefaultPluginDependenciesResolver
return pluginArtifact;
}
public List<Artifact> resolve( Plugin plugin, Artifact pluginArtifact, ArtifactResolutionRequest request,
ArtifactFilter dependencyFilter )
public DependencyNode resolve( Plugin plugin, Artifact pluginArtifact, DependencyFilter dependencyFilter,
List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginResolutionException
{
if ( pluginArtifact == null )
{
pluginArtifact = repositorySystem.createPluginArtifact( plugin );
pluginArtifact = toArtifact( plugin, session );
}
Set<Artifact> overrideArtifacts = new LinkedHashSet<Artifact>();
DependencyFilter collectionFilter = new ScopeDependencyFilter( "provided", "test" );
DependencyFilter resolutionFilter =
new ExclusionsDependencyFilter( artifactFilterManager.getCoreArtifactExcludes() );
resolutionFilter = AndDependencyFilter.newInstance( resolutionFilter, dependencyFilter );
resolutionFilter = new AndDependencyFilter( collectionFilter, resolutionFilter );
DependencyNode node;
try
{
DependencySelector selector =
AndDependencySelector.newInstance( session.getDependencySelector(), new WagonExcluder() );
DependencyGraphTransformer transformer =
ChainedDependencyGraphTransformer.newInstance( session.getDependencyGraphTransformer(),
new PlexusUtilsInjector() );
DefaultRepositorySystemSession pluginSession = new DefaultRepositorySystemSession( session );
pluginSession.setDependencySelector( selector );
pluginSession.setDependencyGraphTransformer( transformer );
CollectRequest request = new CollectRequest();
request.setRequestContext( REPOSITORY_CONTEXT );
request.setRepositories( repositories );
request.setRoot( new org.sonatype.aether.graph.Dependency( pluginArtifact, null ) );
for ( Dependency dependency : plugin.getDependencies() )
{
if ( !Artifact.SCOPE_SYSTEM.equals( dependency.getScope() ) )
org.sonatype.aether.graph.Dependency pluginDep =
RepositoryUtils.toDependency( dependency, session.getArtifactTypeRegistry() );
if ( !JavaScopes.SYSTEM.equals( pluginDep.getScope() ) )
{
dependency.setScope( Artifact.SCOPE_RUNTIME );
pluginDep = pluginDep.setScope( JavaScopes.RUNTIME );
}
overrideArtifacts.add( repositorySystem.createDependencyArtifact( dependency ) );
request.addDependency( pluginDep );
}
ArtifactFilter collectionFilter = new ScopeArtifactFilter( Artifact.SCOPE_RUNTIME_PLUS_SYSTEM );
node = repoSystem.collectDependencies( pluginSession, request ).getRoot();
ArtifactFilter resolutionFilter = artifactFilterManager.getCoreArtifactFilter();
PluginDependencyResolutionListener listener = new PluginDependencyResolutionListener( resolutionFilter );
if ( dependencyFilter != null )
if ( logger.isDebugEnabled() )
{
resolutionFilter = new AndArtifactFilter( Arrays.asList( resolutionFilter, dependencyFilter ) );
node.accept( new GraphLogger() );
}
request.setArtifact( pluginArtifact );
request.setArtifactDependencies( overrideArtifacts );
request.setCollectionFilter( collectionFilter );
request.setResolutionFilter( resolutionFilter );
request.setResolveRoot( true );
request.setResolveTransitively( true );
request.addListener( listener );
ArtifactResolutionResult result = repositorySystem.resolve( request );
try
repoSystem.resolveDependencies( session, node, resolutionFilter );
}
catch ( DependencyCollectionException e )
{
resolutionErrorHandler.throwErrors( request, result );
throw new PluginResolutionException( plugin, e );
}
catch ( ArtifactResolutionException e )
{
throw new PluginResolutionException( plugin, e );
}
List<Artifact> pluginArtifacts = new ArrayList<Artifact>( result.getArtifacts() );
listener.removeBannedDependencies( pluginArtifacts );
addPlexusUtils( pluginArtifacts, plugin, request );
return pluginArtifacts;
return node;
}
// backward-compatibility with Maven 2.x
private void addPlexusUtils( List<Artifact> pluginArtifacts, Plugin plugin, RepositoryRequest repositoryRequest )
throws PluginResolutionException
class GraphLogger
implements DependencyVisitor
{
for ( Artifact artifact : pluginArtifacts )
private String indent = "";
public boolean visitEnter( DependencyNode node )
{
if ( "org.codehaus.plexus:plexus-utils:jar".equals( artifact.getDependencyConflictId() ) )
StringBuilder buffer = new StringBuilder( 128 );
buffer.append( indent );
org.sonatype.aether.graph.Dependency dep = node.getDependency();
if ( dep != null )
{
return;
}
}
org.sonatype.aether.artifact.Artifact art = dep.getArtifact();
Artifact plexusUtils =
repositorySystem.createArtifact( "org.codehaus.plexus", "plexus-utils", "1.1", Artifact.SCOPE_RUNTIME,
"jar" );
buffer.append( art );
buffer.append( ':' ).append( dep.getScope() );
ArtifactResolutionRequest request = new ArtifactResolutionRequest( repositoryRequest );
request.setArtifact( plexusUtils );
request.setResolveRoot( true );
request.setResolveTransitively( false );
ArtifactResolutionResult result = repositorySystem.resolve( request );
try
if ( node.getPremanagedScope() != null && !node.getPremanagedScope().equals( dep.getScope() ) )
{
resolutionErrorHandler.throwErrors( request, result );
buffer.append( " (scope managed from " ).append( node.getPremanagedScope() ).append( ")" );
}
catch ( ArtifactResolutionException e )
if ( node.getPremanagedVersion() != null && !node.getPremanagedVersion().equals( art.getVersion() ) )
{
throw new PluginResolutionException( plugin, e );
buffer.append( " (version managed from " ).append( node.getPremanagedVersion() ).append( ")" );
}
}
logger.debug( buffer.toString() );
indent += " ";
return true;
}
public boolean visitLeave( DependencyNode node )
{
indent = indent.substring( 0, indent.length() - 3 );
return true;
}
pluginArtifacts.add( plexusUtils );
}
}

View File

@ -22,8 +22,6 @@ package org.apache.maven.plugin.internal;
import java.util.Map;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
@ -100,10 +98,9 @@ public class DefaultPluginManager
PluginDescriptor pluginDescriptor;
try
{
RepositoryRequest repositoryRequest =
DefaultRepositoryRequest.getRepositoryRequest( session, session.getCurrentProject() );
pluginDescriptor = pluginManager.getPluginDescriptor( plugin, repositoryRequest );
pluginDescriptor =
pluginManager.getPluginDescriptor( plugin, session.getCurrentProject().getRemotePluginRepositories(),
session.getRepositorySession() );
pluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null );
}
@ -133,10 +130,9 @@ public class DefaultPluginManager
PluginDescriptor pluginDescriptor;
try
{
RepositoryRequest repositoryRequest =
DefaultRepositoryRequest.getRepositoryRequest( session, session.getCurrentProject() );
pluginDescriptor = pluginManager.getPluginDescriptor( plugin, repositoryRequest );
pluginDescriptor =
pluginManager.getPluginDescriptor( plugin, session.getCurrentProject().getRemotePluginRepositories(),
session.getRepositorySession() );
pluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null );
}
@ -234,24 +230,24 @@ public class DefaultPluginManager
InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, PluginNotFoundException,
PluginVersionNotFoundException
{
RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
repositoryRequest.setLocalRepository( localRepository );
repositoryRequest.setRemoteRepositories( project.getPluginArtifactRepositories() );
repositoryRequest.setOffline( settings.isOffline() );
MavenSession session = legacySupport.getSession();
if ( plugin.getVersion() == null )
{
PluginVersionRequest versionRequest = new DefaultPluginVersionRequest( plugin, repositoryRequest );
PluginVersionRequest versionRequest =
new DefaultPluginVersionRequest( plugin, session.getRepositorySession(),
project.getRemotePluginRepositories() );
plugin.setVersion( pluginVersionResolver.resolve( versionRequest ).getVersion() );
}
try
{
return pluginManager.getPluginDescriptor( plugin, repositoryRequest );
return pluginManager.getPluginDescriptor( plugin, project.getRemotePluginRepositories(),
session.getRepositorySession() );
}
catch ( PluginResolutionException e )
{
throw new PluginNotFoundException( plugin, repositoryRequest.getRemoteRepositories() );
throw new PluginNotFoundException( plugin, project.getPluginArtifactRepositories() );
}
catch ( PluginDescriptorParsingException e )
{

View File

@ -0,0 +1,87 @@
package org.apache.maven.plugin.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.sonatype.aether.RepositoryException;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.collection.DependencyGraphTransformationContext;
import org.sonatype.aether.collection.DependencyGraphTransformer;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.artifact.JavaScopes;
import org.sonatype.aether.util.graph.DefaultDependencyNode;
/**
* Injects plexus-utils:1.1 into a plugin's class path if it doesn't already declare a dependency on plexus-utils. This
* is another legacy bit to provide backward-compat with Maven 2.x.
*
* @author Benjamin Bentmann
*/
class PlexusUtilsInjector
implements DependencyGraphTransformer
{
private static final String GID = "org.codehaus.plexus";
private static final String AID = "plexus-utils";
private static final String VER = "1.1";
private static final String EXT = "jar";
public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
throws RepositoryException
{
if ( findPlexusUtils( node ) == null )
{
Artifact pu = new DefaultArtifact( GID, AID, null, EXT, VER );
DefaultDependencyNode child = new DefaultDependencyNode( new Dependency( pu, JavaScopes.RUNTIME ) );
child.setRepositories( node.getRepositories() );
child.setRequestContext( node.getRequestContext() );
node.getChildren().add( child );
}
return node;
}
private DependencyNode findPlexusUtils( DependencyNode node )
{
Artifact artifact = node.getDependency().getArtifact();
if ( AID.equals( artifact.getArtifactId() ) && GID.equals( artifact.getGroupId() )
&& EXT.equals( artifact.getExtension() ) && "".equals( artifact.getClassifier() ) )
{
return node;
}
for ( DependencyNode child : node.getChildren() )
{
DependencyNode result = findPlexusUtils( child );
if ( result != null )
{
return result;
}
}
return null;
}
}

View File

@ -21,11 +21,13 @@ package org.apache.maven.plugin.internal;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.PluginResolutionException;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.graph.DependencyFilter;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Assists in resolving the dependencies of a plugin. <strong>Warning:</strong> This is an internal utility interface
@ -42,12 +44,13 @@ public interface PluginDependenciesResolver
* Resolves the main artifact of the specified plugin.
*
* @param plugin The plugin for which to resolve the main artifact, must not be {@code null}.
* @param request A prepopulated resolution request that will be completed and used for the resolution, must not be
* {@code null}.
* @param repositories The plugin repositories to use for resolving the plugin's main artifact, must not be {@code
* null}.
* @param session The repository session to use for resolving the plugin's main artifact, must not be {@code null}.
* @return The resolved plugin artifact, never {@code null}.
* @throws PluginResolutionException If the plugin artifact could not be resolved.
*/
Artifact resolve( Plugin plugin, ArtifactResolutionRequest request )
public Artifact resolve( Plugin plugin, List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginResolutionException;
/**
@ -55,14 +58,14 @@ public interface PluginDependenciesResolver
*
* @param plugin The plugin for which to resolve the dependencies, must not be {@code null}.
* @param pluginArtifact The plugin's main artifact, may be {@code null}.
* @param request A prepopulated resolution request that will be completed and used for the resolution, must not be
* {@code null}.
* @param dependencyFilter A filter to exclude artifacts from resolution, may be {@code null}.
* @return The list of artifacts denoting the resolved plugin class path, never {@code null}.
* @param dependencyFilter A filter to exclude artifacts from resolution (but not collection), may be {@code null}.
* @param repositories The plugin repositories to use for resolving the plugin artifacts, must not be {@code null}.
* @param session The repository session to use for resolving the plugin artifacts, must not be {@code null}.
* @return The dependency tree denoting the resolved plugin class path, never {@code null}.
* @throws PluginResolutionException If any dependency could not be resolved.
*/
List<Artifact> resolve( Plugin plugin, Artifact pluginArtifact, ArtifactResolutionRequest request,
ArtifactFilter dependencyFilter )
DependencyNode resolve( Plugin plugin, Artifact pluginArtifact, DependencyFilter dependencyFilter,
List<RemoteRepository> repositories, RepositorySystemSession session )
throws PluginResolutionException;
}

View File

@ -0,0 +1,109 @@
package org.apache.maven.plugin.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.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.collection.DependencyCollectionContext;
import org.sonatype.aether.collection.DependencySelector;
import org.sonatype.aether.graph.Dependency;
/**
* Assists in detecting wagon providers brought into the plugin class path via legacy Maven core artifacts (e.g.
* maven-core:2.0.6) and excluding them. A plugin should be able to explicitly declare dependencies on specific wagons
* for its use. However, the (old) wagons pulled in transitively via legacy Maven core artifacts are usually not
* intended as dependencies and more importantly screw up artifact resolution because they would get preferred over the
* core wagon versions. This is a hack to provide backward-compat with Maven 2 (MNG-4528, MNG-4561).
*
* @author Benjamin Bentmann
*/
class WagonExcluder
implements DependencySelector
{
private final boolean coreArtifact;
public WagonExcluder()
{
this( false );
}
private WagonExcluder( boolean coreArtifact )
{
this.coreArtifact = coreArtifact;
}
public boolean selectDependency( Dependency dependency )
{
return !coreArtifact || !isWagonProvider( dependency.getArtifact() );
}
public DependencySelector deriveChildSelector( DependencyCollectionContext context )
{
if ( coreArtifact || !isLegacyCoreArtifact( context.getDependency().getArtifact() ) )
{
return this;
}
else
{
return new WagonExcluder( true );
}
}
private boolean isLegacyCoreArtifact( Artifact artifact )
{
String version = artifact.getVersion();
return version != null && version.startsWith( "2." ) && artifact.getArtifactId().startsWith( "maven-" )
&& artifact.getGroupId().equals( "org.apache.maven" );
}
private boolean isWagonProvider( Artifact artifact )
{
if ( "org.apache.maven.wagon".equals( artifact.getGroupId() ) )
{
return artifact.getArtifactId().startsWith( "wagon-" );
}
return false;
}
@Override
public boolean equals( Object obj )
{
if ( obj == this )
{
return true;
}
else if ( obj == null || !getClass().equals( obj.getClass() ) )
{
return false;
}
WagonExcluder that = (WagonExcluder) obj;
return coreArtifact == that.coreArtifact;
}
@Override
public int hashCode()
{
int hash = getClass().hashCode();
hash = hash * 31 + ( coreArtifact ? 1 : 0 );
return hash;
}
}

View File

@ -19,17 +19,14 @@ package org.apache.maven.plugin.prefix;
* under the License.
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Model;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.ArtifactTransferListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Collects settings required to resolve a plugin prefix.
@ -43,34 +40,25 @@ public class DefaultPluginPrefixRequest
private String prefix;
private List<String> pluginGroups;
private List<String> pluginGroups = Collections.emptyList();
private Model pom;
private RepositoryRequest repositoryRequest;
private List<RemoteRepository> repositories = Collections.emptyList();
private RepositorySystemSession session;
/**
* Creates an empty request.
*/
public DefaultPluginPrefixRequest()
{
repositoryRequest = new DefaultRepositoryRequest();
}
/**
* Creates a request by copying settings from the specified repository request.
*
* @param repositoryRequest The repository request to copy from, must not be {@code null}.
*/
public DefaultPluginPrefixRequest( RepositoryRequest repositoryRequest )
{
this.repositoryRequest = new DefaultRepositoryRequest( repositoryRequest );
}
/**
* Creates a request for the specified plugin prefix and build session. The provided build session will be used to
* configure repository settings. If the session has a current project, its plugin artifact repositories and model
* will be used as well.
* configure repository settings. If the session has a current project, its plugin repositories and model will be
* used as well.
*
* @param prefix The plugin prefix to resolve, must not be {@code null}.
* @param session The build session from which to derive further settings, must not be {@code null}.
@ -79,18 +67,12 @@ public class DefaultPluginPrefixRequest
{
setPrefix( prefix );
this.repositoryRequest = new DefaultRepositoryRequest();
setCache( session.getRepositoryCache() );
setLocalRepository( session.getLocalRepository() );
setOffline( session.isOffline() );
setForceUpdate( session.getRequest().isUpdateSnapshots() );
setTransferListener( session.getRequest().getTransferListener() );
setRepositorySession( session.getRepositorySession() );
MavenProject project = session.getCurrentProject();
if ( project != null )
{
setRemoteRepositories( project.getPluginArtifactRepositories() );
setRepositories( project.getRemotePluginRepositories() );
setPom( project.getModel() );
}
@ -111,17 +93,19 @@ public class DefaultPluginPrefixRequest
public List<String> getPluginGroups()
{
if ( pluginGroups == null )
{
pluginGroups = new ArrayList<String>();
}
return pluginGroups;
}
public DefaultPluginPrefixRequest setPluginGroups( List<String> pluginGroups )
{
if ( pluginGroups != null )
{
this.pluginGroups = pluginGroups;
}
else
{
this.pluginGroups = Collections.emptyList();
}
return this;
}
@ -138,74 +122,33 @@ public class DefaultPluginPrefixRequest
return this;
}
public RepositoryCache getCache()
public List<RemoteRepository> getRepositories()
{
return repositoryRequest.getCache();
return repositories;
}
public DefaultPluginPrefixRequest setCache( RepositoryCache cache )
public DefaultPluginPrefixRequest setRepositories( List<RemoteRepository> repositories )
{
repositoryRequest.setCache( cache );
if ( repositories != null )
{
this.repositories = repositories;
}
else
{
this.repositories = Collections.emptyList();
}
return this;
}
public ArtifactRepository getLocalRepository()
public RepositorySystemSession getRepositorySession()
{
return repositoryRequest.getLocalRepository();
return session;
}
public DefaultPluginPrefixRequest setLocalRepository( ArtifactRepository localRepository )
public DefaultPluginPrefixRequest setRepositorySession( RepositorySystemSession session )
{
repositoryRequest.setLocalRepository( localRepository );
return this;
}
public List<ArtifactRepository> getRemoteRepositories()
{
return repositoryRequest.getRemoteRepositories();
}
public DefaultPluginPrefixRequest setRemoteRepositories( List<ArtifactRepository> remoteRepositories )
{
repositoryRequest.setRemoteRepositories( remoteRepositories );
return this;
}
public boolean isOffline()
{
return repositoryRequest.isOffline();
}
public DefaultPluginPrefixRequest setOffline( boolean offline )
{
repositoryRequest.setOffline( offline );
return this;
}
public boolean isForceUpdate()
{
return repositoryRequest.isForceUpdate();
}
public DefaultPluginPrefixRequest setForceUpdate( boolean forceUpdate )
{
repositoryRequest.setForceUpdate( forceUpdate );
return this;
}
public ArtifactTransferListener getTransferListener()
{
return repositoryRequest.getTransferListener();
}
public DefaultPluginPrefixRequest setTransferListener( ArtifactTransferListener transferListener )
{
repositoryRequest.setTransferListener( transferListener );
this.session = session;
return this;
}

View File

@ -21,29 +21,21 @@ package org.apache.maven.plugin.prefix;
import java.util.List;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RemoteRepository;
public class NoPluginFoundForPrefixException
extends Exception
{
private String prefix;
private ArtifactRepository localRepository;
private List<ArtifactRepository> remoteRepositories;
public NoPluginFoundForPrefixException( String prefix, List<String> pluginGroups,
ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories )
public NoPluginFoundForPrefixException( String prefix, List<String> pluginGroups, LocalRepository localRepository,
List<RemoteRepository> remoteRepositories )
{
super( "No plugin found for prefix '" + prefix + "' in the current project and in the plugin groups "
+ pluginGroups + " available from the repositories " + format( localRepository, remoteRepositories ) );
this.prefix = prefix;
this.localRepository = localRepository;
this.remoteRepositories = remoteRepositories;
}
private static String format( ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
private static String format( LocalRepository localRepository, List<RemoteRepository> remoteRepositories )
{
String repos = "[";
@ -54,7 +46,7 @@ public class NoPluginFoundForPrefixException
if ( remoteRepositories != null && !remoteRepositories.isEmpty() )
{
for ( ArtifactRepository repository : remoteRepositories )
for ( RemoteRepository repository : remoteRepositories )
{
repos += ", ";

View File

@ -21,11 +21,9 @@ package org.apache.maven.plugin.prefix;
import java.util.List;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.model.Model;
import org.apache.maven.repository.ArtifactTransferListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Collects settings required to resolve a plugin prefix.
@ -34,7 +32,6 @@ import org.apache.maven.repository.ArtifactTransferListener;
* @author Benjamin Bentmann
*/
public interface PluginPrefixRequest
extends RepositoryRequest
{
/**
@ -84,80 +81,35 @@ public interface PluginPrefixRequest
*/
PluginPrefixRequest setPom( Model pom );
/**
* Indicates whether network access to remote repositories has been disabled.
*
* @return {@code true} if remote access has been disabled, {@code false} otherwise.
*/
boolean isOffline();
/**
* Enables/disables network access to remote repositories.
*
* @param offline {@code true} to disable remote access, {@code false} to allow network access.
* @return This request, never {@code null}.
*/
PluginPrefixRequest setOffline( boolean offline );
/**
* Gets the local repository to use.
*
* @return The local repository to use or {@code null} if not set.
*/
ArtifactRepository getLocalRepository();
/**
* Sets the local repository to use.
*
* @param localRepository The local repository to use.
* @return This request, never {@code null}.
*/
PluginPrefixRequest setLocalRepository( ArtifactRepository localRepository );
/**
* Gets the remote repositories to use.
*
* @return The remote repositories to use, never {@code null}.
*/
List<ArtifactRepository> getRemoteRepositories();
List<RemoteRepository> getRepositories();
/**
* Sets the remote repositories to use. <em>Note:</em> When creating a request from a project, be sure to use the
* plugin artifact repositories and not the regular artifact repositories.
* plugin repositories and not the regular project repositories.
*
* @param remoteRepositories The remote repositories to use.
* @param repositories The remote repositories to use.
* @return This request, never {@code null}.
*/
PluginPrefixRequest setRemoteRepositories( List<ArtifactRepository> remoteRepositories );
PluginPrefixRequest setRepositories( List<RemoteRepository> repositories );
/**
* Gets the repository cache to use.
* Gets the session to use for repository access.
*
* @return The repository cache to use or {@code null} if none.
* @return The repository session or {@code null} if not set.
*/
RepositoryCache getCache();
RepositorySystemSession getRepositorySession();
/**
* Sets the repository cache to use.
* Sets the session to use for repository access.
*
* @param cache The repository cache to use, may be {@code null}.
* @param repositorySession The repository session to use.
* @return This request, never {@code null}.
*/
PluginPrefixRequest setCache( RepositoryCache cache );
/**
* Gets the listener to notify of transfer events.
*
* @return The transfer listener or {@code null} if none.
*/
ArtifactTransferListener getTransferListener();
/**
* Sets the listener to notify of transfer events.
*
* @param transferListener The transfer listener to notify, may be {@code null}.
* @return This request, never {@code null}.
*/
PluginPrefixRequest setTransferListener( ArtifactTransferListener transferListener );
PluginPrefixRequest setRepositorySession( RepositorySystemSession repositorySession );
}

View File

@ -1,5 +1,7 @@
package org.apache.maven.plugin.prefix;
import org.sonatype.aether.repository.ArtifactRepository;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@ -19,8 +21,6 @@ package org.apache.maven.plugin.prefix;
* under the License.
*/
import org.apache.maven.artifact.repository.ArtifactRepository;
/**
* Describes the result of a plugin prefix resolution request.
*

View File

@ -23,11 +23,9 @@ import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.io.MetadataReader;
import org.apache.maven.model.Build;
@ -38,12 +36,18 @@ import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
import org.apache.maven.plugin.prefix.PluginPrefixRequest;
import org.apache.maven.plugin.prefix.PluginPrefixResolver;
import org.apache.maven.plugin.prefix.PluginPrefixResult;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.ArtifactDoesNotExistException;
import org.apache.maven.repository.ArtifactTransferFailedException;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.repository.ArtifactRepository;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.repository.RepositoryPolicy;
import org.sonatype.aether.resolution.MetadataRequest;
import org.sonatype.aether.resolution.MetadataResult;
import org.sonatype.aether.transfer.MetadataNotFoundException;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
import org.sonatype.aether.util.metadata.DefaultMetadata;
/**
* Resolves a plugin prefix.
@ -56,6 +60,8 @@ public class DefaultPluginPrefixResolver
implements PluginPrefixResolver
{
private static final String REPOSITORY_CONTEXT = "plugin";
@Requirement
private Logger logger;
@ -82,8 +88,8 @@ public class DefaultPluginPrefixResolver
if ( result == null )
{
throw new NoPluginFoundForPrefixException( request.getPrefix(), request.getPluginGroups(),
request.getLocalRepository(),
request.getRemoteRepositories() );
request.getRepositorySession().getLocalRepository(),
request.getRepositories() );
}
else if ( logger.isDebugEnabled() )
{
@ -126,7 +132,8 @@ public class DefaultPluginPrefixResolver
{
try
{
PluginDescriptor pluginDescriptor = pluginManager.loadPlugin( plugin, request );
PluginDescriptor pluginDescriptor =
pluginManager.loadPlugin( plugin, request.getRepositories(), request.getRepositorySession() );
if ( request.getPrefix().equals( pluginDescriptor.getGoalPrefix() ) )
{
@ -152,19 +159,85 @@ public class DefaultPluginPrefixResolver
private PluginPrefixResult resolveFromRepository( PluginPrefixRequest request )
{
ArtifactRepository localRepository = request.getLocalRepository();
List<MetadataRequest> requests = new ArrayList<MetadataRequest>();
// Process all plugin groups in the local repository first to see if we get a hit. A developer may have been
// developing a plugin locally and installing.
//
for ( String pluginGroup : request.getPluginGroups() )
{
String localPath = getLocalMetadataPath( pluginGroup, localRepository );
org.sonatype.aether.metadata.Metadata metadata =
new DefaultMetadata( pluginGroup, "maven-metadata.xml", DefaultMetadata.Nature.RELEASE_OR_SNAPSHOT );
File groupMetadataFile = new File( localRepository.getBasedir(), localPath );
requests.add( new MetadataRequest( metadata, null, REPOSITORY_CONTEXT ) );
for ( RemoteRepository repository : request.getRepositories() )
{
requests.add( new MetadataRequest( metadata, repository, REPOSITORY_CONTEXT ) );
}
}
// initial try, use locally cached metadata
List<MetadataResult> results = repositorySystem.resolveMetadata( request.getRepositorySession(), requests );
requests.clear();
PluginPrefixResult result = processResults( request, results, requests );
if ( result != null )
{
return result;
}
// second try, refetch all (possibly outdated) metadata that wasn't updated in the first attempt
if ( !request.getRepositorySession().isOffline() && !requests.isEmpty() )
{
DefaultRepositorySystemSession session =
new DefaultRepositorySystemSession( request.getRepositorySession() );
session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS );
results = repositorySystem.resolveMetadata( session, requests );
return processResults( request, results, null );
}
return null;
}
private PluginPrefixResult processResults( PluginPrefixRequest request, List<MetadataResult> results,
List<MetadataRequest> requests )
{
for ( MetadataResult res : results )
{
if ( res.getException() != null )
{
if ( res.getException() instanceof MetadataNotFoundException )
{
logger.debug( "Could not find " + res.getRequest().getMetadata() + " in "
+ res.getRequest().getRepository() );
}
else if ( logger.isDebugEnabled() )
{
logger.warn( "Could not retrieve " + res.getRequest().getMetadata() + " from "
+ res.getRequest().getRepository() + ": " + res.getException().getMessage(), res.getException() );
}
else
{
logger.warn( "Could not retrieve " + res.getRequest().getMetadata() + " from "
+ res.getRequest().getRepository() + ": " + res.getException().getMessage() );
}
}
org.sonatype.aether.metadata.Metadata metadata = res.getMetadata();
if ( metadata != null )
{
ArtifactRepository repository = res.getRequest().getRepository();
if ( repository == null )
{
repository = request.getRepositorySession().getLocalRepository();
}
PluginPrefixResult result =
resolveFromRepository( request, pluginGroup, groupMetadataFile, localRepository );
resolveFromRepository( request, metadata.getGroupId(), metadata.getFile(), repository );
if ( result != null )
{
@ -172,135 +245,19 @@ public class DefaultPluginPrefixResolver
}
}
Map<String, List<ArtifactRepository>> recheck = new HashMap<String, List<ArtifactRepository>>();
// Process all the remote repositories.
//
for ( String pluginGroup : request.getPluginGroups() )
if ( requests != null && !res.isUpdated() )
{
for ( ArtifactRepository repository : request.getRemoteRepositories() )
{
if ( !isEnabled( repository ) )
{
logger.debug( "Skipped plugin prefix lookup from disabled repository " + repository.getId() );
continue;
}
String localPath = getLocalMetadataPath( pluginGroup, repository );
File groupMetadataFile = new File( localRepository.getBasedir(), localPath );
if ( !request.isOffline() && ( !groupMetadataFile.exists() || request.isForceUpdate() ) )
{
String remotePath = getRemoteMetadataPath( pluginGroup, repository );
try
{
repositorySystem.retrieve( repository, groupMetadataFile, remotePath,
request.getTransferListener() );
}
catch ( ArtifactTransferFailedException e )
{
if ( logger.isDebugEnabled() )
{
logger.warn( "Failed to retrieve " + remotePath + " from " + repository.getId() + ": "
+ e.getMessage(), e );
}
else
{
logger.warn( "Failed to retrieve " + remotePath + " from " + repository.getId() + ": "
+ e.getMessage() );
}
}
catch ( ArtifactDoesNotExistException e )
{
continue;
}
}
else if ( !request.isOffline() && !request.isForceUpdate() )
{
List<ArtifactRepository> repos = recheck.get( pluginGroup );
if ( repos == null )
{
repos = new ArrayList<ArtifactRepository>();
recheck.put( pluginGroup, repos );
}
repos.add( repository );
}
PluginPrefixResult result = resolveFromRepository( request, pluginGroup, groupMetadataFile,
repository );
if ( result != null )
{
return result;
}
}
}
// Retry the remote repositories for which we previously only consulted the possibly outdated local cache.
//
for ( String pluginGroup : request.getPluginGroups() )
{
List<ArtifactRepository> repos = recheck.get( pluginGroup );
if ( repos == null )
{
continue;
}
for ( ArtifactRepository repository : repos )
{
String localPath = getLocalMetadataPath( pluginGroup, repository );
File groupMetadataFile = new File( localRepository.getBasedir(), localPath );
String remotePath = getRemoteMetadataPath( pluginGroup, repository );
try
{
repositorySystem.retrieve( repository, groupMetadataFile, remotePath,
request.getTransferListener() );
}
catch ( ArtifactTransferFailedException e )
{
if ( logger.isDebugEnabled() )
{
logger.warn( "Failed to retrieve " + remotePath + " from " + repository.getId() + ": "
+ e.getMessage(), e );
}
else
{
logger.warn( "Failed to retrieve " + remotePath + " from " + repository.getId() + ": "
+ e.getMessage() );
}
}
catch ( ArtifactDoesNotExistException e )
{
continue;
}
PluginPrefixResult result = resolveFromRepository( request, pluginGroup, groupMetadataFile,
repository );
if ( result != null )
{
return result;
}
requests.add( res.getRequest() );
}
}
return null;
}
private boolean isEnabled( ArtifactRepository repository )
{
return repository.getReleases().isEnabled() || repository.getSnapshots().isEnabled();
}
private PluginPrefixResult resolveFromRepository( PluginPrefixRequest request, String pluginGroup,
File metadataFile, ArtifactRepository repository )
{
if ( metadataFile.isFile() )
if ( metadataFile != null && metadataFile.isFile() )
{
try
{
@ -337,14 +294,4 @@ public class DefaultPluginPrefixResolver
return null;
}
private String getLocalMetadataPath( String groupId, ArtifactRepository repository )
{
return groupId.replace( '.', '/' ) + "/" + "maven-metadata-" + repository.getId() + ".xml";
}
private String getRemoteMetadataPath( String groupId, ArtifactRepository repository )
{
return groupId.replace( '.', '/' ) + "/" + "maven-metadata.xml";
}
}

View File

@ -19,9 +19,9 @@ package org.apache.maven.plugin.prefix.internal;
* under the License.
*/
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.prefix.PluginPrefixResult;
import org.sonatype.aether.repository.ArtifactRepository;
/**
* Describes the result of a plugin prefix resolution request.

View File

@ -19,17 +19,15 @@ package org.apache.maven.plugin.version;
* under the License.
*/
import java.util.Collections;
import java.util.List;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.ArtifactTransferListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Collects settings required to resolve the version for a plugin.
@ -47,65 +45,55 @@ public class DefaultPluginVersionRequest
private Model pom;
private RepositoryRequest repositoryRequest;
private List<RemoteRepository> repositories = Collections.emptyList();
private RepositorySystemSession session;
/**
* Creates an empty request.
*/
public DefaultPluginVersionRequest()
{
repositoryRequest = new DefaultRepositoryRequest();
}
/**
* Creates a request by copying settings from the specified repository request.
*
* @param repositoryRequest The repository request to copy from, must not be {@code null}.
*/
public DefaultPluginVersionRequest( RepositoryRequest repositoryRequest )
{
this.repositoryRequest = new DefaultRepositoryRequest( repositoryRequest );
}
/**
* Creates a request for the specified plugin by copying settings from the specified repository request.
*
* @param The plugin for which to resolve a version, must not be {@code null}.
* @param repositoryRequest The repository request to copy from, must not be {@code null}.
*/
public DefaultPluginVersionRequest( Plugin plugin, RepositoryRequest repositoryRequest )
{
this.groupId = plugin.getGroupId();
this.artifactId = plugin.getArtifactId();
this.repositoryRequest = new DefaultRepositoryRequest( repositoryRequest );
}
/**
* Creates a request for the specified plugin by copying settings from the specified build session. If the session
* has a current project, its plugin artifact repositories will be used as well.
* has a current project, its plugin repositories will be used as well.
*
* @param The plugin for which to resolve a version, must not be {@code null}.
* @param plugin The plugin for which to resolve a version, must not be {@code null}.
* @param repositoryRequest The repository request to copy from, must not be {@code null}.
*/
public DefaultPluginVersionRequest( Plugin plugin, MavenSession session )
{
this.groupId = plugin.getGroupId();
this.artifactId = plugin.getArtifactId();
this.repositoryRequest = new DefaultRepositoryRequest();
setGroupId( plugin.getGroupId() );
setArtifactId( plugin.getArtifactId() );
setCache( session.getRepositoryCache() );
setLocalRepository( session.getLocalRepository() );
setOffline( session.isOffline() );
setForceUpdate( session.getRequest().isUpdateSnapshots() );
setTransferListener( session.getRequest().getTransferListener() );
setRepositorySession( session.getRepositorySession() );
MavenProject project = session.getCurrentProject();
if ( project != null )
{
setRemoteRepositories( project.getPluginArtifactRepositories() );
setRepositories( project.getRemotePluginRepositories() );
}
}
/**
* Creates a request for the specified plugin using the given repository session and plugin repositories.
*
* @param plugin The plugin for which to resolve a version, must not be {@code null}.
* @param session The repository session to use, must not be {@code null}.
* @param repositories The plugin repositories to query, may be {@code null}.
*/
public DefaultPluginVersionRequest( Plugin plugin, RepositorySystemSession session, List<RemoteRepository> repositories )
{
setGroupId( plugin.getGroupId() );
setArtifactId( plugin.getArtifactId() );
setRepositorySession( session );
setRepositories( repositories );
}
public String getGroupId()
{
return groupId;
@ -142,74 +130,33 @@ public class DefaultPluginVersionRequest
return this;
}
public RepositoryCache getCache()
public List<RemoteRepository> getRepositories()
{
return repositoryRequest.getCache();
return repositories;
}
public DefaultPluginVersionRequest setCache( RepositoryCache cache )
public DefaultPluginVersionRequest setRepositories( List<RemoteRepository> repositories )
{
repositoryRequest.setCache( cache );
if ( repositories != null )
{
this.repositories = repositories;
}
else
{
this.repositories = Collections.emptyList();
}
return this;
}
public ArtifactRepository getLocalRepository()
public RepositorySystemSession getRepositorySession()
{
return repositoryRequest.getLocalRepository();
return session;
}
public DefaultPluginVersionRequest setLocalRepository( ArtifactRepository localRepository )
public DefaultPluginVersionRequest setRepositorySession( RepositorySystemSession session )
{
repositoryRequest.setLocalRepository( localRepository );
return this;
}
public List<ArtifactRepository> getRemoteRepositories()
{
return repositoryRequest.getRemoteRepositories();
}
public DefaultPluginVersionRequest setRemoteRepositories( List<ArtifactRepository> remoteRepositories )
{
repositoryRequest.setRemoteRepositories( remoteRepositories );
return this;
}
public boolean isOffline()
{
return repositoryRequest.isOffline();
}
public DefaultPluginVersionRequest setOffline( boolean offline )
{
repositoryRequest.setOffline( offline );
return this;
}
public boolean isForceUpdate()
{
return repositoryRequest.isForceUpdate();
}
public DefaultPluginVersionRequest setForceUpdate( boolean forceUpdate )
{
repositoryRequest.setForceUpdate( forceUpdate );
return this;
}
public ArtifactTransferListener getTransferListener()
{
return repositoryRequest.getTransferListener();
}
public DefaultPluginVersionRequest setTransferListener( ArtifactTransferListener transferListener )
{
repositoryRequest.setTransferListener( transferListener );
this.session = session;
return this;
}

View File

@ -21,11 +21,9 @@ package org.apache.maven.plugin.version;
import java.util.List;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.model.Model;
import org.apache.maven.repository.ArtifactTransferListener;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.RemoteRepository;
/**
* Collects settings required to resolve the version for a plugin.
@ -34,7 +32,6 @@ import org.apache.maven.repository.ArtifactTransferListener;
* @author Benjamin Bentmann
*/
public interface PluginVersionRequest
extends RepositoryRequest
{
/**
@ -84,80 +81,35 @@ public interface PluginVersionRequest
*/
PluginVersionRequest setPom( Model pom );
/**
* Indicates whether network access to remote repositories has been disabled.
*
* @return {@code true} if remote access has been disabled, {@code false} otherwise.
*/
boolean isOffline();
/**
* Enables/disables network access to remote repositories.
*
* @param offline {@code true} to disable remote access, {@code false} to allow network access.
* @return This request, never {@code null}.
*/
PluginVersionRequest setOffline( boolean offline );
/**
* Gets the local repository to use.
*
* @return The local repository to use or {@code null} if not set.
*/
ArtifactRepository getLocalRepository();
/**
* Sets the local repository to use.
*
* @param localRepository The local repository to use.
* @return This request, never {@code null}.
*/
PluginVersionRequest setLocalRepository( ArtifactRepository localRepository );
/**
* Gets the remote repositories to use.
*
* @return The remote repositories to use, never {@code null}.
*/
List<ArtifactRepository> getRemoteRepositories();
List<RemoteRepository> getRepositories();
/**
* Sets the remote repositories to use. <em>Note:</em> When creating a request from a project, be sure to use the
* plugin artifact repositories and not the regular artifact repositories.
* plugin repositories and not the regular project repositories.
*
* @param remoteRepositories The remote repositories to use.
* @param repositories The remote repositories to use.
* @return This request, never {@code null}.
*/
PluginVersionRequest setRemoteRepositories( List<ArtifactRepository> remoteRepositories );
PluginVersionRequest setRepositories( List<RemoteRepository> repositories );
/**
* Gets the repository cache to use.
* Gets the session to use for repository access.
*
* @return The repository cache to use or {@code null} if none.
* @return The repository session or {@code null} if not set.
*/
RepositoryCache getCache();
RepositorySystemSession getRepositorySession();
/**
* Sets the repository cache to use.
* Sets the session to use for repository access.
*
* @param cache The repository cache to use, may be {@code null}.
* @param repositorySession The repository session to use.
* @return This request, never {@code null}.
*/
PluginVersionRequest setCache( RepositoryCache cache );
/**
* Gets the listener to notify of transfer events.
*
* @return The transfer listener or {@code null} if none.
*/
ArtifactTransferListener getTransferListener();
/**
* Sets the listener to notify of transfer events.
*
* @param transferListener The transfer listener to notify, may be {@code null}.
* @return This request, never {@code null}.
*/
PluginVersionRequest setTransferListener( ArtifactTransferListener transferListener );
PluginVersionRequest setRepositorySession( RepositorySystemSession repositorySession );
}

Some files were not shown because too many files have changed in this diff Show More