You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2010/08/25 00:46:12 UTC
svn commit: r988749 [7/9] - in /maven/maven-3/trunk: ./ apache-maven/
maven-aether-provider/ maven-aether-provider/src/
maven-aether-provider/src/main/ maven-aether-provider/src/main/java/
maven-aether-provider/src/main/java/org/ maven-aether-provider/...
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResolutionException.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResolutionException.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResolutionException.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResolutionException.java Tue Aug 24 22:46:07 2010
@@ -21,7 +21,8 @@ package org.apache.maven.plugin.version;
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 PluginVersionResolutionException
extends Exception
@@ -50,8 +51,8 @@ public class PluginVersionResolutionExce
this.baseMessage = baseMessage;
}
- public PluginVersionResolutionException( String groupId, String artifactId, ArtifactRepository localRepository,
- List<ArtifactRepository> remoteRepositories, String baseMessage )
+ public PluginVersionResolutionException( String groupId, String artifactId, LocalRepository localRepository,
+ List<RemoteRepository> remoteRepositories, String baseMessage )
{
super( "Error resolving version for plugin \'" + groupId + ":" + artifactId + "\' from the repositories "
+ format( localRepository, remoteRepositories ) + ": " + baseMessage );
@@ -76,7 +77,7 @@ public class PluginVersionResolutionExce
return baseMessage;
}
- private static String format( ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
+ private static String format( LocalRepository localRepository, List<RemoteRepository> remoteRepositories )
{
String repos = "[";
@@ -87,7 +88,7 @@ public class PluginVersionResolutionExce
if ( remoteRepositories != null && !remoteRepositories.isEmpty() )
{
- for ( ArtifactRepository repository : remoteRepositories )
+ for ( RemoteRepository repository : remoteRepositories )
{
repos += ", ";
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResult.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResult.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResult.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResult.java Tue Aug 24 22:46:07 2010
@@ -19,7 +19,7 @@ package org.apache.maven.plugin.version;
* under the License.
*/
-import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.sonatype.aether.repository.ArtifactRepository;
/**
* Describes the result of a plugin version resolution request.
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java Tue Aug 24 22:46:07 2010
@@ -21,12 +21,13 @@ package org.apache.maven.plugin.version.
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
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.Versioning;
import org.apache.maven.artifact.repository.metadata.io.MetadataReader;
import org.apache.maven.model.Build;
import org.apache.maven.model.Plugin;
@@ -34,13 +35,18 @@ import org.apache.maven.plugin.version.P
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.plugin.version.PluginVersionResolver;
import org.apache.maven.plugin.version.PluginVersionResult;
-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.codehaus.plexus.util.StringUtils;
+import org.sonatype.aether.impl.MetadataResolver;
+import org.sonatype.aether.repository.ArtifactRepository;
+import org.sonatype.aether.repository.LocalRepository;
+import org.sonatype.aether.repository.RemoteRepository;
+import org.sonatype.aether.resolution.MetadataRequest;
+import org.sonatype.aether.resolution.MetadataResult;
+import org.sonatype.aether.transfer.MetadataNotFoundException;
+import org.sonatype.aether.util.metadata.DefaultMetadata;
/**
* Resolves a version for a plugin.
@@ -53,11 +59,13 @@ public class DefaultPluginVersionResolve
implements PluginVersionResolver
{
+ private static final String REPOSITORY_CONTEXT = "plugin";
+
@Requirement
private Logger logger;
@Requirement
- private RepositorySystem repositorySystem;
+ private MetadataResolver metadataResolver;
@Requirement
private MetadataReader metadataReader;
@@ -73,18 +81,10 @@ public class DefaultPluginVersionResolve
{
result = resolveFromRepository( request );
- if ( StringUtils.isEmpty( result.getVersion() ) )
- {
- throw new PluginVersionResolutionException( request.getGroupId(), request.getArtifactId(),
- request.getLocalRepository(),
- request.getRemoteRepositories(),
- "Plugin not found in any plugin repository" );
- }
- else if ( logger.isDebugEnabled() )
+ if ( logger.isDebugEnabled() )
{
logger.debug( "Resolved plugin version for " + request.getGroupId() + ":" + request.getArtifactId()
- + " to " + result.getVersion() + " from repository "
- + ( result.getRepository() != null ? result.getRepository().getId() : "null" ) );
+ + " to " + result.getVersion() + " from repository " + result.getRepository() );
}
}
else if ( logger.isDebugEnabled() )
@@ -101,126 +101,75 @@ public class DefaultPluginVersionResolve
{
DefaultPluginVersionResult result = new DefaultPluginVersionResult();
- Metadata mergedMetadata = new Metadata();
+ org.sonatype.aether.metadata.Metadata metadata =
+ new DefaultMetadata( request.getGroupId(), request.getArtifactId(), "maven-metadata.xml",
+ DefaultMetadata.Nature.RELEASE_OR_SNAPSHOT );
+
+ List<MetadataRequest> requests = new ArrayList<MetadataRequest>();
- ArtifactRepository localRepository = request.getLocalRepository();
+ requests.add( new MetadataRequest( metadata, null, REPOSITORY_CONTEXT ) );
- // Search in remote repositories for a (released) version.
- //
- // maven-metadata-{central|nexus|...}.xml
- //
- // TODO: we should cycle through the repositories but take the repository which actually satisfied the prefix.
- for ( ArtifactRepository repository : request.getRemoteRepositories() )
+ for ( RemoteRepository repository : request.getRepositories() )
{
- if ( !isEnabled( repository ) )
- {
- logger.debug( "Skipped plugin version lookup from disabled repository " + repository.getId() );
- continue;
- }
+ requests.add( new MetadataRequest( metadata, repository, REPOSITORY_CONTEXT ) );
+ }
- String localPath = getLocalMetadataPath( request, repository );
+ List<MetadataResult> results = metadataResolver.resolveMetadata( request.getRepositorySession(), requests );
- File artifactMetadataFile = new File( localRepository.getBasedir(), localPath );
+ LocalRepository localRepo = request.getRepositorySession().getLocalRepository();
- if ( !request.isOffline() && ( !artifactMetadataFile.exists() /* || user requests snapshot updates */ ) )
- {
- String remotePath = getRemoteMetadataPath( request, repository );
+ Versions versions = new Versions();
- try
+ for ( MetadataResult res : results )
+ {
+ if ( res.getException() != null )
+ {
+ if ( res.getException() instanceof MetadataNotFoundException )
{
- repositorySystem.retrieve( repository, artifactMetadataFile, remotePath,
- request.getTransferListener() );
+ logger.debug( "Could not find " + res.getRequest().getMetadata() + " in "
+ + res.getRequest().getRepository() );
}
- catch ( ArtifactTransferFailedException e )
+ else if ( logger.isDebugEnabled() )
{
- 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() );
- }
-
- continue;
+ logger.warn( "Could not retrieve " + res.getRequest().getMetadata() + " from "
+ + res.getRequest().getRepository() + ": " + res.getException().getMessage(), res.getException() );
}
- catch ( ArtifactDoesNotExistException e )
+ else
{
- continue;
+ logger.warn( "Could not retrieve " + res.getRequest().getMetadata() + " from "
+ + res.getRequest().getRepository() + ": " + res.getException().getMessage() );
}
}
- if ( mergeMetadata( mergedMetadata, artifactMetadataFile ) )
+ if ( res.getMetadata() != null )
{
- result.setRepository( repository );
+ mergeMetadata( versions, res.getMetadata().getFile(), res.getRequest().getRepository() );
}
}
- // Search in the local repositiory for a (development) version
- //
- // maven-metadata-local.xml
- //
+ if ( StringUtils.isNotEmpty( versions.releaseVersion ) )
{
- String localPath = getLocalMetadataPath( request, localRepository );
-
- File artifactMetadataFile = new File( localRepository.getBasedir(), localPath );
-
- if ( mergeMetadata( mergedMetadata, artifactMetadataFile ) )
- {
- result.setRepository( localRepository );
- }
+ result.setVersion( versions.releaseVersion );
+ result.setRepository( ( versions.releaseRepository == null ) ? localRepo : versions.releaseRepository );
}
-
- if ( mergedMetadata.getVersioning() != null )
+ else if ( StringUtils.isNotEmpty( versions.latestVersion ) )
{
- String release = mergedMetadata.getVersioning().getRelease();
-
- if ( StringUtils.isNotEmpty( release ) )
- {
- result.setVersion( release );
- }
- else
- {
- String latest = mergedMetadata.getVersioning().getLatest();
-
- if ( StringUtils.isNotEmpty( latest ) )
- {
- result.setVersion( latest );
- }
- }
+ result.setVersion( versions.latestVersion );
+ result.setRepository( ( versions.latestRepository == null ) ? localRepo : versions.latestRepository );
}
-
- if ( StringUtils.isEmpty( result.getVersion() ) )
+ else
{
- throw new PluginVersionResolutionException( request.getGroupId(), request.getArtifactId(),
- request.getLocalRepository(), request.getRemoteRepositories(),
+ throw new PluginVersionResolutionException( request.getGroupId(), request.getArtifactId(), localRepo,
+ request.getRepositories(),
"Plugin not found in any plugin repository" );
}
return result;
}
- private boolean isEnabled( ArtifactRepository repository )
- {
- return repository.getReleases().isEnabled() || repository.getSnapshots().isEnabled();
- }
-
- private String getLocalMetadataPath( PluginVersionRequest request, ArtifactRepository repository )
- {
- return request.getGroupId().replace( '.', '/' ) + '/' + request.getArtifactId() + "/maven-metadata-"
- + repository.getId() + ".xml";
- }
-
- private String getRemoteMetadataPath( PluginVersionRequest request, ArtifactRepository repository )
- {
- return request.getGroupId().replace( '.', '/' ) + '/' + request.getArtifactId() + "/maven-metadata.xml";
- }
-
- private boolean mergeMetadata( Metadata target, File metadataFile )
+ private void mergeMetadata( Versions versions, File metadataFile, ArtifactRepository repository )
{
- if ( metadataFile.isFile() )
+ if ( metadataFile != null && metadataFile.isFile() )
{
try
{
@@ -228,7 +177,7 @@ public class DefaultPluginVersionResolve
Metadata repoMetadata = metadataReader.read( metadataFile, options );
- return mergeMetadata( target, repoMetadata );
+ mergeMetadata( versions, repoMetadata, repository );
}
catch ( IOException e )
{
@@ -242,13 +191,31 @@ public class DefaultPluginVersionResolve
}
}
}
-
- return false;
}
- private boolean mergeMetadata( Metadata target, Metadata source )
+ private void mergeMetadata( Versions versions, Metadata source, ArtifactRepository repository )
{
- return target.merge( source );
+ Versioning versioning = source.getVersioning();
+ if ( versioning != null )
+ {
+ String timestamp = StringUtils.clean( versioning.getLastUpdated() );
+
+ if ( StringUtils.isNotEmpty( versioning.getRelease() )
+ && timestamp.compareTo( versions.releaseTimestamp ) > 0 )
+ {
+ versions.releaseVersion = versioning.getRelease();
+ versions.releaseTimestamp = timestamp;
+ versions.releaseRepository = repository;
+ }
+
+ if ( StringUtils.isNotEmpty( versioning.getLatest() )
+ && timestamp.compareTo( versions.latestTimestamp ) > 0 )
+ {
+ versions.latestVersion = versioning.getLatest();
+ versions.latestTimestamp = timestamp;
+ versions.latestRepository = repository;
+ }
+ }
}
private PluginVersionResult resolveFromProject( PluginVersionRequest request )
@@ -290,4 +257,21 @@ public class DefaultPluginVersionResolve
return null;
}
+ static class Versions
+ {
+
+ String releaseVersion = "";
+
+ String releaseTimestamp = "";
+
+ ArtifactRepository releaseRepository;
+
+ String latestVersion = "";
+
+ String latestTimestamp = "";
+
+ ArtifactRepository latestRepository;
+
+ }
+
}
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResult.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResult.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResult.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResult.java Tue Aug 24 22:46:07 2010
@@ -19,8 +19,8 @@ package org.apache.maven.plugin.version.
* under the License.
*/
-import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.plugin.version.PluginVersionResult;
+import org.sonatype.aether.repository.ArtifactRepository;
/**
* Describes the result of a plugin version resolution request.
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java?rev=988749&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java Tue Aug 24 22:46:07 2010
@@ -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 org.sonatype.aether.RepositorySystemSession;
+import org.sonatype.aether.graph.DependencyFilter;
+
+/**
+ * @author Benjamin Bentmann
+ */
+public class DefaultDependencyResolutionRequest
+ implements DependencyResolutionRequest
+{
+
+ private MavenProject project;
+
+ private DependencyFilter filter;
+
+ private RepositorySystemSession session;
+
+ public DefaultDependencyResolutionRequest()
+ {
+ // enables default constructor
+ }
+
+ public DefaultDependencyResolutionRequest( MavenProject project, RepositorySystemSession session )
+ {
+ setMavenProject( project );
+ setRepositorySession( session );
+ }
+
+ public DependencyFilter getResolutionFilter()
+ {
+ return filter;
+ }
+
+ public MavenProject getMavenProject()
+ {
+ return project;
+ }
+
+ public RepositorySystemSession getRepositorySession()
+ {
+ return session;
+ }
+
+ public DependencyResolutionRequest setResolutionFilter( DependencyFilter filter )
+ {
+ this.filter = filter;
+ return this;
+ }
+
+ public DependencyResolutionRequest setMavenProject( MavenProject project )
+ {
+ this.project = project;
+ return this;
+ }
+
+ public DependencyResolutionRequest setRepositorySession( RepositorySystemSession repositorySession )
+ {
+ this.session = repositorySession;
+ return this;
+ }
+
+}
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java?rev=988749&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java Tue Aug 24 22:46:07 2010
@@ -0,0 +1,111 @@
+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.ArrayList;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.sonatype.aether.graph.Dependency;
+import org.sonatype.aether.graph.DependencyNode;
+
+/**
+ * @author Benjamin Bentmann
+ */
+class DefaultDependencyResolutionResult
+ implements DependencyResolutionResult
+{
+
+ private DependencyNode root;
+
+ private List<Dependency> dependencies = new ArrayList<Dependency>();
+
+ private List<Dependency> resolvedDependencies = new ArrayList<Dependency>();
+
+ private List<Dependency> unresolvedDependencies = new ArrayList<Dependency>();
+
+ private List<Exception> collectionErros = new ArrayList<Exception>();
+
+ private Map<Dependency, List<Exception>> resolutionErrors = new IdentityHashMap<Dependency, List<Exception>>();
+
+ public DependencyNode getDependencyGraph()
+ {
+ return root;
+ }
+
+ public void setDependencyGraph( DependencyNode root )
+ {
+ this.root = root;
+ }
+
+ public List<Dependency> getDependencies()
+ {
+ return dependencies;
+ }
+
+ public List<Dependency> getResolvedDependencies()
+ {
+ return resolvedDependencies;
+ }
+
+ public void addResolvedDependency( Dependency dependency )
+ {
+ dependencies.add( dependency );
+ resolvedDependencies.add( dependency );
+ }
+
+ public List<Dependency> getUnresolvedDependencies()
+ {
+ return unresolvedDependencies;
+ }
+
+ public List<Exception> getCollectionErrors()
+ {
+ return collectionErros;
+ }
+
+ public void setCollectionErrors( List<Exception> exceptions )
+ {
+ if ( exceptions != null )
+ {
+ this.collectionErros = exceptions;
+ }
+ else
+ {
+ this.collectionErros = new ArrayList<Exception>();
+ }
+ }
+
+ public List<Exception> getResolutionErrors( Dependency dependency )
+ {
+ List<Exception> errors = resolutionErrors.get( dependency );
+ return ( errors != null ) ? errors : Collections.<Exception> emptyList();
+ }
+
+ public void setResolutionErrors( Dependency dependency, List<Exception> errors )
+ {
+ dependencies.add( dependency );
+ unresolvedDependencies.add( dependency );
+ resolutionErrors.put( dependency, errors );
+ }
+
+}
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java Tue Aug 24 22:46:07 2010
@@ -107,7 +107,7 @@ class DefaultModelBuildingListener
projectBuildingHelper.createProjectRealm( project, model, projectBuildingRequest );
project.setClassRealm( record.realm );
- project.setExtensionArtifactFilter( record.extensionArtifactFilter );
+ project.setExtensionDependencyFilter( record.extensionArtifactFilter );
}
catch ( PluginResolutionException e )
{
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java Tue Aug 24 22:46:07 2010
@@ -1,35 +1,30 @@
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.
+ * 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.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
+import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
-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.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Profile;
@@ -45,18 +40,23 @@ import org.apache.maven.model.building.M
import org.apache.maven.model.building.ModelSource;
import org.apache.maven.model.building.StringModelSource;
import org.apache.maven.model.resolution.ModelResolver;
-import org.apache.maven.project.artifact.ProjectArtifact;
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.codehaus.plexus.util.Os;
import org.codehaus.plexus.util.StringUtils;
+import org.sonatype.aether.impl.ArtifactResolver;
+import org.sonatype.aether.impl.RemoteRepositoryManager;
+import org.sonatype.aether.repository.WorkspaceRepository;
+import org.sonatype.aether.resolution.ArtifactRequest;
+import org.sonatype.aether.resolution.ArtifactResult;
+import org.sonatype.aether.util.artifact.SubArtifact;
/**
* @version $Id$
*/
-@Component( role = ProjectBuilder.class )
+@Component(role = ProjectBuilder.class)
public class DefaultProjectBuilder
implements ProjectBuilder
{
@@ -77,7 +77,13 @@ public class DefaultProjectBuilder
private RepositorySystem repositorySystem;
@Requirement
- private ResolutionErrorHandler resolutionErrorHandler;
+ private ArtifactResolver artifactResolver;
+
+ @Requirement
+ private RemoteRepositoryManager repositoryManager;
+
+ @Requirement
+ private ProjectDependenciesResolver dependencyResolver;
// ----------------------------------------------------------------------
// MavenProjectBuilder Implementation
@@ -115,11 +121,11 @@ public class DefaultProjectBuilder
DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, configuration );
request.setModelBuildingListener( listener );
-
+
request.setPomFile( pomFile );
request.setModelSource( modelSource );
request.setLocationTracking( pomFile != null );
-
+
ModelBuildingResult result;
try
{
@@ -139,34 +145,32 @@ public class DefaultProjectBuilder
projectBuildingHelper.selectProjectRealm( project );
}
- ArtifactResolutionResult artifactResult = null;
+ DependencyResolutionResult resolutionResult = null;
if ( configuration.isResolveDependencies() )
{
- Artifact artifact = new ProjectArtifact( project );
-
- ArtifactResolutionRequest artifactRequest = new ArtifactResolutionRequest()
- .setArtifact( artifact )
- .setResolveRoot( false )
- .setResolveTransitively( true )
- .setCache( configuration.getRepositoryCache() )
- .setLocalRepository( configuration.getLocalRepository() )
- .setRemoteRepositories( project.getRemoteArtifactRepositories() )
- .setServers( configuration.getServers() )
- .setMirrors( configuration.getMirrors() )
- .setProxies( configuration.getProxies() )
- .setOffline( configuration.isOffline() )
- .setForceUpdate( configuration.isForceUpdate() )
- .setManagedVersionMap( project.getManagedVersionMap() );
- artifactRequest.setTransferListener( configuration.getTransferListener() );
-
- artifactResult = repositorySystem.resolve( artifactRequest );
+ try
+ {
+ DefaultDependencyResolutionRequest resolution =
+ new DefaultDependencyResolutionRequest( project, configuration.getRepositorySession() );
+ resolutionResult = dependencyResolver.resolve( resolution );
+ }
+ catch ( DependencyResolutionException e )
+ {
+ resolutionResult = e.getResult();
+ }
- project.setResolvedArtifacts( artifactResult.getArtifacts() );
- project.setArtifacts( artifactResult.getArtifacts() );
+ Set<Artifact> artifacts = new LinkedHashSet<Artifact>();
+ if ( resolutionResult.getDependencyGraph() != null )
+ {
+ RepositoryUtils.toArtifacts( artifacts, resolutionResult.getDependencyGraph().getChildren(),
+ Collections.singletonList( project.getArtifact().getId() ), null );
+ }
+ project.setResolvedArtifacts( artifacts );
+ project.setArtifacts( artifacts );
}
- return new DefaultProjectBuildingResult( project, modelProblems, artifactResult );
+ return new DefaultProjectBuildingResult( project, modelProblems, resolutionResult );
}
finally
{
@@ -187,10 +191,12 @@ public class DefaultProjectBuilder
}
private ModelBuildingRequest getModelBuildingRequest( ProjectBuildingRequest configuration,
- ReactorModelPool reactorModelPool )
+ ReactorModelPool modelPool )
{
ModelResolver resolver =
- new RepositoryModelResolver( repositorySystem, resolutionErrorHandler, configuration, reactorModelPool );
+ new ReactorModelResolver( configuration.getRepositorySession(), artifactResolver,
+ repositoryManager,
+ RepositoryUtils.toRepos( configuration.getRemoteRepositories() ), modelPool );
ModelBuildingRequest request = new DefaultModelBuildingRequest();
@@ -216,42 +222,34 @@ public class DefaultProjectBuilder
public ProjectBuildingResult build( Artifact artifact, boolean allowStubModel, ProjectBuildingRequest configuration )
throws ProjectBuildingException
{
- if ( !artifact.getType().equals( "pom" ) )
+ org.sonatype.aether.artifact.Artifact pomArtifact = RepositoryUtils.toArtifact( artifact );
+ if ( !pomArtifact.getExtension().equals( "pom" ) )
{
- artifact =
- repositorySystem.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(),
- artifact.getVersion() );
- }
-
- ArtifactResolutionRequest request = new ArtifactResolutionRequest()
- .setArtifact( artifact )
- .setCache( configuration.getRepositoryCache() )
- .setLocalRepository( configuration.getLocalRepository() )
- .setRemoteRepositories( configuration.getRemoteRepositories() )
- .setOffline( configuration.isOffline() )
- .setForceUpdate( configuration.isForceUpdate() );
- request.setTransferListener( configuration.getTransferListener() );
-
- ArtifactResolutionResult result = repositorySystem.resolve( request );
-
- if ( result.hasMissingArtifacts() && allowStubModel )
- {
- return build( null, createStubModelSource( artifact ), configuration );
+ pomArtifact = new SubArtifact( pomArtifact, "", "pom" );
}
+ ArtifactResult result;
try
{
- resolutionErrorHandler.throwErrors( request, result );
+ ArtifactRequest request = new ArtifactRequest();
+ request.setArtifact( pomArtifact );
+ request.setRepositories( RepositoryUtils.toRepos( configuration.getRemoteRepositories() ) );
+ result = artifactResolver.resolveArtifact( configuration.getRepositorySession(), request );
+ pomArtifact = result.getArtifact();
}
- catch ( ArtifactResolutionException e )
+ catch ( org.sonatype.aether.resolution.ArtifactResolutionException e )
{
+ if ( e.getResults().get( 0 ).isMissing() && allowStubModel )
+ {
+ return build( null, createStubModelSource( artifact ), configuration );
+ }
throw new ProjectBuildingException( artifact.getId(),
"Error resolving project artifact: " + e.getMessage(), e );
}
- boolean localProject = artifact.getRepository() != null && artifact.getRepository().isProjectAware();
+ boolean localProject = result.getRepository() instanceof WorkspaceRepository;
- File pomFile = artifact.getFile();
+ File pomFile = pomArtifact.getFile();
return build( localProject ? pomFile : null, new FileModelSource( pomFile ), configuration );
}
@@ -279,14 +277,14 @@ public class DefaultProjectBuilder
List<InterimResult> interimResults = new ArrayList<InterimResult>();
- ReactorModelPool reactorModelPool = new ReactorModelPool();
+ ReactorModelPool modelPool = new ReactorModelPool();
ReactorModelCache modelCache = new ReactorModelCache();
boolean noErrors =
- build( results, interimResults, pomFiles, true, recursive, config, reactorModelPool, modelCache );
+ build( results, interimResults, pomFiles, true, recursive, config, modelPool, modelCache );
- populateReactorModelPool( reactorModelPool, interimResults );
+ populateReactorModelPool( modelPool, interimResults );
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java Tue Aug 24 22:46:07 2010
@@ -22,20 +22,16 @@ package org.apache.maven.project;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException;
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.ArtifactResolutionRequest;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.ExclusionSetFilter;
import org.apache.maven.classrealm.ClassRealmManager;
import org.apache.maven.model.Build;
import org.apache.maven.model.Extension;
@@ -56,10 +52,16 @@ import org.codehaus.plexus.classworlds.r
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.graph.DependencyFilter;
+import org.sonatype.aether.graph.DependencyNode;
+import org.sonatype.aether.repository.RemoteRepository;
+import org.sonatype.aether.util.filter.ExclusionsDependencyFilter;
+import org.sonatype.aether.util.graph.PreorderNodeListGenerator;
/**
* Assists the project builder. <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
+ * 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
@@ -104,10 +106,12 @@ public class DefaultProjectBuildingHelpe
throws InvalidRepositoryException
{
List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
+ Collection<String> repoIds = new HashSet<String>();
for ( Repository repository : pomRepositories )
{
artifactRepositories.add( repositorySystem.buildArtifactRepository( repository ) );
+ repoIds.add( repository.getId() );
}
repositorySystem.injectMirror( artifactRepositories, request.getMirrors() );
@@ -118,7 +122,13 @@ public class DefaultProjectBuildingHelpe
if ( externalRepositories != null )
{
- artifactRepositories.addAll( externalRepositories );
+ for ( ArtifactRepository repository : externalRepositories )
+ {
+ if ( repoIds.add( repository.getId() ) )
+ {
+ artifactRepositories.add( repository );
+ }
+ }
}
artifactRepositories = repositorySystem.getEffectiveRepositories( artifactRepositories );
@@ -174,26 +184,23 @@ public class DefaultProjectBuildingHelpe
List<Artifact> publicArtifacts = new ArrayList<Artifact>();
- RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
- repositoryRequest.setCache( request.getRepositoryCache() );
- repositoryRequest.setLocalRepository( request.getLocalRepository() );
- repositoryRequest.setRemoteRepositories( project.getPluginArtifactRepositories() );
- repositoryRequest.setOffline( request.isOffline() );
- repositoryRequest.setForceUpdate( request.isForceUpdate() );
- repositoryRequest.setTransferListener( request.getTransferListener() );
-
for ( Plugin plugin : extensionPlugins )
{
if ( plugin.getVersion() == null )
{
- PluginVersionRequest versionRequest = new DefaultPluginVersionRequest( plugin, repositoryRequest );
+ PluginVersionRequest versionRequest =
+ new DefaultPluginVersionRequest( plugin, request.getRepositorySession(),
+ project.getRemotePluginRepositories() );
plugin.setVersion( pluginVersionResolver.resolve( versionRequest ).getVersion() );
}
List<Artifact> artifacts;
- PluginArtifactsCache.CacheRecord recordArtifacts =
- pluginArtifactsCache.get( plugin, repositoryRequest, null );
+ PluginArtifactsCache.Key cacheKey =
+ pluginArtifactsCache.createKey( plugin, null, project.getRemotePluginRepositories(),
+ request.getRepositorySession() );
+
+ PluginArtifactsCache.CacheRecord recordArtifacts = pluginArtifactsCache.get( cacheKey );
if ( recordArtifacts != null )
{
@@ -201,9 +208,9 @@ public class DefaultProjectBuildingHelpe
}
else
{
- artifacts = resolveExtensionArtifacts( plugin, repositoryRequest, request );
+ artifacts = resolveExtensionArtifacts( plugin, project.getRemotePluginRepositories(), request );
- recordArtifacts = pluginArtifactsCache.put( plugin, repositoryRequest, null, artifacts );
+ recordArtifacts = pluginArtifactsCache.put( cacheKey, artifacts );
}
pluginArtifactsCache.register( project, recordArtifacts );
@@ -314,10 +321,10 @@ public class DefaultProjectBuildingHelpe
}
}
- ArtifactFilter extensionArtifactFilter = null;
+ DependencyFilter extensionArtifactFilter = null;
if ( !exclusions.isEmpty() )
{
- extensionArtifactFilter = new ExclusionSetFilter( exclusions );
+ extensionArtifactFilter = new ExclusionsDependencyFilter( exclusions );
}
record = projectRealmCache.put( extensionRealms, projectRealm, extensionArtifactFilter );
@@ -328,16 +335,17 @@ public class DefaultProjectBuildingHelpe
return record;
}
- private List<Artifact> resolveExtensionArtifacts( Plugin extensionPlugin, RepositoryRequest repositoryRequest,
+ private List<Artifact> resolveExtensionArtifacts( Plugin extensionPlugin, List<RemoteRepository> repositories,
ProjectBuildingRequest request )
throws PluginResolutionException
{
- ArtifactResolutionRequest artifactRequest = new ArtifactResolutionRequest( repositoryRequest );
- artifactRequest.setServers( request.getServers() );
- artifactRequest.setMirrors( request.getMirrors() );
- artifactRequest.setProxies( request.getProxies() );
-
- return pluginDependenciesResolver.resolve( extensionPlugin, null, artifactRequest, null );
+ DependencyNode root =
+ pluginDependenciesResolver.resolve( extensionPlugin, null, null, repositories,
+ request.getRepositorySession() );
+
+ PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+ root.accept( nlg );
+ return nlg.getArtifacts( false );
}
public void selectProjectRealm( MavenProject project )
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingRequest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingRequest.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingRequest.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingRequest.java Tue Aug 24 22:46:07 2010
@@ -25,24 +25,24 @@ 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.model.building.ModelBuildingRequest;
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.RepositorySystemSession;
public class DefaultProjectBuildingRequest
implements ProjectBuildingRequest
{
+ private RepositorySystemSession repositorySession;
+
private boolean offline;
private boolean forceUpdate;
- private RepositoryCache repositoryCache;
-
private ArtifactRepository localRepository;
private List<ArtifactRepository> remoteRepositories;
@@ -126,18 +126,6 @@ public class DefaultProjectBuildingReque
return this;
}
- public ProjectBuildingRequest setRepositoryCache( RepositoryCache repositoryCache )
- {
- this.repositoryCache = repositoryCache;
-
- return this;
- }
-
- public RepositoryCache getRepositoryCache()
- {
- return repositoryCache;
- }
-
public ProjectBuildingRequest setLocalRepository( ArtifactRepository localRepository )
{
this.localRepository = localRepository;
@@ -393,4 +381,15 @@ public class DefaultProjectBuildingReque
this.transferListener = transferListener;
}
+ public RepositorySystemSession getRepositorySession()
+ {
+ return repositorySession;
+ }
+
+ public DefaultProjectBuildingRequest setRepositorySession( RepositorySystemSession repositorySession )
+ {
+ this.repositorySession = repositorySession;
+ return this;
+ }
+
}
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingResult.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingResult.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingResult.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingResult.java Tue Aug 24 22:46:07 2010
@@ -23,7 +23,6 @@ import java.io.File;
import java.util.ArrayList;
import java.util.List;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.model.building.ModelProblem;
/**
@@ -43,18 +42,17 @@ class DefaultProjectBuildingResult
private List<ModelProblem> problems;
- private ArtifactResolutionResult artifactResolutionResult;
+ private DependencyResolutionResult dependencyResolutionResult;
/**
* Creates a new result with the specified contents.
*
* @param project The project that was built, may be {@code null}.
* @param problems The problems that were encouterned, may be {@code null}.
- * @param dependencyResolutionResult The result of the artifact resolution for the project dependencies, may be
- * {@code null}.
+ * @param dependencyResolutionResult The result of the resolution for the project dependencies, may be {@code null}.
*/
public DefaultProjectBuildingResult( MavenProject project, List<ModelProblem> problems,
- ArtifactResolutionResult dependencyResolutionResult )
+ DependencyResolutionResult dependencyResolutionResult )
{
this.projectId =
( project != null ) ? project.getGroupId() + ':' + project.getArtifactId() + ':' + project.getVersion()
@@ -62,7 +60,7 @@ class DefaultProjectBuildingResult
this.pomFile = ( project != null ) ? project.getFile() : null;
this.project = project;
this.problems = problems;
- this.artifactResolutionResult = dependencyResolutionResult;
+ this.dependencyResolutionResult = dependencyResolutionResult;
}
/**
@@ -104,9 +102,9 @@ class DefaultProjectBuildingResult
return problems;
}
- public ArtifactResolutionResult getArtifactResolutionResult()
+ public DependencyResolutionResult getDependencyResolutionResult()
{
- return artifactResolutionResult;
+ return dependencyResolutionResult;
}
}
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java?rev=988749&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java Tue Aug 24 22:46:07 2010
@@ -0,0 +1,232 @@
+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.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.model.Exclusion;
+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.ArtifactTypeRegistry;
+import org.sonatype.aether.collection.CollectRequest;
+import org.sonatype.aether.collection.DependencyCollectionException;
+import org.sonatype.aether.graph.DependencyFilter;
+import org.sonatype.aether.graph.DependencyNode;
+import org.sonatype.aether.graph.DependencyVisitor;
+import org.sonatype.aether.resolution.ArtifactResolutionException;
+import org.sonatype.aether.resolution.ArtifactResult;
+import org.sonatype.aether.util.artifact.JavaScopes;
+
+/**
+ * @author Benjamin Bentmann
+ */
+@Component( role = ProjectDependenciesResolver.class )
+public class DefaultProjectDependenciesResolver
+ implements ProjectDependenciesResolver
+{
+
+ @Requirement
+ private Logger logger;
+
+ @Requirement
+ private RepositorySystem repoSystem;
+
+ public DependencyResolutionResult resolve( DependencyResolutionRequest request )
+ throws DependencyResolutionException
+ {
+ DefaultDependencyResolutionResult result = new DefaultDependencyResolutionResult();
+
+ MavenProject project = request.getMavenProject();
+ RepositorySystemSession session = request.getRepositorySession();
+ DependencyFilter filter = request.getResolutionFilter();
+
+ ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry();
+
+ CollectRequest collect = new CollectRequest();
+ collect.setRequestContext( "project" );
+ collect.setRepositories( project.getRemoteProjectRepositories() );
+
+ if ( project.getDependencyArtifacts() == null )
+ {
+ for ( Dependency dependency : project.getDependencies() )
+ {
+ collect.addDependency( RepositoryUtils.toDependency( dependency, stereotypes ) );
+ }
+ }
+ else
+ {
+ Map<String, Dependency> dependencies = new HashMap<String, Dependency>();
+ for ( Dependency dependency : project.getDependencies() )
+ {
+ String key = dependency.getManagementKey();
+ dependencies.put( key, dependency );
+ }
+ for ( Artifact artifact : project.getDependencyArtifacts() )
+ {
+ String key = artifact.getDependencyConflictId();
+ Dependency dependency = dependencies.get( key );
+ Collection<Exclusion> exclusions = dependency != null ? dependency.getExclusions() : null;
+ org.sonatype.aether.graph.Dependency dep = RepositoryUtils.toDependency( artifact, exclusions );
+ if ( !JavaScopes.SYSTEM.equals( dep.getScope() ) && dep.getArtifact().getFile() != null )
+ {
+ // enable re-resolution
+ dep = dep.setArtifact( dep.getArtifact().setFile( null ) );
+ }
+ collect.addDependency( dep );
+ }
+ }
+
+ DependencyManagement depMngt = project.getDependencyManagement();
+ if ( depMngt != null )
+ {
+ for ( Dependency dependency : depMngt.getDependencies() )
+ {
+ collect.addManagedDependency( RepositoryUtils.toDependency( dependency, stereotypes ) );
+ }
+ }
+
+ DependencyNode node;
+ try
+ {
+ node = repoSystem.collectDependencies( session, collect ).getRoot();
+ result.setDependencyGraph( node );
+ }
+ catch ( DependencyCollectionException e )
+ {
+ result.setDependencyGraph( e.getResult().getRoot() );
+ result.setCollectionErrors( e.getResult().getExceptions() );
+
+ throw new DependencyResolutionException( result, "Could not resolve dependencies for project "
+ + project.getId() + ": " + e.getMessage(), e );
+ }
+
+ if ( logger.isWarnEnabled() )
+ {
+ for ( DependencyNode child : node.getChildren() )
+ {
+ if ( !child.getRelocations().isEmpty() )
+ {
+ logger.warn( "The artifact " + child.getRelocations().get( 0 ) + " has been relocated to "
+ + child.getDependency().getArtifact() );
+ }
+ }
+ }
+
+ if ( logger.isDebugEnabled() )
+ {
+ node.accept( new GraphLogger( project ) );
+ }
+
+ try
+ {
+ process( result, repoSystem.resolveDependencies( session, node, filter ) );
+ }
+ catch ( ArtifactResolutionException e )
+ {
+ process( result, e.getResults() );
+
+ throw new DependencyResolutionException( result, "Could not resolve dependencies for project "
+ + project.getId() + ": " + e.getMessage(), e );
+ }
+
+ return result;
+ }
+
+ private void process( DefaultDependencyResolutionResult result, Collection<ArtifactResult> results )
+ {
+ for ( ArtifactResult ar : results )
+ {
+ if ( ar.isResolved() )
+ {
+ result.addResolvedDependency( ar.getRequest().getDependencyNode().getDependency() );
+ }
+ else
+ {
+ result.setResolutionErrors( ar.getRequest().getDependencyNode().getDependency(), ar.getExceptions() );
+ }
+ }
+ }
+
+ class GraphLogger
+ implements DependencyVisitor
+ {
+
+ private final MavenProject project;
+
+ private String indent = "";
+
+ public GraphLogger( MavenProject project )
+ {
+ this.project = project;
+ }
+
+ public boolean visitEnter( DependencyNode node )
+ {
+ StringBuilder buffer = new StringBuilder( 128 );
+ buffer.append( indent );
+ org.sonatype.aether.graph.Dependency dep = node.getDependency();
+ if ( dep != null )
+ {
+ org.sonatype.aether.artifact.Artifact art = dep.getArtifact();
+
+ buffer.append( art );
+ buffer.append( ':' ).append( dep.getScope() );
+
+ if ( node.getPremanagedScope() != null && !node.getPremanagedScope().equals( dep.getScope() ) )
+ {
+ buffer.append( " (scope managed from " ).append( node.getPremanagedScope() ).append( ")" );
+ }
+
+ if ( node.getPremanagedVersion() != null && !node.getPremanagedVersion().equals( art.getVersion() ) )
+ {
+ buffer.append( " (version managed from " ).append( node.getPremanagedVersion() ).append( ")" );
+ }
+ }
+ else
+ {
+ buffer.append( project.getGroupId() );
+ buffer.append( ':' ).append( project.getArtifactId() );
+ buffer.append( ':' ).append( project.getPackaging() );
+ buffer.append( ':' ).append( project.getVersion() );
+ }
+
+ logger.debug( buffer.toString() );
+ indent += " ";
+ return true;
+ }
+
+ public boolean visitLeave( DependencyNode node )
+ {
+ indent = indent.substring( 0, indent.length() - 3 );
+ return true;
+ }
+
+ }
+
+}
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java?rev=988749&r1=988748&r2=988749&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java Tue Aug 24 22:46:07 2010
@@ -24,9 +24,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.annotations.Component;
+import org.sonatype.aether.graph.DependencyFilter;
/**
* Default project realm cache implementation. Assumes cached data does not change.
@@ -84,7 +84,7 @@ public class DefaultProjectRealmCache
}
public CacheRecord put( List<? extends ClassRealm> extensionRealms, ClassRealm projectRealm,
- ArtifactFilter extensionArtifactFilter )
+ DependencyFilter extensionArtifactFilter )
{
if ( projectRealm == null )
{
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java?rev=988749&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java Tue Aug 24 22:46:07 2010
@@ -0,0 +1,42 @@
+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.
+ */
+
+/**
+ * @author Benjamin Bentmann
+ */
+public class DependencyResolutionException
+ extends Exception
+{
+
+ private DependencyResolutionResult result;
+
+ public DependencyResolutionException( DependencyResolutionResult result, String message, Throwable cause )
+ {
+ super( message, cause );
+ this.result = result;
+ }
+
+ public DependencyResolutionResult getResult()
+ {
+ return result;
+ }
+
+}
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java?rev=988749&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java Tue Aug 24 22:46:07 2010
@@ -0,0 +1,79 @@
+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 org.sonatype.aether.RepositorySystemSession;
+import org.sonatype.aether.graph.DependencyFilter;
+
+/**
+ * A request to resolve the dependencies of a project.
+ *
+ * @author Benjamin Bentmann
+ */
+public interface DependencyResolutionRequest
+{
+
+ /**
+ * Gets the project to resolve dependencies for.
+ *
+ * @return The project to resolve dependencies for or {@code null} if not set.
+ */
+ MavenProject getMavenProject();
+
+ /**
+ * Sets the project to resolve dependencies for.
+ *
+ * @param project The project to resolve dependencies for, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ DependencyResolutionRequest setMavenProject( MavenProject project );
+
+ /**
+ * Gets the filter used to exclude some dependencies from resolution.
+ *
+ * @return The filter to exclude dependencies from resolution or {@code null} to resolve all dependencies.
+ */
+ DependencyFilter getResolutionFilter();
+
+ /**
+ * Sets the filter used to exclude some dependencies from resolution.
+ *
+ * @param filter The filter to exclude dependencies from resolution, may be {@code null} to resolve all
+ * dependencies.
+ * @return This request for chaining, never {@code null}.
+ */
+ DependencyResolutionRequest setResolutionFilter( DependencyFilter filter );
+
+ /**
+ * Gets the session to use for repository access.
+ *
+ * @return The repository session or {@code null} if not set.
+ */
+ RepositorySystemSession getRepositorySession();
+
+ /**
+ * Sets the session to use for repository access.
+ *
+ * @param repositorySession The repository session to use.
+ * @return This request for chaining, never {@code null}.
+ */
+ DependencyResolutionRequest setRepositorySession( RepositorySystemSession repositorySession );
+
+}
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java?rev=988749&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java Tue Aug 24 22:46:07 2010
@@ -0,0 +1,79 @@
+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.List;
+
+import org.sonatype.aether.graph.Dependency;
+import org.sonatype.aether.graph.DependencyNode;
+
+/**
+ * The result of a project dependency resolution.
+ *
+ * @author Benjamin Bentmann
+ */
+public interface DependencyResolutionResult
+{
+
+ /**
+ * Gets the dependency graph of the project.
+ *
+ * @return The dependency graph or {@code null} if not available.
+ */
+ DependencyNode getDependencyGraph();
+
+ /**
+ * Gets the transitive dependencies of the project that were not excluded by a filter, whether successfully resolved
+ * or not.
+ *
+ * @return The transitive dependencies, never {@code null}.
+ */
+ List<Dependency> getDependencies();
+
+ /**
+ * Gets the dependencies that were successfully resolved.
+ *
+ * @return The resolved dependencies, never {@code null}.
+ */
+ List<Dependency> getResolvedDependencies();
+
+ /**
+ * Gets the dependencies that could not be resolved.
+ *
+ * @return The unresolved dependencies, never {@code null}.
+ */
+ List<Dependency> getUnresolvedDependencies();
+
+ /**
+ * Gets the errors that occurred while building the dependency graph.
+ *
+ * @return The errors that occurred while building the dependency graph, never {@code null}.
+ */
+ List<Exception> getCollectionErrors();
+
+ /**
+ * Gets the errors that occurred while resolving the specified dependency.
+ *
+ * @param dependency The dependency for which to retrieve the errors, must not be {@code null}.
+ * @return The resolution errors for the specified dependency, never {@code null}.
+ */
+ List<Exception> getResolutionErrors( Dependency dependency );
+
+}
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision