| /* |
| * 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. |
| */ |
| |
| package npanday.resolver; |
| |
| import com.google.common.base.Predicate; |
| import com.google.common.collect.Lists; |
| import com.google.common.collect.Sets; |
| import org.apache.maven.artifact.Artifact; |
| import org.apache.maven.artifact.metadata.ArtifactMetadataSource; |
| import org.apache.maven.artifact.repository.ArtifactRepository; |
| import org.apache.maven.artifact.resolver.ArtifactNotFoundException; |
| import org.apache.maven.artifact.resolver.ArtifactResolutionException; |
| import org.apache.maven.artifact.resolver.ArtifactResolutionResult; |
| import org.apache.maven.artifact.resolver.ArtifactResolver; |
| import org.apache.maven.artifact.resolver.DebugResolutionListener; |
| import org.apache.maven.artifact.resolver.WarningResolutionListener; |
| import org.apache.maven.artifact.resolver.filter.ArtifactFilter; |
| import org.codehaus.plexus.logging.AbstractLogEnabled; |
| import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import javax.annotation.Nullable; |
| |
| /** |
| * Wraps the default Maven artifact resolver and executes all implementations |
| * of {@link npanday.resolver.ArtifactResolvingContributor} for each artiact. |
| * |
| * @author <a href="mailto:me@lcorneliussen.de>Lars Corneliussen, Faktum Software</a> |
| */ |
| public class DefaultNPandayArtifactResolver |
| extends AbstractLogEnabled |
| implements NPandayArtifactResolver, Initializable |
| { |
| private List<ArtifactResolvingContributor> contributors; |
| |
| ArtifactResolver original; |
| |
| private Set<Artifact> customResolveCache = Sets.newHashSet(); |
| private Set<Artifact> customDependenciesCache = Sets.newHashSet(); |
| |
| private ArtifactFilter filter; |
| |
| public void resolve( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository ) throws |
| ArtifactResolutionException, |
| ArtifactNotFoundException |
| { |
| runCustomResolvers( artifact ); |
| |
| original.resolve( |
| artifact, remoteRepositories, localRepository |
| ); |
| |
| runCustomDependencyContributors(artifact, localRepository, remoteRepositories); |
| } |
| |
| public void resolveAlways( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository ) throws |
| ArtifactResolutionException, |
| ArtifactNotFoundException |
| { |
| runCustomResolvers( artifact ); |
| |
| original.resolveAlways( |
| artifact, remoteRepositories, localRepository |
| ); |
| |
| runCustomDependencyContributors(artifact, localRepository, remoteRepositories); |
| } |
| |
| public ArtifactResolutionResult resolveTransitively( |
| Set artifacts, Artifact originatingArtifact, Map managedVersions, ArtifactRepository localRepository, |
| List remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter, List listeners ) throws |
| ArtifactResolutionException, |
| ArtifactNotFoundException |
| { |
| listeners = intercept( listeners, filter, localRepository, remoteRepositories ); |
| |
| return original.resolveTransitively( |
| artifacts, originatingArtifact, managedVersions, localRepository, remoteRepositories, source, filter, |
| listeners |
| ); |
| |
| } |
| |
| |
| |
| private List intercept( List listeners, ArtifactFilter filter, ArtifactRepository localRepository, |
| List remoteRepositories ) |
| { |
| |
| if (listeners == null) |
| listeners = Lists.newArrayList(); |
| |
| |
| NPandayResolutionListener listener = new NPandayResolutionListener(this, filter, localRepository, |
| remoteRepositories); |
| listener.enableLogging( getLogger() ); |
| |
| listeners.add( listener ); |
| |
| return listeners; |
| } |
| |
| public void runArtifactContributors(Artifact artifact, ArtifactRepository localRepository, |
| List remoteRepositories) throws ArtifactNotFoundException |
| { |
| if(!artifact.isResolved()) { |
| runCustomResolvers(artifact); |
| } |
| |
| if(artifact.isResolved()) { |
| runCustomDependencyContributors(artifact, localRepository, remoteRepositories); |
| } |
| } |
| |
| protected void runCustomResolvers( Artifact artifact ) throws ArtifactNotFoundException |
| { |
| if ( artifact.isResolved() ) |
| { |
| return; |
| } |
| |
| getLogger().debug( |
| "NPANDAY-147-007: trying to resolve " + artifact.getId() + " using resolving contributors" |
| ); |
| |
| for ( ArtifactResolvingContributor contributor : contributors ) |
| { |
| Set<Artifact> additionalDependenciesCollector = Sets.newHashSet(); |
| contributor.tryResolve( artifact, additionalDependenciesCollector, filter ); |
| |
| if ( artifact.isResolved() ) |
| { |
| customResolveCache.add( artifact ); |
| |
| getLogger().info( |
| "NPANDAY-147-001: " + contributor.getClass().getName() + " resolved " + artifact.getId() + " to " |
| + artifact.getFile() |
| ); |
| |
| if ( additionalDependenciesCollector.size() > 0 ) |
| { |
| addContributeArtifactsToDependenciesCache(additionalDependenciesCollector); |
| } |
| return; |
| } |
| } |
| } |
| |
| protected void runCustomDependencyContributors(Artifact artifact, ArtifactRepository localRepository, List remoteRepositories) throws ArtifactNotFoundException |
| { |
| if ( !artifact.isResolved() ) |
| { |
| throw new IllegalArgumentException( |
| String.format("NPANDAY-147-008: Artifact[groupId:'%s', artifactId:'%s', type:'%s', version:'%s']" + |
| " could not be unresolved", |
| artifact.getGroupId(), artifact.getArtifactId(), artifact.getType(), artifact.getVersion())); |
| } |
| |
| getLogger().debug( |
| "NPANDAY-147-009: trying to find complementary artifacts for " + artifact.getId() + " using resolving contributors" |
| ); |
| |
| for ( ArtifactResolvingContributor contributor : contributors ) |
| { |
| Set<Artifact> additionalDependenciesCollector = Sets.newHashSet(); |
| contributor.contribute(artifact, localRepository, remoteRepositories, additionalDependenciesCollector, filter); |
| |
| if ( additionalDependenciesCollector.size() > 0 ) |
| { |
| addContributeArtifactsToDependenciesCache(additionalDependenciesCollector); |
| } |
| } |
| |
| } |
| |
| private void addContributeArtifactsToDependenciesCache(Set<Artifact> artifacts) |
| { |
| if (artifacts == null || artifacts.isEmpty()) |
| { |
| return; |
| } |
| |
| Set<Artifact> resolvedArtifacts = Sets.filter(artifacts, new Predicate<Artifact>(){ |
| public boolean apply(@Nullable Artifact artifact) { |
| return artifact !=null && artifact.isResolved() && artifact.getFile() != null |
| && artifact.getFile().exists(); |
| }}); |
| |
| customDependenciesCache.addAll(resolvedArtifacts); |
| } |
| |
| public void initialize() { |
| if (contributors.size() == 0) { |
| getLogger().warn( "NPANDAY-147-005: could not find any custom artifact resolving contributors!" ); |
| } |
| else{ |
| getLogger().debug( "NPANDAY-147-004: resolved " + contributors.size() + " contributors: " + contributors ); |
| } |
| } |
| |
| /* Copies of the convenience overloads in DefaultArtifactResolver */ |
| |
| public ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact, |
| Map managedVersions, ArtifactRepository localRepository, |
| List remoteRepositories, ArtifactMetadataSource source ) |
| throws ArtifactResolutionException, ArtifactNotFoundException |
| { |
| return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository, |
| remoteRepositories, source, null ); |
| } |
| |
| public ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact, |
| Map managedVersions, ArtifactRepository localRepository, |
| List remoteRepositories, ArtifactMetadataSource source, |
| ArtifactFilter filter ) |
| throws ArtifactResolutionException, ArtifactNotFoundException |
| { |
| // TODO: this is simplistic |
| List listeners = new ArrayList(); |
| if ( getLogger().isDebugEnabled() ) |
| { |
| listeners.add( new DebugResolutionListener( getLogger() ) ); |
| } |
| |
| listeners.add( new WarningResolutionListener( getLogger() ) ); |
| |
| return resolveTransitively( artifacts, originatingArtifact, managedVersions, localRepository, |
| remoteRepositories, source, filter, listeners ); |
| |
| } |
| |
| public ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact, |
| ArtifactRepository localRepository, List remoteRepositories, |
| ArtifactMetadataSource source, ArtifactFilter filter ) |
| throws ArtifactResolutionException, ArtifactNotFoundException |
| { |
| return resolveTransitively( artifacts, originatingArtifact, Collections.EMPTY_MAP, localRepository, |
| remoteRepositories, source, filter ); |
| |
| } |
| |
| public ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact, |
| List remoteRepositories, ArtifactRepository localRepository, |
| ArtifactMetadataSource source ) |
| throws ArtifactResolutionException, ArtifactNotFoundException |
| { |
| return resolveTransitively( artifacts, originatingArtifact, localRepository, remoteRepositories, source, null ); |
| } |
| |
| public ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact, |
| List remoteRepositories, ArtifactRepository localRepository, |
| ArtifactMetadataSource source, List listeners ) |
| throws ArtifactResolutionException, ArtifactNotFoundException |
| { |
| return resolveTransitively( artifacts, originatingArtifact, Collections.EMPTY_MAP, localRepository, |
| remoteRepositories, source, null, listeners ); |
| } |
| |
| public void initializeWithFilter(ArtifactFilter filter) { |
| this.filter = filter; |
| } |
| |
| public Set<Artifact> getCustomResolveCache() |
| { |
| return customResolveCache; |
| } |
| |
| public Set<Artifact> getCustomDependenciesCache() |
| { |
| return customDependenciesCache; |
| } |
| } |