package org.codehaus.mojo.graphing.model.factory;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed 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.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.artifact.repository.layout.LegacyRepositoryLayout;
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.ResolutionNode;
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.artifact.resolver.filter.TypeArtifactFilter;
import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryPolicy;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugin.logging.SystemStreamLog;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.MavenMetadataSource;
import org.codehaus.mojo.graphing.model.Edge;
import org.codehaus.mojo.graphing.model.GraphModel;
import org.codehaus.mojo.graphing.model.Node;
public class GraphModelFactory
{
private ArtifactFactory artifactFactory;
private Map artifactLayouts;
private ArtifactRepositoryFactory artifactRepositoryFactory;
private ArtifactResolver artifactResolver;
private ArtifactRepository localRepository;
private Log log;
private MavenMetadataSource mavenMetadataSource;
private MavenProject project;
private String scopeFilter;
private String typeFilter;
private boolean verbose;
public GraphModelFactory( Log logger )
{
this.log = logger;
this.verbose = false;
this.artifactLayouts = new HashMap();
this.artifactLayouts.put( "default", new DefaultRepositoryLayout() );
this.artifactLayouts.put( "legacy", new LegacyRepositoryLayout() );
}
public ArtifactFactory getArtifactFactory()
{
return artifactFactory;
}
private ArtifactRepositoryLayout getArtifactLayout( String layoutid )
{
ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) this.artifactLayouts.get( layoutid );
if ( layout == null )
{
layout = new DefaultRepositoryLayout();
}
return layout;
}
private ArtifactRepositoryPolicy getArtifactPolicy( RepositoryPolicy policy )
{
if ( policy == null )
{
return null;
}
ArtifactRepositoryPolicy artipolicy = new ArtifactRepositoryPolicy();
artipolicy.setChecksumPolicy( policy.getChecksumPolicy() );
artipolicy.setEnabled( policy.isEnabled() );
artipolicy.setUpdatePolicy( policy.getUpdatePolicy() );
return artipolicy;
}
private List getArtifactRepositories()
{
Iterator it;
List artifactRepositories = new ArrayList();
it = project.getRepositories().iterator();
while ( it.hasNext() )
{
Repository repo = (Repository) it.next();
artifactRepositories.add( toArtifactRepository( repo ) );
}
return artifactRepositories;
}
public ArtifactRepositoryFactory getArtifactRepositoryFactory()
{
return artifactRepositoryFactory;
}
public ArtifactResolver getArtifactResolver()
{
return artifactResolver;
}
public GraphModel getGraphModel( String groupId, String artifactId, String version)
throws MojoExecutionException
{
Artifact pomArtifact = resolveArtifact( groupId, artifactId, version );
// Model pom = getModel(pomArtifact);
List listeners = Collections.EMPTY_LIST;
if ( verbose )
{
listeners = Collections.singletonList( new DebugResolutionListener( getLog() ) );
}
List remoteArtifactRepositories = getArtifactRepositories();
// TODO: managed dependencies
Map managedDependencies = Collections.EMPTY_MAP;
ArtifactFilter filter = null;
if ( scopeFilter != null )
{
filter = new ScopeArtifactFilter( scopeFilter );
}
if ( typeFilter != null )
{
TypeArtifactFilter typeArtifactFilter = new TypeArtifactFilter( typeFilter );
if ( filter != null )
{
AndArtifactFilter andFilter = new AndArtifactFilter();
andFilter.add( filter );
andFilter.add( typeArtifactFilter );
filter = andFilter;
}
else
{
filter = typeArtifactFilter;
}
}
ArtifactResolutionResult result;
Set artifacts;
GraphModel model = new GraphModel();
Node centerNode = toNode(pomArtifact);
model.addNode(centerNode);
model.setCenterNode(centerNode);
try
{
artifacts = new HashSet();
artifacts.add( pomArtifact );
result = artifactResolver.resolveTransitively( artifacts, pomArtifact, managedDependencies,
localRepository, remoteArtifactRepositories,
mavenMetadataSource, filter, listeners );
}
catch ( ArtifactResolutionException e )
{
throw new MojoExecutionException( "Unable to resolve deps.", e );
}
catch ( ArtifactNotFoundException e )
{
throw new MojoExecutionException( "Unable to resolve deps.", e );
}
getLog().info("Got " + result.getArtifactResolutionNodes().size() + " resolution node(s).");
Iterator it = result.getArtifactResolutionNodes().iterator();
while(it.hasNext()) {
ResolutionNode child = (ResolutionNode) it.next();
Node childNode = toNode(child.getArtifact());
Edge edge = new Edge(centerNode, childNode);
if(model.addEdge(edge)) {
addChildEdges(model, child);
}
}
return model;
}
private Artifact resolveArtifact(String groupId, String artifactId, String version) {
Artifact artifact = artifactFactory.createProjectArtifact(groupId, artifactId, version);
if(!artifact.isResolved()) {
try
{
artifactResolver.resolve(artifact, getArtifactRepositories(), localRepository);
}
catch ( ArtifactResolutionException e )
{
getLog().error("Unable to resolve artifact.",e);
}
catch ( ArtifactNotFoundException e )
{
getLog().error("Artifact not found.",e);
}
}
getLog().info("Got resolved artifact: " + artifact);
return artifact;
}
private void addChildEdges(GraphModel model, ResolutionNode resolutionNode)
{
Node originNode = toNode(resolutionNode.getArtifact());
Iterator it = resolutionNode.getChildrenIterator();
while(it.hasNext())
{
ResolutionNode child = (ResolutionNode) it.next();
Node childNode = toNode(child.getArtifact());
Edge edge = new Edge(originNode, childNode);
if(model.addEdge(edge))
{
addChildEdges(model, child);
}
}
}
private Node toNode(Artifact artifact) {
return toNode(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType());
}
private Node toNode(String groupId, String artifactId, String version, String type)
{
String id = groupId + "/" + artifactId + "-" + version + "." + type;
String label = id;
return new Node(id, label);
}
public ArtifactRepository getLocalRepository()
{
return localRepository;
}
private Log getLog()
{
if ( this.log == null )
{
this.log = new SystemStreamLog();
}
return this.log;
}
public MavenMetadataSource getMavenMetadataSource()
{
return mavenMetadataSource;
}
public MavenProject getProject()
{
return project;
}
public String getScopeFilter()
{
return scopeFilter;
}
public String getTypeFilter()
{
return typeFilter;
}
public String getUseScope()
{
return scopeFilter;
}
public boolean isVerbose()
{
return verbose;
}
public void setArtifactFactory( ArtifactFactory artifactFactory )
{
this.artifactFactory = artifactFactory;
}
public void setArtifactRepositoryFactory( ArtifactRepositoryFactory artifactRepositoryFactory )
{
this.artifactRepositoryFactory = artifactRepositoryFactory;
}
public void setArtifactResolver( ArtifactResolver artifactResolver )
{
this.artifactResolver = artifactResolver;
}
public void setLocalRepository( ArtifactRepository localRepository )
{
this.localRepository = localRepository;
}
public void setLog( Log log )
{
this.log = log;
}
public void setMavenMetadataSource( MavenMetadataSource mavenMetadataSource )
{
this.mavenMetadataSource = mavenMetadataSource;
}
public void setProject( MavenProject project )
{
this.project = project;
}
public void setScopeFilter( String scopeFilter )
{
this.scopeFilter = scopeFilter;
}
public void setTypeFilter( String typeFilter )
{
this.typeFilter = typeFilter;
}
public void setUseScope( String useScope )
{
this.scopeFilter = useScope;
}
public void setVerbose( boolean verbose )
{
this.verbose = verbose;
}
private ArtifactRepository toArtifactRepository( Repository repo )
{
ArtifactRepositoryLayout layout = getArtifactLayout( repo.getLayout() );
ArtifactRepositoryPolicy snapshotPolicy = getArtifactPolicy( repo.getSnapshots() );
ArtifactRepositoryPolicy releasesPolicy = getArtifactPolicy( repo.getReleases() );
ArtifactRepository artirepo = artifactRepositoryFactory.createArtifactRepository( repo.getId(), repo.getUrl(),
layout, snapshotPolicy,
releasesPolicy );
return artirepo;
}
}