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.io.BufferedReader; import java.io.FileReader; import java.io.IOException; 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.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.ArtifactResolver; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.Repository; import org.apache.maven.model.RepositoryPolicy; import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.logging.SystemStreamLog; import org.apache.maven.project.MavenProject; import org.codehaus.mojo.graphing.model.Edge; import org.codehaus.mojo.graphing.model.GraphModel; import org.codehaus.mojo.graphing.model.Node; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; /** * Old GraphModel Factory. * * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a> */ public class OldGraphModelFactory { private Log log; private ArtifactFactory artifactFactory; private ArtifactResolver artifactResolver; private ArtifactRepository localRepository; private ArtifactRepositoryFactory artifactRepositoryFactory; private MavenProject project; private Map artifactLayouts; public OldGraphModelFactory(Log log) { this.log = log; this.artifactLayouts = new HashMap(); this.artifactLayouts.put("default", new DefaultRepositoryLayout()); this.artifactLayouts.put("legacy", new LegacyRepositoryLayout()); } private Log getLog() { if(this.log == null) { this.log = new SystemStreamLog(); } return this.log; } public GraphModel getGraphModel(String groupId, String artifactId, String version) { Artifact rootArtifact = resolveArtifact(groupId, artifactId, version); GraphModel model = new GraphModel(); model.setCenterNode(toNode(rootArtifact)); addEdges(model, rootArtifact); return model; } private void addEdges(GraphModel model, Artifact artifact) { Model artifactModel = getModel(artifact); if(artifactModel == null) { Node badNode = toNode(artifact); badNode.setType(GraphModel.NODE_ERROR); model.addNode(badNode); } else { Node originNode = toNode(artifactModel); originNode.setType(GraphModel.NODE_PROJECT); getLog().info("adding node: " + originNode); List deps = artifactModel.getDependencies(); Iterator it = deps.iterator(); while(it.hasNext()) { Dependency dep = (Dependency) it.next(); Node destNode = toNode(dep); Edge edge = new Edge(originNode, destNode); getLog().info("adding edge: " + edge); if(model.addEdge(edge)) { addEdges(model, toArtifact(dep)); } } } } public Model getModel(Artifact artifact) { try { MavenXpp3Reader xmlreader = new MavenXpp3Reader(); FileReader freader = new FileReader(artifact.getFile()); BufferedReader bufreader = new BufferedReader(freader); Model model = xmlreader.read(bufreader); // TODO: Ensure deps are properly defined. return model; } catch (IOException e) { getLog().error("Unable to read response.", e); return null; } catch (XmlPullParserException e) { getLog().error("Unable to create model parser.", e); return null; } } private Artifact toArtifact(Dependency dep) { return resolveArtifact(dep.getGroupId(), dep.getArtifactId(), dep.getVersion()); } private Node toNode(Dependency dep) { return toNode(dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), dep.getType()); } private Node toNode(Model model) { return toNode(model.getGroupId(), model.getArtifactId(), model.getVersion(), model.getPackaging()); } 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); } 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 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; } 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; } 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 ArtifactRepositoryLayout getArtifactLayout(String layoutid) { ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) this.artifactLayouts.get(layoutid); if(layout == null) { layout = new DefaultRepositoryLayout(); } return layout; } /** * @return Returns the artifactFactory. */ public ArtifactFactory getArtifactFactory() { return artifactFactory; } /** * @param artifactFactory The artifactFactory to set. */ public void setArtifactFactory( ArtifactFactory artifactFactory ) { this.artifactFactory = artifactFactory; } /** * @return Returns the artifactResolver. */ public ArtifactResolver getArtifactResolver() { return artifactResolver; } /** * @param artifactResolver The artifactResolver to set. */ public void setArtifactResolver( ArtifactResolver artifactResolver ) { this.artifactResolver = artifactResolver; } /** * @return Returns the localRepository. */ public ArtifactRepository getLocalRepository() { return localRepository; } /** * @param localRepository The localRepository to set. */ public void setLocalRepository( ArtifactRepository localRepository ) { this.localRepository = localRepository; } /** * @return Returns the artifactRepositoryFactory. */ public ArtifactRepositoryFactory getArtifactRepositoryFactory() { return artifactRepositoryFactory; } /** * @param artifactRepositoryFactory The artifactRepositoryFactory to set. */ public void setArtifactRepositoryFactory( ArtifactRepositoryFactory artifactRepositoryFactory ) { this.artifactRepositoryFactory = artifactRepositoryFactory; } /** * @return Returns the project. */ public MavenProject getProject() { return project; } /** * @param project The project to set. */ public void setProject( MavenProject project ) { this.project = project; } }