You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by gd...@apache.org on 2007/12/31 05:33:23 UTC

svn commit: r607662 - in /webservices/axis2/trunk/java/modules/kernel: src/org/apache/axis2/deployment/ src/org/apache/axis2/engine/ src/org/apache/axis2/phaseresolver/ test/org/apache/axis2/deployment/ test/org/apache/axis2/engine/

Author: gdaniels
Date: Sun Dec 30 20:33:22 2007
New Revision: 607662

URL: http://svn.apache.org/viewvc?rev=607662&view=rev
Log:
Reimplementing dynamic phases, part 1.  This is a slightly more architectural approach.

* A Deployable is something that fits into a DeployableChain in an ordered fashion.  Each Deployable has a name, and may be marked "first", "last", and/or may have a list of "successor" names (indicating other deployables).  Each Deployable also contains a "target" which is the real thing (i.e. a Phase or a Handler) that wants to be ordered.

* A DeployableChain represents an ordered list of Deployables, which are inserted with the deploy() method - some basic consistency checking happens then, but the actual complete order is not calculated until rebuild() is called, at which time all the existing constraints are walked and a complete chain is built.  After rebuild(), the getChain() API will return an ordered list of the targets.

* Some tests for the above.

* Hook up the dynamic phase mechanism for module.xml using the above code.  This enables multiple befores and afters (i.e. before="foo,bar") and multiple deployments (in different modules, say) of a given new phase.

* Few small fixes in testDynamicPhase()

Next steps:

- More tests!

- Improve JavaDoc a bit.

- Explore revamping the PhaseRule stuff to use this technique as well (within a Phase), which will allow for more flexible handler deployment and clean-up/unify some code.

Added:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/Deployable.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/DeployableChain.java
    webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/engine/DeployableChainTest.java
Modified:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleBuilder.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/phaseresolver/PhaseHolder.java
    webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/deployment/DeploymentTotalTest.java

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleBuilder.java?rev=607662&r1=607661&r2=607662&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleBuilder.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleBuilder.java Sun Dec 30 20:33:22 2007
@@ -28,6 +28,7 @@
 import org.apache.axis2.description.*;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.engine.MessageReceiver;
+import org.apache.axis2.engine.Deployable;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.java.security.AccessController;
 import org.apache.axis2.modules.Module;
@@ -297,7 +298,7 @@
             // processing <wsp:PolicyReference> .. </..> elements
             Iterator policyRefElements = operation.getChildrenWithName(new QName(POLICY_NS_URI, TAG_POLICY_REF));
 
-            if (policyRefElements != null && policyElements.hasNext()) {
+            if (policyRefElements != null && policyRefElements.hasNext()) {
                 processPolicyRefElements(PolicyInclude.AXIS_MODULE_OPERATION_POLICY, policyRefElements, module.getPolicyInclude());
             }
 
@@ -333,22 +334,38 @@
         while (phases.hasNext()) {
             OMElement element = (OMElement) phases.next();
             String phaseName = element.getAttributeValue(new QName(ATTRIBUTE_NAME));
+
+            Deployable d = new Deployable(phaseName);
             String after = element.getAttributeValue(new QName(TAG_AFTER));
+            if (after != null) {
+                String [] afters = after.split(",");
+                for (int i = 0; i < afters.length; i++) {
+                    String s = afters[i];
+                    d.addPredecessor(s);
+                }
+            }
             String before = element.getAttributeValue(new QName(TAG_BEFORE));
+            if (before != null) {
+                String [] befores = before.split(",");
+                for (int i = 0; i < befores.length; i++) {
+                    String s = befores[i];
+                    d.addSuccessor(s);
+                }
+            }
             String flowName = element.getAttributeValue(new QName("flow"));
-            int flowInex ;
+            int flowIndex ;
             if (TAG_FLOW_IN.equals(flowName)){
-                flowInex = PhaseMetadata.IN_FLOW ;
+                flowIndex = PhaseMetadata.IN_FLOW ;
             } else if (TAG_FLOW_OUT.equals(flowName)) {
-                flowInex = PhaseMetadata.OUT_FLOW ;
+                flowIndex = PhaseMetadata.OUT_FLOW ;
             } else if (TAG_FLOW_OUT_FAULT.equals(flowName)) {
-                flowInex = PhaseMetadata.FAULT_OUT_FLOW;
+                flowIndex = PhaseMetadata.FAULT_OUT_FLOW;
             } else if (TAG_FLOW_IN_FAULT.equals(flowName)) {
-                flowInex = PhaseMetadata.FAULT_IN_FLOW;
+                flowIndex = PhaseMetadata.FAULT_IN_FLOW;
             } else {
                 throw new DeploymentException(" Flow can not be null for the phase name " + phaseName);
             }
-            axisConfig.insertPhase(phaseName,before,after,flowInex);
+            axisConfig.insertPhase(d, flowIndex);
         }
     }
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java?rev=607662&r1=607661&r2=607662&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java Sun Dec 30 20:33:22 2007
@@ -1122,48 +1122,42 @@
      *   3 - fault in flow
      *   4 - fault out flow
      *
