Author: scheu Date: Thu Nov 18 17:44:54 2010 New Revision: 1036556 URL: http://svn.apache.org/viewvc?rev=1036556&view=rev Log: AXIS2-4881 Contributor:Rich Scheuerle Introduce (optional) two-phase handler model
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=1036556&r1=1036555&r2=1036556&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 Nov 18 17:44:54 2010 @@ -22,6 +22,7 @@ package org.apache.axis2.handlers.addres import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.axiom.soap.RolePlayer; +import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPHeader; import org.apache.axiom.soap.SOAPHeaderBlock; import org.apache.axis2.AxisFault; @@ -36,6 +37,7 @@ import org.apache.axis2.context.MessageC import org.apache.axis2.description.HandlerDescription; import org.apache.axis2.description.Parameter; import org.apache.axis2.engine.AxisConfiguration; +import org.apache.axis2.engine.Handler.InvocationResponse; import org.apache.axis2.handlers.AbstractHandler; import org.apache.axis2.util.JavaUtils; import org.apache.axis2.util.LoggingControl; @@ -71,16 +73,18 @@ 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 { //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); - - // if there are not headers put a flag to disable addressing temporary - SOAPHeader header = msgContext.getEnvelope().getHeader(); - if (header == null) { - return InvocationResponse.CONTINUE; - } //Determine if we want to ignore addressing headers. This parameter must //be retrieved from the message context because it's value can vary on a //per service basis. @@ -91,10 +95,19 @@ public class AddressingInHandler extends log.debug( "The AddressingInHandler has been disabled. No further processing will take place."); } - return InvocationResponse.CONTINUE; + return false; } - + // if there are not headers put a flag to disable addressing temporary + SOAPHeader header = msgContext.getEnvelope().getHeader(); + if (header == null) { + return false; + } + return true; + } + + public InvocationResponse invoke_stage2(MessageContext msgContext) throws AxisFault { + SOAPHeader header = msgContext.getEnvelope().getHeader(); if(configuration == null){ AxisConfiguration conf = msgContext.getConfigurationContext().getAxisConfiguration(); rolePlayer = (RolePlayer)conf.getParameterValue(Constants.SOAP_ROLE_PLAYER_PARAMETER); 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=1036556&r1=1036555&r2=1036556&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 Nov 18 17:44:54 2010 @@ -64,6 +64,14 @@ public class AddressingOutHandler extend 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 { Parameter param = null; boolean disableAddressing = false; @@ -85,8 +93,13 @@ public class AddressingOutHandler extend log.trace(msgContext.getLogIDString() + " Addressing is disabled. Not adding WS-Addressing headers."); } - return InvocationResponse.CONTINUE; + return false; } + return true; + } + + public InvocationResponse invoke_stage2(MessageContext msgContext) throws AxisFault { + // Determine the addressin namespace in effect. Object addressingVersionFromCurrentMsgCtxt = msgContext.getProperty(WS_ADDRESSING_VERSION); @@ -99,7 +112,7 @@ public class AddressingOutHandler extend // Determine whether to include optional addressing headers in the output. // Get default value from module.xml or axis2.xml files - param = msgContext.getModuleParameter( + Parameter param = msgContext.getModuleParameter( INCLUDE_OPTIONAL_HEADERS, MODULE_NAME, handlerDesc); boolean includeOptionalHeaders = msgContext.isPropertyTrue(INCLUDE_OPTIONAL_HEADERS, 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=1036556&r1=1036555&r2=1036556&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 Nov 18 17:44:54 2010 @@ -19,6 +19,7 @@ package org.apache.axis2.jaxws.dispatchers; +import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.commons.logging.Log; @@ -34,6 +35,22 @@ import org.apache.commons.logging.LogFac public class MustUnderstandChecker extends org.apache.axis2.handlers.AbstractHandler { private static final Log log = LogFactory.getLog(MustUnderstandChecker.class); + public boolean invoke_stage1(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); + } + public InvocationResponse invoke(MessageContext msgContext) throws AxisFault { // Get the list of headers for the roles we're acting in, then mark any we understand // as processed. 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=1036556&r1=1036555&r2=1036556&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 Nov 18 17:44:54 2010 @@ -25,6 +25,7 @@ import org.apache.axis2.context.MessageC import org.apache.axis2.description.HandlerDescription; import org.apache.axis2.description.Parameter; import org.apache.axis2.description.PhaseRule; +import org.apache.axis2.handlers.AbstractHandler; import org.apache.axis2.phaseresolver.PhaseException; import org.apache.axis2.util.LoggingControl; import org.apache.commons.logging.Log; @@ -294,8 +295,6 @@ public class Phase implements Handler { "\""); } - InvocationResponse pi = InvocationResponse.CONTINUE; - int currentIndex = msgctx.getCurrentPhaseIndex(); if (currentIndex == 0) { @@ -308,21 +307,17 @@ public class Phase implements Handler { int handlersSize = handlers.size(); - while (currentIndex < handlersSize) { - Handler handler = (Handler) handlers.get(currentIndex); - - if (isDebugEnabled) { - log.debug(msgctx.getLogIDString() + " Invoking Handler '" + handler.getName() + - "' in Phase '" + phaseName + "'"); - } - pi = handler.invoke(msgctx); + for (int i= currentIndex; i < handlersSize; i++) { + Handler handler = (Handler) handlers.get(i); + InvocationResponse pi = invokeHandler(handler, msgctx); + if (!pi.equals(InvocationResponse.CONTINUE)) { return pi; } - - currentIndex++; - msgctx.setCurrentPhaseIndex(currentIndex); + + // Set phase index to the next handler + msgctx.setCurrentPhaseIndex(i+1); } if (isDebugEnabled) { @@ -332,7 +327,28 @@ public class Phase implements Handler { msgctx.setCurrentPhaseIndex(0); checkPostConditions(msgctx); - return pi; + return InvocationResponse.CONTINUE; + } + + 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); + } } 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=1036556&r1=1036555&r2=1036556&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 Nov 18 17:44:54 2010 @@ -20,10 +20,12 @@ package org.apache.axis2.handlers; +import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.description.HandlerDescription; import org.apache.axis2.description.Parameter; import org.apache.axis2.engine.Handler; +import org.apache.axis2.engine.Handler.InvocationResponse; /** * Class AbstractHandler @@ -100,4 +102,34 @@ 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); + } }