[jboss-cvs] JBossAS SVN: r98959 - in projects/jboss-deployers/branches/vfs3: deployers-client/src/test/java/org/jboss/test/deployers/deploymentfactory and 29 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Dec 31 15:34:00 EST 2009


Author: johnbailey
Date: 2009-12-31 15:33:58 -0500 (Thu, 31 Dec 2009)
New Revision: 98959

Added:
   projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataEntry.java
   projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataType.java
   projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/MetaDataEntryImpl.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/KahnDeployerSorter.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractDeployerFlowUnitTest.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractSorterOrderingUnitTest.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DominoOrderingUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/IndexingOrderingUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/KahnOrderingUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/empty.txt
Removed:
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/empty.txt
Modified:
   projects/jboss-deployers/branches/vfs3/deployers-client-spi/src/main/java/org/jboss/deployers/client/spi/DeploymentFactory.java
   projects/jboss-deployers/branches/vfs3/deployers-client/src/test/java/org/jboss/test/deployers/deploymentfactory/AbstractDeploymentFactoryTest.java
   projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/ContextInfo.java
   projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/StructureMetaDataFactory.java
   projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/ContextInfoImpl.java
   projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/DefaultStructureMetaDataFactory.java
   projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/AbstractContextInfoTest.java
   projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/ContextInfoImplUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/StructureMetaDataFactoryContextInfoUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DeployerSorterFactory.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DominoOrdering.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/DeployersDeployerTestSuite.java
   projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DeployerFlowUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-spi/src/main/java/org/jboss/deployers/spi/deployer/helpers/AbstractDeployer.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/VFSDeploymentContext.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/helpers/AbstractStructureDeployer.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/modified/MetaDataStructureModificationChecker.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/AbstractVFSDeploymentContext.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructuralDeployersImpl.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructureBuilder.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/dir/DirectoryStructure.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/explicit/StructureMetaDataObjectFactory.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/FileModificationTypeMatcher.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/ModificationActions.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/war/WARStructure.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BaseDeployersVFSTest.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BootstrapDeployersTest.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/DeployersVFSTestSuite.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/annotations/test/ScanningMetaDataTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/deployer/validate/test/ObjectMFDTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/metadata/test/MetaDataUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/ear/support/MockEarStructureDeployer.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/explicit/test/DeclaredStructureUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structurebuilder/test/VFSStructureBuilderUnitTestCase.java
   projects/jboss-deployers/branches/vfs3/pom.xml
Log:
[JBAS-7362] - Merged changes from trunk to VFS3 integration branch.

Modified: projects/jboss-deployers/branches/vfs3/deployers-client/src/test/java/org/jboss/test/deployers/deploymentfactory/AbstractDeploymentFactoryTest.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-client/src/test/java/org/jboss/test/deployers/deploymentfactory/AbstractDeploymentFactoryTest.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-client/src/test/java/org/jboss/test/deployers/deploymentfactory/AbstractDeploymentFactoryTest.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -31,6 +31,8 @@
 import org.jboss.deployers.spi.attachments.PredeterminedManagedObjectAttachments;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.test.BaseTestCase;
 
@@ -72,10 +74,11 @@
       assertTrue(contextInfo.getMetaDataPath().isEmpty());
    }
 
-   protected static void assertDefaultMetaDataPath(List<String> metaDataPath)
+   protected static void assertDefaultMetaDataPath(List<MetaDataEntry> metaDataPath)
    {
       assertEquals(1, metaDataPath.size());
-      assertEquals("metaDataPath", metaDataPath.get(0));
+      assertEquals("metaDataPath", metaDataPath.get(0).getPath());
+      assertEquals(MetaDataType.DEFAULT, metaDataPath.get(0).getType());
    }
 
    protected static void assertDefaultClassPath(List<ClassPathEntry> classPath)

Modified: projects/jboss-deployers/branches/vfs3/deployers-client-spi/src/main/java/org/jboss/deployers/client/spi/DeploymentFactory.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-client-spi/src/main/java/org/jboss/deployers/client/spi/DeploymentFactory.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-client-spi/src/main/java/org/jboss/deployers/client/spi/DeploymentFactory.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,6 +21,7 @@
  */
 package org.jboss.deployers.client.spi;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +32,8 @@
 import org.jboss.deployers.spi.attachments.PredeterminedManagedObjectAttachments;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 
@@ -88,7 +91,8 @@
    public ContextInfo addContext(PredeterminedManagedObjectAttachments context, String path, String metaDataPath, List<ClassPathEntry> classPath)
    {
       StructureMetaData structure = assureStructure(context);
-      ContextInfo result = StructureMetaDataFactory.createContextInfo(path, metaDataPath, classPath);
+      MetaDataEntry entry = createMetaDataPathEntry(metaDataPath);
+      ContextInfo result = StructureMetaDataFactory.createContextInfo(path, entry, classPath);
       structure.addContext(result);
       return result;
    }
@@ -106,12 +110,54 @@
    public ContextInfo addContext(PredeterminedManagedObjectAttachments context, String path, List<String> metaDataPath, List<ClassPathEntry> classPath)
    {
       StructureMetaData structure = assureStructure(context);
-      ContextInfo result = StructureMetaDataFactory.createContextInfo(path, metaDataPath, classPath);
+      ContextInfo result = StructureMetaDataFactory.createContextInfo(path, createMetaDataEntries(metaDataPath), classPath);
       structure.addContext(result);
       return result;
    }
 
    /**
+    * Create a new metadata path entry.
+    *
+    * @param path the path
+    * @return the metadata path entry
+    * @throws IllegalArgumentException for a null path
+    */
+   public static MetaDataEntry createMetaDataPathEntry(String path)
+   {
+      return StructureMetaDataFactory.createMetaDataEntry(path);
+   }
+
+   /**
+    * Create a new metadata path entry.
+    *
+    * @param path the path
+    * @param type the type
+    * @return the metadata path entry
+    * @throws IllegalArgumentException for a null path
+    */
+   public static MetaDataEntry createMetaDataPathEntry(String path, MetaDataType type)
+   {
+      return StructureMetaDataFactory.createMetaDataEntry(path, type);
+   }
+
+   /**
+    * Create metadata path entries.
+    *
+    * @param metaDataPath the metadata path entries
+    * @return the entries
+    */
+   public static List<MetaDataEntry> createMetaDataEntries(List<String> metaDataPath)
+   {
+      if (metaDataPath == null)
+         throw new IllegalArgumentException("Null metadata path");
+
+      List<MetaDataEntry> entries = new ArrayList<MetaDataEntry>(metaDataPath.size());
+      for (String path : metaDataPath)
+         entries.add(createMetaDataPathEntry(path));
+      return entries;
+   }
+
+   /**
     * Create a new classpath entry
     * 
     * @param path the path

Modified: projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/ContextInfoImpl.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/ContextInfoImpl.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/ContextInfoImpl.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -32,6 +32,7 @@
 import org.jboss.deployers.spi.attachments.helpers.PredeterminedManagedObjectAttachmentsImpl;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.spi.structure.ModificationType;
 
 /**
@@ -52,8 +53,8 @@
    private String path;
    
    /** The metadata path */
-   private List<String> metaDataPath;
-   
+   private List<MetaDataEntry> metaDataPath;
+
    /** The class path entries */
    private List<ClassPathEntry> classPath = ClassPathEntryImpl.DEFAULT;
 
@@ -105,7 +106,7 @@
     * @param classPath the class path
     * @throws IllegalArgumentException for a null path or metadata path
     */
-   public ContextInfoImpl(String path, String metaDataPath, List<ClassPathEntry> classPath)
+   public ContextInfoImpl(String path, MetaDataEntry metaDataPath, List<ClassPathEntry> classPath)
    {
       setPath(path);
       if (metaDataPath == null)
@@ -122,7 +123,7 @@
     * @param classPath the class path
     * @throws IllegalArgumentException for a null path or metadata path
     */
-   public ContextInfoImpl(String path, List<String> metaDataPath, List<ClassPathEntry> classPath)
+   public ContextInfoImpl(String path, List<MetaDataEntry> metaDataPath, List<ClassPathEntry> classPath)
    {
       setPath(path);
       setMetaDataPath(metaDataPath);
@@ -147,7 +148,7 @@
       this.path = path;
    }
 
-   public List<String> getMetaDataPath()
+   public List<MetaDataEntry> getMetaDataPath()
    {
       if (metaDataPath == null)
          return Collections.emptyList();
@@ -159,27 +160,27 @@
     *
     * @param metaDataPath the meta data paths
     */
-   public void setMetaDataPath(List<String> metaDataPath)
+   public void setMetaDataPath(List<MetaDataEntry> metaDataPath)
    {
       this.metaDataPath = metaDataPath;
    }
 
-   public void addMetaDataPath(String path)
+   public void addMetaDataPath(MetaDataEntry entry)
    {
-      if (path == null)
+      if (entry == null)
          throw new IllegalArgumentException("Null path");
 
       if (metaDataPath == null)
-         metaDataPath = Collections.singletonList(path);
+         metaDataPath = Collections.singletonList(entry);
       else if (metaDataPath.size() == 1)
       {
-         List<String> paths = new ArrayList<String>();
+         List<MetaDataEntry> paths = new ArrayList<MetaDataEntry>();
          paths.addAll(metaDataPath);
-         paths.add(path);
+         paths.add(entry);
          metaDataPath = paths;
       }
       else
-         metaDataPath.add(path);
+         metaDataPath.add(entry);
    }
 
    public List<ClassPathEntry> getClassPath()
@@ -282,12 +283,10 @@
       ContextInfo other = (ContextInfo) obj;
       if (getPath().equals(other.getPath()) == false)
          return false;
-
-      List<String> thisMetaDataPath = getMetaDataPath();
-      List<String> otherMetaDataPath = other.getMetaDataPath();
+      List<MetaDataEntry> thisMetaDataPath = getMetaDataPath();
+      List<MetaDataEntry> otherMetaDataPath = other.getMetaDataPath();
       if (thisMetaDataPath.equals(otherMetaDataPath) == false)
          return false;
-
       List<ClassPathEntry> thisClassPath = getClassPath();
       List<ClassPathEntry> otherClassPath = other.getClassPath();
       if (thisClassPath == null)
@@ -308,7 +307,7 @@
       setPath(in.readUTF());
       boolean isEmptyMetaDataPath = in.readBoolean();
       if (isEmptyMetaDataPath == false)
-         setMetaDataPath((List<String>)in.readObject());
+         setMetaDataPath((List<MetaDataEntry>)in.readObject());
       setClassPath((List) in.readObject());
       setRelativeOrder(in.readInt());
       boolean isNullComparator = in.readBoolean();
@@ -327,7 +326,7 @@
    {
       super.writeExternal(out);
       out.writeUTF(getPath());
-      List<String> metaDataPath = getMetaDataPath();
+      List<MetaDataEntry> metaDataPath = getMetaDataPath();
       boolean isEmptyMetaDataPath = metaDataPath.isEmpty();
       out.writeBoolean(isEmptyMetaDataPath);
       if (isEmptyMetaDataPath == false)

Modified: projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/DefaultStructureMetaDataFactory.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/DefaultStructureMetaDataFactory.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/DefaultStructureMetaDataFactory.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -25,6 +25,8 @@
 
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 
@@ -32,6 +34,7 @@
  * DefaultStructureMetaDataFactory.
  * 
  * @author <a href="adrian at jboss.org">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision: 1.1 $
  */
 public class DefaultStructureMetaDataFactory extends StructureMetaDataFactory
@@ -51,16 +54,26 @@
       return new ContextInfoImpl(path, classPath);
    }
 
-   protected ContextInfo newContextInfo(String path, String metaDataPath, List<ClassPathEntry> classPath)
+   protected ContextInfo newContextInfo(String path, MetaDataEntry metaDataPath, List<ClassPathEntry> classPath)
    {
       return new ContextInfoImpl(path, metaDataPath, classPath);
    }
    
-   protected ContextInfo newContextInfo(String path, List<String> metaDataPath, List<ClassPathEntry> classPath)
+   protected ContextInfo newContextInfo(String path, List<MetaDataEntry> metaDataPath, List<ClassPathEntry> classPath)
    {
       return new ContextInfoImpl(path, metaDataPath, classPath);
    }
 
+   protected MetaDataEntry newMetaDataPathEntry(String metaDataPath)
+   {
+      return newMetaDataPathEntry(metaDataPath, MetaDataType.DEFAULT);
+   }
+
+   protected MetaDataEntry newMetaDataPathEntry(String metaDataPath, MetaDataType type)
+   {
+      return new MetaDataEntryImpl(metaDataPath, type);
+   }
+
    protected ClassPathEntry newClassPathEntry(String path, String suffixes)
    {
       return new ClassPathEntryImpl(path, suffixes);

Copied: projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/MetaDataEntryImpl.java (from rev 98958, projects/jboss-deployers/trunk/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/MetaDataEntryImpl.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/MetaDataEntryImpl.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-core/src/main/java/org/jboss/deployers/plugins/structure/MetaDataEntryImpl.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.deployers.plugins.structure;
+
+import java.io.Serializable;
+
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
+
+/**
+ * MetaDataEntryImpl
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public class MetaDataEntryImpl implements MetaDataEntry, Serializable
+{
+   private static long serialVersionUID = 1l;
+   private String path;
+   private MetaDataType type;
+
+   public MetaDataEntryImpl(String path)
+   {
+      this(path, MetaDataType.DEFAULT);
+   }
+
+   public MetaDataEntryImpl(String path, MetaDataType type)
+   {
+      if (path == null)
+         throw new IllegalArgumentException("Null path");
+      if (type == null)
+         throw new IllegalArgumentException("Null type");
+      this.path = path;
+      this.type = type;
+   }
+
+   public String getPath()
+   {
+      return path;
+   }
+
+   public MetaDataType getType()
+   {
+      return type;
+   }
+
+   @Override
+   public int hashCode()
+   {
+      return path.hashCode();
+   }
+
+   @Override
+   public boolean equals(Object obj)
+   {
+      if (obj instanceof MetaDataEntry == false)
+         return false;
+
+      MetaDataEntry other = (MetaDataEntry)obj;
+      if (path.equals(other.getPath()) == false)
+         return false;
+
+      return type == other.getType(); 
+   }
+
+   @Override
+   public String toString()
+   {
+      return path + " - " + type;
+   }
+}
\ No newline at end of file

Modified: projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/AbstractContextInfoTest.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/AbstractContextInfoTest.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/AbstractContextInfoTest.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -25,6 +25,9 @@
 
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
+import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 
 /**
  * AbstractContextInfoTest.
@@ -107,12 +110,30 @@
 
    protected abstract ContextInfo createPathAndMetaDataAndClassPath(String path, List<String> metaDataPath, List<ClassPathEntry> classPath);
 
-   protected static void assertDefaultMetaDataPath(List<String> metaDataPath)
+   protected void addMetaDataPath(ContextInfo context, String path)
    {
+      MetaDataEntry entry = StructureMetaDataFactory.createMetaDataEntry(path);
+      context.addMetaDataPath(entry);
+   }
+
+   protected static void assertDefaultMetaDataPath(List<MetaDataEntry> metaDataPath)
+   {
       assertEquals(1, metaDataPath.size());
-      assertEquals("metaDataPath", metaDataPath.get(0));
+      assertEquals("metaDataPath", metaDataPath.get(0).getPath());
+      assertEquals(MetaDataType.DEFAULT, metaDataPath.get(0).getType());
    }
 
+   protected static void assertMetaDataPaths(List<String> expected, List<MetaDataEntry> entries)
+   {
+      assertEquals(expected.size(), entries.size());
+      int i = 0;
+      for (String path : expected)
+      {
+         assertEquals(path, entries.get(i).getPath());
+         i++;
+      }
+   }
+
    public void testConstructorPathAndMetaDataAndClassPath()
    {
       List<ClassPathEntry> classPath = createClassPath("ClassPath");

Modified: projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/ContextInfoImplUnitTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/ContextInfoImplUnitTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/ContextInfoImplUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,17 +21,20 @@
 */
 package org.jboss.test.deployers.structure.test;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
-import java.util.Arrays;
-import java.util.ArrayList;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+
 import org.jboss.deployers.plugins.attachments.AttachmentsImpl;
 import org.jboss.deployers.plugins.structure.ClassPathEntryImpl;
 import org.jboss.deployers.plugins.structure.ContextInfoImpl;
+import org.jboss.deployers.plugins.structure.MetaDataEntryImpl;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.test.deployers.structure.AbstractContextInfoTest;
 
 /**
@@ -70,16 +73,19 @@
       return new ContextInfoImpl(path, classPath);
    }
    
-   @Override
    protected ContextInfo createPathAndMetaDataAndClassPath(String path, String metaDataPath, List<ClassPathEntry> classPath)
    {
-      return new ContextInfoImpl(path, metaDataPath, classPath);
+      MetaDataEntry entry = new MetaDataEntryImpl(metaDataPath);
+      return new ContextInfoImpl(path, entry, classPath);
    }
 
    @Override
    protected ContextInfo createPathAndMetaDataAndClassPath(String path, List<String> metaDataPath, List<ClassPathEntry> classPath)
    {
-      return new ContextInfoImpl(path, metaDataPath, classPath);
+      List<MetaDataEntry> entries = new ArrayList<MetaDataEntry>();
+      for (String mdp : metaDataPath)
+         entries.add(new MetaDataEntryImpl(mdp));
+      return new ContextInfoImpl(path, entries, classPath);
    }
 
    @Override
@@ -126,12 +132,12 @@
       assertEquals("", context.getPath());
       assertDefaultNonPath(context);
       
-      context.addMetaDataPath("metaDataPath");
+      addMetaDataPath(context, "metaDataPath");
       assertDefaultMetaDataPath(context.getMetaDataPath());
       assertDefaultClassPath(context.getClassPath());
 
-      context.addMetaDataPath("added");
-      assertEquals(Arrays.asList("metaDataPath", "added"), context.getMetaDataPath());
+      addMetaDataPath(context, "added");
+      assertMetaDataPaths(Arrays.asList("metaDataPath", "added"), context.getMetaDataPath());
       assertDefaultClassPath(context.getClassPath());
    }
    
@@ -144,8 +150,8 @@
       assertDefaultMetaDataPath(context.getMetaDataPath());
       assertDefaultClassPath(context.getClassPath());
 
-      context.addMetaDataPath("added");
-      assertEquals(Arrays.asList("metaDataPath", "added"), context.getMetaDataPath());
+      addMetaDataPath(context, "added");
+      assertMetaDataPaths(Arrays.asList("metaDataPath", "added"), context.getMetaDataPath());
       assertDefaultClassPath(context.getClassPath());
    }
 

Modified: projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/StructureMetaDataFactoryContextInfoUnitTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/StructureMetaDataFactoryContextInfoUnitTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core/src/test/java/org/jboss/test/deployers/structure/test/StructureMetaDataFactoryContextInfoUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,12 +21,15 @@
 */
 package org.jboss.test.deployers.structure.test;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 import org.jboss.test.deployers.structure.AbstractContextInfoTest;
 
@@ -69,13 +72,16 @@
    @Override
    protected ContextInfo createPathAndMetaDataAndClassPath(String path, String metaDataPath, List<ClassPathEntry> classPath)
    {
-      return StructureMetaDataFactory.createContextInfo(path, metaDataPath, classPath);
+      return StructureMetaDataFactory.createContextInfo(path, StructureMetaDataFactory.createMetaDataEntry(metaDataPath), classPath);
    }
 
    @Override
    protected ContextInfo createPathAndMetaDataAndClassPath(String path, List<String> metaDataPath, List<ClassPathEntry> classPath)
    {
-      return StructureMetaDataFactory.createContextInfo(path, metaDataPath, classPath);
+      List<MetaDataEntry> entries = new ArrayList<MetaDataEntry>();
+      for (String mdp : metaDataPath)
+         entries.add(StructureMetaDataFactory.createMetaDataEntry(mdp));
+      return StructureMetaDataFactory.createContextInfo(path, entries, classPath);
    }
 
    @Override

Modified: projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/ContextInfo.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/ContextInfo.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/ContextInfo.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -49,17 +49,17 @@
    /**
     * Get the logical path of the metdata location.
     * 
-    * @return the path of the metdata location.
+    * @return the paths of the metdata location.
     */
-   List<String> getMetaDataPath();
+   List<MetaDataEntry> getMetaDataPath();
 
    /**
     * Add the metaDataPath.
     *
-    * @param path the metaDataPath.
-    * @throws IllegalArgumentException for a null path
+    * @param entry the metaDataPath entry.
+    * @throws IllegalArgumentException for a null entry
     */
-   void addMetaDataPath(String path);
+   void addMetaDataPath(MetaDataEntry entry);
 
    /**
     * Get the classpath locations within the context

Copied: projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataEntry.java (from rev 98958, projects/jboss-deployers/trunk/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataEntry.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataEntry.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataEntry.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.deployers.spi.structure;
+
+import java.io.Serializable;
+
+/**
+ * A metadata entry.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public interface MetaDataEntry extends Serializable
+{
+   /**
+    * Get the path relative to the context virtual file
+    *
+    * @return the path.
+    */
+   String getPath();
+
+   /**
+    * Get metadata type.
+    *
+    * e.g. some deployments have alternative metadata locations;
+    * JEE .war deployments -- WEB-INF/lib/somelib.jar/META-INF/ejb-jar.xml
+    *
+    * @return the metadata type
+    */
+   MetaDataType getType();
+}
\ No newline at end of file

Copied: projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataType.java (from rev 98958, projects/jboss-deployers/trunk/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataType.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataType.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/MetaDataType.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.deployers.spi.structure;
+
+/**
+ * A metadata type.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public enum MetaDataType
+{
+   DEFAULT,
+   ALTERNATIVE;
+
+   /**
+    * Get type.
+    *
+    * We accept "alternative" or "alt",
+    * anything else matches default.
+    *
+    * @param string the type string
+    * @return metadata type
+    */
+   public static final MetaDataType getMetaDataType(String string)
+   {
+      if (ALTERNATIVE.name().equalsIgnoreCase(string) || "alt".equalsIgnoreCase(string))
+         return ALTERNATIVE;
+      else
+         return DEFAULT;
+   }
+}
\ No newline at end of file

Modified: projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/StructureMetaDataFactory.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/StructureMetaDataFactory.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-core-spi/src/main/java/org/jboss/deployers/spi/structure/StructureMetaDataFactory.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -86,7 +86,7 @@
     * @return the context info
     * @throws IllegalArgumentException for a null path or metadata path
     */
-   public static ContextInfo createContextInfo(String path, String metaDataPath, List<ClassPathEntry> classPath)
+   public static ContextInfo createContextInfo(String path, MetaDataEntry metaDataPath, List<ClassPathEntry> classPath)
    {
       return StructureMetaDataBuilder.getInstance().newContextInfo(path, metaDataPath, classPath);
    }
@@ -100,12 +100,35 @@
     * @return the context info
     * @throws IllegalArgumentException for a null path or metadata path
     */
-   public static ContextInfo createContextInfo(String path, List<String> metaDataPath, List<ClassPathEntry> classPath)
+   public static ContextInfo createContextInfo(String path, List<MetaDataEntry> metaDataPath, List<ClassPathEntry> classPath)
    {
       return StructureMetaDataBuilder.getInstance().newContextInfo(path, metaDataPath, classPath);
    }
 
    /**
+    * Create a new MetaData entry.
+    *
+    * @param metaDataPath the metadata path
+    * @return new metadata path entry
+    */
+   public static MetaDataEntry createMetaDataEntry(String metaDataPath)
+   {
+      return StructureMetaDataBuilder.getInstance().newMetaDataPathEntry(metaDataPath);
+   }
+
+   /**
+    * Create a new MetaData entry.
+    *
+    * @param metaDataPath the metadata path
+    * @param type the type
+    * @return new metadata path entry
+    */
+   public static MetaDataEntry createMetaDataEntry(String metaDataPath, MetaDataType type)
+   {
+      return StructureMetaDataBuilder.getInstance().newMetaDataPathEntry(metaDataPath, type);
+   }
+
+   /**
     * Create a new classpath entry
     * 
     * @return the classpath entry
@@ -175,7 +198,7 @@
     * @return the context info
     * @throws IllegalArgumentException for a null path or metadata path
     */
-   protected abstract ContextInfo newContextInfo(String path, String metaDataPath, List<ClassPathEntry> classPath);
+   protected abstract ContextInfo newContextInfo(String path, MetaDataEntry metaDataPath, List<ClassPathEntry> classPath);
    
    /**
     * Create a new ContextInfo.
@@ -186,9 +209,28 @@
     * @return the context info
     * @throws IllegalArgumentException for a null path or metadata path
     */
-   protected abstract ContextInfo newContextInfo(String path, List<String> metaDataPath, List<ClassPathEntry> classPath);
+   protected abstract ContextInfo newContextInfo(String path, List<MetaDataEntry> metaDataPath, List<ClassPathEntry> classPath);
 
    /**
+    * Create new metadata path entry.
+    *
+    * @param metaDataPath the metadata path
+    * @return new metadata path entry
+    * @throws IllegalArgumentException for a null path or metadata path
+    */
+   protected abstract MetaDataEntry newMetaDataPathEntry(String metaDataPath);
+
+   /**
+    * Create new metadata path entry.
+    *
+    * @param metaDataPath the metadata path
+    * @param type the metadata path type
+    * @return new metadata path entry
+    * @throws IllegalArgumentException for a null path or metadata path
+    */
+   protected abstract MetaDataEntry newMetaDataPathEntry(String metaDataPath, MetaDataType type);
+
+   /**
     * Create a new classpath entry
     * 
     * @param path the path

Modified: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/deployers/DeployersImpl.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -33,6 +33,7 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
+
 import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
@@ -50,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.NewStagedSortedDeployers;
+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;
@@ -77,8 +78,7 @@
  * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision$
  */
-public class DeployersImpl implements Deployers, ControllerContextActions,
-   DeployersImplMBean, MBeanRegistration
+public class DeployersImpl implements Deployers, ControllerContextActions, DeployersImplMBean, MBeanRegistration
 {
    /**
     * The log
@@ -90,23 +90,31 @@
     */
    private AtomicBoolean shutdown = new AtomicBoolean(false);
 
-   /** Whether to record statistics */
+   /**
+    * Whether to record statistics
+    */
    private boolean collectStats = false;
-   
-   /** The deployment time stats */
+
+   /**
+    * The deployment time stats
+    */
    private DeployerStatistics deploymentTimes;
-   
+
    /**
     * The dependency state machine
     */
    private Controller controller;
 
-   /** The mbean server */
+   /**
+    * The mbean server
+    */
    private MBeanServer server;
-   
-   /** Whether to register deployments as mbeans */
+
+   /**
+    * Whether to register deployments as mbeans
+    */
    private boolean registerMBeans = true;
-   
+
    /**
     * The repository
     */
@@ -125,20 +133,29 @@
    /**
     * The deployers by stage and type
     */
-   private Map<String, List<Deployer>> deployersByStage = new HashMap<String, List<Deployer>>();
+   private StagedSortedDeployers deployersByStage = new NewStagedSortedDeployers();
 
    /**
     * The scope builder
     */
    private ScopeBuilder scopeBuilder;
 
-   /** The ManagedDeploymentCreator plugin */
+   /**
+    * The ManagedDeploymentCreator plugin
+    */
    private ManagedObjectCreator mgtObjectCreator = null;
 
-   /** The exception handlers */
+   /**
+    * The exception handlers
+    */
    private final Set<ExceptionNotificationListener<? extends Throwable>> exceptionNotificationListeners = CollectionsFactory.createLazySet();
 
    /**
+    * Tracing addDeployer is *REALLY* inefficient.  Turn it on with this flag
+    */
+   private boolean traceAddDeployer;
+
+   /**
     * Create a new DeployersImpl.
     *
     * @param controller the controller
@@ -178,6 +195,9 @@
       // Create the deployers
       if (deployers != null)
          setDeployers(deployers);
+
+      // Deployer addition logging
+      setTraceAddDeployer(log.isTraceEnabled());
    }
 
    public void shutdown()
@@ -186,6 +206,26 @@
    }
 
    /**
+    * Should we trace deployer addition.
+    *
+    * @return true if we trace deployer addition
+    */
+   public boolean isTraceAddDeployer()
+   {
+      return traceAddDeployer;
+   }
+
+   /**
+    * Set the deployer addition tracing flag.
+    *
+    * @param traceAddDeployer the deployer addition tracing flag
+    */
+   public void setTraceAddDeployer(boolean traceAddDeployer)
+   {
+      this.traceAddDeployer = traceAddDeployer;
+   }
+
+   /**
     * Check whether we are shutdown
     */
    protected void checkShutdown()
@@ -196,7 +236,7 @@
 
    /**
     * Get the collectStats.
-    * 
+    *
     * @return the collectStats.
     */
    public boolean isCollectStats()
@@ -206,7 +246,7 @@
 
    /**
     * Set the collectStats.
-    * 
+    *
     * @param collectStats the collectStats.
     */
    public void setCollectStats(boolean collectStats)
@@ -215,6 +255,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.
@@ -271,24 +321,23 @@
          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();
-      builder.append("Added deployer ").append(deployer).append(" for stage ").append(stageName).append('\n');
-      for (Deployer temp : getDeployersList(stageName))
+      if (isTraceAddDeployer())
       {
-         builder.append(temp);
-         builder.append("{inputs=").append(temp.getInputs());
-         builder.append(" outputs=").append(temp.getOutputs());
-         builder.append("}\n");
+         // This string creation takes an extreme amount of time.  So dont' use it unless there are problems.
+         StringBuilder builder = new StringBuilder();
+         builder.append("Added deployer ").append(deployer).append(" for stage ").append(stageName).append('\n');
+         for (Deployer temp : getDeployersList(stageName))
+         {
+            builder.append(temp);
+            builder.append("{inputs=").append(temp.getInputs());
+            builder.append(" outputs=").append(temp.getOutputs());
+            builder.append("}\n");
+         }
+         log.trace(builder);
       }
-      log.debug(builder);
    }
 
    /**
@@ -301,7 +350,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)
@@ -311,14 +361,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);
    }
 
@@ -457,10 +500,11 @@
    {
       return mgtObjectCreator;
    }
+
    public void setMgtObjectCreator(ManagedObjectCreator mgtObjectCreator)
    {
       this.mgtObjectCreator = mgtObjectCreator;
-      log.debug("setMgtObjectCreator, "+mgtObjectCreator);
+      log.debug("setMgtObjectCreator, " + mgtObjectCreator);
    }
 
    /**
@@ -485,7 +529,7 @@
 
    /**
     * Get whether to register mbeans
-    * 
+    *
     * @return true to register mbeans
     */
    public boolean isRegisterMBeans()
@@ -495,7 +539,7 @@
 
    /**
     * Set whether to register mbeans
-    * 
+    *
     * @param registerMBeans true to register mbeans
     */
    public void setRegisterMBeans(boolean registerMBeans)
@@ -508,7 +552,7 @@
       // Bootstrap the repository
       if (repository == null && controller instanceof KernelController)
       {
-         KernelController kernelController = (KernelController)controller;
+         KernelController kernelController = (KernelController) controller;
          repository = kernelController.getKernel().getMetaDataRepository().getMetaDataRepository();
       }
    }
@@ -528,12 +572,12 @@
       {
          outputs.addAll(deployer.getOutputs());
          // If the deployer supports ManagedObjectCreator let is augment/modify the managed objects
-         if(deployer.getManagedObjectCreator() != null)
+         if (deployer.getManagedObjectCreator() != null)
             mocs.add(deployer);
       }
-      // 
+      
       mgtObjectCreator.build(unit, outputs, managedObjects);
-      for(ManagedObjectCreator moc : mocs)
+      for (ManagedObjectCreator moc : mocs)
       {
          moc.build(unit, outputs, managedObjects);
       }
@@ -588,7 +632,7 @@
          return "No statistics available";
       return deploymentTimes.listTimes(details);
    }
-   
+
    public String listDeployers(String stageName)
    {
       StringBuilder result = new StringBuilder();
@@ -610,7 +654,7 @@
    {
       if (attachment == null || attachment.trim().length() == 0)
          return "No attachment specified";
-      
+
       StringBuilder result = new StringBuilder();
       result.append("<table><tr><th>Stage/Deployer</th><th>top</th><th>component</th><th>parent last</th><th>input<th>output</th></tr>");
       for (String stage : stages.keySet())
@@ -621,17 +665,17 @@
 
    /**
     * List the deployers for a stage
-    * 
-    * @param stageName the stage
+    *
+    * @param stageName  the stage
     * @param attachment the attachment
-    * @param builder the builder
+    * @param builder    the builder
     */
    protected void internalListDeployers(String stageName, String attachment, StringBuilder builder)
    {
       List<Deployer> deployers = getDeployersList(stageName);
       if (deployers.isEmpty())
          return;
-      
+
       builder.append("<tr>").append("<td>").append(stageName).append("</td>").append("</tr>");
       for (Deployer deployer : deployers)
       {
@@ -650,7 +694,7 @@
             if (attachment == null || attachment.equals(output))
                outputs.add(output);
          }
-         if (attachment != null && inputs.isEmpty() &&  outputs.isEmpty())
+         if (attachment != null && inputs.isEmpty() && outputs.isEmpty())
             continue;
          while (row < 1 || row < outputs.size() || row < outputs.size())
          {
@@ -679,7 +723,7 @@
          }
       }
    }
-   
+
    public DeploymentStage getDeploymentStage(DeploymentContext context) throws DeploymentException
    {
       DeploymentControllerContext deploymentControllerContext = context.getTransientAttachments().getAttachment(ControllerContext.class.getName(), DeploymentControllerContext.class);
@@ -943,7 +987,7 @@
     * Notify.
     *
     * @param exception the exception to notify
-    * @param context the context that has this exception as its problem
+    * @param context   the context that has this exception as its problem
     */
    @SuppressWarnings("unchecked")
    protected void notify(Throwable exception, ControllerContext context)
@@ -1021,10 +1065,10 @@
     * @param states                      controller states
     */
    protected final void checkControllerContext(
-         ControllerContext context,
-         Map<String, Throwable> contextsInError,
-         Map<String, Set<MissingDependency>> contextsMissingDependencies,
-         ControllerStateModel states)
+           ControllerContext context,
+           Map<String, Throwable> contextsInError,
+           Map<String, Set<MissingDependency>> contextsMissingDependencies,
+           ControllerStateModel states)
    {
       if (context.getState().equals(ControllerState.ERROR))
       {
@@ -1077,19 +1121,19 @@
                   ControllerState requiredState = item.getDependentState();
                   if (requiredState == null)
                      requiredState = (other != null) ? other.getRequiredState() : ControllerState.INSTALLED;
-                  
+
                   if (actualState == null || states.isBeforeState(actualState, requiredState))
                   {
                      String requiredStateString = requiredState.getStateString();
                      MissingDependency missing = isAsynchInProgress ?
-                           new MissingAsynchronousDependency(name, dependency, requiredStateString, actualStateString) :
-                           new MissingDependency(name, dependency, requiredStateString, actualStateString);
+                             new MissingAsynchronousDependency(name, dependency, requiredStateString, actualStateString) :
+                             new MissingDependency(name, dependency, requiredStateString, actualStateString);
                      dependencies.add(missing);
                   }
                }
             }
          }
-         
+
          if (dependencies.isEmpty() == false)
             contextsMissingDependencies.put(name, dependencies);
       }
