[jboss-cvs] JBossAS SVN: r98944 - in projects/jboss-deployers/trunk/deployers-impl/src: test/java/org/jboss/test/deployers/deployer/test and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Dec 29 08:40:57 EST 2009
Author: alesj
Date: 2009-12-29 08:40:57 -0500 (Tue, 29 Dec 2009)
New Revision: 98944
Modified:
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java
projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java
Log:
Simplify topological sort.
Modified: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java 2009-12-29 10:57:08 UTC (rev 98943)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java 2009-12-29 13:40:57 UTC (rev 98944)
@@ -25,14 +25,15 @@
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
+import java.util.TreeSet;
import org.jboss.deployers.spi.Ordered;
import org.jboss.deployers.spi.deployer.Deployer;
@@ -55,30 +56,44 @@
public List<Deployer> sortDeployers(List<Deployer> original, Deployer newDeployer)
{
Graph<Integer> graph = new Graph<Integer>();
- Map<String, Vertex<Integer>> vertices = new HashMap<String, Vertex<Integer>>();
+ Map<String, Set<Deployer>> output2deployer = new HashMap<String, Set<Deployer>>();
List<Deployer> splitList = new SplitList<Deployer>(original, newDeployer);
- List<DeployerNode> nodes = new ArrayList<DeployerNode>();
+ Set<Deployer> notUsed = new TreeSet<Deployer>(Ordered.COMPARATOR);
for (Deployer deployer : splitList)
{
+ boolean used = false;
+
Set<String> inputs = deployer.getInputs();
- Set<Vertex<Integer>> ivd = fillVertices(inputs, vertices, graph);
+ Set<Vertex<Integer>> ivd = fillVertices(inputs, graph);
Set<String> outputs = deployer.getOutputs();
- Set<Vertex<Integer>> ovd = fillVertices(outputs, vertices, graph);
- nodes.add(new DeployerNode(deployer, ivd, ovd));
- for (String input : inputs)
+ Set<Vertex<Integer>> ovd = fillVertices(outputs, graph);
+ ivd.retainAll(ovd); // intersection
+ for (String output : outputs)
{
- for (String output : outputs)
+ Set<Deployer> deployers = output2deployer.get(output);
+ if (deployers == null)
{
- Vertex<Integer> from = vertices.get(input);
- Vertex<Integer> to = vertices.get(output);
+ deployers = new TreeSet<Deployer>(Ordered.COMPARATOR);
+ output2deployer.put(output, deployers);
+ }
+ deployers.add(deployer);
+ used = true;
+
+ for (String input : inputs)
+ {
+ Vertex<Integer> from = graph.findVertexByName(input);
+ Vertex<Integer> to = graph.findVertexByName(output);
// ignore pass-through
- if (from != to && ivd.contains(to) == false && ovd.contains(from) == false)
+ if (from != to && ivd.contains(from) == false)
graph.addEdge(from, to, 0);
}
}
+
+ if (used == false)
+ notUsed.add(deployer);
}
Stack<Vertex<Integer>> noIncoming = new Stack<Vertex<Integer>>();
- for (Vertex<Integer> vertex : vertices.values())
+ for (Vertex<Integer> vertex : graph.getVerticies())
{
if (vertex.getIncomingEdgeCount() == 0)
noIncoming.push(vertex);
@@ -101,29 +116,48 @@
if (graph.getEdges().isEmpty() == false)
throw new IllegalStateException("We have a cycle: " + newDeployer + ", previous: " + original);
- // FIXME - transitive compare doesn't work here -- find a better way to map deployers onto ordered inputs/outputs
- Collections.sort(nodes, DeployerNodeComparator.INSTANCE);
- List<Deployer> sortedDeployers = new ArrayList<Deployer>();
- for (DeployerNode node : nodes)
- sortedDeployers.add(node.deployer);
- return sortedDeployers;
+ Set<Deployer> sortedDeployers = new LinkedHashSet<Deployer>();
+ for (Vertex<Integer> v : sorted)
+ {
+ Set<Deployer> deployers = output2deployer.get(v.getName());
+ if (deployers != null)
+ {
+ Deployer first = deployers.iterator().next();
+ Iterator<Deployer> notUsedIter = notUsed.iterator();
+ while(notUsedIter.hasNext())
+ {
+ Deployer next = notUsedIter.next();
+ if (next.getInputs().isEmpty() && Ordered.COMPARATOR.compare(next, first) < 0)
+ {
+ sortedDeployers.add(next);
+ notUsedIter.remove();
+ }
+ }
+ for (Deployer deployer : deployers)
+ {
+ if (sortedDeployers.contains(deployer) == false)
+ sortedDeployers.add(deployer);
+ }
+ }
+ }
+ sortedDeployers.addAll(notUsed); // add the one's with no output
+ return new ArrayList<Deployer>(sortedDeployers);
}
- private static Set<Vertex<Integer>> fillVertices(Set<String> keys, Map<String, Vertex<Integer>> vertices, Graph<Integer> graph)
+ private static Set<Vertex<Integer>> fillVertices(Set<String> keys, Graph<Integer> graph)
{
Map<Vertex<Integer>, Object> dv = new IdentityHashMap<Vertex<Integer>, Object>();
for (String key : keys)
- dv.put(getVertex(key, vertices, graph), 0);
+ dv.put(getVertex(key, graph), 0);
return dv.keySet();
}
- private static Vertex<Integer> getVertex(String key, Map<String, Vertex<Integer>> vertices, Graph<Integer> graph)
+ private static Vertex<Integer> getVertex(String key, Graph<Integer> graph)
{
- Vertex<Integer> vertex = vertices.get(key);
+ Vertex<Integer> vertex = graph.findVertexByName(key);
if (vertex == null)
{
vertex = new Vertex<Integer>(key);
- vertices.put(key, vertex);
graph.addVertex(vertex);
}
return vertex;
@@ -136,13 +170,8 @@
private SplitList(List<T> head, T tail)
{
- this(head, Collections.singletonList(tail));
- }
-
- private SplitList(List<T> head, List<T> tail)
- {
this.head = head;
- this.tail = tail;
+ this.tail = Collections.singletonList(tail);
}
@Override
@@ -161,169 +190,4 @@
return head.size() + tail.size();
}
}
-
- private class DeployerNode implements Ordered
- {
- private Deployer deployer;
- private Set<Vertex<Integer>> inputs;
- private Set<Vertex<Integer>> outputs;
- private int minIn = -1;
- private int maxIn = -1;
- private int minOut = -1;
- private int maxOut = -1;
-
- private DeployerNode(Deployer deployer, Set<Vertex<Integer>> inputs, Set<Vertex<Integer>> outputs)
- {
- this.deployer = deployer;
- this.inputs = inputs;
- if (inputs.isEmpty())
- {
- minIn = 0;
- maxIn = 0;
- }
- this.outputs = outputs;
- if (outputs.isEmpty())
- {
- minOut = 0;
- maxOut = 0;
- }
- }
-
- public int getRelativeOrder()
- {
- return deployer.getRelativeOrder();
- }
-
- public void setRelativeOrder(int order)
- {
- }
-
- @Override
- public String toString()
- {
- return deployer.toString();
- }
-
- public int sizeIn()
- {
- return inputs.size();
- }
-
- public int sizeOut()
- {
- return outputs.size();
- }
-
- public int getMinIn()
- {
- if (minIn == -1)
- minIn = Collections.min(inputs, VertextComparator.INSTANCE).getData();
-
- return minIn;
- }
-
- public int getMaxIn()
- {
- if (maxIn == -1)
- maxIn = Collections.max(inputs, VertextComparator.INSTANCE).getData();
-
- return maxIn;
- }
-
- public int getMinOut()
- {
- if (minOut == -1)
- minOut = Collections.min(outputs, VertextComparator.INSTANCE).getData();
-
- return minOut;
- }
-
- public int getMaxOut()
- {
- if (maxOut == -1)
- maxOut = Collections.max(outputs, VertextComparator.INSTANCE).getData();
-
- return maxOut;
- }
- }
-
- private static int overlap(DeployerNode dn1, DeployerNode dn2)
- {
- int maxOut_1 = dn1.getMaxOut();
- int minIn_2 = dn2.getMinIn();
-
- // not comparable
- if (maxOut_1 == 0 || minIn_2 == 0)
- return -1;
-
- if (maxOut_1 < minIn_2)
- return 0; // bigger
-
- int minOut_1 = dn1.getMinOut();
- int maxIn_2 = dn2.getMaxIn();
-
- // inclusion
- if (minOut_1 <= minIn_2 && maxOut_1 >= maxIn_2)
- return maxIn_2 - minIn_2 + 1;
- if (minIn_2 <= minOut_1 && maxOut_1 <= maxIn_2)
- return maxOut_1 - minOut_1 + 1;
-
- // overlap
- if (minOut_1 <= minIn_2 && minIn_2 <= maxOut_1 && maxOut_1 <= maxIn_2)
- return maxOut_1 - minIn_2 + 1;
- if (minOut_1 >= minIn_2 && minIn_2 >= maxOut_1 && maxOut_1 >= maxIn_2)
- return maxIn_2 - minOut_1 + 1;
-
- return -1;
- }
-
- private static class DeployerNodeComparator implements Comparator<DeployerNode>
- {
- static final DeployerNodeComparator INSTANCE = new DeployerNodeComparator();
-
- public int compare(DeployerNode dn1, DeployerNode dn2)
- {
- int overlap12 = overlap(dn1, dn2);
- int overlap21 = overlap(dn2, dn1);
-
- if (overlap12 > 0 && overlap21 > 0)
- {
- if (overlap12 != overlap21)
- return overlap21 - overlap12;
-
- Set<Vertex<Integer>> tail1 = new HashSet<Vertex<Integer>>(dn1.outputs);
- tail1.retainAll(dn2.inputs);
- Set<Vertex<Integer>> tail2 = new HashSet<Vertex<Integer>>(dn2.outputs);
- tail2.retainAll(dn1.inputs);
- int s1 = tail1.size();
- int s2 = tail2.size();
- if (s1 != s2)
- {
- return s2 - s1;
- }
- else
- {
- overlap12 = overlap21 = -1; // reset
- }
- }
-
- if (overlap12 >= 0)
- return -1;
-
- if (overlap21 >= 0)
- return 1;
-
- return Ordered.COMPARATOR.compare(dn1, dn2);
- }
- }
-
- private static class VertextComparator implements Comparator<Vertex<Integer>>
- {
- static final VertextComparator INSTANCE = new VertextComparator();
-
- public int compare(Vertex<Integer> v1, Vertex<Integer> v2)
- {
- return v1.getData() - v2.getData();
- }
- }
}
\ No newline at end of file
Modified: projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java 2009-12-29 10:57:08 UTC (rev 98943)
+++ projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java 2009-12-29 13:40:57 UTC (rev 98944)
@@ -51,20 +51,8 @@
}
@Override
- public void testIntermediateIsRelativelySorted() throws Exception
- {
- // TODO - fix final DeployerNodes sort
- }
-
- @Override
- public void testDoubleCycle() throws Exception
- {
- // TODO - fix final DeployerNodes sort
- }
-
- @Override
public void testDeployersOrder1() throws Exception
{
- // TODO - fix final DeployerNodes sort
+ // TODO - how much do we allow pass-through to participate in ordering?
}
}
\ No newline at end of file
More information about the jboss-cvs-commits
mailing list