Java tutorial
package net.erdfelt.maven.graphing; /* * Copyright (c) Joakim Erdfelt. * * 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.awt.Color; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import net.erdfelt.maven.graphing.graph.GraphRenderer; import net.erdfelt.maven.graphing.graph.GraphingException; import net.erdfelt.maven.graphing.graph.decorator.EdgeDecorator; import net.erdfelt.maven.graphing.graph.decorator.GraphDecorator; import net.erdfelt.maven.graphing.graph.decorator.NodeDecorator; import net.erdfelt.maven.graphing.graph.model.Edge; import net.erdfelt.maven.graphing.graph.model.Graph; import net.erdfelt.maven.graphing.graph.model.GraphConstraintException; import net.erdfelt.maven.graphing.graph.model.Node; import org.apache.maven.model.Dependency; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.StringUtils; /** * MultimoduleGraphMojo * * @author <a href="mailto:joakim@erdfelt.net">Joakim Erdfelt</a> * @version $Id$ * * @goal multimodule * @aggregator */ public class MultimoduleGraphMojo extends AbstractMojo { /** * The projects in the current build. Each of these is subject to refreshing. * * @parameter default-value="${reactorProjects}" * @required * @readonly */ private List projects; /** * @component role="net.erdfelt.maven.graphing.graph.GraphRenderer" roleHint="graphviz" */ private GraphRenderer graphRenderer; /** * @parameter expression="${graphing.ignoreVersions}" default-value="true" */ private boolean ignoreVersions; /** * @parameter expression="${graphing.filterTests}" default-value="true" */ private boolean filterTests; @Override public void execute() throws MojoExecutionException, MojoFailureException { getLog().info("Found " + projects.size() + " Project(s)"); Graph graph = new Graph(); getLog().debug("Using: " + graphRenderer); try { Iterator it = projects.iterator(); while (it.hasNext()) { MavenProject project = (MavenProject) it.next(); List deps = project.getDependencies(); if (!StringUtils.equals("pom", project.getPackaging())) { Node currentNode = graph.addNode(toNode(project)); getLog().info(" Project: " + project.getId() + " - " + deps.size() + " dep(s)"); addDependenciesToGraph(graph, currentNode, deps); } } if (graph.getDecorator() == null) { graph.setDecorator(new GraphDecorator()); } graph.getDecorator().setTitle("Module Relationship"); graph.getDecorator().setOrientation(GraphDecorator.LEFT_TO_RIGHT); graphRenderer.render(graph, new File("target/graph-multimodule.png")); } catch (GraphConstraintException e) { getLog().error("Unable to generate graph."); } catch (IOException e) { getLog().error("Unable to generate graph.", e); } catch (GraphingException e) { getLog().error("Unable to generate graph.", e); } } private boolean isMultiModuleDependency(Dependency dep) { boolean ret = false; Iterator it = projects.iterator(); while (it.hasNext()) { MavenProject project = (MavenProject) it.next(); if (StringUtils.equals(project.getGroupId(), dep.getGroupId()) && StringUtils.equals(project.getArtifactId(), dep.getArtifactId()) && StringUtils.equals(project.getPackaging(), dep.getType())) { // Found dep that matches on groupId / artifactId / type only. if (ignoreVersions) { // No test of version. ret = true; break; } else if (StringUtils.equals(project.getVersion(), dep.getVersion())) { // Found dep that matches on version too. ret = true; break; } } } return ret; } private void addDependenciesToGraph(Graph graph, Node currentNode, List deps) throws GraphConstraintException { Iterator it = deps.iterator(); while (it.hasNext()) { Dependency dep = (Dependency) it.next(); boolean isModule = isMultiModuleDependency(dep); if (filterTests && isTestDep(dep)) { // Skip continue; } if (isModule) { Node depNode = graph.addNode(toNode(dep)); Edge edge = graph.addEdge(currentNode, depNode); if (isTestDep(dep)) { if (edge.getDecorator() == null) { edge.setDecorator(new EdgeDecorator()); } edge.getDecorator().setLineColor(Color.blue); Color testColor = new Color(200, 200, 255); if (depNode.getDecorator() == null) { depNode.setDecorator(new NodeDecorator()); } depNode.getDecorator().setBackgroundColor(testColor); depNode.getDecorator().setBorderColor(testColor); graph.addNode(depNode); } } getLog().info(" " + (isModule ? "* " : " ") + dep); } } private boolean isTestDep(Dependency dep) { return StringUtils.equals("test", dep.getScope()); } private Node toNode(Dependency dep) { return toNode(dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), dep.getType()); } private Node toNode(MavenProject project) { return toNode(project.getGroupId(), project.getArtifactId(), project.getVersion(), project.getPackaging()); } private Node toNode(String groupId, String artifactId, String version, String type) { StringBuffer label = new StringBuffer(); label.append(groupId).append("\n"); label.append(artifactId).append("\n"); if (!ignoreVersions) { label.append(version).append("\n"); } label.append(type); return new Node(label.toString()); } }