Index: C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/Constants.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/Constants.java (revision 3243) +++ C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/Constants.java (working copy) @@ -241,7 +241,12 @@ * from SOAPFault to AxisFault */ public static final String INBOUND_FAULT_OVERRIDE = "inboundFaultOverride"; - + + /** + * This is used to store Header QNames that failed mustUnderstand check. + */ + public static final String FAULTY_HEADER_QNAMES = "faultyHeaderQNames"; + public static interface Configuration { public static final String ENABLE_REST = "enableREST"; public static final String ENABLE_REST_THROUGH_GET = "restThroughGet"; @@ -329,6 +334,7 @@ * @see org.apache.axis2.transport.MessageFormatter */ public static final String MESSAGE_TYPE = "messageType"; + } } Index: C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/engine/MessageReceiverExtension.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/engine/MessageReceiverExtension.java (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/engine/MessageReceiverExtension.java (revision 0) @@ -0,0 +1,19 @@ +package org.apache.axis2.engine; +/* + * MessageReceiverExtension will be used to add additional functionality to MessageReceiver. + * For Example MessageReceiverExtension can be used by JAXWSMessageReceiver to validate the + * MustUnderstand Checks, We use this functionality in case a webservice uses jaxws handlers and + * that AxisEngine does not have handler instance which get loaded later in the webservice lifecycle. + * + */ +public interface MessageReceiverExtension{ + /** + * checkNonUnderstoodHeaderInFuture returns a true if the header mustUnderstand check need to be + * posponed till the request is received by MessageReceiver. + * In some instances especially in Handler processing, the handlers are not loaded/instantiated until the + * first webservice call is made. Thus header qNames that are set in getHeaders()are not available to + * AxisEngine. We will use this method in such situations to pospone the MustUnderstand Check. + * @return + */ + public boolean isMustUnderstandCheckPostponed(org.apache.axis2.context.MessageContext axisRequestMsgCtx); +} Index: C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java (revision 3243) +++ C:/webservices/rad/WSFP_GM_092507/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java (working copy) @@ -17,12 +17,19 @@ package org.apache.axis2.engine; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Iterator; + +import javax.xml.namespace.QName; + import org.apache.axiom.soap.SOAP11Constants; import org.apache.axiom.soap.SOAP12Constants; import org.apache.axiom.soap.SOAPConstants; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPHeaderBlock; import org.apache.axis2.AxisFault; +import org.apache.axis2.Constants; import org.apache.axis2.client.async.Callback; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; @@ -41,12 +48,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.Iterator; - - /** * There is one engine for the Server and the Client. the send() and receive() * Methods are the basic operations the Sync, Async messageing are build on top. @@ -80,6 +82,15 @@ return; } Iterator headerBlocks = envelope.getHeader().examineAllHeaderBlocks(); + //If MustUnderstand check is delegated to MessageReceiver + //Lets store the HeaderQnames that failed check and we will + //re-check them when MessageReceiver performs its checks. + ArrayList faultyHeaderQNames = new ArrayList(); + + if(log.isDebugEnabled()){ + log.debug("Check if MessageReceiver will handle MustUnderstand check"); + } + boolean delegateToMR = delegateMustUnderstandCheckToMR(msgContext); while (headerBlocks.hasNext()) { SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) headerBlocks.next(); QName headerQName = headerBlock.getQName(); @@ -109,7 +120,18 @@ if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) { log.debug("MustUnderstand header not processed or registered as understood " + headerQName); } - + + if(delegateToMR){ + if(log.isDebugEnabled()){ + log.debug("MustUnderstandCheck delegated to MessageReceiver"); + } + if(!faultyHeaderQNames.contains(headerQName)){ + faultyHeaderQNames.add(headerQName); + } + continue; + } + + // Throw a MustUnderstand fault for the current SOAP version String prefix = envelope.getNamespace().getPrefix(); @@ -125,7 +147,7 @@ headerQName.toString()), SOAP12Constants.FAULT_CODE_MUST_UNDERSTAND); } else { - + // TODO: should we be using a prefix on the faultcode? What about // the QName object Constants.FAULT_MUSTUNDERSTAND? throw new AxisFault(Messages.getMessage("mustunderstandfailed", @@ -134,8 +156,46 @@ SOAP11Constants.FAULT_CODE_MUST_UNDERSTAND); } } + //Adding HeaderQName that failed mustUnderstand Check as AxisService Parameter + //If mustUnderstand check is delegated to MessageReceiver these faulty headers will + //be examined later by MessageReceiver. + AxisService axisService = msgContext.getAxisService(); + Parameter p = new Parameter(Constants.FAULTY_HEADER_QNAMES, faultyHeaderQNames); + axisService.addParameter(p); } + /** + * This method uses java reflection on MessageReceiver to see if the + * MustUnderstandCheck will be handled by the MessageReceiver implementation. + * @param msgContext + * @return + * @throws AxisFault + */ + private boolean delegateMustUnderstandCheckToMR(MessageContext msgContext) throws AxisFault{ + //Check if MustUnderstand check should be posponed + if (msgContext.isServerSide()) { + // Get Message Receiver + MessageReceiver receiver = msgContext.getAxisOperation().getMessageReceiver(); + if (receiver == null) { + throw new AxisFault(Messages.getMessage("nomessagereciever", + msgContext.getAxisOperation() + .getName() + .toString())); + } + + if(MessageReceiverExtension.class.isAssignableFrom(receiver.getClass())){ + MessageReceiverExtension mre = (MessageReceiverExtension) receiver; + return mre.isMustUnderstandCheckPostponed(msgContext); + }else{ + if(log.isDebugEnabled()){ + log.debug("Receiver does not implement MessageReceiverExtension"); + } + } + + } + return false; + + } private boolean checkThisHeader(SOAPHeaderBlock headerBlock, MessageContext msgContext) { boolean checkIt = true; // Return true if this header should be validated for mustUnderstand Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java (revision 3243) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java (working copy) @@ -41,6 +41,7 @@ import org.apache.axis2.jaxws.handler.HandlerChainProcessorTests; import org.apache.axis2.jaxws.handler.context.CompositeMessageContextTests; import org.apache.axis2.jaxws.handler.context.LogicalMessageContextTests; +import org.apache.axis2.jaxws.handler.header.tests.HandlerTests; import org.apache.axis2.jaxws.i18n.JaxwsMessageBundleTests; import org.apache.axis2.jaxws.injection.ResourceInjectionTests; import org.apache.axis2.jaxws.lifecycle.EndpointLifecycleTests; @@ -208,6 +209,7 @@ suite.addTestSuite(BindingProviderTests.class); suite.addTestSuite(StringListTests.class); suite.addTestSuite(RPCLitStringArrayTests.class); + suite.addTestSuite(HandlerTests.class); // ------ Endpoint Tests ------ suite.addTestSuite(BasicEndpointTests.class); Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/services.xml =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/services.xml (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/services.xml (revision 0) @@ -0,0 +1,14 @@ + + + + + + org.apache.axis2.jaxws.handler.header.DemoService + + + + + + + + Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/DemoServiceService_schema1.xsd =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/DemoServiceService_schema1.xsd (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/DemoServiceService_schema1.xsd (revision 0) @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/DemoServiceService.wsdl =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/DemoServiceService.wsdl (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/META-INF/DemoServiceService.wsdl (revision 0) @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/tests/HandlerTests.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/tests/HandlerTests.java (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/tests/HandlerTests.java (revision 0) @@ -0,0 +1,37 @@ +package org.apache.axis2.jaxws.handler.header.tests; + +import javax.xml.namespace.QName; +import javax.xml.ws.Dispatch; +import javax.xml.ws.Service; + +import junit.framework.TestCase; + +public class HandlerTests extends TestCase { + + public void testHandler_getHeader_invocation(){ + System.out.println("----------------------------------"); + System.out.println("test: " + getName()); + Object res = null; + String soapMessage = " test"; + String url = "http://localhost:8080/axis2/services/DemoServiceService"; + QName name = new QName("http://demo/", "DemoServiceService"); + QName portName = new QName("http://demo/", "DemoServicePort"); + try{ + //Create Service + Service s = Service.create(name); + assertNotNull(s); + //add port + s.addPort(portName, null, url); + + //Create Dispatch + Dispatch dispatch = s.createDispatch(portName, String.class, Service.Mode.MESSAGE); + assertNotNull(dispatch); + res = dispatch.invoke(soapMessage); + assertNotNull(res); + System.out.println("----------------------------------"); + }catch(Exception e){ + e.printStackTrace(); + fail(); + } + } +} Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/DemoHandler.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/DemoHandler.java (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/DemoHandler.java (revision 0) @@ -0,0 +1,35 @@ +package org.apache.axis2.jaxws.handler.header; + +import java.util.HashSet; +import java.util.Set; + +import javax.xml.namespace.QName; +import javax.xml.ws.handler.MessageContext; +import javax.xml.ws.handler.soap.SOAPHandler; +import javax.xml.ws.handler.soap.SOAPMessageContext; + +public class DemoHandler implements SOAPHandler { + + public Set getHeaders() { + System.out.println("DemoHandler.getHeaders Invoked by JAXWS"); + Set result = new HashSet(); + result.add(new QName("http://demo/", "myheader")); + return result; + } + + public void close(MessageContext arg0) { + + } + + public boolean handleFault(SOAPMessageContext arg0) { + return true; + } + + public boolean handleMessage(SOAPMessageContext arg0) { + System.out.println("DemoHandler.handleMessage"); + return true; + } + + + +} Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/DemoService.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/DemoService.java (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/DemoService.java (revision 0) @@ -0,0 +1,15 @@ +package org.apache.axis2.jaxws.handler.header; + +import javax.jws.HandlerChain; +import javax.jws.WebService; + +@WebService +@HandlerChain(file="handler.xml") +public class DemoService { + + public String echo(String msg) { + System.out.println("DemoService.echo called with msg: " + msg); + return "Hello, " + msg; + } + +} Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/handler.xml =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/handler.xml (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/test/org/apache/axis2/jaxws/handler/header/handler.xml (revision 0) @@ -0,0 +1,10 @@ + + + + + + org.apache.axis2.jaxws.handler.header.DemoHandler + + + + \ No newline at end of file Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/maven.xml =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/maven.xml (revision 3243) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/maven.xml (working copy) @@ -792,6 +792,26 @@ + + + + + + + + + + + + + + + + + + + + Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java (revision 3243) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java (working copy) @@ -33,6 +33,7 @@ import org.apache.axis2.jaxws.handler.HandlerChainProcessor; import org.apache.axis2.jaxws.handler.HandlerInvokerUtils; import org.apache.axis2.jaxws.handler.HandlerResolverImpl; +import org.apache.axis2.jaxws.handler.HandlerUtils; import org.apache.axis2.jaxws.i18n.Messages; import org.apache.axis2.jaxws.message.Message; import org.apache.axis2.jaxws.message.Protocol; @@ -196,9 +197,12 @@ if (log.isDebugEnabled()) { log.debug("No handlers found on the InvocationContext, initializing handler list."); } - eic.setHandlers(new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo())); + eic.setHandlers(new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo())); } - + //Since we are adding the handlers to description layer here we will register all the + //headers set by SOAPHandler->getHeader with AxisService here. + HandlerUtils.registerSOAPHandlerHeaders(request.getAxisMessageContext(), eic.getHandlers()); + if (!Utils.bindingTypesMatch(request, endpointDesc.getServiceDescription())) { Protocol protocol = request.getMessage().getProtocol(); MessageContext faultContext = Utils.createVersionMismatchMessage(request, protocol); @@ -217,6 +221,10 @@ // modify/destroy parts of the message. Make sure to save // the request message if appropriate. saveRequestMessage(request); + //As per section 10.2.1 of JAXWS Specification, perform a mustUnderstand processing before + //invoking inbound handlers. + + HandlerUtils.checkMustUnderstand(request.getAxisMessageContext()); // Invoke inbound application handlers. It's safe to use the first object on the iterator because there is // always exactly one EndpointDescription on a server invoke Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java (revision 3243) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java (working copy) @@ -19,17 +19,22 @@ package org.apache.axis2.jaxws.server; +import javax.xml.ws.Binding; +import javax.xml.ws.WebServiceException; + import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.AddressingConstants; import org.apache.axis2.context.OperationContext; import org.apache.axis2.description.AxisOperation; import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.Parameter; import org.apache.axis2.engine.AxisEngine; import org.apache.axis2.engine.MessageReceiver; +import org.apache.axis2.engine.MessageReceiverExtension; import org.apache.axis2.jaxws.ExceptionFactory; -import org.apache.axis2.jaxws.core.InvocationContext; import org.apache.axis2.jaxws.core.InvocationContextFactory; import org.apache.axis2.jaxws.core.MessageContext; +import org.apache.axis2.jaxws.description.EndpointDescription; import org.apache.axis2.jaxws.handler.AttachmentsAdapter; import org.apache.axis2.jaxws.handler.MEPContext; import org.apache.axis2.jaxws.handler.TransportHeadersAdapter; @@ -43,15 +48,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.xml.ws.Binding; -import javax.xml.ws.WebServiceException; - /** * The JAXWSMessageReceiver is the entry point, from the server's perspective, * to the JAX-WS code. This will be called by the Axis Engine and is the end * of the chain from an Axis2 perspective. */ -public class JAXWSMessageReceiver implements MessageReceiver { +public class JAXWSMessageReceiver implements MessageReceiver, MessageReceiverExtension{ private static final Log log = LogFactory.getLog(JAXWSMessageReceiver.class); @@ -206,8 +208,35 @@ throw faultToReturn; } } + + /* (non-Javadoc) + * @see org.apache.axis2.jaxws.server.MessageReceiverExtension#isMustUnderstandCheckPosponed() + */ + public boolean isMustUnderstandCheckPostponed(org.apache.axis2.context.MessageContext axisRequestMsgCtx) { + AxisService axisSvc = axisRequestMsgCtx.getAxisService(); + if (axisSvc.getParameter(EndpointDescription.AXIS_SERVICE_PARAMETER) != null) { + Parameter param = axisSvc.getParameter(EndpointDescription.AXIS_SERVICE_PARAMETER); + EndpointDescription ed = (EndpointDescription)param.getValue(); + //Lets check if there is a Handler implementation present using Metadata layer. + //HandlerChain annotation can be present in Service Endpoint or ServiceEndpointInterface. + // ed.getHandlerChain() looks for HandlerAnnotation at both Endpoint and at SEI. + if(log.isDebugEnabled()){ + log.debug("Check to see if a jaxws handler is configured."); + } + if(ed.getHandlerChain()!=null){ + return true; + } - private boolean isMepInOnly(String mep) { + return false; + } + else{ + //If we cannot get to ServiceDescription to check for HandlerChain annotation we will return true. + return true; + } + + } + + private boolean isMepInOnly(String mep) { boolean inOnly = mep.equals(WSDL20_2004_Constants.MEP_URI_ROBUST_IN_ONLY) || mep.equals(WSDL20_2004_Constants.MEP_URI_IN_ONLY) Index: C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerUtils.java =================================================================== --- C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerUtils.java (revision 0) +++ C:/webservices/rad/WSFP_GM_092507/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerUtils.java (revision 0) @@ -0,0 +1,148 @@ +package org.apache.axis2.jaxws.handler; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.xml.namespace.QName; +import javax.xml.ws.handler.Handler; +import javax.xml.ws.handler.soap.SOAPHandler; + +import org.apache.axiom.soap.SOAP11Constants; +import org.apache.axiom.soap.SOAP12Constants; +import org.apache.axiom.soap.SOAPConstants; +import org.apache.axiom.soap.SOAPEnvelope; +import org.apache.axis2.AxisFault; +import org.apache.axis2.Constants; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.Parameter; +import org.apache.axis2.i18n.Messages; +import org.apache.axis2.util.LoggingControl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +/* + * Utility class to perform static utility type of operations on Handlers. + */ +public class HandlerUtils { + private static Log log = LogFactory.getLog(HandlerUtils.class); + + /** + * IregisterHandlerHeaders will invoke getHeaders on SOAPHandlers and register these headers + * with AxisService as Understood headers. + * @param msgContext + * @param handlers + */ + public static void registerSOAPHandlerHeaders(MessageContext msgContext, List handlers){ + if(msgContext == null){ + return; + } + AxisOperation axisOperation = msgContext.getAxisOperation(); + + AxisService axisService = msgContext.getAxisService(); + //do nothing if handlers or axisService is null. + if(handlers == null || axisService == null){ + return; + } + + ArrayList understoodHeaderNames = axisOperation.getUnderstoodHeaderQNames(); + for(Handler handler:handlers){ + if(handler instanceof SOAPHandler){ + SOAPHandler soapHandler = (SOAPHandler)handler; + //Invoking getHeaders. + if(log.isDebugEnabled()){ + log.debug("Invoking getHeader() on SOAPHandler"); + } + Set headers = soapHandler.getHeaders(); + if(headers!=null){ + for(QName header:headers){ + if(!understoodHeaderNames.contains(header)){ + if(log.isDebugEnabled()){ + log.debug("Adding Header QName" + header + " to uderstoodHeaderQName List"); + } + //Adding this to understood header list of AxisOperation. + understoodHeaderNames.add(header); + } + } + } + } + } + } + + /** + * checkMustUnderstand will validate headers that where delegated by Axis Engine + * to MessageReceiver for mustUnderstand check. + * @param msgContext + * @throws AxisFault + */ + public static void checkMustUnderstand(MessageContext msgContext)throws AxisFault{ + if (msgContext == null || !msgContext.isHeaderPresent()) { + return; + } + SOAPEnvelope envelope = msgContext.getEnvelope(); + if (envelope.getHeader() == null) { + return; + } + AxisService axisService =msgContext.getAxisService(); + if(axisService == null){ + return; + } + if(log.isDebugEnabled()){ + log.debug("Reading faultyHeaderQNames from axisService Parameter"); + } + Parameter param = axisService.getParameter(Constants.FAULTY_HEADER_QNAMES); + if(param == null){ + if(log.isDebugEnabled()){ + log.debug("axisService Parameter FAULTY_HEADER_QNAMES is null"); + } + return; + } + + ArrayList headerQNames = (ArrayList)param.getValue(); + AxisOperation axisOperation = msgContext.getAxisOperation(); + for (QName headerQName : headerQNames) { + if (axisOperation != null) { + ArrayList understoodHeaderList = (ArrayList) axisOperation.getUnderstoodHeaderQNames(); + if (understoodHeaderList != null && !understoodHeaderList.isEmpty()) { + if (understoodHeaderList.contains(headerQName)) { + if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) { + log.debug("MustUnderstand header registered as understood on AxisOperation: " + headerQName); + } + continue; + } + } + } + + if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) { + log.debug("MustUnderstand header not processed or registered as understood " + headerQName); + } + + // Throw a MustUnderstand fault for the current SOAP version + String prefix = envelope.getNamespace().getPrefix(); + + if (!msgContext.isSOAP11()) { + + if (prefix == null || "".equals(prefix)) { + prefix = SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX; + } + // TODO: should we be using a prefix on the faultcode? What about + // the QName object Constants.FAULT_SOAP12_MUSTUNDERSTAND? + throw new AxisFault(Messages.getMessage("mustunderstandfailed", + prefix, + headerQName.toString()), + SOAP12Constants.FAULT_CODE_MUST_UNDERSTAND); + } else { + + // TODO: should we be using a prefix on the faultcode? What about + // the QName object Constants.FAULT_MUSTUNDERSTAND? + throw new AxisFault(Messages.getMessage("mustunderstandfailed", + prefix, + headerQName.toString()), + SOAP11Constants.FAULT_CODE_MUST_UNDERSTAND); + } + } + //resetting the FAULTY_HEADER_QNAME to null. + param.setValue(null); + } +}