@@ -1108,7 +1152,7 @@
    /**
     * Check if deployments are complete.
     *
-    * @param contexts the deployment contexts
+    * @param contexts      the deployment contexts
     * @param checkContexts do we check contexts
     * @throws DeploymentException throw error if deployment is incomplete
     */
@@ -1169,7 +1213,7 @@
       }
       return false;
    }
-   
+
    /**
     * Is context deployed.
     *
@@ -1191,11 +1235,11 @@
     * @param states                      controller states
     */
    protected final void checkComplete(
-         DeploymentContext context,
-         Map<String, Throwable> contextsInError,
-         Map<String, Set<MissingDependency>> contextsMissingDependencies,
-         Set<ControllerContext> notInstalled,
-         ControllerStateModel states)
+           DeploymentContext context,
+           Map<String, Throwable> contextsInError,
+           Map<String, Set<MissingDependency>> contextsMissingDependencies,
+           Set<ControllerContext> notInstalled,
+           ControllerStateModel states)
    {
       DeploymentControllerContext dcc = context.getTransientAttachments().getAttachment(ControllerContext.class.getName(), DeploymentControllerContext.class);
       checkControllerContext(dcc, contextsInError, contextsMissingDependencies, notInstalled, states);
@@ -1235,11 +1279,11 @@
     * @param states                      controller states
     */
    protected void checkControllerContext(
-         ControllerContext context,
-         Map<String, Throwable> contextsInError,
-         Map<String, Set<MissingDependency>> contextsMissingDependencies,
-         Set<ControllerContext> notInstalled,
-         ControllerStateModel states)
+           ControllerContext context,
+           Map<String, Throwable> contextsInError,
+           Map<String, Set<MissingDependency>> contextsMissingDependencies,
+           Set<ControllerContext> notInstalled,
+           ControllerStateModel states)
    {
       if (context != null)
       {
@@ -1252,7 +1296,7 @@
 
    public void install(ControllerContext context, ControllerState fromState, ControllerState toState) throws Throwable
    {
-      DeploymentControllerContext deploymentControllerContext = (DeploymentControllerContext)context;
+      DeploymentControllerContext deploymentControllerContext = (DeploymentControllerContext) context;
       String stageName = toState.getStateString();
 
       DeploymentContext deploymentContext = deploymentControllerContext.getDeploymentContext();
@@ -1490,7 +1534,7 @@
 
    public void uninstall(ControllerContext context, ControllerState fromState, ControllerState toState)
    {
-      DeploymentControllerContext deploymentControllerContext = (DeploymentControllerContext)context;
+      DeploymentControllerContext deploymentControllerContext = (DeploymentControllerContext) context;
       String stageName = fromState.getStateString();
 
       DeploymentContext deploymentContext = deploymentControllerContext.getDeploymentContext();
@@ -1600,9 +1644,9 @@
 
    /**
     * Do a deployment
-    * 
+    *
     * @param deployer the deployer
-    * @param unit the deployment unit
+    * @param unit     the deployment unit
     * @throws DeploymentException for any error
     */
    protected void doDeploy(Deployer deployer, DeploymentUnit unit) throws DeploymentException
@@ -1637,15 +1681,15 @@
 
    /**
     * Do an undeployment
-    * 
+    *
     * @param deployer the deployer
-    * @param unit the deployment unit
+    * @param unit     the deployment unit
     */
    protected void doUndeploy(Deployer deployer, DeploymentUnit unit)
    {
       deployer.undeploy(unit);
    }
-   
+
    /**
     * Build a list of  deployers for this stage
     *
@@ -1654,7 +1698,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();
 
@@ -1707,19 +1751,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 = DeployerSorterFactory.newSorter();
-      return sorter.sortDeployers(original, newDeployer);
-   }
-
-   /**
     * Set the deployment state for a context and its children
     *
     * @param context the context
@@ -1778,7 +1809,7 @@
 
    /**
     * Register a deployment context's mbean
-    * 
+    *
     * @param context the context
     */
    protected void registerMBean(DeploymentContext context)
@@ -1799,12 +1830,12 @@
 
    /**
     * Unregister a deployment context's mbean
-    * 
+    *
     * @param context the context
     */
    protected void unregisterMBean(DeploymentContext context)
    {
-      if (server != null && isRegisterMBeans() && context instanceof DeploymentMBean )
+      if (server != null && isRegisterMBeans() && context instanceof DeploymentMBean)
       {
          try
          {
@@ -1817,7 +1848,7 @@
          }
       }
    }
-   
+
    public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception
    {
       this.server = server;

Modified: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DeployerSorterFactory.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DeployerSorterFactory.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DeployerSorterFactory.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -36,6 +36,6 @@
     */
    public static DeployerSorter newSorter()
    {
-      return new DominoDeployerSorter();      
+      return new KahnDeployerSorter();      
    }
 }

Modified: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DominoOrdering.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DominoOrdering.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/DominoOrdering.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -103,7 +103,7 @@
             if (relation == 0)
             {
                // lazy compare on those who don't have order set
-               if (one.getRelativeOrder() != 0 && two.getRelativeOrder() != 0)
+               if (one.getRelativeOrder() != Integer.MAX_VALUE && two.getRelativeOrder() != Integer.MAX_VALUE)
                   relation = one.getRelativeOrder() - two.getRelativeOrder();
             }
             connections[i][j] = relation;

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/KahnDeployerSorter.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/KahnDeployerSorter.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/KahnDeployerSorter.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/KahnDeployerSorter.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,364 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright (c) 2009, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.deployers.plugins.sort;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jboss.deployers.spi.Ordered;
+import org.jboss.deployers.spi.deployer.Deployer;
+
+/**
+ * @author <a href="cdewolf at redhat.com">Carlo de Wolf</a>
+ */
+public class KahnDeployerSorter implements DeployerSorter
+{
+   private static class Edge
+   {
+      Deployer from;
+      String input;
+      Deployer to;
+
+      Edge(Deployer from, String input, Deployer to)
+      {
+         if(from.equals(to))
+            throw new IllegalArgumentException("cyclic edge");
+         this.from = from;
+         this.input = input;
+         this.to = to;
+      }
+
+      @Override
+      public boolean equals(Object o)
+      {
+         if(this == o) return true;
+         if(o == null || getClass() != o.getClass()) return false;
+
+         Edge edge = (Edge) o;
+
+         if(from != null ? !from.equals(edge.from) : edge.from != null) return false;
+         if(!input.equals(edge.input)) return false;
+         if(!to.equals(edge.to)) return false;
+
+         return true;
+      }
+
+      @Override
+      public int hashCode()
+      {
+         int result = from != null ? from.hashCode() : 0;
+         result = 31 * result + input.hashCode();
+         result = 31 * result + to.hashCode();
+         return result;
+      }
+
+      @Override
+      public String toString()
+      {
+         return "Edge{" +
+            "from=" + from +
+            ", input='" + input + '\'' +
+            ", to=" + to +
+            '}';
+      }
+   }
+
+   private static class ScoredDeployer
+   {
+      Deployer deployer;
+      int score;
+
+      ScoredDeployer(Deployer deployer)
+      {
+         this.deployer = deployer;
+         this.score = deployer.getRelativeOrder();
+      }
+
+      @Override
+      public String toString()
+      {
+         return "ScoredDeployer{" +
+            "deployer=" + deployer +
+            ", score=" + score +
+            '}';
+      }
+   }
+
+   protected int compare(Deployer one, Deployer two)
+   {
+      int relation = one.getRelativeOrder() - two.getRelativeOrder();
+      if(relation == 0)
+         relation = one.hashCode() - two.hashCode();
+      assert relation != 0;
+      return relation;
+   }
+
+   protected Collection<Edge> createEdges(Deployer from, Map<String, Collection<Deployer>> inputCache, Set<String> outputs)
+   {
+      Collection<Edge> result = new ArrayList<Edge>();
+      for(String output : outputs)
+      {
+         Collection<Deployer> deployers = inputCache.get(output);
+         if(deployers != null) for(Deployer to : deployers)
+         {
+            if(from != to)
+               result.add(new Edge(from, output, to));
+         }
+      }
+      return result;
+   }
+
+   protected Collection<Edge> createEdges(Map<String, Collection<Deployer>> outputCache, Set<String> inputs, Deployer to)
+   {
+      Collection<Edge> result = new ArrayList<Edge>();
+      for(String input : inputs)
+      {
+         Collection<Deployer> deployers = outputCache.get(input);
+         if(deployers != null) for(Deployer from : deployers)
+         {
+            result.add(new Edge(from, input, to));
+         }
+      }
+      return result;
+   }
+
+   protected Collection<Edge> findInputs(Map<Deployer, Set<Edge>> edgeCache, Deployer from, Map<String, Collection<Deployer>> cache, Set<String> inputs)
+   {
+      Collection<Edge> result = new ArrayList<Edge>();
+      for(String input : inputs)
+      {
+         //result.addAll(cache.get(input));
+         Collection<Deployer> deployers = cache.get(input);
+         if(deployers != null) for(Deployer d : deployers)
+         {
+            if(d != from)
+            {
+               //result.add(new Edge(from, input, d));
+               Edge potential = new Edge(from, input, d);
+               Set<Edge> edges = edgeCache.get(d);
+               if(edges.contains(potential))
+                  result.add(potential);
+            }
+         }
+      }
+      return result;
+   }
+
+   protected boolean isInputMaster(Collection<Deployer> deployers, Deployer deployer, String input)
+   {
+      for(Deployer other : deployers)
+      {
+         if(isTransient(other, input))
+         {
+            if(compare(other, deployer) > 0)
+               return false;
+         }
+      }
+      return true;
+   }
+
+   protected boolean isTransient(Deployer deployer, String input)
+   {
+      return deployer.getInputs().contains(input) && deployer.getOutputs().contains(input);
+   }
+
+   protected void process(Deployer deployer, Collection<Deployer> s, Map<String, Collection<Deployer>> inputCache, Map<Deployer, Set<Edge>> edgeCache, Set<String> outputs, Map<String, Collection<Deployer>> outputCache)
+   {
+      outputs.addAll(deployer.getOutputs());
+      if(deployer.getInputs() == null || deployer.getInputs().size() == 0)
+         s.add(deployer);
+      else
+      {
+         Set<Edge> edges = edgeCache.get(deployer);
+         assert edges == null;
+         edges = new HashSet<Edge>();
+         edgeCache.put(deployer, edges);
+
+         for(String input : deployer.getInputs())
+         {
+            Collection<Deployer> c = inputCache.get(input);
+            if(c == null)
+            {
+               c = new ArrayList<Deployer>();
+               inputCache.put(input, c);
+            }
+            c.add(deployer);
+         }
+
+         Collection<Edge> c = createEdges(outputCache, deployer.getInputs(), deployer);
+         if(c.isEmpty())
+         {
+            // might be a bit premature, see below
+            s.add(deployer);
+         }
+         else
+         {
+            edges.addAll(c);
+         }
+      }
+
+      for(String output : deployer.getOutputs())
+      {
+         Collection<Deployer> c = outputCache.get(output);
+         if(c == null)
+         {
+            c = new ArrayList<Deployer>();
+            outputCache.put(output, c);
+         }
+         c.add(deployer);
+      }
+
+      Collection<Edge> edges = createEdges(deployer, inputCache, deployer.getOutputs());
+      for(Edge e : edges)
+      {
+         Set<Edge> cachedEdges = edgeCache.get(e.to);
+         if(cachedEdges == null)
+         {
+            cachedEdges = new HashSet<Edge>();
+            edgeCache.put(e.to, cachedEdges);
+         }
+         cachedEdges.add(e);
+         // remove a prematurely added deployer
+         s.remove(e.to);
+      }
+   }
+
+   /**
+    * Break the cyclic graph by processing transient deployers. Basically choosing one edge which we want removed.
+    */
+   public void processTransientDeployers(List<Deployer> s, Map<String, Collection<Deployer>> inputCache, Map<String, Collection<Deployer>> outputCache, Map<Deployer, Set<Edge>> edgeCache)
+   {
+      for(String input : inputCache.keySet())
+      {
+         Collection<Deployer> others = outputCache.get(input);
+         if(others == null)
+            continue;
+         List<Deployer> deployers = new ArrayList<Deployer>(inputCache.get(input));
+         deployers.retainAll(others);
+         if(deployers.isEmpty() || deployers.size() == 1)
+            continue;
+
+         List<ScoredDeployer> scoredDeployers = new ArrayList<ScoredDeployer>();
+         // TODO: too slow
+         for(Deployer d : deployers)
+         {
+            ScoredDeployer scoredDeployer = new ScoredDeployer(d);
+            scoredDeployers.add(scoredDeployer);
+            
+            Set<Edge> edges = edgeCache.get(d);
+            for(Edge e : new HashSet<Edge>(edges))
+            {
+               if(deployers.contains(e.from) && input.equals(e.input))
+                  edges.remove(e);
+               else if(deployers.contains(e.from))
+                  scoredDeployer.score++;
+            }
+         }
+
+         Comparator<? super ScoredDeployer> comparator = new Comparator<ScoredDeployer>() {
+            public int compare(ScoredDeployer o1, ScoredDeployer o2)
+            {
+               int relation = o1.score - o2.score;
+               if(relation == 0)
+                  relation = Ordered.COMPARATOR.compare(o1.deployer, o2.deployer);
+               return relation;
+            }
+         };
+         Collections.sort(scoredDeployers, comparator);
+
+         for(int i = 1; i < scoredDeployers.size(); i++)
+         {
+            Set<Edge> edges = edgeCache.get(scoredDeployers.get(i).deployer);
+            edges.add(new Edge(scoredDeployers.get(0).deployer, input, scoredDeployers.get(i).deployer));
+         }
+
+         // add the top one if it doesn't have any incoming edges
+         // note that the normal process step does the same thing, so exclude it.
+         Deployer deployer = scoredDeployers.get(0).deployer;
+         if(edgeCache.get(deployer).isEmpty() && !s.contains(deployer))
+            s.add(deployer);
+      }
+   }
+
+   public List<Deployer> sortDeployers(List<Deployer> original, Deployer newDeployer)
+   {
+      List<Deployer> result = new ArrayList<Deployer>();
+      // S ← Set of all nodes with no incoming edges
+      List<Deployer> s = new ArrayList<Deployer>();
+      Map<String, Collection<Deployer>> inputCache = new HashMap<String, Collection<Deployer>>();
+      Map<Deployer, Set<Edge>> edgeCache = new IdentityHashMap<Deployer, Set<Edge>>();
+      Set<String> outputs = new HashSet<String>();
+      Map<String, Collection<Deployer>> outputCache = new HashMap<String, Collection<Deployer>>();
+      for(Deployer deployer : original)
+      {
+         process(deployer, s, inputCache, edgeCache, outputs, outputCache);
+      }
+      process(newDeployer, s, inputCache, edgeCache, outputs, outputCache);
+
+      // find transient deployers and sort them out
+      processTransientDeployers(s, inputCache, outputCache, edgeCache);
+
+      // never, ever ask why this is here.
+      // I really mean it, do not ask.
+      // Seriously I will not give a sensible answer to this one.
+      // Okay, okay, stop bitching. There is a requirement that deployer need to be in name ordering.
+      // setupSillyNameEdges(deployer, newDeployer); // hmm does work out
+      Collections.sort(s, Ordered.COMPARATOR);
+
+      while(!s.isEmpty())
+      {
+         Deployer deployer = s.remove(0);
+         result.add(deployer);
+         // for each node m with an edge e from n to m do
+         for(Edge e : findInputs(edgeCache, deployer, inputCache, deployer.getOutputs()))
+         {
+            // remove edge e from the graph
+            Set<Edge> edges = edgeCache.get(e.to);
+            edges.remove(e);
+            // if m has no other incoming edges then insert m into S
+            if(edges.isEmpty())
+               s.add(e.to);
+         }
+      }
+      // if graph has edges then output error message (graph has at least one cycle)
+      String message = "";
+      for(Set<Edge> edges : edgeCache.values())
+      {
+         if(!edges.isEmpty())
+            message += "edges: " + edges;
+      }
+      if(message.length() > 0)
+         throw new IllegalStateException(message);
+
+      assert result.size() == original.size() + 1 : "not all deployers made it";
+      return result;
+   }
+}

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/NewStagedSortedDeployers.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -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);
+   }
+}

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/OldStagedSortedDeployers.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -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;
+   }
+}

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/SortedDeployers.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,336 @@
+package org.jboss.deployers.plugins.sort;
+
+import org.jboss.deployers.spi.deployer.Deployer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:bill at burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class SortedDeployers
+{
+   private static class Entry
+   {
+
+      public Deployer deployer;
+      public int index;
+
+      private String nameCache;
+
+      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 String toString()
+      {
+         // this speeds up things a few milliseconds :)
+         if (nameCache == null) nameCache = deployer.toString();
+         return nameCache;
+      }
+   }
+
+   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);
+      IdentityHashMap visited = new IdentityHashMap();
+      traverseOutputs(n, visited);
+      relativeOrdering();
+
+      // For some reason, something depends on a new list within MC/VDF
+      // be careful if you change this
+      deployers = new ArrayList<Deployer>();
+      for (Entry entry : entries)
+      {
+         deployers.add(entry.deployer);
+      }
+   }
+
+   public void removeDeployer(Deployer d)
+   {
+      Entry removed = null;
+      int esize = entries.size();
+      for (int i = 0; i < esize; 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 = new ArrayList<Deployer>();
+      for (Entry entry : entries)
+      {
+         deployers.add(entry.deployer);
+      }
+   }
+
+   public List<Deployer> getDeployers()
+   {
+      return deployers;
+   }
+
+   private void traverseOutputs(Entry n, IdentityHashMap visited)
+   {
+      if (n.getOutputs() == null) return;
+      if (visited.containsKey(n))
+      {
+         throw new IllegalStateException("Deployer " + n + " is involved in a cyclic dependency.");
+      }
+      visited.put(n, n);
+      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 both the new deployer and comparing deployer have the same output as input
+               // don't change the index of the new deployer.  We always want to insert the deployer at the lowest
+               // possible index so that it is guaranteed that a lower index is always "not equal" to it.
+               if (n.getInputs().contains(output) && deployer.getOutputs().contains(output))
+               {
+
+               }
+               else
+               {
+                  removeAt(deployer.getIndex());
+                  deployer.setIndex(0);
+                  insertAfterInputs(deployer);
+                  traverseOutputs(deployer, visited);
+               }
+            }
+         }
+
+      }
+   }
+
+   private void insertAfterInputs(Entry n)
+   {
+      Set<String> nInputs = n.getInputs();
+      Set<String> nOutputs = n.getOutputs();
+      if (nInputs == null) return;
+      for (String input : nInputs)
+      {
+         List<Entry> outputs = outputMap.get(input);
+         if (outputs == null) continue;
+         for (Entry deployer : outputs)
+         {
+            if (deployer == n) continue;
+            if (deployer.getIndex() >= n.getIndex())
+            {
+               // if both the new deployer and comparing deployer have the same output as input
+               // don't change the index of the new deployer.  We always want to insert the deployer at the lowest
+               // possible index so that it is guaranteed that a lower index is always "not equal" to it.
+               if (nOutputs.contains(input) && deployer.getInputs().contains(input))
+               {
+
+               }
+               else
+               {
+                  n.setIndex(deployer.getIndex() + 1);
+               }
+            }
+         }
+      }
+      insertAt(n);
+   }
+
+   void insertAt(Entry n)
+   {
+      entries.add(n.getIndex(), n);
+      int esize = entries.size();
+      for (int i = n.getIndex() + 1; i < esize; i++)
+      {
+         entries.get(i).setIndex(i);
+      }
+   }
+
+   void removeAt(int index)
+   {
+      entries.remove(index);
+      int esize = entries.size();
+      for (int i = index; i < esize; i++)
+      {
+         entries.get(i).setIndex(i);
+      }
+   }
+
+   public void relativeOrdering()
+   {
+      // this algorithm may seem buggy, but I don't think it is.
+      // WE can do a simple for loop because deployers are add one at a time
+      // since they are added one at a time, the current entry list is already sorted
+      // also, we ensure that deployers are inserted at the lowest possible index.  This means
+      // that they cannot be "equal to" a lower index than themselves and makes this
+      // single for-loop optimization rather than a real sort possible.
+      // Time improvement could be saved  if name ordering was removed.
+      int esize = entries.size();
+      for (int i = 0; i < esize - 1; i++)
+      {
+         Entry d1 = entries.get(i);
+         Entry d2 = entries.get(i + 1);
+
+         // optimization.  If relative order is the same, we don't have to do a swap
+         if (d1.getRelativeOrder() == d2.getRelativeOrder())
+         {
+            String name1 = d1.toString();
+            String name2 = d2.toString();
+            if (name1.compareTo(name2) < 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;
+      Set<String> d1Outputs = d1.getOutputs();
+      if (d1Outputs == null) return true;
+      for (String output : d1Outputs)
+      {
+         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;
+   }
+}

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/StagedSortedDeployers.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -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);
+}

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/main/java/org/jboss/deployers/plugins/sort/TopologicalDeployerSorter.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,193 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright (c) 2009, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.deployers.plugins.sort;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+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;
+import org.jboss.util.graph.Edge;
+import org.jboss.util.graph.Graph;
+import org.jboss.util.graph.Vertex;
+
+/**
+ * Simple topological sorting: http://en.wikipedia.org/wiki/Topological_sorting.
+ * 
+ * Each input or output is a task, dependency between tasks is determined by deployer.
+ * e.g. Deployer D has input X and output Y, hence we have 2 tasks and the dependency between them,
+ * meaning that task X needs to be finished before task Y.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class TopologicalDeployerSorter implements DeployerSorter
+{
+   @SuppressWarnings({"unchecked"})
+   public List<Deployer> sortDeployers(List<Deployer> original, Deployer newDeployer)
+   {
+      Graph<Integer> graph = new Graph<Integer>();
+      Map<String, Set<Deployer>> output2deployer = new HashMap<String, Set<Deployer>>();
+      List<Deployer> splitList = new SplitList<Deployer>(original, newDeployer);
+      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, graph);
+         Set<String> outputs = deployer.getOutputs();
+         Set<Vertex<Integer>> ovd = fillVertices(outputs, graph);
+         ivd.retainAll(ovd); // intersection
+         for (String output : outputs)
+         {
+            Set<Deployer> deployers = output2deployer.get(output);
+            if (deployers == null)
+            {
+               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(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 : graph.getVerticies())
+      {
+         if (vertex.getIncomingEdgeCount() == 0)
+            noIncoming.push(vertex);
+      }
+      List<Vertex<Integer>> sorted = new ArrayList<Vertex<Integer>>();
+      while(noIncoming.isEmpty() == false)
+      {
+         Vertex<Integer> n = noIncoming.pop();
+         sorted.add(n);
+         n.setData(sorted.size());
+         List<Edge<Integer>> edges = new ArrayList<Edge<Integer>>(n.getOutgoingEdges());
+         for (Edge<Integer> edge : edges)
+         {
+            Vertex<Integer> m = edge.getTo();
+            graph.removeEdge(n, m);
+            if (m.getIncomingEdgeCount() == 0)
+               noIncoming.push(m);
+         }
+      }
+      if (graph.getEdges().isEmpty() == false)
+         throw new IllegalStateException("We have a cycle: " + newDeployer + ", previous: " + original);
+
+      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, Graph<Integer> graph)
+   {
+      Map<Vertex<Integer>, Object> dv = new IdentityHashMap<Vertex<Integer>, Object>();
+      for (String key : keys)
+         dv.put(getVertex(key, graph), 0);
+      return dv.keySet();
+   }
+
+   private static Vertex<Integer> getVertex(String key, Graph<Integer> graph)
+   {
+      Vertex<Integer> vertex = graph.findVertexByName(key);
+      if (vertex == null)
+      {
+         vertex = new Vertex<Integer>(key);
+         graph.addVertex(vertex);
+      }
+      return vertex;
+   }
+
+   private class SplitList<T> extends AbstractList<T>
+   {
+      private List<T> head;
+      private List<T> tail;
+
+      private SplitList(List<T> head, T tail)
+      {
+         this.head = head;
+         this.tail = Collections.singletonList(tail);
+      }
+
+      @Override
+      public T get(int index)
+      {
+         int headSize = head.size();
+         if (index < headSize)
+            return head.get(index);
+         else
+            return tail.get(index - headSize);
+      }
+
+      @Override
+      public int size()
+      {
+         return head.size() + tail.size();
+      }
+   }
+}
\ No newline at end of file

Modified: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/DeployersDeployerTestSuite.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/DeployersDeployerTestSuite.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/DeployersDeployerTestSuite.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -36,9 +36,13 @@
 import org.jboss.test.deployers.deployer.test.DeployerRequiredStageUnitTestCase;
 import org.jboss.test.deployers.deployer.test.DeployerWidthFirstUnitTestCase;
 import org.jboss.test.deployers.deployer.test.DeployersImplUnitTestCase;
+import org.jboss.test.deployers.deployer.test.DominoOrderingUnitTestCase;
 import org.jboss.test.deployers.deployer.test.HeuristicAllOrNothingUnitTestCase;
 import org.jboss.test.deployers.deployer.test.HeuristicRussionDollUnitTestCase;
+import org.jboss.test.deployers.deployer.test.IndexingOrderingUnitTestCase;
+import org.jboss.test.deployers.deployer.test.KahnOrderingUnitTestCase;
 import org.jboss.test.deployers.deployer.test.MultipleComponentTypeUnitTestCase;
+import org.jboss.test.deployers.deployer.test.TopologicalOrderingUnitTestCase;
 
 /**
  * Deployers Deployer Test Suite.
@@ -60,7 +64,6 @@
 
       suite.addTest(DeployerProtocolUnitTestCase.suite());
       suite.addTest(DeployerOrderingUnitTestCase.suite());
-      suite.addTest(DeployerFlowUnitTestCase.suite());
       suite.addTest(DeployerWidthFirstUnitTestCase.suite());
       suite.addTest(DeployerClassLoaderUnitTestCase.suite());
       suite.addTest(DeployersImplUnitTestCase.suite());
@@ -72,6 +75,13 @@
       suite.addTest(DeployerRequiredStageUnitTestCase.suite());
       suite.addTest(DeployerRequiredInputsUnitTestCase.suite());
 
+      // sorting tests
+      suite.addTest(DeployerFlowUnitTestCase.suite());
+      suite.addTest(DominoOrderingUnitTestCase.suite());
+      suite.addTest(KahnOrderingUnitTestCase.suite());
+      suite.addTest(TopologicalOrderingUnitTestCase.suite());
+      suite.addTest(IndexingOrderingUnitTestCase.suite());
+
       // helper deployers
       suite.addTest(ExactAttachmentDeployerWithVisitorTestCase.suite());
 

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractDeployerFlowUnitTest.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractDeployerFlowUnitTest.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractDeployerFlowUnitTest.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractDeployerFlowUnitTest.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,2061 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright (c) 2009, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.deployers.deployer.test;
+
+import org.jboss.deployers.client.spi.DeployerClient;
+import org.jboss.deployers.client.spi.Deployment;
+import org.jboss.deployers.plugins.deployers.DeployersImpl;
+import org.jboss.deployers.spi.deployer.Deployers;
+import org.jboss.deployers.spi.deployer.DeploymentStages;
+import org.jboss.deployers.spi.deployer.helpers.AbstractDeployer;
+import org.jboss.test.deployers.AbstractDeployerTest;
+import org.jboss.test.deployers.deployer.support.TestDeployerAdapter;
+import org.jboss.test.deployers.deployer.support.TestFlowDeployer;
+
+/**
+ * DeployerOrderingUnitTestCase.
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ * @author <a href="mailto:ropalka at redhat.com">Richard Opalka</a>
+ * @author <a href="cdewolf at redhat.com">Carlo de Wolf</a>
+ * @version $Revision: 1.1 $
+ */
+public abstract class AbstractDeployerFlowUnitTest extends AbstractDeployerTest
+{
+   public AbstractDeployerFlowUnitTest(String name)
+   {
+      super(name);
+   }
+
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+      TestFlowDeployer.reset();
+   }
+
+   @Override
+   protected Deployers createDeployers()
+   {
+      Deployers deployers = super.createDeployers();
+      DeployersImpl impl = assertInstanceOf(deployers, DeployersImpl.class, false);
+      applySortingChanges(impl);
+      return impl;
+   }
+
+   protected abstract void applySortingChanges(DeployersImpl deployers);
+
+   public void testSimpleInputOutputCorrectOrder() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test");
+      addDeployer(main, deployer1);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test");
+      addDeployer(main, deployer2);
+
+      Deployment deployment = createSimpleDeployment("correctOrder");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(3, deployer2.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(5, deployer1.getDeployOrder());
+      assertEquals(6, deployer2.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(3, deployer2.getUndeployOrder());
+   }
+
+   public void testSimpleInputOutputWrongOrder() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test");
+      addDeployer(main, deployer1);
+
+      Deployment deployment = createSimpleDeployment("wrongOrder");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(3, deployer2.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(5, deployer1.getDeployOrder());
+      assertEquals(6, deployer2.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(3, deployer2.getUndeployOrder());
+   }
+
+   public void testInputOutputLoop() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setInputs("A");
+      deployer1.setOutputs("B");
+      addDeployer(main, deployer1);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("B");
+      deployer2.setOutputs("C");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setInputs("C");
+      deployer3.setOutputs("A");
+      try
+      {
+         addDeployer(main, deployer3);
+         fail("Should not be here!");
+      }
+      catch (Throwable t)
+      {
+         checkThrowable(IllegalStateException.class, t);
+      }
+   }
+
+   public void testInputOutputTransient() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test");
+      addDeployer(main, deployer1);
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setInputs("test");
+      addDeployer(main, deployer3);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test");
+      deployer2.setOutputs("test");
+      addDeployer(main, deployer2);
+
+      Deployment deployment = createSimpleDeployment("transient");
+      main.addDeployment(deployment);
+      main.process();
+
+      // B can appear at any position
+      // BCA, CBA, CAB
+      assertDeployBefore(deployer2, deployer1);
+      assertTrue("C doesn't deploy", deployer1.getDeployOrder() > 0);
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(6, deployer1.getUndeployOrder());
+      assertEquals(5, deployer2.getUndeployOrder());
+      assertEquals(4, deployer3.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(7, deployer1.getDeployOrder());
+      assertEquals(8, deployer2.getDeployOrder());
+      assertEquals(9, deployer3.getDeployOrder());
+      assertEquals(6, deployer1.getUndeployOrder());
+      assertEquals(5, deployer2.getUndeployOrder());
+      assertEquals(4, deployer3.getUndeployOrder());
+   }
+
+   public void testInputOutputTransient2() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setInputs("test");
+      deployer1.setOutputs("test");
+      addDeployer(main, deployer1);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test");
+      addDeployer(main, deployer2);
+
+      Deployment deployment = createSimpleDeployment("transient2");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(3, deployer2.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(5, deployer1.getDeployOrder());
+      assertEquals(6, deployer2.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(3, deployer2.getUndeployOrder());
+   }
+
+   public void testInputOutputMultipleTransient() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer4 = new TestFlowDeployer("4");
+      deployer4.setInputs("test");
+      addDeployer(main, deployer4);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test");
+      deployer2.setOutputs("test");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setInputs("test");
+      deployer3.setOutputs("test");
+      addDeployer(main, deployer3);
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test");
+      addDeployer(main, deployer1);
+
+      Deployment deployment = createSimpleDeployment("transient");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(9, deployer1.getDeployOrder());
+      assertEquals(10, deployer2.getDeployOrder());
+      assertEquals(11, deployer3.getDeployOrder());
+      assertEquals(12, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+   }
+
+   public void testMultipleOutput() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test1", "test2");
+      addDeployer(main, deployer1);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test1");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setInputs("test2");
+      addDeployer(main, deployer3);
+
+      Deployment deployment = createSimpleDeployment("MultipleOutput");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer2, deployer1);
+      assertDeployBefore(deployer3, deployer1);
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer2, deployer1);
+      assertDeployBefore(deployer3, deployer1);
+      assertUndeployAfter(deployer2, deployer1);
+      assertUndeployAfter(deployer3, deployer1);
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer2, deployer1);
+      assertDeployBefore(deployer3, deployer1);
+      assertUndeployAfter(deployer2, deployer1);
+      assertUndeployAfter(deployer3, deployer1);
+   }
+
+   public void testMultipleInput() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer3 = new TestFlowDeployer("in12");
+      deployer3.setInputs("test1", "test2");
+      addDeployer(main, deployer3);
+      TestFlowDeployer deployer1 = new TestFlowDeployer("out1");
+      deployer1.setOutputs("test1");
+      addDeployer(main, deployer1);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("out2");
+      deployer2.setOutputs("test2");
+      addDeployer(main, deployer2);
+
+      Deployment deployment = createSimpleDeployment("MultipleInput");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer3, deployer1);
+      assertDeployBefore(deployer3, deployer2);
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer3, deployer1);
+      assertDeployBefore(deployer3, deployer2);
+      assertEquals(3, deployer3.getDeployOrder());
+      assertUndeployAfter(deployer3, deployer1);
+      assertUndeployAfter(deployer3, deployer2);
+      assertEquals(4, deployer3.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer3, deployer1);
+      assertDeployBefore(deployer3, deployer2);
+      assertEquals(9, deployer3.getDeployOrder());
+      assertUndeployAfter(deployer3, deployer1);
+      assertUndeployAfter(deployer3, deployer2);
+      assertEquals(4, deployer3.getUndeployOrder());
+   }
+
+   public void testChain() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setInputs("test2");
+      addDeployer(main, deployer3);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setInputs("test1");
+      deployer2.setOutputs("test2");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test1");
+      addDeployer(main, deployer1);
+
+      Deployment deployment = createSimpleDeployment("Chain");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(6, deployer1.getUndeployOrder());
+      assertEquals(5, deployer2.getUndeployOrder());
+      assertEquals(4, deployer3.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(7, deployer1.getDeployOrder());
+      assertEquals(8, deployer2.getDeployOrder());
+      assertEquals(9, deployer3.getDeployOrder());
+      assertEquals(6, deployer1.getUndeployOrder());
+      assertEquals(5, deployer2.getUndeployOrder());
+      assertEquals(4, deployer3.getUndeployOrder());
+   }
+
+   public void testComplicated() throws Exception
+   {
+      // (1) (2) (3)
+      //  \   /   |
+      //    T1    T2
+      //    |     |
+      //         (4)
+      //          |
+      //          T3
+      //          |
+      //         (5)
+      //    |     |
+      //    T1    T3
+      //      \   /
+      //       (6)
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer6 = new TestFlowDeployer("6");
+      deployer6.setInputs("test1", "test3");
+      addDeployer(main, deployer6);
+      TestFlowDeployer deployer5 = new TestFlowDeployer("5");
+      deployer5.setInputs("test3");
+      deployer5.setOutputs("test3");
+      addDeployer(main, deployer5);
+      TestFlowDeployer deployer4 = new TestFlowDeployer("4");
+      deployer4.setInputs("test2");
+      deployer4.setOutputs("test3");
+      addDeployer(main, deployer4);
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setOutputs("test2");
+      addDeployer(main, deployer3);
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setOutputs("test1");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setOutputs("test1");
+      addDeployer(main, deployer1);
+
+      Deployment deployment = createSimpleDeployment("Complicated");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer6, deployer1);
+      assertDeployBefore(deployer6, deployer2);
+      assertDeployBefore(deployer4, deployer3);
+      assertDeployBefore(deployer5, deployer4);
+      assertDeployBefore(deployer6, deployer5);
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+      assertEquals(-1, deployer5.getUndeployOrder());
+      assertEquals(-1, deployer6.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer6, deployer1);
+      assertDeployBefore(deployer6, deployer2);
+      assertDeployBefore(deployer4, deployer3);
+      assertDeployBefore(deployer5, deployer4);
+      assertDeployBefore(deployer6, deployer5);
+      assertUndeployAfter(deployer6, deployer1);
+      assertUndeployAfter(deployer6, deployer2);
+      assertUndeployAfter(deployer4, deployer3);
+      assertUndeployAfter(deployer5, deployer4);
+      assertUndeployAfter(deployer6, deployer5);
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer6, deployer1);
+      assertDeployBefore(deployer6, deployer2);
+      assertDeployBefore(deployer4, deployer3);
+      assertDeployBefore(deployer5, deployer4);
+      assertDeployBefore(deployer6, deployer5);
+      assertUndeployAfter(deployer6, deployer1);
+      assertUndeployAfter(deployer6, deployer2);
+      assertUndeployAfter(deployer4, deployer3);
+      assertUndeployAfter(deployer5, deployer4);
+      assertUndeployAfter(deployer6, deployer5);
+   }
+
+   public void testIntermediateIsRelativelySorted() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer2 = new TestFlowDeployer("A");
+      deployer2.setInputs("test1");
+      addDeployer(main, deployer2);
+      TestFlowDeployer deployer3 = new TestFlowDeployer("B");
+      addDeployer(main, deployer3);
+      TestFlowDeployer deployer1 = new TestFlowDeployer("C");
+      deployer1.setOutputs("test1");
+      addDeployer(main, deployer1);
+
+      Deployment deployment = createSimpleDeployment("IntermediateIsRelativelySorted");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer2, deployer1);
+      assertTrue("B doesn't deploy", deployer3.getDeployOrder() > 0);
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer2, deployer1);
+      assertTrue("B doesn't deploy", deployer3.getDeployOrder() > 0);
+      assertUndeployAfter(deployer2, deployer1);
+      assertTrue("B doesn't undeploy", deployer3.getUndeployOrder() > 0);
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeployBefore(deployer2, deployer1);
+      assertTrue("B doesn't deploy", deployer3.getDeployOrder() > 0);
+      assertUndeployAfter(deployer2, deployer1);
+      assertTrue("B doesn't undeploy", deployer3.getUndeployOrder() > 0);
+   }
+
+   public void testTransitionOrdering() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("A");
+      deployer1.setInputs("3");
+      deployer1.setOutputs("4");
+      addDeployer(main, deployer1);
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer("B");
+      deployer2.setInputs("1");
+      deployer2.setOutputs("2");
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer("C");
+      deployer3.setInputs("2");
+      deployer3.setOutputs("3");
+      addDeployer(main, deployer3);
+
+      Deployment deployment = createSimpleDeployment("TransitionOrdering");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(3, deployer1.getDeployOrder());
+      assertEquals(1, deployer2.getDeployOrder());
+      assertEquals(2, deployer3.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(3, deployer1.getDeployOrder());
+      assertEquals(1, deployer2.getDeployOrder());
+      assertEquals(2, deployer3.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(6, deployer2.getUndeployOrder());
+      assertEquals(5, deployer3.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(9, deployer1.getDeployOrder());
+      assertEquals(7, deployer2.getDeployOrder());
+      assertEquals(8, deployer3.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(6, deployer2.getUndeployOrder());
+      assertEquals(5, deployer3.getUndeployOrder());
+   }
+
+   public void testSymetricDots() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+      TestFlowDeployer deployer1 = new TestFlowDeployer("XB");
+      deployer1.setInputs("X");
+      deployer1.setOutputs("B");
+      addDeployer(main, deployer1);
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer("XX");
+      deployer2.setInputs("X");
+      deployer2.setOutputs("X");
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer("AX");
+      deployer3.setInputs("A");
+      deployer3.setOutputs("X");
+      addDeployer(main, deployer3);
+
+      Deployment deployment = createSimpleDeployment("SymetricDots");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(3, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(1, deployer3.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(3, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(1, deployer3.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(5, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(9, deployer1.getDeployOrder());
+      assertEquals(8, deployer2.getDeployOrder());
+      assertEquals(7, deployer3.getDeployOrder());
+      assertEquals(4, deployer1.getUndeployOrder());
+      assertEquals(5, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+   }
+
+   public void testDoubleCycle() throws Exception
+   {
+      // (D) (H) (B) (E) (G)
+      //  |   |
+      //  T1 2nd
+      //  |   |
+      // (F) (C)
+      //  |
+      //  T2
+      //  |
+      // (A)
+      DeployerClient main = createMainDeployer();
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer("A");
+      deployer2.setInputs("test2");
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer("B");
+      addDeployer(main, deployer3);
+
+      TestFlowDeployer deployer6 = new TestFlowDeployer("C");
+      deployer6.setInputs("2ndcycle");
+      addDeployer(main, deployer6);
+
+      TestFlowDeployer deployer1 = new TestFlowDeployer("D");
+      deployer1.setOutputs("test1");
+      addDeployer(main, deployer1);
+
+      TestFlowDeployer deployer4 = new TestFlowDeployer("E");
+      addDeployer(main, deployer4);
+
+      TestFlowDeployer deployer5 = new TestFlowDeployer("F");
+      deployer5.setInputs("test1");
+      deployer5.setOutputs("test2");
+      addDeployer(main, deployer5);
+
+      TestFlowDeployer deployer7 = new TestFlowDeployer("G");
+      addDeployer(main, deployer7);
+
+      TestFlowDeployer deployer8 = new TestFlowDeployer("H");
+      deployer8.setOutputs("2ndcycle");
+      addDeployer(main, deployer8);
+
+      Deployment deployment = createSimpleDeployment("DoubleCycle");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeploy(deployer3);
+      assertDeployBefore(deployer6, deployer8);
+      assertDeployBefore(deployer5, deployer1);
+      assertDeploy(deployer4);
+      assertDeployBefore(deployer2, deployer5);
+      assertDeploy(deployer7);
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer8.getUndeployOrder());
+      assertEquals(-1, deployer6.getUndeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+      assertEquals(-1, deployer5.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer7.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertDeploy(deployer3);
+      assertDeployBefore(deployer6, deployer8);
+      assertDeployBefore(deployer5, deployer1);
+      assertDeploy(deployer4);
+      assertDeployBefore(deployer2, deployer5);
+      assertDeploy(deployer7);
+      assertUndeploy(deployer3);
+      assertUndeployAfter(deployer6, deployer8);
+      assertUndeployAfter(deployer5, deployer1);
+      assertUndeploy(deployer4);
+      assertUndeployAfter(deployer2, deployer5);
+      assertUndeploy(deployer7);
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertDeploy(deployer3);
+      assertDeployBefore(deployer6, deployer8);
+      assertDeployBefore(deployer5, deployer1);
+      assertDeploy(deployer4);
+      assertDeployBefore(deployer2, deployer5);
+      assertDeploy(deployer7);
+      assertUndeploy(deployer3);
+      assertUndeployAfter(deployer6, deployer8);
+      assertUndeployAfter(deployer5, deployer1);
+      assertUndeploy(deployer4);
+      assertUndeployAfter(deployer2, deployer5);
+      assertUndeploy(deployer7);
+   }
+
+   public void testOrderedThenFlowWithPassThrough() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      TestFlowDeployer deployer4 = new TestFlowDeployer("4");
+      deployer4.setInputs("test");
+      addDeployer(main, deployer4);
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
+      deployer3.setRelativeOrder(3);
+      deployer3.setInputs("test");
+      deployer3.setOutputs("test");
+      addDeployer(main, deployer3);
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
+      deployer2.setRelativeOrder(2);
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
+      deployer1.setRelativeOrder(1);
+      addDeployer(main, deployer1);
+
+      Deployment deployment = createSimpleDeployment("orderedThenFlowWithPassThrough");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(9, deployer1.getDeployOrder());
+      assertEquals(10, deployer2.getDeployOrder());
+      assertEquals(11, deployer3.getDeployOrder());
+      assertEquals(12, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+   }
+
+   public void testSimplePassThrough() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      TestFlowDeployer postJBWMD = new TestFlowDeployer("PassThrough");
+      postJBWMD.setInputs("JBWMD", "CLMD");
+      postJBWMD.setOutputs("JBWMD", "CLMD");
+      addDeployer(main, postJBWMD);
+   }
+
+   public void testWebBeansOrder() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      TestFlowDeployer mcfcld = new TestFlowDeployer("ManagedConnectionFactory");
+      mcfcld.setInputs("ManagedConnectionFactoryDeploymentGroup");
+      mcfcld.setOutputs("CLMD");
+      addDeployer(main, mcfcld);
+
+      TestFlowDeployer postJBWMD = new TestFlowDeployer("PostJBossWebMetadataDeployer");
+      postJBWMD.setInputs("JBWMD", "CLMD");
+      postJBWMD.setOutputs("JBWMD", "CLMD");
+      addDeployer(main, postJBWMD);
+
+      TestFlowDeployer postEJB = new TestFlowDeployer("PostEjbJar");
+      postEJB.setInputs("EJB");
+      postEJB.setOutputs("EJB");
+      addDeployer(main, postEJB);
+
+      TestFlowDeployer warCL = new TestFlowDeployer("WarClassLoaderDeployer");
+      warCL.setInputs("JBWMD", "CLMD");
+      warCL.setOutputs("CLMD");
+      addDeployer(main, warCL);
+
+      TestFlowDeployer service = new TestFlowDeployer("ServiceCL");
+      service.setInputs("ServiceDeployment");
+      service.setOutputs("CLMD");
+      addDeployer(main, service);
+
+      TestFlowDeployer legacy = new TestFlowDeployer("Legacy");
+      legacy.setInputs("JBWMD", "WMD");
+      legacy.setOutputs("JBWMD");
+      addDeployer(main, legacy);
+
+      TestFlowDeployer cluster = new TestFlowDeployer("Cluster");
+      cluster.setInputs("JBWMD");
+      cluster.setOutputs("JBWMD");
+      addDeployer(main, cluster);
+
+      TestFlowDeployer postWMD = new TestFlowDeployer("PostWebMetadataDeployer");
+      postWMD.setInputs("JBWMD");
+      postWMD.setOutputs("JBWMD");
+      addDeployer(main, postWMD);
+   }
+
+   public void testWebServicesDeployersOrder() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      TestFlowDeployer deployer1 = new TestFlowDeployer("FakeDeployer");
+      deployer1.setOutputs("WebServicesMetaData", "WebServiceDeployment", "JBossWebMetaData" );
+      addDeployer(main, deployer1);
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer("WebServicesDeploymentTypeDeployer");
+      deployer2.setInputs("WebServicesMetaData", "WebServiceDeployment", "JBossWebMetaData" );
+      deployer2.setOutputs("DeploymentType", "JBossWebMetaData");
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer4 = new TestFlowDeployer("WebServiceDeployerPreJSE");
+      deployer4.setInputs("JBossWebMetaData", "DeploymentType");
+      deployer4.setOutputs("JBossWebMetaData");
+      addDeployer(main, deployer4);
+
+      TestFlowDeployer deployer5 = new TestFlowDeployer("AbstractWarDeployer");
+      deployer5.setInputs("JBossWebMetaData");
+      deployer5.setOutputs("WarDeployment");
+      addDeployer(main, deployer5);
+
+      TestFlowDeployer deployer6 = new TestFlowDeployer("ServiceCL");
+      deployer6.setInputs("DeploymentType", "WarDeployment");
+      addDeployer(main, deployer6);
+
+      // #2 duplicate
+      TestFlowDeployer deployer3 = new TestFlowDeployer("WebServicesDeploymentTypeDeployer2");
+      deployer3.setInputs("WebServicesMetaData", "WebServiceDeployment", "JBossWebMetaData" );
+      deployer3.setOutputs("DeploymentType", "JBossWebMetaData");
+      addDeployer(main, deployer3);
+
+      // #4 duplicate
+      TestFlowDeployer deployer7 = new TestFlowDeployer("WebServiceDeployerEJB");
+      deployer7.setInputs("JBossWebMetaData", "DeploymentType");
+      deployer7.setOutputs("JBossWebMetaData");
+      addDeployer(main, deployer7);
+
+      Deployment deployment = createSimpleDeployment("testWSDeploymentOrder");
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+//      assertEquals(4, deployer7.getDeployOrder());
+      assertDeployBefore(deployer2, deployer1);
+      assertDeployBefore(deployer3, deployer1);
+      assertDeployBefore(deployer7, deployer2);
+      assertDeployBefore(deployer7, deployer3);
+      assertDeployBefore(deployer4, deployer2);
+      assertDeployBefore(deployer4, deployer3);
+      assertDeployBefore(deployer5, deployer4);
+      assertDeployBefore(deployer5, deployer7);
+      assertDeployBefore(deployer6, deployer5);
+      assertDeployBefore(deployer6, deployer2);
+      assertDeployBefore(deployer6, deployer3);
+//      assertEquals(5, deployer4.getDeployOrder());
+//      assertEquals(6, deployer5.getDeployOrder());
+//      assertEquals(7, deployer6.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+      assertEquals(-1, deployer5.getUndeployOrder());
+      assertEquals(-1, deployer6.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+//      assertEquals(4, deployer7.getDeployOrder());
+      assertDeployBefore(deployer2, deployer1);
+      assertDeployBefore(deployer3, deployer1);
+      assertDeployBefore(deployer7, deployer2);
+      assertDeployBefore(deployer7, deployer3);
+      assertDeployBefore(deployer4, deployer2);
+      assertDeployBefore(deployer4, deployer3);
+      assertDeployBefore(deployer5, deployer4);
+      assertDeployBefore(deployer5, deployer7);
+      assertDeployBefore(deployer6, deployer5);
+      assertDeployBefore(deployer6, deployer2);
+      assertDeployBefore(deployer6, deployer3);
+//      assertEquals(5, deployer4.getDeployOrder());
+//      assertEquals(6, deployer5.getDeployOrder());
+//      assertEquals(7, deployer6.getDeployOrder());
+      assertEquals(14, deployer1.getUndeployOrder());
+      assertEquals(13, deployer2.getUndeployOrder());
+      assertEquals(12, deployer3.getUndeployOrder());
+//      assertEquals(11, deployer7.getUndeployOrder());
+//      assertEquals(10, deployer4.getUndeployOrder());
+//      assertEquals(9, deployer5.getUndeployOrder());
+//      assertEquals(8, deployer6.getUndeployOrder());
+      assertUndeployAfter(deployer2, deployer1);
+      assertUndeployAfter(deployer3, deployer1);
+      assertUndeployAfter(deployer7, deployer2);
+      assertUndeployAfter(deployer7, deployer3);
+      assertUndeployAfter(deployer4, deployer2);
+      assertUndeployAfter(deployer4, deployer3);
+      assertUndeployAfter(deployer5, deployer4);
+      assertUndeployAfter(deployer5, deployer7);
+      assertUndeployAfter(deployer6, deployer5);
+      assertUndeployAfter(deployer6, deployer2);
+      assertUndeployAfter(deployer6, deployer3);
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(15, deployer1.getDeployOrder());
+      assertEquals(16, deployer2.getDeployOrder());
+      assertEquals(17, deployer3.getDeployOrder());
+//      assertEquals(18, deployer7.getDeployOrder());
+      assertDeployBefore(deployer2, deployer1);
+      assertDeployBefore(deployer3, deployer1);
+      assertDeployBefore(deployer7, deployer2);
+      assertDeployBefore(deployer7, deployer3);
+      assertDeployBefore(deployer4, deployer2);
+      assertDeployBefore(deployer4, deployer3);
+      assertDeployBefore(deployer5, deployer4);
+      assertDeployBefore(deployer5, deployer7);
+      assertDeployBefore(deployer6, deployer5);
+      assertDeployBefore(deployer6, deployer2);
+      assertDeployBefore(deployer6, deployer3);
+//      assertEquals(19, deployer4.getDeployOrder());
+//      assertEquals(20, deployer5.getDeployOrder());
+//      assertEquals(21, deployer6.getDeployOrder());
+      assertEquals(14, deployer1.getUndeployOrder());
+      assertEquals(13, deployer2.getUndeployOrder());
+      assertEquals(12, deployer3.getUndeployOrder());
+//      assertEquals(11, deployer7.getUndeployOrder());
+//      assertEquals(10, deployer4.getUndeployOrder());
+//      assertEquals(9, deployer5.getUndeployOrder());
+//      assertEquals(8, deployer6.getUndeployOrder());
+      assertUndeployAfter(deployer2, deployer1);
+      assertUndeployAfter(deployer3, deployer1);
+      assertUndeployAfter(deployer7, deployer2);
+      assertUndeployAfter(deployer7, deployer3);
+      assertUndeployAfter(deployer4, deployer2);
+      assertUndeployAfter(deployer4, deployer3);
+      assertUndeployAfter(deployer5, deployer4);
+      assertUndeployAfter(deployer5, deployer7);
+      assertUndeployAfter(deployer6, deployer5);
+      assertUndeployAfter(deployer6, deployer2);
+      assertUndeployAfter(deployer6, deployer3);
+
+      main.removeDeployment(deployment);
+      main.process();
+   }
+
+   public void testDeployersOrder1() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      TestFlowDeployer deployer6 = new TestFlowDeployer( "6" );
+      deployer6.setInputs( "a11", "a12", "a13", "a14", "a33" );
+      addDeployer(main, deployer6);
+
+      TestFlowDeployer deployer5 = new TestFlowDeployer( "5" );
+      deployer5.setInputs( "a21", "a33", "a41" );
+      deployer5.setOutputs( "a33", "a51", "a52" );
+      addDeployer(main, deployer5);
+
+      TestFlowDeployer deployer4 = new TestFlowDeployer( "4" );
+      deployer4.setInputs( "a14", "a33" );
+      deployer4.setOutputs( "a14", "a33", "a41" );
+      addDeployer( main, deployer4 );
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer( "3" );
+      deployer3.setInputs( "a13", "a21" );
+      deployer3.setOutputs( "a32", "a33" );
+      addDeployer( main, deployer3 );
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer( "2" );
+      deployer2.setInputs( "a11", "a12" );
+      deployer2.setOutputs( "a12", "a21", "a22" );
+      addDeployer( main, deployer2 );
+
+      TestFlowDeployer deployer1 = new TestFlowDeployer( "1" );
+      deployer1.setOutputs( "a11", "a12", "a13", "a14" );
+      addDeployer( main, deployer1 );
+
+      Deployment deployment = createSimpleDeployment( "deployersOrderTest" );
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(5, deployer5.getDeployOrder());
+      assertEquals(6, deployer6.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+      assertEquals(-1, deployer5.getUndeployOrder());
+      assertEquals(-1, deployer6.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(5, deployer5.getDeployOrder());
+      assertEquals(6, deployer6.getDeployOrder());
+      assertEquals(12, deployer1.getUndeployOrder());
+      assertEquals(11, deployer2.getUndeployOrder());
+      assertEquals(10, deployer3.getUndeployOrder());
+      assertEquals(9, deployer4.getUndeployOrder());
+      assertEquals(8, deployer5.getUndeployOrder());
+      assertEquals(7, deployer6.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(13, deployer1.getDeployOrder());
+      assertEquals(14, deployer2.getDeployOrder());
+      assertEquals(15, deployer3.getDeployOrder());
+      assertEquals(16, deployer4.getDeployOrder());
+      assertEquals(17, deployer5.getDeployOrder());
+      assertEquals(18, deployer6.getDeployOrder());
+      assertEquals(12, deployer1.getUndeployOrder());
+      assertEquals(11, deployer2.getUndeployOrder());
+      assertEquals(10, deployer3.getUndeployOrder());
+      assertEquals(9, deployer4.getUndeployOrder());
+      assertEquals(8, deployer5.getUndeployOrder());
+      assertEquals(7, deployer6.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+   }
+
+   public void testRemovingOverlapping() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      // "1", "2", "3", "4" and "6" are provided by deployers in different stage
+      TestFlowDeployer deployer1 = new TestFlowDeployer( "WSEJBAdapterDeployer" );
+      deployer1.setInputs( "1", "2", "3", "4" );
+      deployer1.setOutputs( "5" );
+      addDeployer(main, deployer1);
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer( "WSTypeDeployer" );
+      deployer2.setInputs( "5", "4", "6" ); // note 6 is both input and output
+      deployer2.setOutputs( "6", "7" );
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer( "WSDeploymentDeployer" );
+      deployer3.setInputs( "6", "7" ); // note 6 is both input and output
+      deployer3.setOutputs( "8", "6" );
+      addDeployer( main, deployer3 );
+
+      TestFlowDeployer deployer4 = new TestFlowDeployer( "WSDeploymentAspectDeployer" );
+      deployer4.setInputs( "6", "7", "8" );  // note 6 is both input and output
+      deployer4.setOutputs( "9", "6", "0" );
+      addDeployer( main, deployer4 );
+
+      Deployment deployment = createSimpleDeployment( "deployersOrderTest" );
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(9, deployer1.getDeployOrder());
+      assertEquals(10, deployer2.getDeployOrder());
+      assertEquals(11, deployer3.getDeployOrder());
+      assertEquals(12, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+   }
+
+   public void testPartialOverlapping() throws Exception
+   {
+      DeployerClient main = createMainDeployer();
+
+      // "1", "2", are provided by other preceding deployers
+      TestFlowDeployer deployer1 = new TestFlowDeployer( "#1_12-2345" );
+      deployer1.setInputs( "1", "2" );
+      deployer1.setOutputs( "3", "5", "2", "4" );
+      addDeployer(main, deployer1);
+
+      TestFlowDeployer deployer2 = new TestFlowDeployer( "#2_125-246" );
+      deployer2.setInputs( "1", "5", "2" ); // depends on 5 (output of deployer1)
+      deployer2.setOutputs( "6", "2", "4" );
+      addDeployer(main, deployer2);
+
+      TestFlowDeployer deployer3 = new TestFlowDeployer( "#3_1256-247" );
+      deployer3.setInputs( "6", "1", "5", "2" ); // depends on 6 (output of deployer2) and 5 (output of deployer1)
+      deployer3.setOutputs( "7", "2", "4" );
+      addDeployer( main, deployer3 );
+
+      TestFlowDeployer deployer4 = new TestFlowDeployer( "#4_124-28" );
+      deployer4.setInputs( "1", "2", "4" ); // depends on 4 (output of deployer1, deployer2 and deployer3)
+      deployer4.setOutputs( "8", "2" );
+      addDeployer( main, deployer4 );
+
+      Deployment deployment = createSimpleDeployment( "deployersOrderTest" );
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(-1, deployer1.getUndeployOrder());
+      assertEquals(-1, deployer2.getUndeployOrder());
+      assertEquals(-1, deployer3.getUndeployOrder());
+      assertEquals(-1, deployer4.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+
+      assertEquals(1, deployer1.getDeployOrder());
+      assertEquals(2, deployer2.getDeployOrder());
+      assertEquals(3, deployer3.getDeployOrder());
+      assertEquals(4, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+
+      main.addDeployment(deployment);
+      main.process();
+
+      assertEquals(9, deployer1.getDeployOrder());
+      assertEquals(10, deployer2.getDeployOrder());
+      assertEquals(11, deployer3.getDeployOrder());
+      assertEquals(12, deployer4.getDeployOrder());
+      assertEquals(8, deployer1.getUndeployOrder());
+      assertEquals(7, deployer2.getUndeployOrder());
+      assertEquals(6, deployer3.getUndeployOrder());
+      assertEquals(5, deployer4.getUndeployOrder());
+
+      main.removeDeployment(deployment);
+      main.process();
+   }
+
+   public void testRealWorldAS6DeployersScenario() throws Exception
+   {
+      // THIS IS REAL WORLD SCENARIO - AS deployers with their dependencies
+      DeployerClient main = createMainDeployer();
+      AbstractDeployer deployer;
+      long start = System.currentTimeMillis();
+
+      // PARSE
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.annotations.ScanningMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.deployers.spi.annotations.ScanningMetaData", "org.jboss.deployers.plugins.annotations.AbstractScanningMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.AliasesParserDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentAliases" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DependenciesParserDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.hibernate.deployers.metadata.HibernateMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.xnio.metadata.XnioMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.security.microcontainer.beans.metadata.SecurityPolicyMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.logging.metadata.LoggingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.threads.metadata.ThreadsMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.aop.microcontainer.beans.metadata.AOPDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.AppParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.ear.spec.EarMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.JBossAppParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.AppClientParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.client.spec.ApplicationClientMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.JBossClientParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setInputs( "org.jboss.metadata.client.spec.ApplicationClientMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.client.jboss.JBossClientMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.PersistenceUnitParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.jpa.spec.PersistenceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.jpa.deployers.PersistenceParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.jpa.spec.PersistenceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.ManagedConnectionFactoryParserDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.RARParserDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.resource.metadata.RARDeploymentMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.security.deployers.AclConfigParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.security.acl.config.ACLConfiguration" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.security.deployers.XacmlConfigParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "javax.xml.bind.JAXBElement" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.SARDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.system.metadata.ServiceDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.varia.deployment.LegacyBeanShellDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.varia.deployment.BeanShellScript" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDescriptorDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.wsf.spi.metadata.webservices.WebservicesMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.AOPAnnotationMetaDataParserDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.aop.microcontainer.beans.metadata.AOPDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.EARContentsDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.WebAppParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.web.spec.WebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.WebAppFragmentParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.web.spec.WebFragmentMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.TldParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.web.spec.TldMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.JBossWebAppParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.EjbParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setOutputs( "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.JBossEjbParsingDeployer" );
+      deployer.setStage(DeploymentStages.PARSE);
+      deployer.setInputs( "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
+      deployer.setOutputs( "standardjboss.xml", "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ApplicationMetaData" );
+      addDeployer(main, deployer);
+
+      // POST_PARSE
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaData" );
+      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentDependencies" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DeploymentAliasesDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentAliases" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DeploymentDependencyDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentDependencies" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.EarClassLoaderDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.EjbClassLoaderDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.LegacyWebXmlLessDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.ManagedConnectionFactoryClassLoaderDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.ServiceClassLoaderDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.system.metadata.ServiceDeployment" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.tomcat.service.deployers.ClusteringDefaultsDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.tomcat.service.deployers.WarClassLoaderDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.PostJBossMetadataDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.PostJBossWebMetadataDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.WeldFilesDeployer" );
+      deployer.setStage(DeploymentStages.POST_PARSE);
+      deployer.setInputs( "org.jboss.weld.integration.deployer.ext.JBossWeldMetaData" );
+      deployer.setOutputs( "WELD_FILES", "WELD_CLASSPATH" );
+      addDeployer(main, deployer);
+
+      // PRE_DESCRIBE
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.plugins.classloading.ClassLoadingDefaultDeployer" );
+      deployer.setStage(DeploymentStages.PRE_DESCRIBE);
+      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      // DESCRIBE
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.classloader.InMemoryClassesDeployer" );
+      deployer.setStage(DeploymentStages.DESCRIBE);
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.seam.integration.microcontainer.deployers.SeamWebUrlIntegrationDeployer" );
+      deployer.setStage(DeploymentStages.DESCRIBE);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.cl.WeldFacesIntegrationDeployer" );
+      deployer.setStage(DeploymentStages.DESCRIBE);
+      deployer.setInputs( "WELD_FILES" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.classloader.VFSClassLoaderClassPathDeployer" );
+      deployer.setStage(DeploymentStages.DESCRIBE);
+      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.classloader.VFSClassLoaderDescribeDeployer" );
+      deployer.setStage(DeploymentStages.DESCRIBE);
+      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.dependency.Module" );
+      addDeployer(main, deployer);
+
+      // CLASSLOADER
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.plugins.classloading.AbstractLevelClassLoaderSystemDeployer" );
+      deployer.setStage(DeploymentStages.CLASSLOADER);
+      deployer.setInputs( "org.jboss.deployers.structure.spi.ClassLoaderFactory" );
+      deployer.setOutputs( "java.lang.ClassLoader" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.AOPClassLoaderDeployer" );
+      deployer.setStage(DeploymentStages.CLASSLOADER);
+      deployer.setInputs( "java.lang.ClassLoader" );
+      addDeployer(main, deployer);
+
+      // POST_CLASSLOADER
+
+      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.AOPDeploymentAopMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.aop.microcontainer.beans.metadata.AOPDeployment" );
+      deployer.setOutputs( "org.jboss.aop.asintegration.jboss5.AopMetaDataDeployerOutput" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.BeansDeploymentAopMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      deployer.setOutputs( "org.jboss.aop.asintegration.jboss5.AopMetaDataDeployerOutput" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.EarLibExcludeDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
+      deployer.setOutputs( "org.jboss.classloading.spi.visitor.ResourceFilter.recurse" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.annotations.FilteredAnnotationEnvironmentDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.deployers.spi.annotations.ScanningMetaData", "org.jboss.classloading.spi.visitor.ResourceFilter.resource", "org.jboss.classloading.spi.dependency.Module", "org.jboss.classloading.spi.visitor.ResourceFilter.recurse" );
+      deployer.setOutputs( "org.jboss.deployers.spi.annotations.AnnotationEnvironment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.EarSecurityDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
+      deployer.setOutputs( "jboss.jacc", "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.OptAnnotationMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.client.spec.ApplicationClientMetaData", "org.jboss.deployers.spi.annotations.AnnotationEnvironment", "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
+      deployer.setOutputs( "annotated.org.jboss.metadata.web.spec.WebMetaData", "annotated.org.jboss.metadata.ejb.spec.EjbJarMetaData", "annotated.org.jboss.metadata.client.spec.ApplicationClientMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.MergedJBossMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "annotated.org.jboss.metadata.ejb.spec.EjbJarMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
+      deployer.setOutputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.MergedJBossClientMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.client.jboss.JBossClientMetaData", "annotated.org.jboss.metadata.client.spec.ApplicationClientMetaData", "org.jboss.metadata.client.spec.ApplicationClientMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.client.jboss.JBossClientMetaData", "merged.org.jboss.metadata.client.jboss.JBossClientMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ha.framework.server.deployers.Ejb2HAPartitionDependencyDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ha.framework.server.deployers.Ejb3HAPartitionDependencyDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.StandardJBossMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "standardjboss.xml", "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "raw.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3MetadataProcessingDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "processed.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.EjbMetadataJndiPolicyDecoratorDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "processed.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "EjbMetadataJndiPolicyDecoratorDeployer" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.PostWebMetadataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "merged.org.jboss.metadata.web.jboss.JBossWebMetaData", "WELD_FILES", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.WeldEjbInterceptorMetadataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "WELD_FILES", "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.EjbSecurityDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "jboss.jacc", "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.WarAnnotationMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData" );
+      deployer.setOutputs( "annotated.org.jboss.metadata.web.spec.WebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.MergedJBossWebMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "annotated.org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "overlays.org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "order.org.jboss.metadata.web.spec.WebMetaData", "localscis.org.jboss.metadata.web.spec.WebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployment.MappedReferenceMetaDataResolverDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.client.jboss.JBossClientMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.deployment.spi.DeploymentEndpointResolver" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.ServletContainerInitializerDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "order.org.jboss.metadata.web.spec.WebMetaData", "localscis.org.jboss.metadata.web.spec.WebMetaData" );
+      deployer.setOutputs( "sci.org.jboss.metadata.web.spec.WebMetaData", "sci.handlestypes.org.jboss.metadata.web.spec.WebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.WarSecurityDeployer" );
+      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jboss.jacc", "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      // PRE_REAL
+
+      deployer = new TestDeployerAdapter( "org.jboss.beanvalidation.deployers.ValidatorFactoryDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      deployer.setOutputs( "javax.validation.ValidatorFactory" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3DependenciesDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.system.server.profileservice.persistence.deployer.ProfileServicePersistenceDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.EjbServicesDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      deployer.setInputs( "WELD_FILES", "org.jboss.weld.integration.deployer.env.BootstrapInfo" );
+      deployer.setOutputs( "BootstrapInfoEJB_SERVICES", "org.jboss.weld.integration.deployer.env.BootstrapInfo" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.WeldDiscoveryDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      deployer.setInputs( "org.jboss.weld.integration.deployer.ext.JBossWeldMetaData", "WELD_FILES", "WELD_CLASSPATH" );
+      deployer.setOutputs( "org.jboss.weld.integration.deployer.env.WeldDiscoveryEnvironment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.FlatDeploymentDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      deployer.setInputs( "WELD_FILES", "org.jboss.weld.integration.deployer.env.BootstrapInfo", "org.jboss.weld.integration.deployer.env.WeldDiscoveryEnvironment", "BootstrapInfoEJB_SERVICES" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData", "org.jboss.weld.integration.deployer.env.BootstrapInfo", "BootstrapInfoDEPLOYMENT" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.WeldBootstrapDeployer" );
+      deployer.setStage(DeploymentStages.PRE_REAL);
+      deployer.setInputs( "javax.validation.ValidatorFactory", "WELD_FILES", "org.jboss.weld.integration.deployer.env.BootstrapInfo" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      // REAL
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataFactoryDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.threads.metadata.ThreadsMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataFactoryDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.logging.metadata.LoggingMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataFactoryDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.xnio.metadata.XnioMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.CreateDestinationDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.system.metadata.ServiceMetaData", "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.EjbDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.ejb.deployers.EjbDeployment", "org.jboss.system.metadata.ServiceMetaData", "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3ClientDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.client.jboss.JBossClientMetaData" );
+      deployer.setOutputs( "org.jboss.ejb3.clientmodule.ClientENCInjectionContainer", "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData", "processed.org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.ejb3.Ejb3Deployment", "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.AliasDeploymentDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.kernel.spi.deployment.KernelDeployment", "org.jboss.beans.metadata.spi.NamedAliasMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.NamedAliasMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.endpoint.deployers.EJB3EndpointDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.ejb3.metrics.deployer.Ejb3MetricsDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.ejb3.Ejb3Deployment" );
+      deployer.setOutputs( "org.jboss.ejb3.metrics.deployer.Ejb3MetricsDeployer" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.hibernate.deployers.HibernateDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.hibernate.deployers.metadata.HibernateMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.jpa.deployers.PersistenceDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.jpa.spec.PersistenceMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.jpa.spec.PersistenceUnitMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.jpa.deployers.PersistenceUnitDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.jpa.spec.PersistenceUnitMetaData" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.KernelDeploymentDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.beans.metadata.spi.BeanMetaData", "org.jboss.kernel.spi.deployment.KernelDeployment" );
+      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.DeploymentAliasMetaDataDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.beans.metadata.spi.BeanMetaData", "org.jboss.beans.metadata.spi.NamedAliasMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.EarModuleJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.EjbModuleJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.JCAResourceJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.RarModuleJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.resource.metadata.RARDeploymentMetaData" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.ManagedConnectionFactoryDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
+      deployer.setOutputs( "org.jboss.system.metadata.ServiceDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.ServiceModuleJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.system.metadata.ServiceDeployment" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.RARDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.resource.metadata.RARDeploymentMetaData" );
+      deployer.setOutputs( "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.varia.deployment.LegacyBeanShellScriptDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.varia.deployment.BeanShellScript" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSEJBAdapterDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.ejb3.Ejb3Deployment", "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.ejb.deployers.EjbDeployment", "org.jboss.wsf.spi.metadata.webservices.WebservicesMetaData" );
+      deployer.setOutputs( "org.jboss.wsf.spi.deployment.integration.WebServiceDeployment" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSTypeDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.integration.WebServiceDeployment", "org.jboss.wsf.spi.metadata.webservices.WebservicesMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "org.jboss.wsf.spi.deployment.Deployment$DeploymentType" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "org.jboss.wsf.spi.deployment.Deployment$DeploymentType" );
+      deployer.setOutputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.EndpointMetrics", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.VFSRoot", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata", "jbossws.VirtualHosts" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.ContextRoot", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.ContextRoot", "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.URLPattern", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.EndpointAddress", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.EndpointName", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.EndpointName", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.RegisteredEndpoint", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.VirtualHosts" );
+      deployer.setOutputs( "jbossws.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.StackEndpointHandler", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.JAXBIntros", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.JAXBIntros", "jbossws.VFSRoot", "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.UnifiedMetaDataModel", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.JAXBIntros", "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.PublishedContract", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.InitializedMetaDataModel", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.StackEndpointHandler", "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.StackDescriptor", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.ContextProperties", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.WebMetaData", "org.jboss.wsf.spi.deployment.Deployment", "jbossws.StackDescriptor", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.ContextProperties" );
+      deployer.setOutputs( "jbossws.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.WebMetaData", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.JACCPermisions", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.WebMetaData", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.InjectionMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "jbossws.RegisteredEndpoint", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "jbossws.EndpointRecordProcessors", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
+      deployer.setOutputs( "jbossws.LifecycleHandler", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.WebModuleJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.web.tomcat.service.deployers.TomcatDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
+      deployer.setOutputs( "org.jboss.web.deployers.WarDeployment", "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.ServiceDeploymentDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.system.metadata.ServiceDeployment", "org.jboss.system.metadata.ServiceMetaData" );
+      deployer.setOutputs( "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.JMSResourceJSR77Deployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.system.metadata.ServiceMetaData" );
+      deployer.setOutputs( "javax.management.ObjectName" );
+      addDeployer(main, deployer);
+
+      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.ServiceDeployer" );
+      deployer.setStage(DeploymentStages.REAL);
+      deployer.setInputs( "org.jboss.system.metadata.ServiceMetaData" );
+      addDeployer(main, deployer);
+
+      long end = System.currentTimeMillis();
+      System.out.println("------------------------------------------------------------------------");
+      System.out.println("Deployer sorting (" + getClass().getSimpleName() +  ") took: " + (end - start) + " milliseconds");
+      System.out.println("------------------------------------------------------------------------");
+   }
+
+   private static void assertDeploy(TestFlowDeployer deployer)
+   {
+      assertTrue(deployer + " must deploy", deployer.getDeployOrder() > 0);
+   }
+
+   private static void assertDeployBefore(TestFlowDeployer after, TestFlowDeployer before)
+   {
+      assertTrue(before + " must deploy before " + after, after.getDeployOrder() > before.getDeployOrder());
+   }
+
+   private static void assertUndeploy(TestFlowDeployer deployer)
+   {
+      assertTrue(deployer + " must undeploy", deployer.getUndeployOrder() > 0);
+   }
+
+   private static void assertUndeployAfter(TestFlowDeployer after, TestFlowDeployer before)
+   {
+      assertTrue(before + " must undeploy after " + after, after.getUndeployOrder() < before.getUndeployOrder());
+   }
+}
\ No newline at end of file

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractSorterOrderingUnitTest.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractSorterOrderingUnitTest.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractSorterOrderingUnitTest.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/AbstractSorterOrderingUnitTest.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,49 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.deployers.deployer.test;
+
+import org.jboss.deployers.plugins.deployers.DeployersImpl;
+import org.jboss.deployers.plugins.sort.DeployerSorter;
+import org.jboss.deployers.plugins.sort.OldStagedSortedDeployers;
+
+/**
+ * Sorting via sorter.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public abstract class AbstractSorterOrderingUnitTest extends AbstractDeployerFlowUnitTest
+{
+   protected AbstractSorterOrderingUnitTest(String name)
+   {
+      super(name);
+   }
+
+   protected abstract DeployerSorter createSorter();
+
+   @Override
+   protected void applySortingChanges(DeployersImpl deployers)
+   {
+      OldStagedSortedDeployers sorter = new OldStagedSortedDeployers();
+      sorter.setSorter(createSorter());
+      deployers.setDeployersByStage(sorter);
+   }
+}
\ No newline at end of file

Modified: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DeployerFlowUnitTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DeployerFlowUnitTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DeployerFlowUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -23,1949 +23,29 @@
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.jboss.deployers.client.spi.DeployerClient;
-import org.jboss.deployers.client.spi.Deployment;
-import org.jboss.deployers.spi.deployer.helpers.AbstractDeployer;
-import org.jboss.deployers.spi.deployer.DeploymentStages;
-import org.jboss.test.deployers.AbstractDeployerTest;
-import org.jboss.test.deployers.deployer.support.TestDeployerAdapter;
-import org.jboss.test.deployers.deployer.support.TestFlowDeployer;
 
+import org.jboss.deployers.plugins.deployers.DeployersImpl;
+
 /**
  * DeployerOrderingUnitTestCase.
  *
- * @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @author <a href="mailto:ropalka at redhat.com">Richard Opalka</a>
- * @version $Revision: 1.1 $
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
  */
-public class DeployerFlowUnitTestCase extends AbstractDeployerTest
+public class DeployerFlowUnitTestCase extends AbstractDeployerFlowUnitTest
 {
-   public static Test suite()
-   {
-      return new TestSuite(DeployerFlowUnitTestCase.class);
-   }
-
    public DeployerFlowUnitTestCase(String name)
    {
       super(name);
    }
 
-   protected void setUp() throws Exception
+   public static Test suite()
    {
-      super.setUp();
-      TestFlowDeployer.reset();
+      return new TestSuite(DeployerFlowUnitTestCase.class);
    }
 
-   public void testSimpleInputOutputCorrectOrder() throws Exception
+   @Override
+   protected void applySortingChanges(DeployersImpl deployers)
    {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test");
-      addDeployer(main, deployer1);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test");
-      addDeployer(main, deployer2);
-
-      Deployment deployment = createSimpleDeployment("correctOrder");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(3, deployer2.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(5, deployer1.getDeployOrder());
-      assertEquals(6, deployer2.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(3, deployer2.getUndeployOrder());
+      // use default
    }
-
-   public void testSimpleInputOutputWrongOrder() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test");
-      addDeployer(main, deployer1);
-
-      Deployment deployment = createSimpleDeployment("wrongOrder");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(3, deployer2.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(5, deployer1.getDeployOrder());
-      assertEquals(6, deployer2.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(3, deployer2.getUndeployOrder());
-   }
-
-   public void testInputOutputLoop() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setInputs("input1");
-      deployer1.setOutputs("output1");
-      addDeployer(main, deployer1);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("output1");
-      deployer2.setOutputs("output2");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("output2");
-      deployer3.setOutputs("input1");
-      try
-      {
-         addDeployer(main, deployer3);
-         fail("Should not be here!");
-      }
-      catch (Throwable t)
-      {
-         checkThrowable(IllegalStateException.class, t);
-      }
-   }
-
-   public void testInputOutputTransient() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test");
-      addDeployer(main, deployer1);
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("test");
-      addDeployer(main, deployer3);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test");
-      deployer2.setOutputs("test");
-      addDeployer(main, deployer2);
-
-      Deployment deployment = createSimpleDeployment("transient");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(7, deployer1.getDeployOrder());
-      assertEquals(8, deployer2.getDeployOrder());
-      assertEquals(9, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-   }
-
-   public void testInputOutputTransient2() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setInputs("test");
-      deployer1.setOutputs("test");
-      addDeployer(main, deployer1);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test");
-      addDeployer(main, deployer2);
-
-      Deployment deployment = createSimpleDeployment("transient2");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(3, deployer2.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(5, deployer1.getDeployOrder());
-      assertEquals(6, deployer2.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(3, deployer2.getUndeployOrder());
-   }
-
-   public void testInputOutputMultipleTransient() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer4 = new TestFlowDeployer("4");
-      deployer4.setInputs("test");
-      addDeployer(main, deployer4);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test");
-      deployer2.setOutputs("test");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("test");
-      deployer3.setOutputs("test");
-      addDeployer(main, deployer3);
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test");
-      addDeployer(main, deployer1);
-
-      Deployment deployment = createSimpleDeployment("transient");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(9, deployer1.getDeployOrder());
-      assertEquals(10, deployer2.getDeployOrder());
-      assertEquals(11, deployer3.getDeployOrder());
-      assertEquals(12, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-   }
-
-   public void testMultipleOutput() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test1", "test2");
-      addDeployer(main, deployer1);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test1");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("test2");
-      addDeployer(main, deployer3);
-
-      Deployment deployment = createSimpleDeployment("MultipleOutput");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(7, deployer1.getDeployOrder());
-      assertEquals(8, deployer2.getDeployOrder());
-      assertEquals(9, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-   }
-
-   public void testMultipleInput() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("test1", "test2");
-      addDeployer(main, deployer3);
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test1");
-      addDeployer(main, deployer1);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setOutputs("test2");
-      addDeployer(main, deployer2);
-
-      Deployment deployment = createSimpleDeployment("MultipleInput");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(7, deployer1.getDeployOrder());
-      assertEquals(8, deployer2.getDeployOrder());
-      assertEquals(9, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-   }
-
-   public void testChain() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("test2");
-      addDeployer(main, deployer3);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("test1");
-      deployer2.setOutputs("test2");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test1");
-      addDeployer(main, deployer1);
-
-      Deployment deployment = createSimpleDeployment("Chain");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(7, deployer1.getDeployOrder());
-      assertEquals(8, deployer2.getDeployOrder());
-      assertEquals(9, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-   }
-
-   public void testComplicated() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer6 = new TestFlowDeployer("6");
-      deployer6.setInputs("test1", "test3");
-      addDeployer(main, deployer6);
-      TestFlowDeployer deployer5 = new TestFlowDeployer("5");
-      deployer5.setInputs("test3");
-      deployer5.setOutputs("test3");
-      addDeployer(main, deployer5);
-      TestFlowDeployer deployer4 = new TestFlowDeployer("4");
-      deployer4.setInputs("test2");
-      deployer4.setOutputs("test3");
-      addDeployer(main, deployer4);
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setOutputs("test2");
-      addDeployer(main, deployer3);
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setOutputs("test1");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setOutputs("test1");
-      addDeployer(main, deployer1);
-
-      Deployment deployment = createSimpleDeployment("Complicated");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(5, deployer5.getDeployOrder());
-      assertEquals(6, deployer6.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-      assertEquals(-1, deployer5.getUndeployOrder());
-      assertEquals(-1, deployer6.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(5, deployer5.getDeployOrder());
-      assertEquals(6, deployer6.getDeployOrder());
-      assertEquals(12, deployer1.getUndeployOrder());
-      assertEquals(11, deployer2.getUndeployOrder());
-      assertEquals(10, deployer3.getUndeployOrder());
-      assertEquals(9, deployer4.getUndeployOrder());
-      assertEquals(8, deployer5.getUndeployOrder());
-      assertEquals(7, deployer6.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(13, deployer1.getDeployOrder());
-      assertEquals(14, deployer2.getDeployOrder());
-      assertEquals(15, deployer3.getDeployOrder());
-      assertEquals(16, deployer4.getDeployOrder());
-      assertEquals(17, deployer5.getDeployOrder());
-      assertEquals(18, deployer6.getDeployOrder());
-      assertEquals(12, deployer1.getUndeployOrder());
-      assertEquals(11, deployer2.getUndeployOrder());
-      assertEquals(10, deployer3.getUndeployOrder());
-      assertEquals(9, deployer4.getUndeployOrder());
-      assertEquals(8, deployer5.getUndeployOrder());
-      assertEquals(7, deployer6.getUndeployOrder());
-   }
-
-   public void testIntermediateIsRelativelySorted() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer2 = new TestFlowDeployer("A");
-      deployer2.setInputs("test1");
-      addDeployer(main, deployer2);
-      TestFlowDeployer deployer3 = new TestFlowDeployer("B");
-      addDeployer(main, deployer3);
-      TestFlowDeployer deployer1 = new TestFlowDeployer("C");
-      deployer1.setOutputs("test1");
-      addDeployer(main, deployer1);
-
-      Deployment deployment = createSimpleDeployment("IntermediateIsRelativelySorted");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(7, deployer1.getDeployOrder());
-      assertEquals(8, deployer2.getDeployOrder());
-      assertEquals(9, deployer3.getDeployOrder());
-      assertEquals(6, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(4, deployer3.getUndeployOrder());
-   }
-
-   public void testTransitionOrdering() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("A");
-      deployer1.setInputs("3");
-      deployer1.setOutputs("4");
-      addDeployer(main, deployer1);
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer("B");
-      deployer2.setInputs("1");
-      deployer2.setOutputs("2");
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer3 = new TestFlowDeployer("C");
-      deployer3.setInputs("2");
-      deployer3.setOutputs("3");
-      addDeployer(main, deployer3);
-
-      Deployment deployment = createSimpleDeployment("TransitionOrdering");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(3, deployer1.getDeployOrder());
-      assertEquals(1, deployer2.getDeployOrder());
-      assertEquals(2, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(3, deployer1.getDeployOrder());
-      assertEquals(1, deployer2.getDeployOrder());
-      assertEquals(2, deployer3.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(6, deployer2.getUndeployOrder());
-      assertEquals(5, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(9, deployer1.getDeployOrder());
-      assertEquals(7, deployer2.getDeployOrder());
-      assertEquals(8, deployer3.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(6, deployer2.getUndeployOrder());
-      assertEquals(5, deployer3.getUndeployOrder());
-   }
-
-   public void testSymetricDots() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setInputs("X");
-      deployer1.setOutputs("B");
-      addDeployer(main, deployer1);
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setInputs("X");
-      deployer2.setOutputs("X");
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setInputs("A");
-      deployer3.setOutputs("X");
-      addDeployer(main, deployer3);
-
-      Deployment deployment = createSimpleDeployment("SymetricDots");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(3, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(1, deployer3.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(3, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(1, deployer3.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(9, deployer1.getDeployOrder());
-      assertEquals(8, deployer2.getDeployOrder());
-      assertEquals(7, deployer3.getDeployOrder());
-      assertEquals(4, deployer1.getUndeployOrder());
-      assertEquals(5, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-   }
-
-   public void testDoubleCycle() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer("A");
-      deployer2.setInputs("test2");
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer3 = new TestFlowDeployer("B");
-      addDeployer(main, deployer3);
-
-      TestFlowDeployer deployer6 = new TestFlowDeployer("C");
-      deployer6.setInputs("2ndcycle");
-      addDeployer(main, deployer6);
-
-      TestFlowDeployer deployer1 = new TestFlowDeployer("D");
-      deployer1.setOutputs("test1");
-      addDeployer(main, deployer1);
-
-      TestFlowDeployer deployer4 = new TestFlowDeployer("E");
-      addDeployer(main, deployer4);
-
-      TestFlowDeployer deployer5 = new TestFlowDeployer("F");
-      deployer5.setInputs("test1");
-      deployer5.setOutputs("test2");
-      addDeployer(main, deployer5);
-
-      TestFlowDeployer deployer7 = new TestFlowDeployer("G");
-      addDeployer(main, deployer7);
-
-      TestFlowDeployer deployer8 = new TestFlowDeployer("H");
-      deployer8.setOutputs("2ndcycle");
-      addDeployer(main, deployer8);
-
-      Deployment deployment = createSimpleDeployment("DoubleCycle");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer3.getDeployOrder());
-      assertEquals(2, deployer8.getDeployOrder());
-      assertEquals(3, deployer6.getDeployOrder());
-      assertEquals(4, deployer1.getDeployOrder());
-      assertEquals(5, deployer4.getDeployOrder());
-      assertEquals(6, deployer5.getDeployOrder());
-      assertEquals(7, deployer2.getDeployOrder());
-      assertEquals(8, deployer7.getDeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer8.getUndeployOrder());
-      assertEquals(-1, deployer6.getUndeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-      assertEquals(-1, deployer5.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer7.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer3.getDeployOrder());
-      assertEquals(2, deployer8.getDeployOrder());
-      assertEquals(3, deployer6.getDeployOrder());
-      assertEquals(4, deployer1.getDeployOrder());
-      assertEquals(5, deployer4.getDeployOrder());
-      assertEquals(6, deployer5.getDeployOrder());
-      assertEquals(7, deployer2.getDeployOrder());
-      assertEquals(8, deployer7.getDeployOrder());
-      assertEquals(16, deployer3.getUndeployOrder());
-      assertEquals(15, deployer8.getUndeployOrder());
-      assertEquals(14, deployer6.getUndeployOrder());
-      assertEquals(13, deployer1.getUndeployOrder());
-      assertEquals(12, deployer4.getUndeployOrder());
-      assertEquals(11, deployer5.getUndeployOrder());
-      assertEquals(10, deployer2.getUndeployOrder());
-      assertEquals(9, deployer7.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(17, deployer3.getDeployOrder());
-      assertEquals(18, deployer8.getDeployOrder());
-      assertEquals(19, deployer6.getDeployOrder());
-      assertEquals(20, deployer1.getDeployOrder());
-      assertEquals(21, deployer4.getDeployOrder());
-      assertEquals(22, deployer5.getDeployOrder());
-      assertEquals(23, deployer2.getDeployOrder());
-      assertEquals(24, deployer7.getDeployOrder());
-      assertEquals(16, deployer3.getUndeployOrder());
-      assertEquals(15, deployer8.getUndeployOrder());
-      assertEquals(14, deployer6.getUndeployOrder());
-      assertEquals(13, deployer1.getUndeployOrder());
-      assertEquals(12, deployer4.getUndeployOrder());
-      assertEquals(11, deployer5.getUndeployOrder());
-      assertEquals(10, deployer2.getUndeployOrder());
-      assertEquals(9, deployer7.getUndeployOrder());
-   }
-
-   public void testOrderedThenFlowWithPassThrough() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      TestFlowDeployer deployer4 = new TestFlowDeployer("4");
-      deployer4.setInputs("test");
-      addDeployer(main, deployer4);
-      
-      TestFlowDeployer deployer3 = new TestFlowDeployer("3");
-      deployer3.setRelativeOrder(3);
-      deployer3.setInputs("test");
-      deployer3.setOutputs("test");
-      addDeployer(main, deployer3);
-      
-      TestFlowDeployer deployer2 = new TestFlowDeployer("2");
-      deployer2.setRelativeOrder(2);
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer1 = new TestFlowDeployer("1");
-      deployer1.setRelativeOrder(1);
-      addDeployer(main, deployer1);
-
-      Deployment deployment = createSimpleDeployment("orderedThenFlowWithPassThrough");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(9, deployer1.getDeployOrder());
-      assertEquals(10, deployer2.getDeployOrder());
-      assertEquals(11, deployer3.getDeployOrder());
-      assertEquals(12, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-   }
-
-   public void testWebBeansOrder() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      TestFlowDeployer mcfcld = new TestFlowDeployer("ManagedConnectionFactory");
-      mcfcld.setInputs("ManagedConnectionFactoryDeploymentGroup");
-      mcfcld.setOutputs("CLMD");
-      addDeployer(main, mcfcld);
-
-      TestFlowDeployer postJBWMD = new TestFlowDeployer("PostJBossWebMetadataDeployer");
-      postJBWMD.setInputs("JBWMD", "CLMD");
-      postJBWMD.setOutputs("JBWMD", "CLMD");
-      addDeployer(main, postJBWMD);
-
-      TestFlowDeployer postEJB = new TestFlowDeployer("PostEjbJar");
-      postEJB.setInputs("EJB");
-      postEJB.setOutputs("EJB");
-      addDeployer(main, postEJB);
-
-      TestFlowDeployer warCL = new TestFlowDeployer("WarClassLoaderDeployer");
-      warCL.setInputs("JBWMD", "CLMD");
-      warCL.setOutputs("CLMD");
-      addDeployer(main, warCL);
-
-      TestFlowDeployer service = new TestFlowDeployer("ServiceCL");
-      service.setInputs("ServiceDeployment");
-      service.setOutputs("CLMD");
-      addDeployer(main, service);
-
-      TestFlowDeployer legacy = new TestFlowDeployer("Legacy");
-      legacy.setInputs("JBWMD", "WMD");
-      legacy.setOutputs("JBWMD");
-      addDeployer(main, legacy);
-
-      TestFlowDeployer cluster = new TestFlowDeployer("Cluster");
-      cluster.setInputs("JBWMD");
-      cluster.setOutputs("JBWMD");
-      addDeployer(main, cluster);
-
-      TestFlowDeployer postWMD = new TestFlowDeployer("PostWebMetadataDeployer");
-      postWMD.setInputs("JBWMD");
-      postWMD.setOutputs("JBWMD");
-      addDeployer(main, postWMD);
-   }
-
-   public void testWebServicesDeployersOrder() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      TestFlowDeployer deployer1 = new TestFlowDeployer("FakeDeployer");
-      deployer1.setOutputs("WebServicesMetaData", "WebServiceDeployment", "JBossWebMetaData" );
-      addDeployer(main, deployer1);
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer("WebServicesDeploymentTypeDeployer");
-      deployer2.setInputs("WebServicesMetaData", "WebServiceDeployment", "JBossWebMetaData" );
-      deployer2.setOutputs("DeploymentType", "JBossWebMetaData");
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer4 = new TestFlowDeployer("WebServiceDeployerPreJSE");
-      deployer4.setInputs("JBossWebMetaData", "DeploymentType");
-      deployer4.setOutputs("JBossWebMetaData");
-      addDeployer(main, deployer4);
-
-      TestFlowDeployer deployer5 = new TestFlowDeployer("AbstractWarDeployer");
-      deployer5.setInputs("JBossWebMetaData");
-      deployer5.setOutputs("WarDeployment");
-      addDeployer(main, deployer5);
-
-      TestFlowDeployer deployer6 = new TestFlowDeployer("ServiceCL");
-      deployer6.setInputs("DeploymentType", "WarDeployment");
-      addDeployer(main, deployer6);
-
-      // #2 duplicate
-      TestFlowDeployer deployer3 = new TestFlowDeployer("WebServicesDeploymentTypeDeployer2");
-      deployer3.setInputs("WebServicesMetaData", "WebServiceDeployment", "JBossWebMetaData" );
-      deployer3.setOutputs("DeploymentType", "JBossWebMetaData");
-      addDeployer(main, deployer3);
-
-      // #4 duplicate
-      TestFlowDeployer deployer7 = new TestFlowDeployer("WebServiceDeployerEJB");
-      deployer7.setInputs("JBossWebMetaData", "DeploymentType");
-      deployer7.setOutputs("JBossWebMetaData");
-      addDeployer(main, deployer7);
-
-      Deployment deployment = createSimpleDeployment("testWSDeploymentOrder");
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer7.getDeployOrder());
-      assertEquals(5, deployer4.getDeployOrder());
-      assertEquals(6, deployer5.getDeployOrder());
-      assertEquals(7, deployer6.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-      assertEquals(-1, deployer5.getUndeployOrder());
-      assertEquals(-1, deployer6.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer7.getDeployOrder());
-      assertEquals(5, deployer4.getDeployOrder());
-      assertEquals(6, deployer5.getDeployOrder());
-      assertEquals(7, deployer6.getDeployOrder());
-      assertEquals(14, deployer1.getUndeployOrder());
-      assertEquals(13, deployer2.getUndeployOrder());
-      assertEquals(12, deployer3.getUndeployOrder());
-      assertEquals(11, deployer7.getUndeployOrder());
-      assertEquals(10, deployer4.getUndeployOrder());
-      assertEquals(9, deployer5.getUndeployOrder());
-      assertEquals(8, deployer6.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(15, deployer1.getDeployOrder());
-      assertEquals(16, deployer2.getDeployOrder());
-      assertEquals(17, deployer3.getDeployOrder());
-      assertEquals(18, deployer7.getDeployOrder());
-      assertEquals(19, deployer4.getDeployOrder());
-      assertEquals(20, deployer5.getDeployOrder());
-      assertEquals(21, deployer6.getDeployOrder());
-      assertEquals(14, deployer1.getUndeployOrder());
-      assertEquals(13, deployer2.getUndeployOrder());
-      assertEquals(12, deployer3.getUndeployOrder());
-      assertEquals(11, deployer7.getUndeployOrder());
-      assertEquals(10, deployer4.getUndeployOrder());
-      assertEquals(9, deployer5.getUndeployOrder());
-      assertEquals(8, deployer6.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-   }
-
-   public void testDeployersOrder1() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      TestFlowDeployer deployer6 = new TestFlowDeployer( "6" );
-      deployer6.setInputs( "a11", "a12", "a13", "a14", "a33" );
-      addDeployer(main, deployer6);
-
-      TestFlowDeployer deployer5 = new TestFlowDeployer( "5" );
-      deployer5.setInputs( "a21", "a33", "a41" );
-      deployer5.setOutputs( "a33", "a51", "a52" );
-      addDeployer(main, deployer5);
-
-      TestFlowDeployer deployer4 = new TestFlowDeployer( "4" );
-      deployer4.setInputs( "a14", "a33" );
-      deployer4.setOutputs( "a14", "a33", "a41" );
-      addDeployer( main, deployer4 );
-
-      TestFlowDeployer deployer3 = new TestFlowDeployer( "3" );
-      deployer3.setInputs( "a13", "a21" );
-      deployer3.setOutputs( "a32", "a33" );
-      addDeployer( main, deployer3 );
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer( "2" );
-      deployer2.setInputs( "a11", "a12" );
-      deployer2.setOutputs( "a12", "a21", "a22" );
-      addDeployer( main, deployer2 );
-
-      TestFlowDeployer deployer1 = new TestFlowDeployer( "1" );
-      deployer1.setOutputs( "a11", "a12", "a13", "a14" );
-      addDeployer( main, deployer1 );
-
-      Deployment deployment = createSimpleDeployment( "deployersOrderTest" );
-      main.addDeployment(deployment);
-      main.process();
-      
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(5, deployer5.getDeployOrder());
-      assertEquals(6, deployer6.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-      assertEquals(-1, deployer5.getUndeployOrder());
-      assertEquals(-1, deployer6.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(5, deployer5.getDeployOrder());
-      assertEquals(6, deployer6.getDeployOrder());
-      assertEquals(12, deployer1.getUndeployOrder());
-      assertEquals(11, deployer2.getUndeployOrder());
-      assertEquals(10, deployer3.getUndeployOrder());
-      assertEquals(9, deployer4.getUndeployOrder());
-      assertEquals(8, deployer5.getUndeployOrder());
-      assertEquals(7, deployer6.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(13, deployer1.getDeployOrder());
-      assertEquals(14, deployer2.getDeployOrder());
-      assertEquals(15, deployer3.getDeployOrder());
-      assertEquals(16, deployer4.getDeployOrder());
-      assertEquals(17, deployer5.getDeployOrder());
-      assertEquals(18, deployer6.getDeployOrder());
-      assertEquals(12, deployer1.getUndeployOrder());
-      assertEquals(11, deployer2.getUndeployOrder());
-      assertEquals(10, deployer3.getUndeployOrder());
-      assertEquals(9, deployer4.getUndeployOrder());
-      assertEquals(8, deployer5.getUndeployOrder());
-      assertEquals(7, deployer6.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-   }
-
-   public void testRemovingOverlapping() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      // "1", "2", "3", "4" and "6" are provided by deployers in different stage
-      TestFlowDeployer deployer1 = new TestFlowDeployer( "WSEJBAdapterDeployer" );
-      deployer1.setInputs( "1", "2", "3", "4" );
-      deployer1.setOutputs( "5" );
-      addDeployer(main, deployer1);
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer( "WSTypeDeployer" );
-      deployer2.setInputs( "5", "4", "6" ); // note 6 is both input and output
-      deployer2.setOutputs( "6", "7" );
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer3 = new TestFlowDeployer( "WSDeploymentDeployer" );
-      deployer3.setInputs( "6", "7" ); // note 6 is both input and output
-      deployer3.setOutputs( "8", "6" );
-      addDeployer( main, deployer3 );
-
-      TestFlowDeployer deployer4 = new TestFlowDeployer( "WSDeploymentAspectDeployer" );
-      deployer4.setInputs( "6", "7", "8" );  // note 6 is both input and output
-      deployer4.setOutputs( "9", "6", "0" );
-      addDeployer( main, deployer4 );
-
-      Deployment deployment = createSimpleDeployment( "deployersOrderTest" );
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(9, deployer1.getDeployOrder());
-      assertEquals(10, deployer2.getDeployOrder());
-      assertEquals(11, deployer3.getDeployOrder());
-      assertEquals(12, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-   }
-
-   public void testPartialOverlapping() throws Exception
-   {
-      DeployerClient main = createMainDeployer();
-
-      // "1", "2", are provided by other preceding deployers
-      TestFlowDeployer deployer1 = new TestFlowDeployer( "Deployer" );
-      deployer1.setInputs( "1", "2" );
-      deployer1.setOutputs( "3", "5", "2", "4" );
-      addDeployer(main, deployer1);
-
-      TestFlowDeployer deployer2 = new TestFlowDeployer( "Deployer" );
-      deployer2.setInputs( "1", "5", "2" ); // depends on 5 (output of deployer1)
-      deployer2.setOutputs( "6", "2", "4" );
-      addDeployer(main, deployer2);
-
-      TestFlowDeployer deployer3 = new TestFlowDeployer( "Deployer" );
-      deployer3.setInputs( "6", "1", "5", "2" ); // depends on 6 (output of deployer2) and 5 (output of deployer1)
-      deployer3.setOutputs( "7", "2", "4" );
-      addDeployer( main, deployer3 );
-
-      TestFlowDeployer deployer4 = new TestFlowDeployer( "Deployer" );
-      deployer4.setInputs( "1", "2", "4" ); // depends on 4 (output of deployer1, deployer2 and deployer3)
-      deployer4.setOutputs( "8", "2" );
-      addDeployer( main, deployer4 );
-
-      Deployment deployment = createSimpleDeployment( "deployersOrderTest" );
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(-1, deployer1.getUndeployOrder());
-      assertEquals(-1, deployer2.getUndeployOrder());
-      assertEquals(-1, deployer3.getUndeployOrder());
-      assertEquals(-1, deployer4.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-
-      assertEquals(1, deployer1.getDeployOrder());
-      assertEquals(2, deployer2.getDeployOrder());
-      assertEquals(3, deployer3.getDeployOrder());
-      assertEquals(4, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-
-      main.addDeployment(deployment);
-      main.process();
-
-      assertEquals(9, deployer1.getDeployOrder());
-      assertEquals(10, deployer2.getDeployOrder());
-      assertEquals(11, deployer3.getDeployOrder());
-      assertEquals(12, deployer4.getDeployOrder());
-      assertEquals(8, deployer1.getUndeployOrder());
-      assertEquals(7, deployer2.getUndeployOrder());
-      assertEquals(6, deployer3.getUndeployOrder());
-      assertEquals(5, deployer4.getUndeployOrder());
-
-      main.removeDeployment(deployment);
-      main.process();
-   }
-   
-   public void testRealWorldAS6DeployersScenario() throws Exception
-   {
-      // THIS IS REAL WORLD SCENARIO - AS deployers with their dependencies
-      DeployerClient main = createMainDeployer();
-      AbstractDeployer deployer = null;
-      long start = System.currentTimeMillis();
-
-      // PARSE
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.annotations.ScanningMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.deployers.spi.annotations.ScanningMetaData", "org.jboss.deployers.plugins.annotations.AbstractScanningMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.AliasesParserDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentAliases" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DependenciesParserDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.hibernate.deployers.metadata.HibernateMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.xnio.metadata.XnioMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.security.microcontainer.beans.metadata.SecurityPolicyMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.logging.metadata.LoggingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.threads.metadata.ThreadsMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.aop.microcontainer.beans.metadata.AOPDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.AppParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.ear.spec.EarMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.JBossAppParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.AppClientParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.client.spec.ApplicationClientMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.JBossClientParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setInputs( "org.jboss.metadata.client.spec.ApplicationClientMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.client.jboss.JBossClientMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.PersistenceUnitParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.jpa.spec.PersistenceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.jpa.deployers.PersistenceParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.jpa.spec.PersistenceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.ManagedConnectionFactoryParserDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.RARParserDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.resource.metadata.RARDeploymentMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.security.deployers.AclConfigParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.security.acl.config.ACLConfiguration" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.security.deployers.XacmlConfigParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "javax.xml.bind.JAXBElement" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.SARDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.system.metadata.ServiceDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.varia.deployment.LegacyBeanShellDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.varia.deployment.BeanShellScript" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDescriptorDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.wsf.spi.metadata.webservices.WebservicesMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.AOPAnnotationMetaDataParserDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.aop.microcontainer.beans.metadata.AOPDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.EARContentsDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.WebAppParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.web.spec.WebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.WebAppFragmentParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.web.spec.WebFragmentMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.TldParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.web.spec.TldMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.JBossWebAppParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.EjbParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setOutputs( "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.JBossEjbParsingDeployer" );
-      deployer.setStage(DeploymentStages.PARSE);
-      deployer.setInputs( "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
-      deployer.setOutputs( "standardjboss.xml", "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ApplicationMetaData" );
-      addDeployer(main, deployer);
-
-      // POST_PARSE
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaData" );
-      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentDependencies" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DeploymentAliasesDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentAliases" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.dependency.DeploymentDependencyDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.deployers.vfs.plugins.dependency.DeploymentDependencies" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.EarClassLoaderDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.EjbClassLoaderDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.LegacyWebXmlLessDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.ManagedConnectionFactoryClassLoaderDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.ServiceClassLoaderDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.system.metadata.ServiceDeployment" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.tomcat.service.deployers.ClusteringDefaultsDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.tomcat.service.deployers.WarClassLoaderDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.PostJBossMetadataDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.PostJBossWebMetadataDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.WeldFilesDeployer" );
-      deployer.setStage(DeploymentStages.POST_PARSE);
-      deployer.setInputs( "org.jboss.weld.integration.deployer.ext.JBossWeldMetaData" );
-      deployer.setOutputs( "WELD_FILES", "WELD_CLASSPATH" );
-      addDeployer(main, deployer);
-
-      // PRE_DESCRIBE
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.plugins.classloading.ClassLoadingDefaultDeployer" );
-      deployer.setStage(DeploymentStages.PRE_DESCRIBE);
-      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      // DESCRIBE
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.classloader.InMemoryClassesDeployer" );
-      deployer.setStage(DeploymentStages.DESCRIBE);
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.seam.integration.microcontainer.deployers.SeamWebUrlIntegrationDeployer" );
-      deployer.setStage(DeploymentStages.DESCRIBE);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.cl.WeldFacesIntegrationDeployer" );
-      deployer.setStage(DeploymentStages.DESCRIBE);
-      deployer.setInputs( "WELD_FILES" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.classloader.VFSClassLoaderClassPathDeployer" );
-      deployer.setStage(DeploymentStages.DESCRIBE);
-      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.classloader.VFSClassLoaderDescribeDeployer" );
-      deployer.setStage(DeploymentStages.DESCRIBE);
-      deployer.setInputs( "org.jboss.classloading.spi.metadata.ClassLoadingMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.dependency.Module" );
-      addDeployer(main, deployer);
-
-      // CLASSLOADER
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.plugins.classloading.AbstractLevelClassLoaderSystemDeployer" );
-      deployer.setStage(DeploymentStages.CLASSLOADER);
-      deployer.setInputs( "org.jboss.deployers.structure.spi.ClassLoaderFactory" );
-      deployer.setOutputs( "java.lang.ClassLoader" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.AOPClassLoaderDeployer" );
-      deployer.setStage(DeploymentStages.CLASSLOADER);
-      deployer.setInputs( "java.lang.ClassLoader" );
-      addDeployer(main, deployer);
-
-      // POST_CLASSLOADER
-
-      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.AOPDeploymentAopMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.aop.microcontainer.beans.metadata.AOPDeployment" );
-      deployer.setOutputs( "org.jboss.aop.asintegration.jboss5.AopMetaDataDeployerOutput" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.aop.asintegration.jboss5.BeansDeploymentAopMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      deployer.setOutputs( "org.jboss.aop.asintegration.jboss5.AopMetaDataDeployerOutput" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.EarLibExcludeDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
-      deployer.setOutputs( "org.jboss.classloading.spi.visitor.ResourceFilter.recurse" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.plugins.annotations.FilteredAnnotationEnvironmentDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.deployers.spi.annotations.ScanningMetaData", "org.jboss.classloading.spi.visitor.ResourceFilter.resource", "org.jboss.classloading.spi.dependency.Module", "org.jboss.classloading.spi.visitor.ResourceFilter.recurse" );
-      deployer.setOutputs( "org.jboss.deployers.spi.annotations.AnnotationEnvironment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.EarSecurityDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
-      deployer.setOutputs( "jboss.jacc", "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.OptAnnotationMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.client.spec.ApplicationClientMetaData", "org.jboss.deployers.spi.annotations.AnnotationEnvironment", "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
-      deployer.setOutputs( "annotated.org.jboss.metadata.web.spec.WebMetaData", "annotated.org.jboss.metadata.ejb.spec.EjbJarMetaData", "annotated.org.jboss.metadata.client.spec.ApplicationClientMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.MergedJBossMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "annotated.org.jboss.metadata.ejb.spec.EjbJarMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.spec.EjbJarMetaData" );
-      deployer.setOutputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.MergedJBossClientMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.client.jboss.JBossClientMetaData", "annotated.org.jboss.metadata.client.spec.ApplicationClientMetaData", "org.jboss.metadata.client.spec.ApplicationClientMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.client.jboss.JBossClientMetaData", "merged.org.jboss.metadata.client.jboss.JBossClientMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ha.framework.server.deployers.Ejb2HAPartitionDependencyDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ha.framework.server.deployers.Ejb3HAPartitionDependencyDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.StandardJBossMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "standardjboss.xml", "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "raw.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3MetadataProcessingDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "processed.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.EjbMetadataJndiPolicyDecoratorDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "processed.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "EjbMetadataJndiPolicyDecoratorDeployer" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.PostWebMetadataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "merged.org.jboss.metadata.web.jboss.JBossWebMetaData", "WELD_FILES", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.metadata.WeldEjbInterceptorMetadataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "WELD_FILES", "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.EjbSecurityDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "jboss.jacc", "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.WarAnnotationMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.web.spec.WebMetaData" );
-      deployer.setOutputs( "annotated.org.jboss.metadata.web.spec.WebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.MergedJBossWebMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "annotated.org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "overlays.org.jboss.metadata.web.spec.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "order.org.jboss.metadata.web.spec.WebMetaData", "localscis.org.jboss.metadata.web.spec.WebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployment.MappedReferenceMetaDataResolverDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.client.jboss.JBossClientMetaData", "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.deployment.spi.DeploymentEndpointResolver" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.ServletContainerInitializerDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "order.org.jboss.metadata.web.spec.WebMetaData", "localscis.org.jboss.metadata.web.spec.WebMetaData" );
-      deployer.setOutputs( "sci.org.jboss.metadata.web.spec.WebMetaData", "sci.handlestypes.org.jboss.metadata.web.spec.WebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.deployers.WarSecurityDeployer" );
-      deployer.setStage(DeploymentStages.POST_CLASSLOADER);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jboss.jacc", "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      // PRE_REAL
-
-      deployer = new TestDeployerAdapter( "org.jboss.beanvalidation.deployers.ValidatorFactoryDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      deployer.setOutputs( "javax.validation.ValidatorFactory" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3DependenciesDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.deployers.vfs.plugins.dependency.DependenciesMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.system.server.profileservice.persistence.deployer.ProfileServicePersistenceDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.EjbServicesDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      deployer.setInputs( "WELD_FILES", "org.jboss.weld.integration.deployer.env.BootstrapInfo" );
-      deployer.setOutputs( "BootstrapInfoEJB_SERVICES", "org.jboss.weld.integration.deployer.env.BootstrapInfo" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.WeldDiscoveryDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      deployer.setInputs( "org.jboss.weld.integration.deployer.ext.JBossWeldMetaData", "WELD_FILES", "WELD_CLASSPATH" );
-      deployer.setOutputs( "org.jboss.weld.integration.deployer.env.WeldDiscoveryEnvironment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.FlatDeploymentDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      deployer.setInputs( "WELD_FILES", "org.jboss.weld.integration.deployer.env.BootstrapInfo", "org.jboss.weld.integration.deployer.env.WeldDiscoveryEnvironment", "BootstrapInfoEJB_SERVICES" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData", "org.jboss.weld.integration.deployer.env.BootstrapInfo", "BootstrapInfoDEPLOYMENT" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.weld.integration.deployer.env.WeldBootstrapDeployer" );
-      deployer.setStage(DeploymentStages.PRE_REAL);
-      deployer.setInputs( "javax.validation.ValidatorFactory", "WELD_FILES", "org.jboss.weld.integration.deployer.env.BootstrapInfo" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      // REAL
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataFactoryDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.threads.metadata.ThreadsMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataFactoryDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.logging.metadata.LoggingMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataFactoryDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.xnio.metadata.XnioMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.CreateDestinationDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.system.metadata.ServiceMetaData", "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb.deployers.EjbDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.ejb.deployers.EjbDeployment", "org.jboss.system.metadata.ServiceMetaData", "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3ClientDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.client.jboss.JBossClientMetaData" );
-      deployer.setOutputs( "org.jboss.ejb3.clientmodule.ClientENCInjectionContainer", "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.deployers.Ejb3Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData", "processed.org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.ejb3.Ejb3Deployment", "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.AliasDeploymentDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.kernel.spi.deployment.KernelDeployment", "org.jboss.beans.metadata.spi.NamedAliasMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.NamedAliasMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.endpoint.deployers.EJB3EndpointDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.ejb3.metrics.deployer.Ejb3MetricsDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.ejb3.Ejb3Deployment" );
-      deployer.setOutputs( "org.jboss.ejb3.metrics.deployer.Ejb3MetricsDeployer" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.hibernate.deployers.HibernateDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.hibernate.deployers.metadata.HibernateMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.jpa.deployers.PersistenceDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.jpa.spec.PersistenceMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.jpa.spec.PersistenceUnitMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.jpa.deployers.PersistenceUnitDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.jpa.spec.PersistenceUnitMetaData" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.KernelDeploymentDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.beans.metadata.spi.BeanMetaData", "org.jboss.kernel.spi.deployment.KernelDeployment" );
-      deployer.setOutputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.beans.metadata.spi.BeanMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.deployers.vfs.deployer.kernel.DeploymentAliasMetaDataDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.beans.metadata.spi.BeanMetaData", "org.jboss.beans.metadata.spi.NamedAliasMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.EarModuleJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.ear.jboss.JBossAppMetaData" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.EjbModuleJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.ejb.jboss.JBossMetaData" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.JCAResourceJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.RarModuleJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.resource.metadata.RARDeploymentMetaData" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.ManagedConnectionFactoryDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup" );
-      deployer.setOutputs( "org.jboss.system.metadata.ServiceDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.ServiceModuleJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.system.metadata.ServiceDeployment" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.resource.deployers.RARDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.resource.metadata.RARDeploymentMetaData" );
-      deployer.setOutputs( "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.varia.deployment.LegacyBeanShellScriptDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.varia.deployment.BeanShellScript" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSEJBAdapterDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.ejb3.Ejb3Deployment", "merged.org.jboss.metadata.ejb.jboss.JBossMetaData", "org.jboss.ejb.deployers.EjbDeployment", "org.jboss.wsf.spi.metadata.webservices.WebservicesMetaData" );
-      deployer.setOutputs( "org.jboss.wsf.spi.deployment.integration.WebServiceDeployment" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSTypeDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.integration.WebServiceDeployment", "org.jboss.wsf.spi.metadata.webservices.WebservicesMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "org.jboss.wsf.spi.deployment.Deployment$DeploymentType" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "org.jboss.wsf.spi.deployment.Deployment$DeploymentType" );
-      deployer.setOutputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.EndpointMetrics", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.VFSRoot", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata", "jbossws.VirtualHosts" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.ContextRoot", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.ContextRoot", "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.URLPattern", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.EndpointAddress", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.EndpointName", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.EndpointName", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.RegisteredEndpoint", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.VirtualHosts" );
-      deployer.setOutputs( "jbossws.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.StackEndpointHandler", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.JAXBIntros", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.JAXBIntros", "jbossws.VFSRoot", "jbossws.URLPattern", "org.jboss.wsf.spi.deployment.Deployment", "jbossws.ContainerMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.UnifiedMetaDataModel", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.JAXBIntros", "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.PublishedContract", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.InitializedMetaDataModel", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.StackEndpointHandler", "jbossws.UnifiedMetaDataModel", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.StackDescriptor", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.ContextProperties", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.WebMetaData", "org.jboss.wsf.spi.deployment.Deployment", "jbossws.StackDescriptor", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.ContextProperties" );
-      deployer.setOutputs( "jbossws.WebMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.WebMetaData", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.JACCPermisions", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.WebMetaData", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.InjectionMetaData", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "jbossws.RegisteredEndpoint", "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "jbossws.EndpointRecordProcessors", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.webservices.integration.deployers.WSDeploymentAspectDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.wsf.spi.deployment.Deployment", "org.jboss.metadata.web.jboss.JBossWebMetaData", "jbossws.metadata" );
-      deployer.setOutputs( "jbossws.LifecycleHandler", "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.WebModuleJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.web.tomcat.service.deployers.TomcatDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.metadata.web.jboss.JBossWebMetaData" );
-      deployer.setOutputs( "org.jboss.web.deployers.WarDeployment", "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.ServiceDeploymentDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.system.metadata.ServiceDeployment", "org.jboss.system.metadata.ServiceMetaData" );
-      deployer.setOutputs( "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.management.j2ee.deployers.JMSResourceJSR77Deployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.system.metadata.ServiceMetaData" );
-      deployer.setOutputs( "javax.management.ObjectName" );
-      addDeployer(main, deployer);
-
-      deployer = new TestDeployerAdapter( "org.jboss.system.deployers.ServiceDeployer" );
-      deployer.setStage(DeploymentStages.REAL);
-      deployer.setInputs( "org.jboss.system.metadata.ServiceMetaData" );
-      addDeployer(main, deployer);
-
-      long end = System.currentTimeMillis();
-      System.out.println("---------------------------------------------------------");
-      System.out.println( "Domino sorting took: " + (end - start) + " milliseconds" );
-      System.out.println("---------------------------------------------------------");
-   }
-   
 }

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DominoOrderingUnitTestCase.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DominoOrderingUnitTestCase.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DominoOrderingUnitTestCase.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/DominoOrderingUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,52 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.deployers.deployer.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.jboss.deployers.plugins.sort.DeployerSorter;
+import org.jboss.deployers.plugins.sort.DominoDeployerSorter;
+
+/**
+ * Old domino sorting.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class DominoOrderingUnitTestCase extends AbstractSorterOrderingUnitTest
+{
+   public DominoOrderingUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   public static Test suite()
+   {
+      return new TestSuite(DominoOrderingUnitTestCase.class);
+   }
+
+   @Override
+   protected DeployerSorter createSorter()
+   {
+      return new DominoDeployerSorter();
+   }
+}
\ No newline at end of file

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/IndexingOrderingUnitTestCase.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/IndexingOrderingUnitTestCase.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/IndexingOrderingUnitTestCase.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/IndexingOrderingUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,53 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.deployers.deployer.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.jboss.deployers.plugins.deployers.DeployersImpl;
+import org.jboss.deployers.plugins.sort.NewStagedSortedDeployers;
+import org.jboss.deployers.plugins.sort.StagedSortedDeployers;
+
+/**
+ * Sorting via indexing.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class IndexingOrderingUnitTestCase extends AbstractDeployerFlowUnitTest
+{
+   public IndexingOrderingUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   public static Test suite()
+   {
+      return new TestSuite(IndexingOrderingUnitTestCase.class);
+   }
+
+   @Override
+   protected void applySortingChanges(DeployersImpl deployers)
+   {
+      StagedSortedDeployers sorter = new NewStagedSortedDeployers();
+      deployers.setDeployersByStage(sorter);
+   }
+}
\ No newline at end of file

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/KahnOrderingUnitTestCase.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/KahnOrderingUnitTestCase.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/KahnOrderingUnitTestCase.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/KahnOrderingUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,52 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.deployers.deployer.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.jboss.deployers.plugins.sort.DeployerSorter;
+import org.jboss.deployers.plugins.sort.KahnDeployerSorter;
+
+/**
+ * Kahn topological sorting.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class KahnOrderingUnitTestCase extends AbstractSorterOrderingUnitTest
+{
+   public KahnOrderingUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   public static Test suite()
+   {
+      return new TestSuite(KahnOrderingUnitTestCase.class);
+   }
+
+   @Override
+   protected DeployerSorter createSorter()
+   {
+      return new KahnDeployerSorter();
+   }
+}
\ No newline at end of file

Copied: projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java (from rev 98958, projects/jboss-deployers/trunk/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-impl/src/test/java/org/jboss/test/deployers/deployer/test/TopologicalOrderingUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,58 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.deployers.deployer.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.jboss.deployers.plugins.sort.DeployerSorter;
+import org.jboss.deployers.plugins.sort.TopologicalDeployerSorter;
+
+/**
+ * Simple topological sorting.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class TopologicalOrderingUnitTestCase extends AbstractSorterOrderingUnitTest
+{
+   public TopologicalOrderingUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   public static Test suite()
+   {
+      return new TestSuite(TopologicalOrderingUnitTestCase.class);
+   }
+
+   @Override
+   protected DeployerSorter createSorter()
+   {
+      return new TopologicalDeployerSorter();
+   }
+
+   @Override
+   public void testDeployersOrder1() throws Exception
+   {
+      // TODO - how much do we allow pass-through to participate in ordering?
+   }
+}
\ No newline at end of file

Modified: projects/jboss-deployers/branches/vfs3/deployers-spi/src/main/java/org/jboss/deployers/spi/deployer/helpers/AbstractDeployer.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-spi/src/main/java/org/jboss/deployers/spi/deployer/helpers/AbstractDeployer.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-spi/src/main/java/org/jboss/deployers/spi/deployer/helpers/AbstractDeployer.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -42,7 +42,7 @@
    protected Logger log = Logger.getLogger(getClass());
    
    /** The relative order */
-   private int relativeOrder = 0;
+   private int relativeOrder = Integer.MAX_VALUE;
    
    /** The deployment stage */
    private DeploymentStage stage = DeploymentStages.REAL;

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/AbstractVFSDeploymentContext.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/AbstractVFSDeploymentContext.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/AbstractVFSDeploymentContext.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -27,8 +27,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.structure.spi.DeploymentUnit;
 import org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext;
 import org.jboss.deployers.vfs.spi.structure.VFSDeploymentContext;
@@ -58,7 +62,8 @@
    private VirtualFile root;
 
    /** The meta data locations */
-   private List<VirtualFile> metaDataLocations;
+   /** This map usage is simply pair notion which simplifies API */
+   private Map<VirtualFile, MetaDataType> metaDataLocations;
 
    /** The class paths */
    private List<VirtualFile> classPath;
@@ -124,38 +129,30 @@
       return root;
    }
 
-   public void setMetaDataPath(List<String> paths)
+   public void setMetaDataPath(List<MetaDataEntry> paths)
    {
       if (paths == null)
       {
          setMetaDataLocations(null);
          return;
       }
-      List<VirtualFile> locations = new ArrayList<VirtualFile>();
-      for (String path : paths)
+
+      Map<VirtualFile, MetaDataType> locations = new LinkedHashMap<VirtualFile, MetaDataType>();
+      for (MetaDataEntry entry : paths)
       {
-         if (path == null)
-            throw new IllegalArgumentException("Null path in paths: " + paths);
+         if (entry == null)
+            throw new IllegalArgumentException("Null entry in paths: " + paths);
 
+         String path = entry.getPath();
          VirtualFile child = root.getChild(path);
-         if (child.exists())
-            locations.add(child);
+         if (child != null)
+            locations.put(child, entry.getType());
          else
             log.debug("Meta data path does not exist: root=" + root.getPathName() + " path=" + path);
       }
-      setMetaDataLocations(locations);
+      setMetaDataLocationsMap(locations);
    }
 
-   /**
-    * Get mutable metadata locations.
-    *
-    * @return the mutable metadata locations
-    */
-   protected List<VirtualFile> getMutableMetaDataLocations()
-   {
-      return metaDataLocations;
-   }
-
    public List<VirtualFile> getMetaDataLocations()
    {
       if (metaDataLocations == null || metaDataLocations.isEmpty())
@@ -164,15 +161,38 @@
       }
       else
       {
-         return Collections.unmodifiableList(metaDataLocations);
+         List<VirtualFile> result = new ArrayList<VirtualFile>();
+         for(Map.Entry<VirtualFile, MetaDataType> entry : metaDataLocations.entrySet())
+         {
+            VirtualFile location = entry.getKey();
+            result.add(location);
+         }
+         return result;
       }
    }
 
-   public void setMetaDataLocations(List<VirtualFile> metaDataLocations)
+   public void setMetaDataLocations(List<VirtualFile> locations)
    {
-      this.metaDataLocations = metaDataLocations;
+      Map<VirtualFile, MetaDataType> locationsMap = null;
+      if (locations != null)
+      {
+         locationsMap = new LinkedHashMap<VirtualFile, MetaDataType>();
+         for (VirtualFile file : locations)
+            locationsMap.put(file, MetaDataType.DEFAULT);
+      }
+      setMetaDataLocationsMap(locationsMap);
    }
 
+   /**
+    * Set metadata locations map.
+    *
+    * @param locations the metadata locations
+    */
+   protected void setMetaDataLocationsMap(Map<VirtualFile, MetaDataType> locations)
+   {
+      this.metaDataLocations = locations;
+   }
+
    public VirtualFile getMetaDataFile(String name)
    {
       if (name == null)
@@ -214,8 +234,9 @@
    protected VirtualFile searchMetaDataLocations(String name)
    {
       VirtualFile result = null;
-      for(VirtualFile location : getMetaDataLocations())
+      for(Map.Entry<VirtualFile, MetaDataType> entry : metaDataLocations.entrySet())
       {
+         VirtualFile location = entry.getKey();
          result = location.getChild(name);
          if (result.exists())
          {
@@ -224,11 +245,8 @@
             deployed();
             break;
          }
-         else {
-            result = null;
-         }
       }
-      return result;
+      return result != null && result.exists() ? result : null;
    }
 
    public List<VirtualFile> getMetaDataFiles(String name, String suffix)
@@ -268,8 +286,9 @@
          }
          // Look in the meta data location
          List<VirtualFile> results = new ArrayList<VirtualFile>();
-         for (VirtualFile location : metaDataLocations)
+         for(Map.Entry<VirtualFile, MetaDataType> entry : metaDataLocations.entrySet())
          {
+            VirtualFile location = entry.getKey();
             List<VirtualFile> result = location.getChildren(filter);
             if (result != null && result.isEmpty() == false)
             {
@@ -293,18 +312,20 @@
       if (locations == null)
          throw new IllegalArgumentException("Null locations");
 
-      List<VirtualFile> metadataLocations = getMutableMetaDataLocations();
-      if (metadataLocations == null)
-         metadataLocations = new ArrayList<VirtualFile>();
-
+      Map<VirtualFile, MetaDataType> locationsMap = new LinkedHashMap<VirtualFile, MetaDataType>();
       for (int i = locations.length-1; i >= 0; --i)
       {
          VirtualFile location = locations[i];
          if (location == null)
             throw new IllegalArgumentException("Null virtual file in " + Arrays.toString(locations));
-         metadataLocations.add(0, location);
+         locationsMap.put(location, MetaDataType.DEFAULT);
       }
-      setMetaDataLocations(metadataLocations);
+
+      // add the old ones
+      if (metaDataLocations != null)
+         locationsMap.putAll(metaDataLocations);
+
+      setMetaDataLocationsMap(locationsMap);
    }
 
    public void appendMetaDataLocation(VirtualFile... locations)
@@ -312,17 +333,17 @@
       if (locations == null)
          throw new IllegalArgumentException("Null location");
 
-      List<VirtualFile> metaDataLocations = getMutableMetaDataLocations();
-      if (metaDataLocations == null)
-         metaDataLocations = new ArrayList<VirtualFile>();
+      Map<VirtualFile, MetaDataType> locationsMap = new LinkedHashMap<VirtualFile, MetaDataType>();
+      if (metaDataLocations != null)
+         locationsMap.putAll(metaDataLocations); // add the old ones
 
       for (VirtualFile location : locations)
       {
          if (location == null)
             throw new IllegalArgumentException("Null virtual file in " + Arrays.toString(locations));
-         metaDataLocations.add(location);
+         locationsMap.put(location, MetaDataType.DEFAULT);
       }
-      setMetaDataLocations(metaDataLocations);
+      setMetaDataLocationsMap(locationsMap);
    }
 
    public void removeMetaDataLocation(VirtualFile... locations)
@@ -490,7 +511,7 @@
       root = (VirtualFile) in.readObject();
       boolean isNullOrEmpty = in.readBoolean();
       if (isNullOrEmpty == false)
-         metaDataLocations = (List<VirtualFile>) in.readObject();
+         metaDataLocations = (Map<VirtualFile, MetaDataType>) in.readObject();
       classPath = (List) in.readObject();
    }
 

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructuralDeployersImpl.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructuralDeployersImpl.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructuralDeployersImpl.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -23,15 +23,16 @@
 
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.List;
 
 import org.jboss.deployers.client.spi.Deployment;
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.Ordered;
 import org.jboss.deployers.spi.attachments.MutableAttachments;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 import org.jboss.deployers.structure.spi.helpers.AbstractStructuralDeployers;
@@ -151,7 +152,7 @@
          
          // Create the context in the parent structure
          ContextInfo parentContextInfo;
-         List<String> metaDataPath = recognised.getMetaDataPath();
+         List<MetaDataEntry> metaDataPath = recognised.getMetaDataPath();
          if (metaDataPath == null || metaDataPath.isEmpty())
             parentContextInfo = StructureMetaDataFactory.createContextInfo(relativePath, recognised.getClassPath());
          else

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructureBuilder.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructureBuilder.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/VFSStructureBuilder.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -29,14 +29,15 @@
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.spi.structure.ModificationType;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.structure.spi.DeploymentContext;
 import org.jboss.deployers.structure.spi.helpers.AbstractStructureBuilder;
+import org.jboss.deployers.vfs.plugins.structure.modify.ModificationAction;
+import org.jboss.deployers.vfs.plugins.structure.modify.ModificationActions;
 import org.jboss.deployers.vfs.spi.client.VFSDeployment;
 import org.jboss.deployers.vfs.spi.structure.VFSDeploymentContext;
-import org.jboss.deployers.vfs.plugins.structure.modify.ModificationAction;
-import org.jboss.deployers.vfs.plugins.structure.modify.ModificationActions;
 import org.jboss.logging.Logger;
 import org.jboss.vfs.VFSUtils;
 import org.jboss.vfs.VirtualFile;
@@ -154,7 +155,7 @@
             log.trace("Apply context: " + context.getName() + " " + contextInfo);
          
          VFSDeploymentContext vfsContext = (VFSDeploymentContext) context;
-         List<String> metaDataPath = contextInfo.getMetaDataPath();
+         List<MetaDataEntry> metaDataPath = contextInfo.getMetaDataPath();
          if (metaDataPath != null && metaDataPath.isEmpty() == false)
             vfsContext.setMetaDataPath(contextInfo.getMetaDataPath());
          

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/dir/DirectoryStructure.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/dir/DirectoryStructure.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/dir/DirectoryStructure.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -25,6 +25,7 @@
 
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.vfs.plugins.structure.AbstractVFSStructureDeployer;
 import org.jboss.deployers.vfs.spi.structure.StructureContext;
@@ -89,12 +90,12 @@
 
       StructureMetaData smd = parentContext.getMetaData();
       ContextInfo info = smd.getContext("");
-      List<String> metadataPaths = info.getMetaDataPath();
+      List<MetaDataEntry> metadataPaths = info.getMetaDataPath();
       if (metadataPaths != null && metadataPaths.isEmpty() == false)
       {
          String relativePath = AbstractStructureDeployer.getRelativePath(context.getParent(), context.getFile());
-         for (String path : metadataPaths)
-            if (relativePath.equalsIgnoreCase(path))
+         for (MetaDataEntry entry : metadataPaths)
+            if (relativePath.equalsIgnoreCase(entry.getPath()))
                return true;
       }
 

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/explicit/StructureMetaDataObjectFactory.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/explicit/StructureMetaDataObjectFactory.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/explicit/StructureMetaDataObjectFactory.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -26,8 +26,11 @@
 
 import org.jboss.deployers.plugins.structure.ClassPathEntryImpl;
 import org.jboss.deployers.plugins.structure.ContextInfoImpl;
+import org.jboss.deployers.plugins.structure.MetaDataEntryImpl;
 import org.jboss.deployers.plugins.structure.StructureMetaDataImpl;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.spi.structure.ModificationType;
 import org.jboss.xb.binding.ObjectModelFactory;
 import org.jboss.xb.binding.UnmarshallingContext;
@@ -83,20 +86,22 @@
          parent.setPath(path);
       }
       else if ("metaDataPath".equals(localName))
-         child = new LinkedHashSet<String>();
+         child = new LinkedHashSet<MetaDataEntry>();
       else if (localName.equals("classpath"))
          child = new ArrayList<ClassPathEntry>();
 
       return child;
    }
 
-   public Object newChild(LinkedHashSet<String> parent, UnmarshallingContext navigator, String namespaceURI, String localName, Attributes attrs)
+   public Object newChild(LinkedHashSet<MetaDataEntry> parent, UnmarshallingContext navigator, String namespaceURI, String localName, Attributes attrs)
    {
       Object child = null;
       if("path".equals(localName))
       {
          String path = attrs.getValue("name");
-         parent.add(path);
+         String type = attrs.getValue("type");
+         MetaDataEntry entry = new MetaDataEntryImpl(path, MetaDataType.getMetaDataType(type));
+         parent.add(entry);
       }
       return child;
    }
@@ -119,9 +124,9 @@
       parent.addContext(context);
    }
    
-   public void addChild(ContextInfoImpl context, LinkedHashSet<String> metaDataPath, UnmarshallingContext navigator, String namespaceURI, String localName)
+   public void addChild(ContextInfoImpl context, LinkedHashSet<MetaDataEntry> metaDataPath, UnmarshallingContext navigator, String namespaceURI, String localName)
    {
-      context.setMetaDataPath(new ArrayList<String>(metaDataPath));
+      context.setMetaDataPath(new ArrayList<MetaDataEntry>(metaDataPath));
    }
 
    public void addChild(ContextInfoImpl context, ArrayList<ClassPathEntry> classpath, UnmarshallingContext navigator, String namespaceURI, String localName)

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/FileModificationTypeMatcher.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/FileModificationTypeMatcher.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/FileModificationTypeMatcher.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.vfs.VirtualFile;
 
 /**
@@ -70,7 +71,7 @@
    {
       if (metadataOnly)
       {
-         List<String> metadataPaths = contextInfo.getMetaDataPath();
+         List<MetaDataEntry> metadataPaths = contextInfo.getMetaDataPath();
          if (metadataPaths == null || metadataPaths.isEmpty())
          {
             return Collections.emptyList();
@@ -78,9 +79,9 @@
          else
          {
             List<VirtualFile> result = new ArrayList<VirtualFile>(metadataPaths.size());
-            for (String metadataPath : metadataPaths)
+            for (MetaDataEntry metadataPath : metadataPaths)
             {
-               VirtualFile child = file.getChild(metadataPath);
+               VirtualFile child = file.getChild(metadataPath.getPath());
                if (child.exists())
                   result.add(child);
             }

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/ModificationActions.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/ModificationActions.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/modify/ModificationActions.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -46,13 +46,15 @@
          return original;
       }
    };
-   
+ 
+   /**
+    * Temporary Hack to get the test running.  This leaks a mount - TODO: fix it or remove the need to make copies of VFS locations.
+    */
    private static final ModificationAction TEMP_ACTION = new ModificationAction()
    {
       public VirtualFile modify(VirtualFile original) throws IOException, URISyntaxException
       {
          VirtualFile backup = Automounter.backup(original);
-         // TODO: This leaks a mount - fix it
          VFS.mountTemp(original, getTempFileProvider(original.getName()));
          VFSUtils.copyChildrenRecursive(backup, original);
          return original;

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/war/WARStructure.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/war/WARStructure.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/main/java/org/jboss/deployers/vfs/plugins/structure/war/WARStructure.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -28,6 +28,7 @@
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.structure.ContextInfo;
 import org.jboss.deployers.vfs.plugins.structure.AbstractVFSArchiveStructureDeployer;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.vfs.spi.structure.StructureContext;
 import org.jboss.vfs.VirtualFile;
 import org.jboss.vfs.VirtualFileFilter;
@@ -47,10 +48,10 @@
    /** The default filter which allows jars/jar directories */
    public static final VirtualFileFilter DEFAULT_WEB_INF_LIB_FILTER = new SuffixMatchFilter(".jar", VisitorAttributes.DEFAULT);
 
-   /** The web-inf/lib filter */
+   /** The WEB-INF/lib filter */
    private VirtualFileFilter webInfLibFilter = DEFAULT_WEB_INF_LIB_FILTER;
 
-   /** The web-inf/lib/[some-archive]/META-INF filter */
+   /** The WEB-INF/lib/[some-archive]/META-INF filter */
    private VirtualFileFilter webInfLibMetaDataFilter;
 
    /** Whether to include web-inf in the classpath */
@@ -164,14 +165,17 @@
 
          // Check for a META-INF for metadata
          if (classes.exists())
-             metaDataLocations.add("WEB-INF/classes/META-INF");
+            metaDataLocations.add("WEB-INF/classes/META-INF");
 
+         // Create a context for this war file and all its metadata locations
+         context = createContext(structureContext, metaDataLocations.toArray(new String[metaDataLocations.size()]));
+
          // Check for jars in WEB-INF/lib
          List<VirtualFile> archives = null;
          try
          {
             VirtualFile webinfLib = file.getChild("WEB-INF/lib");
-            if (webinfLib != null)
+            if (webinfLib.exists())
             {
                archives = webinfLib.getChildren(webInfLibFilter);
                // Add the jars' META-INF for metadata
@@ -179,7 +183,7 @@
                {
                   // either same as plain lib filter, null or accepts the jar
                   if (webInfLibMetaDataFilter == null || webInfLibMetaDataFilter == webInfLibFilter || webInfLibMetaDataFilter.accepts(jar))
-                     metaDataLocations.add("WEB-INF/lib/" + jar.getName() + "/META-INF");
+                     addMetaDataPath(structureContext, context, "WEB-INF/lib/" + jar.getName() + "/META-INF", MetaDataType.ALTERNATIVE);
                }
             }
          }
@@ -188,9 +192,6 @@
             log.warn("Exception looking for WEB-INF/lib, " + file.getPathName() + ", " + e);
          }
 
-         // Create a context for this war file and all its metadata locations
-         context = createContext(structureContext, metaDataLocations.toArray(new String[metaDataLocations.size()]));
-
          // Add the war manifest classpath entries
          addClassPath(structureContext, file, false, true, context);
 

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BaseDeployersVFSTest.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BaseDeployersVFSTest.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BaseDeployersVFSTest.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -22,9 +22,13 @@
 package org.jboss.test.deployers;
 
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.jboss.deployers.client.spi.DeployerClient;
 import org.jboss.deployers.plugins.main.MainDeployerImpl;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 import org.jboss.deployers.structure.spi.StructuralDeployers;
 import org.jboss.deployers.structure.spi.StructureBuilder;
 import org.jboss.deployers.vfs.plugins.structure.AbstractVFSDeploymentContext;
@@ -162,4 +166,18 @@
       VirtualFile file = getVirtualFile(root, path);
       return new AbstractVFSDeploymentContext(file, "");
    }
+
+   /**
+    * Create metadata path entries.
+    *
+    * @param metaDataPath the metadata paths
+    * @return the metadata path entries
+    */
+   protected List<MetaDataEntry> createMetaDataEntries(String... metaDataPath)
+   {
+      List<MetaDataEntry> entries = new ArrayList<MetaDataEntry>();
+      for (String path : metaDataPath)
+         entries.add(StructureMetaDataFactory.createMetaDataEntry(path));
+      return entries;
+   }
 }

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BootstrapDeployersTest.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BootstrapDeployersTest.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/BootstrapDeployersTest.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -32,15 +32,14 @@
 import java.io.IOException;
 
 import junit.framework.AssertionFailedError;
-
 import org.jboss.classloader.plugins.ClassLoaderUtils;
 import org.jboss.classloader.plugins.jdk.AbstractJDKChecker;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
 import org.jboss.deployers.client.spi.DeployerClient;
 import org.jboss.deployers.structure.spi.DeploymentUnit;
-import org.jboss.deployers.structure.spi.main.MainDeployerStructure;
 import org.jboss.deployers.structure.spi.main.MainDeployerInternals;
+import org.jboss.deployers.structure.spi.main.MainDeployerStructure;
 import org.jboss.deployers.vfs.spi.client.VFSDeployment;
 import org.jboss.deployers.vfs.spi.client.VFSDeploymentFactory;
 import org.jboss.deployers.vfs.spi.structure.VFSDeploymentUnit;

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/DeployersVFSTestSuite.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/DeployersVFSTestSuite.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/DeployersVFSTestSuite.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -29,7 +29,6 @@
 import org.jboss.test.deployers.vfs.reflect.ReflectTestSuite;
 import org.jboss.test.deployers.vfs.dependency.DependencyTestSuite;
 import org.jboss.test.deployers.vfs.deployer.bean.BeanDeployerTestSuite;
-import org.jboss.test.deployers.vfs.deployer.bean.test.BeanMetaDataDeployerPluginTestCase;
 import org.jboss.test.deployers.vfs.deployer.facelets.FaceletsTestSuite;
 import org.jboss.test.deployers.vfs.deployer.jaxp.JAXPDeployerTestSuite;
 import org.jboss.test.deployers.vfs.deployer.merge.MergeDeployerTestSuite;

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/annotations/test/ScanningMetaDataTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/annotations/test/ScanningMetaDataTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/annotations/test/ScanningMetaDataTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,15 +21,15 @@
 */
 package org.jboss.test.deployers.vfs.annotations.test;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
 import junit.framework.Test;
+
 import org.jboss.deployers.plugins.annotations.AbstractScanningMetaData;
+import org.jboss.deployers.spi.annotations.PathEntryMetaData;
 import org.jboss.deployers.spi.annotations.PathMetaData;
 import org.jboss.deployers.spi.annotations.ScanningMetaData;
-import org.jboss.deployers.spi.annotations.PathEntryMetaData;
 import org.jboss.deployers.vfs.plugins.annotations.ScanningMetaDataDeployer;
 import org.jboss.deployers.vfs.plugins.structure.AbstractVFSDeploymentContext;
 import org.jboss.deployers.vfs.plugins.structure.AbstractVFSDeploymentUnit;
@@ -62,7 +62,7 @@
       {
          VirtualFile file = getVirtualFile("/scanning", "smoke");
          VFSDeploymentContext deployment = new AbstractVFSDeploymentContext(file, "");
-         deployment.setMetaDataPath(Collections.singletonList("META-INF"));
+         deployment.setMetaDataPath(createMetaDataEntries("META-INF"));
          VFSDeploymentUnit unit = new AbstractVFSDeploymentUnit(deployment);
          deployer.deploy(unit);
          try

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/deployer/validate/test/ObjectMFDTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/deployer/validate/test/ObjectMFDTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/deployer/validate/test/ObjectMFDTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,9 +21,8 @@
 */
 package org.jboss.test.deployers.vfs.deployer.validate.test;
 
-import java.util.Collections;
-
 import junit.framework.Test;
+
 import org.jboss.deployers.spi.deployer.Deployer;
 import org.jboss.deployers.spi.structure.ContextInfo;
 import org.jboss.deployers.spi.structure.StructureMetaData;
@@ -56,7 +55,7 @@
    {
       VirtualFile file = getVirtualFile("/structure/explicit", "complex.deployer");
       VFSDeploymentContext deployment = new AbstractVFSDeploymentContext(file, "");
-      deployment.setMetaDataPath(Collections.singletonList("META-INF"));
+      deployment.setMetaDataPath(createMetaDataEntries("META-INF"));
       VFSDeploymentUnit unit = new AbstractVFSDeploymentUnit(deployment);
       Deployer deployer = new StructureOMFDeployer();
 
@@ -76,7 +75,7 @@
    {
       VirtualFile file = getVirtualFile("/structure/explicit", "comparator.jar");
       VFSDeploymentContext deployment = new AbstractVFSDeploymentContext(file, "");
-      deployment.setMetaDataPath(Collections.singletonList("META-INF"));
+      deployment.setMetaDataPath(createMetaDataEntries("META-INF"));
       VFSDeploymentUnit unit = new AbstractVFSDeploymentUnit(deployment);
       Deployer deployer = new StructureOMFDeployer();
 

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/metadata/test/MetaDataUnitTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/metadata/test/MetaDataUnitTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/metadata/test/MetaDataUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,13 +21,16 @@
 */
 package org.jboss.test.deployers.vfs.metadata.test;
 
-import java.util.Collections;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 import org.jboss.deployers.vfs.spi.structure.VFSDeploymentContext;
 import org.jboss.test.deployers.BaseDeployersVFSTest;
 import org.jboss.test.deployers.vfs.metadata.support.ServicesFilter;
@@ -83,7 +86,7 @@
    public void testExactMatchMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       String expected = getVfsURL("/metadata/toplevel/metadata.jar/META-INF/jboss-service.xml");
       assertMetaDataMatch(context, expected, "jboss-service.xml");
    }
@@ -91,28 +94,28 @@
    public void testNotExactMatchMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, "not-correct.xml");
    }
 
    public void testExactMatchNoMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-nometainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, "jboss-service.xml");
    }
 
    public void testNotExactMatchNoMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-nometainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, "not-correct.xml");
    }
 
    public void testPartialMatchMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       Set<String> expected = new HashSet<String>();
       expected.add(getVfsURL("/metadata/toplevel/metadata.jar/META-INF/1-ds.xml"));
       expected.add(getVfsURL("/metadata/toplevel/metadata.jar/META-INF/2-ds.xml"));
@@ -122,28 +125,28 @@
    public void testNotPartialMatchMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, null, "-not.xml");
    }
 
    public void testPartialMatchNoMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-nometainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, null, "-ds.xml");
    }
 
    public void testNotPartialMatchNoMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-nometainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, null, "-not.xml");
    }
 
    public void testExactAndPartialMatchMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       Set<String> expected = new HashSet<String>();
       expected.add(getVfsURL("/metadata/toplevel/metadata.jar/META-INF/jboss-service.xml"));
       expected.add(getVfsURL("/metadata/toplevel/metadata.jar/META-INF/1-ds.xml"));
@@ -154,28 +157,28 @@
    public void testNotExactAndPartialMatchMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, "not-correct.xml", "-not.xml");
    }
 
    public void testExactAndPartialMatchNoMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-nometainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, "jboss-service.xml", "-ds.xml");
    }
 
    public void testNotExactAndPartialMatchNoMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-nometainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       assertNoMetaDataMatch(context, "jboss-service.xml", "-not.xml");
    }
    
    public void testRecurseInMetaInf() throws Exception
    {
       VFSDeploymentContext context = createDeploymentContext("/metadata", "toplevel/metadata-recurseinmetainf.jar");
-      context.setMetaDataPath(Collections.singletonList("META-INF"));
+      context.setMetaDataPath(createMetaDataEntries("META-INF"));
       VirtualFileFilter filter = new ServicesFilter();
       Set<String> expected = new HashSet<String>();
       expected.add(getVfsURL("/metadata/toplevel/metadata-recurseinmetainf.jar/META-INF/jboss-service.xml"));

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/ear/support/MockEarStructureDeployer.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/ear/support/MockEarStructureDeployer.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/ear/support/MockEarStructureDeployer.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -44,6 +44,7 @@
 import org.jboss.vfs.util.Automounter;
 import org.jboss.vfs.util.SuffixMatchFilter;
 import org.jboss.mcann.AnnotationRepository;
+import org.jboss.mcann.AnnotationRepository;
 
 /**
  * A mock ear structure deployer that illustrates concepts involved with an ear

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/explicit/test/DeclaredStructureUnitTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/explicit/test/DeclaredStructureUnitTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structure/explicit/test/DeclaredStructureUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -33,6 +33,7 @@
  * DeclaredStructure deployer unit tests.
  * 
  * @author Scott.Stark at jboss.org
+ * @author Ales.Justin at jboss.org
  * @version $Revision: 1.1 $
  */
 public class DeclaredStructureUnitTestCase extends AbstractStructureTest
@@ -78,4 +79,12 @@
       assertMetaData(xwar, "WEB-INF");
       assertClassPath(xwar, "WEB-INF/classes", "WEB-INF/lib/w0.jar");
    }
+
+   public void testAlternative() throws Throwable
+   {
+      VFSDeploymentContext root = assertDeploy("/structure/explicit", "alt.jar");
+      // Validate the root context info
+      assertMetaDatas(root, "META-INF", "config");
+      // TODO -- check alt usage
+   }
 }

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structurebuilder/test/VFSStructureBuilderUnitTestCase.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structurebuilder/test/VFSStructureBuilderUnitTestCase.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/java/org/jboss/test/deployers/vfs/structurebuilder/test/VFSStructureBuilderUnitTestCase.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -21,7 +21,6 @@
 */
 package org.jboss.test.deployers.vfs.structurebuilder.test;
 
-import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.List;
@@ -31,6 +30,7 @@
 import org.jboss.deployers.client.spi.DeploymentFactory;
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.structure.spi.DeploymentContext;
 import org.jboss.deployers.vfs.plugins.client.AbstractVFSDeployment;
 import org.jboss.deployers.vfs.plugins.structure.VFSStructureBuilder;
@@ -107,7 +107,7 @@
    
    protected void checkMetaDataLocation(VFSDeploymentContext context, ContextInfo contextInfo) throws Exception
    {
-      List<String> metaDataPaths = contextInfo.getMetaDataPath();
+      List<MetaDataEntry> metaDataPaths = contextInfo.getMetaDataPath();
       assertNotNull(metaDataPaths);
       List<VirtualFile> metaDataLocations = context.getMetaDataLocations();
       assertNotNull(metaDataLocations);
@@ -117,7 +117,7 @@
       else
       {
          VirtualFile root = context.getRoot();
-         VirtualFile expected = root.getChild(metaDataPaths.get(0));
+         VirtualFile expected = root.getChild(metaDataPaths.get(0).getPath());
          assertEquals(1, metaDataLocations.size());
          assertEquals(expected, metaDataLocations.get(0));
       }

Copied: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar (from rev 98958, projects/jboss-deployers/trunk/deployers-vfs/src/test/resources/structure/explicit/alt.jar)

Copied: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF (from rev 98958, projects/jboss-deployers/trunk/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF)

Deleted: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml
===================================================================
--- projects/jboss-deployers/trunk/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml	2009-12-31 20:33:58 UTC (rev 98959)
@@ -1,9 +0,0 @@
-<structure>
-  <context>
-    <path name=""/>
-    <metaDataPath>
-      <path name="META-INF" type="Default"/>
-      <path name="config" type="Alt"/>
-    </metaDataPath>
-  </context>
-</structure>

Copied: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml (from rev 98958, projects/jboss-deployers/trunk/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml)
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml	                        (rev 0)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/META-INF/jboss-structure.xml	2009-12-31 20:33:58 UTC (rev 98959)
@@ -0,0 +1,9 @@
+<structure>
+  <context>
+    <path name=""/>
+    <metaDataPath>
+      <path name="META-INF" type="Default"/>
+      <path name="config" type="Alt"/>
+    </metaDataPath>
+  </context>
+</structure>

Copied: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config (from rev 98958, projects/jboss-deployers/trunk/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config)

Deleted: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/empty.txt
===================================================================

Copied: projects/jboss-deployers/branches/vfs3/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/empty.txt (from rev 98958, projects/jboss-deployers/trunk/deployers-vfs/src/test/resources/structure/explicit/alt.jar/config/empty.txt)
===================================================================

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/VFSDeploymentContext.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/VFSDeploymentContext.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/VFSDeploymentContext.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -23,6 +23,7 @@
 
 import java.util.List;
 
+import org.jboss.deployers.spi.structure.MetaDataEntry;
 import org.jboss.deployers.structure.spi.DeploymentContext;
 import org.jboss.vfs.VirtualFile;
 import org.jboss.vfs.VirtualFileFilter;
@@ -48,7 +49,7 @@
     * 
     * @param paths the path
     */
-   void setMetaDataPath(List<String> paths);
+   void setMetaDataPath(List<MetaDataEntry> paths);
 
    /**
     * Get the meta data locations

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/helpers/AbstractStructureDeployer.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/helpers/AbstractStructureDeployer.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/helpers/AbstractStructureDeployer.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -30,6 +30,8 @@
 
 import org.jboss.deployers.spi.structure.ClassPathEntry;
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.spi.structure.StructureMetaDataFactory;
 import org.jboss.deployers.vfs.spi.structure.CandidateAnnotationsCallback;
@@ -429,7 +431,7 @@
 
       // Create and link the context
       if (metaDataPath != null)
-         return StructureMetaDataFactory.createContextInfo("", metaDataPath, null);
+         return StructureMetaDataFactory.createContextInfo("", createMetaDataEntry(metaDataPath), null);
       else
          return StructureMetaDataFactory.createContextInfo("", null);
    }
@@ -450,6 +452,44 @@
    }
 
    /**
+    * Create metadata entry.
+    *
+    * @param path the path
+    * @return the metadata entry
+    */
+   private MetaDataEntry createMetaDataEntry(String path)
+   {
+      return StructureMetaDataFactory.createMetaDataEntry(path);
+   }
+
+   /**
+    * Create metadata entry.
+    *
+    * @param path the path
+    * @param type the type
+    * @return the metadata entry
+    */
+   private MetaDataEntry createMetaDataEntry(String path, MetaDataType type)
+   {
+      return StructureMetaDataFactory.createMetaDataEntry(path, type);
+   }
+
+   /**
+    * Create metadata entry.
+    *
+    * @param context the structure context
+    * @param info the context info
+    * @param path the path
+    * @param type the type
+    */
+   protected void addMetaDataPath(StructureContext context, ContextInfo info, String path, MetaDataType type)
+   {
+      VirtualFile root = context.getFile();
+      if (root.getChild(path).exists())
+         info.addMetaDataPath(createMetaDataEntry(path, type));
+   }
+
+   /**
     * Apply metadata on root to create context.
     *
     * @param context the structure context
@@ -462,7 +502,7 @@
          throw new IllegalArgumentException("Null context");
 
       VirtualFile root = context.getFile();
-      List<String> metaDataPath = CollectionsFactory.createLazyList();
+      List<MetaDataEntry> metaDataPath = CollectionsFactory.createLazyList();
       // Determine whether the metadata paths exists
       if (metaDataPaths != null && metaDataPaths.length > 0)
       {
@@ -470,7 +510,7 @@
          {
             VirtualFile child = root.getChild(path);
             if (child.exists())
-               metaDataPath.add(path);
+               metaDataPath.add(createMetaDataEntry(path));
          }
       }
 

Modified: projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/modified/MetaDataStructureModificationChecker.java
===================================================================
--- projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/modified/MetaDataStructureModificationChecker.java	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/deployers-vfs-spi/src/main/java/org/jboss/deployers/vfs/spi/structure/modified/MetaDataStructureModificationChecker.java	2009-12-31 20:33:58 UTC (rev 98959)
@@ -27,6 +27,8 @@
 import java.util.Set;
 
 import org.jboss.deployers.spi.structure.ContextInfo;
+import org.jboss.deployers.spi.structure.MetaDataEntry;
+import org.jboss.deployers.spi.structure.MetaDataType;
 import org.jboss.deployers.spi.structure.StructureMetaData;
 import org.jboss.deployers.structure.spi.main.MainDeployerInternals;
 import org.jboss.deployers.vfs.spi.structure.VFSDeploymentContext;
@@ -132,11 +134,15 @@
       VirtualFile contextRoot = root.getChild(path);
       if (contextRoot.exists())
       {
-         List<String> metadataPaths = contextInfo.getMetaDataPath();
+         List<MetaDataEntry> metadataPaths = contextInfo.getMetaDataPath();
          if (metadataPaths != null && metadataPaths.isEmpty() == false)
          {
-            for (String metaDataPath : metadataPaths)
+            for (MetaDataEntry entry : metadataPaths)
             {
+               if (entry.getType() != MetaDataType.DEFAULT)
+                  continue;
+
+               String metaDataPath = entry.getPath();
                VirtualFile mdpVF = contextRoot.getChild(metaDataPath);
                if (mdpVF.exists())
                {

Modified: projects/jboss-deployers/branches/vfs3/pom.xml
===================================================================
--- projects/jboss-deployers/branches/vfs3/pom.xml	2009-12-31 15:51:37 UTC (rev 98958)
+++ projects/jboss-deployers/branches/vfs3/pom.xml	2009-12-31 20:33:58 UTC (rev 98959)
@@ -22,17 +22,17 @@
 
   <properties>
     <version.jboss.vfs>3.0.0.CR1-SNAPSHOT</version.jboss.vfs>
-    <version.jboss.reflect>2.2.0-SNAPSHOT</version.jboss.reflect>
-    <version.jboss.classpool>1.0.0-SNAPSHOT</version.jboss.classpool>
+    <version.jboss.reflect>2.2.0.Alpha1</version.jboss.reflect>
+    <version.jboss.classpool>1.0.0.Alpha1</version.jboss.classpool>
     <version.jboss.man>2.1.1.GA</version.jboss.man>
-    <version.jboss.mdr>2.0.2.GA</version.jboss.mdr>
+    <version.jboss.mdr>2.2.0-SNAPSHOT</version.jboss.mdr>
     <version.jboss.kernel>2.2.0-SNAPSHOT</version.jboss.kernel>
     <version.jboss.classloader>2.2.0-SNAPSHOT</version.jboss.classloader>
     <version.jboss.classloading.spi>5.1.0.SP1</version.jboss.classloading.spi>
-    <version.jboss.common.core>2.2.14.GA</version.jboss.common.core>
+    <version.jboss.common.core>2.2.17.GA</version.jboss.common.core>
     <version.jboss.logging.spi>2.2.0.CR1</version.jboss.logging.spi>
     <version.jboss.logging.log4j>2.2.0.CR1</version.jboss.logging.log4j>
-    <version.jbossxb>2.0.2.Beta2</version.jbossxb>
+    <version.jbossxb>2.0.2.Beta3</version.jbossxb>
     <version.jboss.aop>2.1.0.CR3</version.jboss.aop>
     <version.org.jboss.test>1.1.1.GA</version.org.jboss.test>
     <version.junit>4.4</version.junit>




More information about the jboss-cvs-commits mailing list