[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