Author: ruwan
Date: Thu Jan 27 08:05:22 2011
New Revision: 1064018

URL: http://svn.apache.org/viewvc?rev=1064018&view=rev
Log:
Fixing the issue AXIS2-4881, with proper API, AbstractHandler will remain as it 
is to keep the backwards compatibility. I have refactored the classes which 
were using the invoke_stage1/2 methods, but I think we can improve most of the 
handlers with this approach

Added:
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractTemplatedHandler.java
Modified:
    
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
    
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingOutHandler.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/dispatchers/MustUnderstandChecker.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/Phase.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractHandler.java

Modified: 
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java?rev=1064018&r1=1064017&r2=1064018&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
 Thu Jan 27 08:05:22 2011
@@ -39,6 +39,7 @@ import org.apache.axis2.description.Para
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.engine.Handler.InvocationResponse;
 import org.apache.axis2.handlers.AbstractHandler;
+import org.apache.axis2.handlers.AbstractTemplatedHandler;
 import org.apache.axis2.util.JavaUtils;
 import org.apache.axis2.util.LoggingControl;
 import org.apache.axis2.util.Utils;
@@ -49,7 +50,7 @@ import javax.xml.namespace.QName;
 import java.util.ArrayList;
 import java.util.Iterator;
 
-public class AddressingInHandler extends AbstractHandler implements 
AddressingConstants {
+public class AddressingInHandler extends AbstractTemplatedHandler implements 
AddressingConstants {
 
     private static final int TO_FLAG = 1, FROM_FLAG = 2, REPLYTO_FLAG = 3,
             FAULTO_FLAG = 4, MESSAGEID_FLAG = 6, ACTION_FLAG = 0;
@@ -59,7 +60,7 @@ public class AddressingInHandler extends
     private boolean disableRefparamExtract = false;
     private AxisConfiguration configuration = null;
     private RolePlayer rolePlayer = null;
-    
+
     public void init(HandlerDescription handlerdesc){
        super.init(handlerdesc);
        // check whether to process reference parameters.
@@ -72,15 +73,7 @@ public class AddressingInHandler extends
         }
     }
     
-    public InvocationResponse invoke(MessageContext msgContext) throws 
AxisFault {
-        
-        if (invoke_stage1(msgContext)) {
-            return invoke_stage2(msgContext);
-        } else {
-            return InvocationResponse.CONTINUE;
-        }
-    }
-    public boolean invoke_stage1(MessageContext msgContext) throws AxisFault {
+    public boolean shouldInvoke(MessageContext msgContext) throws AxisFault {
         //Set the defaults on the message context.
         msgContext.setProperty(DISABLE_ADDRESSING_FOR_OUT_MESSAGES, 
Boolean.TRUE);
         msgContext.setProperty(IS_ADDR_INFO_ALREADY_PROCESSED, Boolean.FALSE);
@@ -100,13 +93,10 @@ public class AddressingInHandler extends
 
         // if there are not headers put a flag to disable addressing temporary
         SOAPHeader header = msgContext.getEnvelope().getHeader();
-        if (header == null) {
-            return false;
-        }
-        return true;
+        return header != null;
     }
     
-    public InvocationResponse invoke_stage2(MessageContext msgContext) throws 
AxisFault {
+    public InvocationResponse doInvoke(MessageContext msgContext) throws 
AxisFault {
         SOAPHeader header = msgContext.getEnvelope().getHeader();
         if(configuration == null){
                AxisConfiguration conf = 
msgContext.getConfigurationContext().getAxisConfiguration();

Modified: 
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingOutHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingOutHandler.java?rev=1064018&r1=1064017&r2=1064018&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingOutHandler.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingOutHandler.java
 Thu Jan 27 08:05:22 2011
@@ -43,6 +43,7 @@ import org.apache.axis2.description.Axis
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.handlers.AbstractHandler;
+import org.apache.axis2.handlers.AbstractTemplatedHandler;
 import org.apache.axis2.util.JavaUtils;
 import org.apache.axis2.util.LoggingControl;
 import org.apache.axis2.util.Utils;
@@ -55,23 +56,16 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-public class AddressingOutHandler extends AbstractHandler implements 
AddressingConstants {
+public class AddressingOutHandler extends AbstractTemplatedHandler implements 
AddressingConstants {
 
     private static final Log log = 
LogFactory.getLog(AddressingOutHandler.class);
 
     // TODO: This is required for MessageContext#getModuleParameter.
     //       Not clear why there is no way to automatically determine this!
     private static final String MODULE_NAME = "addressing";
-    
-    public InvocationResponse invoke(MessageContext msgContext) throws 
AxisFault {
-        
-        if (invoke_stage1(msgContext)) {
-            return invoke_stage2(msgContext);
-        } else {
-            return InvocationResponse.CONTINUE;
-        }
-    }
-    public boolean invoke_stage1(MessageContext msgContext) throws AxisFault {
+
+
+    public boolean shouldInvoke(MessageContext msgContext) throws AxisFault {
         Parameter param = null;
         boolean disableAddressing = false;
         
@@ -84,8 +78,7 @@ public class AddressingOutHandler extend
                 msgContext.isPropertyTrue(DISABLE_ADDRESSING_FOR_OUT_MESSAGES,
                     
JavaUtils.isTrueExplicitly(Utils.getParameterValue(param)));
         } else {
-           Boolean bool = (Boolean)o;
-           disableAddressing = bool.booleanValue();
+            disableAddressing = (Boolean) o;
         }
 
         if (disableAddressing) {
@@ -98,7 +91,7 @@ public class AddressingOutHandler extend
         return true;
     }
     
-    public InvocationResponse invoke_stage2(MessageContext msgContext) throws 
AxisFault {
+    public InvocationResponse doInvoke(MessageContext msgContext) throws 
AxisFault {
         
 
         // Determine the addressin namespace in effect.

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/dispatchers/MustUnderstandChecker.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/dispatchers/MustUnderstandChecker.java?rev=1064018&r1=1064017&r2=1064018&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/dispatchers/MustUnderstandChecker.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/dispatchers/MustUnderstandChecker.java
 Thu Jan 27 08:05:22 2011
@@ -22,6 +22,7 @@ package org.apache.axis2.jaxws.dispatche
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.handlers.AbstractTemplatedHandler;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -32,29 +33,21 @@ import org.apache.commons.logging.LogFac
  *  Understood headers (per JAXWS 2.0 Section 10.2) include
  *  - Headers that correspond to SEI method parameters.
  */
-public class MustUnderstandChecker extends 
org.apache.axis2.handlers.AbstractHandler {
-    private static final Log log = 
LogFactory.getLog(MustUnderstandChecker.class);
+public class MustUnderstandChecker extends AbstractTemplatedHandler {
 
-    public boolean invoke_stage1(MessageContext msgContext) throws AxisFault {
+    public boolean shouldInvoke(MessageContext msgContext) throws AxisFault {
         if (msgContext == null) {
             return false;
         }
-        
         SOAPEnvelope envelope = msgContext.getEnvelope();
-        if (envelope.getHeader() == null) {
-            return false;
-        }  
-        return true;
-    }
-    
-    public InvocationResponse invoke_stage2(MessageContext msgContext) throws 
AxisFault {
-        return invoke(msgContext);
+        return envelope.getHeader() != null;
     }
     
-    public InvocationResponse invoke(MessageContext msgContext) throws 
AxisFault {
+    public InvocationResponse doInvoke(MessageContext msgContext) throws 
AxisFault {
         // Get the list of headers for the roles we're acting in, then mark 
any we understand
         // as processed.
         MustUnderstandUtils.markUnderstoodHeaderParameters(msgContext);
         return InvocationResponse.CONTINUE;
     }
+    
 }

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/Phase.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/Phase.java?rev=1064018&r1=1064017&r2=1064018&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/Phase.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/engine/Phase.java
 Thu Jan 27 08:05:22 2011
@@ -330,25 +330,14 @@ public class Phase implements Handler {
         return InvocationResponse.CONTINUE;
     }
     
-    private InvocationResponse invokeHandler(Handler handler, MessageContext 
msgctx) throws AxisFault  {
+    private InvocationResponse invokeHandler(Handler handler, MessageContext 
msgctx)
+            throws AxisFault  {
         if (isDebugEnabled) {
             log.debug(msgctx.getLogIDString() + " Invoking Handler '" + 
handler.getName() +
                     "' in Phase '" + phaseName + "'");
         }
-        if (handler instanceof AbstractHandler) {
-            // Call this as a two stage handler.
-            boolean needStage2 = 
((AbstractHandler)handler).invoke_stage1(msgctx);
-
-            if (needStage2) {
-                return ((AbstractHandler)handler).invoke_stage2(msgctx);
-            } else {
-                return InvocationResponse.CONTINUE;
-            } 
-           
-            
-        } else {
-            return handler.invoke(msgctx);
-        }
+        
+        return handler.invoke(msgctx);
     }
 
     public void flowComplete(MessageContext msgContext) {

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractHandler.java?rev=1064018&r1=1064017&r2=1064018&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractHandler.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractHandler.java
 Thu Jan 27 08:05:22 2011
@@ -102,34 +102,5 @@ public abstract class AbstractHandler im
 
     public void flowComplete(MessageContext msgContext) {
     }
-    
-    /**
-     * Alternative to calling invoke()
-     * The handler developer can place code in stage1 that 
-     * will do quick checking to make sure that the handler is
-     * enabled and useful for this message.
-     * Some handler developers may wish to split the invoke into
-     * two stages if the handler is often disabled.
-     * @param msgContext
-     * @return true if stage2 processing is needed; 
-     *   false if stage2 processing is not needed and flow should continue to 
the next handler
-     */
-    public boolean invoke_stage1(MessageContext msgContext) throws AxisFault {
-        // The default behavior is to continue to stage2
-        return true;
-    }
-    
-    /**
-     * Alternative to calling invoke()
-     * The handler developer can place code in stage2 that 
-     * will do the actual processing.
-     * Some handler developers may wish to split the invoke into
-     * two stages if the handler is often disabled.
-     * @param msgContext
-     * @return InvocationResponse
-     */
-    public InvocationResponse invoke_stage2(MessageContext msgContext) throws 
AxisFault {
-        // The default behavior is to call the existing invoke method
-        return invoke(msgContext);
-    }
+
 }

Added: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractTemplatedHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractTemplatedHandler.java?rev=1064018&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractTemplatedHandler.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/handlers/AbstractTemplatedHandler.java
 Thu Jan 27 08:05:22 2011
@@ -0,0 +1,68 @@
+/*
+ * 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.handlers;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
+
+/**
+ * This abstract class differentiates the concern of the conditional check to 
see whether this
+ * particular message needs to be handled by the handler implementation and 
the actual invocation
+ * logic.
+ *
+ * @see org.apache.axis2.handlers.AbstractHandler
+ */
+public abstract class AbstractTemplatedHandler extends AbstractHandler {
+
+    /**
+     * Implements the separation of the conditional check and the actual logic
+     * 
+     * @param msgContext the <code>MessageContext</code> to process with this 
<code>Handler</code>.
+     * @return CONTINUE if the handler implementation says 'should not be 
invoked'
+     * or the result of the {@link 
#doInvoke(org.apache.axis2.context.MessageContext)}
+     * @throws AxisFault if the {@link 
#doInvoke(org.apache.axis2.context.MessageContext)}
+     * throws the same
+     */
+    public final InvocationResponse invoke(MessageContext msgContext) throws 
AxisFault {
+        return shouldInvoke(msgContext) ? doInvoke(msgContext) : 
InvocationResponse.CONTINUE;
+    }
+
+    /**
+     * This method should implement the conditional check of the handler to 
decide whether this 
+     * particular message needs to be handled by me
+     *
+     * @param msgCtx current <code>MessageContext</code> to be evaluated
+     * @return boolean <code>true<code>, if this handler needs to be further 
invoked,
+     * <code>false</code> if this handler has nothing to do with this specific 
message
+     * and want the flow to be continued
+     * @throws AxisFault in an error in evaluating the decision
+     */
+    public abstract boolean shouldInvoke(MessageContext msgCtx) throws 
AxisFault;
+
+    /**
+     * This should implement the actual handler invocation logic.
+     * 
+     * @param msgCtx current message to be handled by this handler
+     * @return flow completion decision, should be one of {@link 
InvocationResponse#CONTINUE},
+     * {@link InvocationResponse#ABORT}, {@link InvocationResponse#SUSPEND}
+     * @throws AxisFault in an error in invoking the handler
+     */
+    public abstract InvocationResponse doInvoke(MessageContext msgCtx) throws 
AxisFault;
+}


Reply via email to