[jboss-cvs] JBossAS SVN: r98092 - in projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins: sort and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Dec 21 12:37:17 EST 2009
Author: alesj
Date: 2009-12-21 12:37:17 -0500 (Mon, 21 Dec 2009)
New Revision: 98092
Added:
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java
Modified:
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java
Log:
[JBDEPLOY-229]; port Bill's deployers sort alg.
Modified: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java 2009-12-21 17:27:09 UTC (rev 98091)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java 2009-12-21 17:37:17 UTC (rev 98092)
@@ -51,8 +51,8 @@
import org.jboss.deployers.client.spi.IncompleteDeployments;
import org.jboss.deployers.client.spi.MissingAsynchronousDependency;
import org.jboss.deployers.client.spi.MissingDependency;
-import org.jboss.deployers.plugins.sort.DeployerSorter;
-import org.jboss.deployers.plugins.sort.DeployerSorterFactory;
+import org.jboss.deployers.plugins.sort.OldStagedSortedDeployers;
+import org.jboss.deployers.plugins.sort.StagedSortedDeployers;
import org.jboss.deployers.spi.DeploymentException;
import org.jboss.deployers.spi.DeploymentState;
import org.jboss.deployers.spi.deployer.Deployer;
@@ -126,11 +126,8 @@
/**
* The deployers by stage and type
*/
- private Map<String, List<Deployer>> deployersByStage = new HashMap<String, List<Deployer>>();
+ private StagedSortedDeployers deployersByStage = new OldStagedSortedDeployers();
- /** The sorter */
- private DeployerSorter sorter;
-
/**
* The scope builder
*/
@@ -219,6 +216,16 @@
}
/**
+ * Set staged sorted deployers.
+ *
+ * @param deployersByStage the stage sorted deployers
+ */
+ public void setDeployersByStage(StagedSortedDeployers deployersByStage)
+ {
+ this.deployersByStage = deployersByStage;
+ }
+
+ /**
* Get the deployers.
*
* @return the deployers.
@@ -253,16 +260,6 @@
}
/**
- * Set the sorter.
- *
- * @param sorter the sorter
- */
- public void setSorter(DeployerSorter sorter)
- {
- this.sorter = sorter;
- }
-
- /**
* Add a deployer
*
* @param deployer the deployer
@@ -285,12 +282,7 @@
return;
String stageName = stage.getName();
- List<Deployer> deployers = deployersByStage.get(stageName);
- if (deployers == null)
- deployers = Collections.emptyList();
- deployers = insert(deployers, wrapper);
- deployersByStage.put(stageName, deployers);
-
+ deployersByStage.addDeployer(stageName, wrapper);
this.deployers.add(wrapper);
StringBuilder builder = new StringBuilder();
@@ -315,7 +307,8 @@
if (deployer == null)
throw new IllegalArgumentException("Null deployer");
- deployers.remove(new DeployerWrapper(deployer));
+ DeployerWrapper wrapper = new DeployerWrapper(deployer);
+ deployers.remove(wrapper);
DeploymentStage stage = deployer.getStage();
if (stage == null)
@@ -325,14 +318,7 @@
}
String stageName = stage.getName();
- List<Deployer> deployers = deployersByStage.get(stageName);
- if (deployers == null)
- return;
-
- deployers.remove(deployer);
- if (deployers.isEmpty())
- deployersByStage.remove(stageName);
-
+ deployersByStage.removeDeployer(stageName, wrapper);
log.debug("Removed deployer " + deployer + " from stage " + stageName);
}
@@ -1668,7 +1654,7 @@
*/
protected synchronized List<Deployer> getDeployersList(String stageName)
{
- List<Deployer> deployers = deployersByStage.get(stageName);
+ List<Deployer> deployers = deployersByStage.getDeployerList(stageName);
if (deployers == null || deployers.isEmpty())
return Collections.emptyList();
@@ -1721,22 +1707,6 @@
}
/**
- * Insert the new Deployer.
- *
- * @param original the original deployers
- * @param newDeployer the new deployer
- * @return the sorted deployers
- */
- protected List<Deployer> insert(List<Deployer> original, Deployer newDeployer)
- {
- DeployerSorter sorter = this.sorter;
- if (sorter == null)
- sorter = DeployerSorterFactory.newSorter();
-
- return sorter.sortDeployers(original, newDeployer);
- }
-
- /**
* Set the deployment state for a context and its children
*
* @param context the context
Added: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java (rev 0)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java 2009-12-21 17:37:17 UTC (rev 98092)
@@ -0,0 +1,45 @@
+package org.jboss.deployers.plugins.sort;
+
+import org.jboss.deployers.spi.deployer.Deployer;
+
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+
+/**
+ * @author <a href="mailto:bill at burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class NewStagedSortedDeployers implements StagedSortedDeployers
+{
+ private Map<String, SortedDeployers> deployersByStage = new HashMap<String, SortedDeployers>();
+
+ public void addDeployer(String stageName, Deployer deployer)
+ {
+ SortedDeployers deployers = deployersByStage.get(stageName);
+ if (deployers == null)
+ {
+ deployers = new SortedDeployers();
+ deployersByStage.put(stageName, deployers);
+ }
+ deployers.sort(deployer);
+
+ }
+
+ public List<Deployer> getDeployerList(String stageName)
+ {
+ SortedDeployers deployers = deployersByStage.get(stageName);
+ if (deployers == null)
+ return Collections.emptyList();
+
+ return deployers.getDeployers();
+ }
+
+ public void removeDeployer(String stageName, Deployer deployer)
+ {
+ SortedDeployers deployers = deployersByStage.get(stageName);
+ if (deployers != null)
+ deployers.removeDeployer(deployer);
+ }
+}
Added: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java (rev 0)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java 2009-12-21 17:37:17 UTC (rev 98092)
@@ -0,0 +1,75 @@
+package org.jboss.deployers.plugins.sort;
+
+import org.jboss.deployers.spi.deployer.Deployer;
+
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+
+/**
+ * @author <a href="mailto:bill at burkecentral.com">Bill Burke</a>
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ * @version $Revision: 1 $
+ */
+public class OldStagedSortedDeployers implements StagedSortedDeployers
+{
+ private Map<String, List<Deployer>> deployersByStage = new HashMap<String, List<Deployer>>();
+ private DeployerSorter sorter;
+
+ public void addDeployer(String stageName, Deployer deployer)
+ {
+ List<Deployer> deployers = deployersByStage.get(stageName);
+ if (deployers == null)
+ deployers = Collections.emptyList();
+ deployers = insert(deployers, deployer);
+ deployersByStage.put(stageName, deployers);
+
+ }
+
+ public List<Deployer> getDeployerList(String stageName)
+ {
+ List<Deployer> deployers = deployersByStage.get(stageName);
+ if (deployers == null || deployers.isEmpty())
+ return Collections.emptyList();
+
+ return deployers;
+ }
+
+ public void removeDeployer(String stageName, Deployer deployer)
+ {
+ List<Deployer> deployers = deployersByStage.get(stageName);
+ if (deployers == null)
+ return;
+
+ deployers.remove(deployer);
+ if (deployers.isEmpty())
+ deployersByStage.remove(stageName);
+ }
+
+ /**
+ * Insert the new Deployer.
+ *
+ * @param original the original deployers
+ * @param newDeployer the new deployer
+ * @return the sorted deployers
+ */
+ protected List<Deployer> insert(List<Deployer> original, Deployer newDeployer)
+ {
+ DeployerSorter sorter = this.sorter;
+ if (sorter == null)
+ sorter = DeployerSorterFactory.newSorter();
+
+ return sorter.sortDeployers(original, newDeployer);
+ }
+
+ /**
+ * The deployer sorter.
+ *
+ * @param sorter the sorter
+ */
+ public void setSorter(DeployerSorter sorter)
+ {
+ this.sorter = sorter;
+ }
+}
Added: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java (rev 0)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java 2009-12-21 17:37:17 UTC (rev 98092)
@@ -0,0 +1,317 @@
+package org.jboss.deployers.plugins.sort;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jboss.deployers.spi.deployer.Deployer;
+
+/**
+ * @author <a href="mailto:bill at burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class SortedDeployers
+{
+ private static class Entry
+ {
+ static volatile AtomicInteger added = new AtomicInteger(0);
+
+ public Deployer deployer;
+ public int index;
+ public final int addedOrder = added.getAndIncrement();
+
+ private Entry(Deployer deployer)
+ {
+ this.deployer = deployer;
+ }
+
+ public Set<String> getInputs()
+ {
+ if (deployer.getInputs() == null) return Collections.emptySet();
+ return deployer.getInputs();
+ }
+
+ public Set<String> getOutputs()
+ {
+ if (deployer.getOutputs() == null) return Collections.emptySet();
+ return deployer.getOutputs();
+ }
+
+ public int getRelativeOrder()
+ {
+ return deployer.getRelativeOrder();
+ }
+
+ public int getIndex()
+ {
+ return index;
+ }
+
+ public void setIndex(int index)
+ {
+ this.index = index;
+ }
+
+ public int getAddedOrder()
+ {
+ return addedOrder;
+ }
+
+ public String toString()
+ {
+ return deployer.toString();
+ }
+ }
+
+ Map<String, List<Entry>> outputMap = new HashMap<String, List<Entry>>();
+ Map<String, List<Entry>> inputMap = new HashMap<String, List<Entry>>();
+ ArrayList<Entry> entries = new ArrayList<Entry>();
+ ArrayList<Deployer> deployers = new ArrayList<Deployer>();
+
+ public void addOutputs(Entry deployer)
+ {
+ if (deployer.getOutputs() == null) return;
+ for (String output : deployer.getOutputs())
+ {
+ List<Entry> list = outputMap.get(output);
+ if (list == null)
+ {
+ list = new ArrayList<Entry>();
+ outputMap.put(output, list);
+ }
+ list.add(deployer);
+ }
+ }
+
+ public void addInputs(Entry deployer)
+ {
+ if (deployer.getInputs() == null) return;
+ for (String input : deployer.getInputs())
+ {
+ List<Entry> list = inputMap.get(input);
+ if (list == null)
+ {
+ list = new ArrayList<Entry>();
+ inputMap.put(input, list);
+ }
+ list.add(deployer);
+ }
+ }
+
+ public void sort(Deployer d)
+ {
+ Entry n = new Entry(d);
+ addOutputs(n);
+ addInputs(n);
+
+ if (entries.size() == 0)
+ {
+ insertAt(n);
+ deployers.clear();
+ for (Entry entry : entries)
+ {
+ deployers.add(entry.deployer);
+ }
+ return;
+ }
+
+ insertAfterInputs(n);
+ traverseOutputs(n);
+ relativeOrdering();
+
+ deployers = new ArrayList<Deployer>();
+ for (Entry entry : entries)
+ {
+ deployers.add(entry.deployer);
+ }
+ }
+
+ public void removeDeployer(Deployer d)
+ {
+ Entry removed = null;
+ for (int i = 0; i < entries.size(); i++)
+ {
+ if (entries.get(0).deployer == d)
+ {
+ removed = entries.get(0);
+ removeAt(i);
+ break;
+ }
+ }
+ if (d.getInputs() != null)
+ {
+ for (String input : d.getInputs())
+ {
+ List<Entry> list = inputMap.get(input);
+ if (list != null)
+ {
+ list.remove(removed);
+ }
+ }
+ }
+ if (d.getOutputs() != null)
+ {
+ for (String output : d.getOutputs())
+ {
+ List<Entry> list = outputMap.get(output);
+ if (list != null)
+ {
+ list.remove(removed);
+ }
+ }
+ }
+ deployers.clear();
+ for (Entry entry : entries)
+ {
+ deployers.add(entry.deployer);
+ }
+ }
+
+ public List<Deployer> getDeployers()
+ {
+ return deployers;
+ }
+
+ private void traverseOutputs(Entry n)
+ {
+ if (n.getOutputs() == null) return;
+ for (String output : n.getOutputs())
+ {
+ List<Entry> inputs = inputMap.get(output);
+ if (inputs == null) continue;
+ for (Entry deployer : inputs)
+ {
+ if (deployer.getIndex() < n.getIndex())
+ {
+ if (n.getInputs().contains(output) && deployer.getOutputs().contains(output))
+ {
+
+ }
+ else
+ {
+ removeAt(deployer.getIndex());
+ deployer.setIndex(0);
+ insertAfterInputs(deployer);
+ traverseOutputs(deployer);
+ }
+ }
+ }
+
+ }
+ }
+
+ private void insertAfterInputs(Entry n)
+ {
+ if (n.getInputs() == null) return;
+ for (String input : n.getInputs())
+ {
+ List<Entry> outputs = outputMap.get(input);
+ if (outputs == null) continue;
+ for (Entry deployer : outputs)
+ {
+ if (deployer == n) continue;
+ if (deployer.getIndex() >= n.getIndex()) n.setIndex(deployer.getIndex() + 1);
+ }
+ }
+ insertAt(n);
+ }
+
+ void insertAt(Entry n)
+ {
+ entries.add(n.getIndex(), n);
+ for (int i = n.getIndex() + 1; i < entries.size(); i++)
+ {
+ entries.get(i).setIndex(i);
+ }
+ }
+
+ void removeAt(int index)
+ {
+ entries.remove(index);
+ for (int i = index; i < entries.size(); i++)
+ {
+ entries.get(i).setIndex(i);
+ }
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ System.out.println("A".compareTo("G"));
+ }
+
+ public void relativeOrdering()
+ {
+ for (int i = 0; i < entries.size() - 1; i++)
+ {
+ Entry d1 = entries.get(i);
+ Entry d2 = entries.get(i + 1);
+ if (d1.getRelativeOrder() == d2.getRelativeOrder())
+ {
+ //if (true) continue;
+
+ // this is with added order
+ /*
+ if (d1.getAddedOrder() < d2.getAddedOrder())
+ {
+ continue;
+ }
+ */
+ if (d1.deployer.toString().compareTo(d2.deployer.toString()) < 0) continue;
+
+ /*
+ if (d1.getInputs().size() == 0 && d2.getInputs().size() > 0)
+ {
+ continue;
+ }
+ */
+
+ if (isIOEqual(d1, d2))
+ {
+ swap(i, d1, d2);
+ continue;
+ }
+ }
+ boolean isEqual = isIOEqual(d1, d2);
+ if (isEqual)
+ {
+ if (d2.getRelativeOrder() < d1.getRelativeOrder())
+ {
+ swap(i, d1, d2);
+ }
+ }
+ }
+ }
+
+ private void swap(int i, Entry d1, Entry d2)
+ {
+ entries.set(i + 1, d1);
+ d1.setIndex(i + 1);
+ entries.set(i, d2);
+ d2.setIndex(i);
+ }
+
+ private boolean isIOEqual(Entry d1, Entry d2)
+ {
+ boolean isEqual = true;
+ if (d1.getOutputs() == null) return true;
+ for (String output : d1.getOutputs())
+ {
+ List<Entry> inputs = inputMap.get(output);
+ if (inputs == null) continue;
+ if (inputs.contains(d2))
+ {
+ if (d1.getInputs().contains(output) && d2.getOutputs().contains(output))
+ {
+ continue;
+ }
+ isEqual = false;
+ break;
+ }
+ }
+ return isEqual;
+ }
+}
Added: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java (rev 0)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java 2009-12-21 17:37:17 UTC (rev 98092)
@@ -0,0 +1,39 @@
+package org.jboss.deployers.plugins.sort;
+
+import org.jboss.deployers.spi.deployer.Deployer;
+
+import java.util.List;
+
+/**
+ * Sorted deployers spi.
+ *
+ * @author <a href="mailto:bill at burkecentral.com">Bill Burke</a>
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ * @version $Revision: 1 $
+ */
+public interface StagedSortedDeployers
+{
+ /**
+ * Add new deployer.
+ *
+ * @param stageName the stage name
+ * @param deployer the deployer
+ */
+ void addDeployer(String stageName, Deployer deployer);
+
+ /**
+ * The deployer list for stage.
+ *
+ * @param stageName the stage name
+ * @return matching deployer per stage
+ */
+ List<Deployer> getDeployerList(String stageName);
+
+ /**
+ * Remove deployer.
+ *
+ * @param stageName the stage name
+ * @param deployer the deployer
+ */
+ void removeDeployer(String stageName, Deployer deployer);
+}
More information about the jboss-cvs-commits
mailing list