001 /** 002 * Copyright (C) 2009 Progress Software, Inc. 003 * http://fusesource.com 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.kuali.maven.plugins.graph; 018 019 import java.io.File; 020 import java.util.ArrayList; 021 import java.util.List; 022 023 import org.kuali.maven.plugins.graph.dot.GraphException; 024 import org.kuali.maven.plugins.graph.dot.edge.EdgeHandler; 025 import org.kuali.maven.plugins.graph.dot.edge.SmartEdgeHandler; 026 import org.kuali.maven.plugins.graph.pojo.Edge; 027 import org.kuali.maven.plugins.graph.pojo.GraphNode; 028 import org.kuali.maven.plugins.graph.pojo.MavenContext; 029 import org.kuali.maven.plugins.graph.pojo.State; 030 import org.kuali.maven.plugins.graph.tree.Node; 031 import org.kuali.maven.plugins.graph.tree.TreeHelper; 032 033 /** 034 * @goal conflicts 035 * @requiresDependencyResolution compile|test|runtime 036 */ 037 public class ConflictsMojo extends BaseMojo { 038 039 /** 040 * The file the graph will be written to 041 * 042 * @parameter expression="${graph.file}" default-value="${project.build.directory}/graph/conflicts.png" 043 */ 044 private File file; 045 046 @Override 047 protected EdgeHandler getEdgeHandler() { 048 return new SmartEdgeHandler(); 049 } 050 051 @Override 052 public File getFile() { 053 return file; 054 } 055 056 public void setFile(File file) { 057 this.file = file; 058 } 059 060 @Override 061 public void execute() { 062 setIncludes(null); 063 setExcludes(null); 064 setHide(null); 065 setShow("::conflict"); 066 super.execute(); 067 } 068 069 @Override 070 protected void postProcess(Node<MavenContext> node, List<GraphNode> nodes, List<Edge> edges) { 071 TreeHelper helper = new TreeHelper(); 072 List<MavenContext> contexts = getContexts(node); 073 List<Edge> conflictEdges = getEdges(contexts, edges); 074 for (Edge conflictEdge : conflictEdges) { 075 conflictEdge.getChild().setHidden(false); 076 } 077 List<Node<MavenContext>> treeNodes = getNodes(node, conflictEdges); 078 for (Node<MavenContext> treeNode : treeNodes) { 079 helper.showPath(treeNode); 080 } 081 } 082 083 protected List<Node<MavenContext>> getNodes(Node<MavenContext> node, List<Edge> edges) { 084 List<Node<MavenContext>> nodes = new ArrayList<Node<MavenContext>>(); 085 for (Edge edge : edges) { 086 nodes.add(getNode(node, edge)); 087 } 088 return nodes; 089 } 090 091 protected Node<MavenContext> getNode(Node<MavenContext> node, Edge edge) { 092 List<Node<MavenContext>> nodes = node.getRoot().getBreadthFirstList(); 093 for (Node<MavenContext> elementNode : nodes) { 094 GraphNode graphNode = elementNode.getObject().getGraphNode(); 095 int id = graphNode.getId(); 096 if (id == edge.getChild().getId()) { 097 return elementNode; 098 } 099 } 100 throw new GraphException("Inconsistent tree state. Unable to locate node " + edge.getChild().getId()); 101 } 102 103 protected List<Edge> getEdges(List<MavenContext> contexts, List<Edge> edges) { 104 List<Edge> newEdges = new ArrayList<Edge>(); 105 for (MavenContext context : contexts) { 106 newEdges.add(getEdge(context, edges)); 107 } 108 return newEdges; 109 } 110 111 protected Edge getEdge(MavenContext context, List<Edge> edges) { 112 for (Edge edge : edges) { 113 GraphNode parent = edge.getParent(); 114 int parentId = parent.getId(); 115 if (parentId == context.getGraphNode().getId()) { 116 return edge; 117 } 118 } 119 throw new GraphException("Inconsistent tree state. Unable to locate an edge for " 120 + context.getArtifactIdentifier()); 121 } 122 123 protected List<MavenContext> getContexts(Node<MavenContext> node) { 124 List<Node<MavenContext>> nodeList = node.getBreadthFirstList(); 125 List<MavenContext> contexts = new ArrayList<MavenContext>(); 126 for (Node<MavenContext> nodeElement : nodeList) { 127 MavenContext context = nodeElement.getObject(); 128 State state = context.getState(); 129 boolean hidden = context.getGraphNode().isHidden(); 130 if (!hidden && state == State.CONFLICT) { 131 contexts.add(context); 132 } 133 } 134 return contexts; 135 } 136 137 }