-     * @param phaseName : Not null parameter , specifying the phase name
-     * @param beforePhase : can be null , will tell the name of before phase
-     * @param afterPhase : Can be null and will tell the name of after phase
-     * @param flow : Type of the flow
+     * @param d the Deployable representing the Phase to deploy
+     * @param flow the type of the flow
      * @throws org.apache.axis2.AxisFault : If something went wrong
      */
-    public void insertPhase(String phaseName ,
-                            String beforePhase,
-                            String afterPhase ,
-                            int flow) throws AxisFault {
-
+    public void insertPhase(Deployable d, int flow) throws AxisFault {
 
         switch (flow) {
             case PhaseMetadata.IN_FLOW : {
-                ArrayList phaseList = phasesinfo.getINPhases();
-                phaseList = findAndInsertPhase(beforePhase, phaseList, afterPhase, phaseName);
+                List phaseList = phasesinfo.getINPhases();
+                phaseList = findAndInsertPhase(d, phaseList);
                 if (phaseList != null) {
-                    phasesinfo.setINPhases(phaseList);
+                    phasesinfo.setINPhases((ArrayList)phaseList);
                 }
                 break;
             }
             case PhaseMetadata.OUT_FLOW : {
-                ArrayList phaseList = phasesinfo.getOUTPhases();
-                phaseList = findAndInsertPhase(beforePhase, phaseList, afterPhase, phaseName);
+                List phaseList = phasesinfo.getOUTPhases();
+                phaseList = findAndInsertPhase(d, phaseList);
                 if (phaseList != null) {
-                    phasesinfo.setOUTPhases(phaseList);
+                    phasesinfo.setOUTPhases((ArrayList)phaseList);
                 }
                 break;
             }
             case PhaseMetadata.FAULT_OUT_FLOW : {
-                ArrayList phaseList = phasesinfo.getOutFaultPhaseList();
-                phaseList = findAndInsertPhase(beforePhase, phaseList, afterPhase, phaseName);
+                List phaseList = phasesinfo.getOutFaultPhaseList();
+                phaseList = findAndInsertPhase(d, phaseList);
                 if (phaseList != null) {
-                    phasesinfo.setOUT_FaultPhases(phaseList);
+                    phasesinfo.setOUT_FaultPhases((ArrayList)phaseList);
                 }
                 break;
             }
             case PhaseMetadata.FAULT_IN_FLOW : {
-                ArrayList phaseList = phasesinfo.getIN_FaultPhases();
-                phaseList = findAndInsertPhase(beforePhase, phaseList, afterPhase, phaseName);
+                List phaseList = phasesinfo.getIN_FaultPhases();
+                phaseList = findAndInsertPhase(d, phaseList);
                 if (phaseList != null) {
-                    phasesinfo.setIN_FaultPhases(phaseList);
+                    phasesinfo.setIN_FaultPhases((ArrayList)phaseList);
                 }
                 break;
             }
@@ -1171,63 +1165,45 @@
     }
 
     /**
-     * This method will added a given phase into the location specified by the phase before
-     * and phase after.  If given phase are not found then an exception will be thrown.
-     * @param beforePhase : Name of the before phase
-     * @param phaseList : ArrayList of phase
-     * @param afterPhase : Name of the after phase
-     * @param phaseName : name of the phase we need to add
-     * @throws AxisFault : If something went wrong
-     * @return : Modified list
+     * Insert a Phase
+     * @param d
+     * @param phaseList
+     * @return
+     * @throws AxisFault
      */
-    private ArrayList findAndInsertPhase(String beforePhase,
-                                         ArrayList phaseList,
-                                         String afterPhase,
-                                         String phaseName) throws AxisFault {
-        int beforeIndex = -1;
-        int afterIndex = -1;
-        for (int i = 0; i < phaseList.size(); i++) {
-            Phase phase = (Phase) phaseList.get(i);
-            if (phase.getPhaseName().equals(beforePhase)) {
-                beforeIndex = i;
-            } else if (phase.getPhaseName().equals(afterPhase)){
-                afterIndex = i;
-            } else if (phase.getPhaseName().equals(phaseName)){
-                return null;
+    private List findAndInsertPhase(Deployable d, List phaseList) throws AxisFault {
+        DeployableChain ec = new DeployableChain();
+        String last = null;
+        for (Iterator i = phaseList.iterator(); i.hasNext();) {
+            Phase phase = (Phase)i.next();
+            String name = phase.getName();
+            Deployable existing = new Deployable(name);
+            existing.setTarget(phase);
+            if (last != null) {
+                // Set up explicit chain relationship for preexisting phases, for now.
+                ec.addRelationship(last, name);
+            }
+            last = name;
+            try {
+                ec.deploy(existing);
+            } catch (Exception e) {
+                // This should never happen when building a simple list like the above
+                throw AxisFault.makeFault(e);
             }
         }
-        if (beforeIndex == -1 && afterIndex == -1) {
-            throw new AxisFault("Trying to add a phase " + phaseName + " before "
-                    + beforePhase + " and after " + afterPhase + " but none of the phases " +
-                    "found in the system please refer to axis2.xml for available phases");
-        }
-
-        if (afterIndex > beforeIndex) {
-            throw new AxisFault("Trying to add a phase " + phaseName + " before "
-                    + beforePhase + " and after " + afterPhase + " phase order is invalid , " +
-                    "please refer axis2.xml for the correct phase order");
-        }
         Phase phase = new Phase();
-        phase.setName(phaseName);
-        if (beforeIndex == -1){
-            if (afterIndex == phaseList.size() -1) {
-                // Need to add to the last phase since the after phase is the
-                // last phase in the system
-                phaseList.add(phase);
-            } else {
-                phaseList.add(afterIndex, phase);
-            }
-        } else   if (afterIndex == -1) {
-            if (beforeIndex == 0) {
-                // Need to add to the first place of the phase since the before
-                // phase index is 0
-                phaseList.add(0, phase);
-            } else {
-                phaseList.add(beforeIndex, phase);
-            }
-        } else {
-            phaseList.add(afterIndex, phase);
+        phase.setName(d.getName());
+        d.setTarget(phase);
+
+        try {
+            ec.deploy(d);
+            ec.rebuild();
+        } catch (Exception e) {
+            throw AxisFault.makeFault(e);
         }
+        
+        phaseList = ec.getChain();
+
         return phaseList;
     }
 }

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/Deployable.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/Deployable.java?rev=607662&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/Deployable.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/Deployable.java Sun Dec 30 20:33:22 2007
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.engine;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * A Deployable is a container for something (Phases, Handlers) which wants
+ * to be deployed in an ordered and constrained fashion via a
+ * DeployableChain.
+ */
+public class Deployable {
+    private String name;
+    private String phase;
+    private Set successors;
+    private Set predecessors;
+    
+    boolean first;
+    boolean last;
+
+    Object target;
+
+    public Deployable(String name) {
+        this.name = name;
+    }
+
+    public Deployable(String name, Object target) {
+        this.name = name;
+        this.target = target;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void addSuccessor(String name) {
+        if (successors == null) {
+            successors = new HashSet();
+        }
+        successors.add(name);
+    }
+
+    public void addPredecessor(String name) {
+        if (predecessors == null) {
+            predecessors = new HashSet();
+        }
+        predecessors.add(name);
+    }
+
+    public Set getPredecessors() {
+        return predecessors;
+    }
+
+    public Set getSuccessors() {
+        return successors;
+    }
+
+    public String getPhase() {
+        return phase;
+    }
+
+    public void setPhase(String phase) {
+        this.phase = phase;
+    }
+
+    public boolean isFirst() {
+        return first;
+    }
+
+    public void setFirst(boolean first) {
+        this.first = first;
+    }
+
+    public boolean isLast() {
+        return last;
+    }
+
+    public void setLast(boolean last) {
+        this.last = last;
+    }
+
+    public void setTarget(Object target) {
+        this.target = target;
+    }
+
+    public Object getTarget() {
+        return target;
+    }
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/DeployableChain.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/DeployableChain.java?rev=607662&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/DeployableChain.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/DeployableChain.java Sun Dec 30 20:33:22 2007
@@ -0,0 +1,243 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.engine;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collection;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+
+public class DeployableChain {
+    /** The actual things (handlers or phases) */
+    List chain = new ArrayList();
+
+    Deployable first;
+    Deployable last;
+
+    Map activeConstraints = new HashMap();
+    private Map deployed = new HashMap();
+
+    Map activePhaseConstraints = new HashMap();
+
+    /**
+     * Deploy a Deployable into this chain.  Note that this does NOT order yet.  The idea
+     * is to deploy everything first, then call rebuild() to generate the fully ordered chain.
+     * This method will validate the Deployable, including confirming that it's compatible with
+     * any previously deployed item of the same name.
+     *
+     * @param deployable Deployable to deploy.
+     * @throws Exception if there is a deployment error.
+     */
+    public void deploy(Deployable deployable) throws Exception {
+        String name = deployable.getName();
+
+        if (deployable.isFirst()) {
+            if (first != null) {
+                throw new Exception("'" + first.getName() + "' is already first, can't deploy '" +
+                    name + "' as first also.");
+            }
+            first = deployable;
+        }
+
+        if (deployable.isLast()) {
+            if (last != null) {
+                throw new Exception("'" + last.getName() + "' is already last, can't deploy '" +
+                        name + "' as last also.");
+            }
+            last = deployable;
+        }
+
+        // Now check internal consistency
+        Set mySuccessors = deployable.getSuccessors();
+        Set myPredecessors = deployable.getPredecessors();
+
+        if (mySuccessors != null && deployable.isLast()) {
+            throw new Exception("Deploying '" + name +
+                    "' - can't both be last and have successors!");
+        }
+        if (myPredecessors != null && deployable.isFirst()) {
+            throw new Exception("Deploying '" + name +
+                    "' - can't both be first and have predecessors!");
+        }
+
+        Deployable previous = (Deployable)deployed.get(name);
+        if (previous == null) {
+            deployed.put(name, deployable);
+        } else {
+            // If something by this name already exists, ensure it's compatible
+            if (previous.isFirst() != deployable.isFirst()) {
+                throw new Exception();
+            }
+            if (previous.isLast() != deployable.isLast()) {
+                throw new Exception();
+            }
+            Object target = previous.getTarget();
+            if (target != null) {
+                if (deployable.getTarget() != null && !target.equals(deployable.getTarget())) {
+                    throw new Exception();
+                }
+            } else {
+                previous.setTarget(deployable.getTarget());
+            }
+        }
+
+        if (mySuccessors != null && !mySuccessors.isEmpty()) {
+            Set successors = (Set)activeConstraints.get(name);
+            if (successors == null) {
+                successors = new HashSet();
+                activeConstraints.put(name, successors);
+            }
+            successors.addAll(mySuccessors);
+        }
+
+        if (myPredecessors != null) {
+            for (Iterator i = myPredecessors.iterator(); i.hasNext();) {
+                String predecessor = (String)i.next();
+                // define relationship for each one
+                addRelationship(predecessor, name);
+            }
+        }
+    }
+
+    /**
+     * Find the correct (minimum) index for a given name.  Finds the active constraints
+     * for the name, then walks that list, making sure that each one is already placed.
+     * If a given successor isn't yet placed, we recursively call this method to place it,
+     * passing a set of "what's left to do" and a set of "what we've seen".
+     *
+     * This results in chain containing the names (Strings).
+     *
+     * TODO: investigate optimizing this algorithm a bit
+     *
+     * @param name the target deployable's name
+     * @param remaining a Set of the names of things we have yet to deploy
+     * @param seen a Set of the names of things we've already seen (to detect loops)
+     * @return an index >=0 or -1 if there was a dependency cycle
+     * @throws Exception if there's a cyclic dependency
+     */
+    private int getMinIndex(String name, Set remaining, Set seen) throws Exception {
+        if (seen.contains(name)) {
+            // We return -1 here instead of throwing the Exception so we can build a better
+            // error message below.
+            return -1;
+        }
+
+        Collection successors = (Collection)activeConstraints.get(name);
+        if (successors == null || successors.isEmpty()) {
+            // Never put anything after the thing marked "last"...
+            int index = (last == null) ? chain.size() : chain.size() - 1;
+            chain.add(index, name);
+            remaining.remove(name);
+            return index;
+        }
+
+        int minIndex = -1;
+        for (Iterator i = successors.iterator(); i.hasNext();) {
+            String otherName = (String)i.next();
+            int otherIdx = chain.indexOf(otherName);
+            if (otherIdx > -1) {
+                if ((minIndex == -1) || (minIndex > otherIdx)) {
+                    minIndex = otherIdx;
+                }
+            } else {
+                // This guy isn't in our list yet - put him in IF he's real (exists in
+                // the deployed list) and we haven't already placed him (exists in
+                // the remaining set).
+                if ((deployed.get(otherName) != null) && remaining.contains(otherName)) {
+                    seen.add(name);
+                    // Not in list yet, go place it
+                    int min = getMinIndex(otherName, remaining, seen);
+                    if (minIndex == -1 || min < minIndex) {
+                        minIndex = min;
+                    }
+                    if (minIndex == -1) {
+                        throw new Exception("Trying to put '" + name + "' before '" +
+                                otherName + "' - incompatible constraints!");
+                    }
+                }
+            }
+        }
+
+        if (minIndex == -1) minIndex = 0;
+
+        chain.add(minIndex, name);
+        remaining.remove(name);
+
+        return minIndex;
+    }
+
+    /**
+     * Taking into account all the active constraints, order the list.  This blows
+     * away the old order.  Could improve this slightly with a "dirty" flag.
+     *
+     * @throws Exception if there's an ordering conflict
+     */
+    public void rebuild() throws Exception {
+        chain.clear();
+
+        Set keys = new HashSet();
+        keys.addAll(deployed.keySet());
+
+        // First goes first.
+        if (first != null) {
+            chain.add(first.getName());
+            keys.remove(first.getName());
+        }
+
+        // Last goes next, and everything else will get inserted before it if it exists.
+        if (last != null) {
+            Collection afterLast = (Collection)activeConstraints.get(last.getName());
+            if (afterLast != null) {
+                throw new Exception("Can't have anything which goes after '" + last.getName() +
+                        "', which has been declared last.");
+            }
+            chain.add(last.getName());
+            keys.remove(last.getName());
+        }
+
+        while (!keys.isEmpty()) {
+            String name = (String)keys.iterator().next();
+            getMinIndex(name, keys, new HashSet());
+        }
+
+        // Now we've got a chain of names.  Convert to actual things before we return.
+        for (int i = 0; i < chain.size(); i++) {
+            String name = (String)chain.get(i);
+            chain.set(i, ((Deployable)deployed.get(name)).getTarget());
+        }
+    }
+
+    public void addRelationship(String before, String after) {
+        Set successors = (Set)activeConstraints.get(before);
+        if (successors == null) {
+            successors = new HashSet();
+            activeConstraints.put(before, successors);
+        }
+        successors.add(after);
+    }
+
+    public List getChain() {
+        return chain;
+    }
+}

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/phaseresolver/PhaseHolder.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/phaseresolver/PhaseHolder.java?rev=607662&r1=607661&r2=607662&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/phaseresolver/PhaseHolder.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/phaseresolver/PhaseHolder.java Sun Dec 30 20:33:22 2007
@@ -26,7 +26,6 @@
 import org.apache.axis2.engine.Phase;
 import org.apache.axis2.i18n.Messages;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -45,15 +44,15 @@
     /**
      * If the phase name is equal to "*" that implies , the handler should be
      * added to each and every phase in the system for a given flow  , and at that
-     * point if the phase rule contains any before or aftere then they will be
+     * point if the phase rule contains any befores or afters then they will be
      * ignored. Phase first and phase last are supported , but make sure you dont
      * break any of the phase rules.
      * <p/>
      * If the phase name is not above then the hadler will be added to the phase
      * specified by  the phase rule , and no rules will be ignored.
      *
-     * @param handlerDesc
-     * @throws PhaseException
+     * @param handlerDesc HandlerDescription to deploy
+     * @throws PhaseException if there's a problem
      */
     public void addHandler(HandlerDescription handlerDesc) throws PhaseException {
         PhaseRule rule = handlerDesc.getRules();
@@ -82,7 +81,8 @@
     /**
      * this method is used to get the actual phase object given in the phase array list
      *
-     * @param phaseName
+     * @param phaseName the name of the desired Phase
+     * @return the matching Phase, or null
      */
     private Phase getPhase(String phaseName) {
         for (int i = 0; i < phaseList.size(); i++) {

Modified: webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/deployment/DeploymentTotalTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/deployment/DeploymentTotalTest.java?rev=607662&r1=607661&r2=607662&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/deployment/DeploymentTotalTest.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/deployment/DeploymentTotalTest.java Sun Dec 30 20:33:22 2007
@@ -50,26 +50,24 @@
 
     public void testDynamicPhase() {
         ArrayList inFlow = er.getInFlowPhases();
-        boolean found = false;
         int index = 0;
         for (int i = 0; i < inFlow.size(); i++) {
             Phase phase = (Phase) inFlow.get(i);
             if (phase.getName().equals("NewPhase")) {
-                found = true;
                 index = i;
             }
         }
-        assertEquals("Phase has insert into a wrong location" ,index,3);
-        assertTrue("Problem in Dynamic Phases for Inflow", found);
+        assertEquals("Wrong index for NewPhase!", 3, index);
+
         inFlow = er.getInFaultFlowPhases();
-        found = false;
+        boolean found = false;
         for (int i = 0; i < inFlow.size(); i++) {
             Phase phase = (Phase) inFlow.get(i);
             if (phase.getName().equals("NewPhase")) {
                 found = true;
             }
         }
-        assertTrue("Problem in Dynamic Phases for InFaultflow", found);
+        assertTrue("NewPhase wasn't found in InFaultFlow", found);
     }
 
 }

Added: webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/engine/DeployableChainTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/engine/DeployableChainTest.java?rev=607662&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/engine/DeployableChainTest.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/engine/DeployableChainTest.java Sun Dec 30 20:33:22 2007
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.engine;
+
+import junit.framework.TestCase;
+
+import java.util.List;
+
+public class DeployableChainTest extends TestCase {
+    static final Object A_TARGET = new Object();
+    static final Object B_TARGET = new Object();
+    static final Object C_TARGET = new Object();
+    static final Object D_TARGET = new Object();
+    static final Object E_TARGET = new Object();
+
+    private Deployable a;
+    private Deployable b;
+    private Deployable c;
+    private Deployable d;
+    private Deployable e;
+    DeployableChain ec;
+
+    protected void setUp() throws Exception {
+        a = new Deployable("a", A_TARGET);
+        b = new Deployable("b", B_TARGET);
+        c = new Deployable("c", C_TARGET);
+        d = new Deployable("d", D_TARGET);
+        e = new Deployable("e", E_TARGET);
+        ec = new DeployableChain();
+    }
+
+    public void testDuplicateDeploy() throws Exception {
+        a.addSuccessor("b");
+        ec.deploy(a);
+
+        // Should be ok to do this again as long as everything matches.
+        ec.deploy(a);
+    }
+
+    public void testOrdering() throws Exception {
+        a.addSuccessor("b");
+        ec.deploy(b);
+        ec.deploy(a);
+        ec.rebuild();
+        List chain = ec.getChain();
+        assertEquals("Wrong number of items", 2, chain.size());
+        assertEquals("Wrong order", A_TARGET, chain.get(0));
+
+        ec.addRelationship("b", "a");
+        boolean caught = false;
+        try {
+            ec.rebuild();
+        } catch (Exception e1) {
+            // Expected Exception, yay!
+            caught = true;
+        }
+        if (!caught) fail("Didn't catch exception for cyclic dependency");
+
+        ec = new DeployableChain();
+        b.addSuccessor("c");
+        d.addSuccessor("e");
+        e.addPredecessor("b");
+
+        e.setLast(true);
+
+        ec.deploy(b);
+        ec.deploy(a);
+        ec.deploy(c);
+        ec.deploy(d);
+        ec.deploy(e);
+        ec.rebuild();
+        chain = ec.getChain();
+
+        assertEquals("Wrong number of items", 5, chain.size());
+        int aIndex = chain.indexOf(A_TARGET);
+        int bIndex = chain.indexOf(B_TARGET);
+        int cIndex = chain.indexOf(C_TARGET);
+        int dIndex = chain.indexOf(D_TARGET);
+        int eIndex = chain.indexOf(E_TARGET);
+        assertTrue(aIndex < bIndex);
+        assertTrue(bIndex < cIndex);
+        assertTrue(dIndex < eIndex);
+        assertTrue(bIndex < eIndex);
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org