| /* |
| * 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.addressing; |
| |
| import org.apache.axis2.AxisFault; |
| import org.apache.axis2.addressing.AddressingConstants; |
| import org.apache.axis2.addressing.AddressingFaultsHelper; |
| import org.apache.axis2.addressing.AddressingHelper; |
| import org.apache.axis2.addressing.EndpointReference; |
| import org.apache.axis2.context.MessageContext; |
| import org.apache.axis2.description.AxisDescription; |
| import org.apache.axis2.description.AxisOperation; |
| import org.apache.axis2.handlers.AbstractHandler; |
| import org.apache.axis2.util.JavaUtils; |
| import org.apache.axis2.util.Utils; |
| import org.apache.axis2.wsdl.WSDLConstants; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| public class AddressingValidationHandler extends AbstractHandler implements AddressingConstants { |
| |
| private static final Log log = LogFactory.getLog(AddressingValidationHandler.class); |
| |
| /* (non-Javadoc) |
| * @see org.apache.axis2.engine.Handler#invoke(org.apache.axis2.context.MessageContext) |
| */ |
| public InvocationResponse invoke(MessageContext msgContext) throws AxisFault { |
| Object flag = msgContext.getLocalProperty(IS_ADDR_INFO_ALREADY_PROCESSED); |
| if (log.isTraceEnabled()) { |
| log.trace("invoke: IS_ADDR_INFO_ALREADY_PROCESSED=" + flag); |
| } |
| |
| if (JavaUtils.isTrueExplicitly(flag)) { |
| // Check if the wsa:MessageID is required or not. |
| checkMessageIDHeader(msgContext); |
| |
| // Check that if wsamInvocationPattern flag is in effect that the replyto and faultto are valid. |
| if (JavaUtils.isTrue(msgContext.getProperty(ADDR_VALIDATE_INVOCATION_PATTERN), true)) { |
| checkWSAMInvocationPattern(msgContext); |
| } |
| } |
| else { |
| // Check that if wsaddressing=required that addressing headers were found inbound |
| checkUsingAddressing(msgContext); |
| } |
| |
| return InvocationResponse.CONTINUE; |
| } |
| |
| /** |
| * Check that if the wsaddressing="required" attribute exists on the service definition |
| * (or AddressingFeature on the client) or <wsaw:UsingAddressing wsdl:required="true" /> |
| * was found in the WSDL (provider side only) that WS-Addressing headers were found on |
| * the inbound message. |
| */ |
| private void checkUsingAddressing(MessageContext msgContext) |
| throws AxisFault { |
| String addressingFlag; |
| if (!msgContext.isServerSide()) { |
| // On client side, get required value from the request message context |
| // (set by AddressingConfigurator). |
| // We do not use the UsingAddressing required attribute on the |
| // client side since it is not generated/processed by java tooling. |
| addressingFlag = AddressingHelper.getRequestAddressingRequirementParameterValue(msgContext); |
| if (log.isTraceEnabled()) { |
| log.trace("checkUsingAddressing: WSAddressingFlag from MessageContext=" + addressingFlag); |
| } |
| } else { |
| // On provider side, get required value from AxisOperation |
| // (set by AddressingConfigurator and UsingAddressing WSDL processing). |
| AxisDescription ad = msgContext.getAxisService(); |
| if(msgContext.getAxisOperation()!=null){ |
| ad = msgContext.getAxisOperation(); |
| } |
| addressingFlag = |
| AddressingHelper.getAddressingRequirementParemeterValue(ad); |
| if (log.isTraceEnabled()) { |
| log.trace("checkUsingAddressing: WSAddressingFlag from AxisOperation=" + addressingFlag); |
| } |
| } |
| if (AddressingConstants.ADDRESSING_REQUIRED.equals(addressingFlag)) { |
| AddressingFaultsHelper.triggerMessageAddressingRequiredFault(msgContext, |
| AddressingConstants.WSA_ACTION); |
| } |
| } |
| |
| /** |
| * Check that if a wsaw:Anonymous value was set on the AxisOperation that the values in the |
| * ReplyTo+FaultTo are valid and fault if not. |
| */ |
| private void checkWSAMInvocationPattern(MessageContext msgContext) throws AxisFault { |
| String value = |
| AddressingHelper.getInvocationPatternParameterValue(msgContext.getAxisOperation()); |
| if (log.isTraceEnabled()) { |
| log.trace("checkWSAMInvocationPattern: value=" + value); |
| } |
| if(!AddressingConstants.WSAM_INVOCATION_PATTERN_BOTH.equals(value)){ |
| if (WSAM_INVOCATION_PATTERN_SYNCHRONOUS.equals(value)) { |
| if (!AddressingHelper.isSyncReplyAllowed(msgContext)) { |
| EndpointReference anonEPR = |
| new EndpointReference(AddressingConstants.Final.WSA_ANONYMOUS_URL); |
| msgContext.setReplyTo(anonEPR); |
| msgContext.setFaultTo(anonEPR); |
| AddressingFaultsHelper.triggerOnlyAnonymousAddressSupportedFault(msgContext, |
| AddressingConstants.WSA_REPLY_TO); |
| } |
| if (!AddressingHelper.isSyncFaultAllowed(msgContext)) { |
| EndpointReference anonEPR = |
| new EndpointReference(AddressingConstants.Final.WSA_ANONYMOUS_URL); |
| msgContext.setReplyTo(anonEPR); |
| msgContext.setFaultTo(anonEPR); |
| AddressingFaultsHelper.triggerOnlyAnonymousAddressSupportedFault(msgContext, |
| AddressingConstants.WSA_FAULT_TO); |
| } |
| } else if (WSAM_INVOCATION_PATTERN_ASYNCHRONOUS.equals(value)) { |
| if (!AddressingHelper.isReplyRedirected(msgContext)) { |
| AddressingFaultsHelper.triggerOnlyNonAnonymousAddressSupportedFault(msgContext, |
| AddressingConstants.WSA_REPLY_TO); |
| } |
| if (!AddressingHelper.isFaultRedirected(msgContext)) { |
| AddressingFaultsHelper.triggerOnlyNonAnonymousAddressSupportedFault(msgContext, |
| AddressingConstants.WSA_FAULT_TO); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Validate that a message id is present when required. The check applied here only applies to |
| * WS-Addressing headers that comply with the 2005/08 (final) spec. |
| * |
| * @param msgContext |
| * @throws AxisFault |
| * @see AddressingInHandler#checkForMandatoryHeaders |
| */ |
| private void checkMessageIDHeader(MessageContext msgContext) throws AxisFault { |
| String namespace = (String)msgContext.getLocalProperty(WS_ADDRESSING_VERSION); |
| if (!Final.WSA_NAMESPACE.equals(namespace)) { |
| return; |
| } |
| |
| AxisOperation axisOperation = msgContext.getAxisOperation(); |
| |
| if (axisOperation != null) { |
| String mep = axisOperation.getMessageExchangePattern(); |
| int mepConstant = Utils.getAxisSpecifMEPConstant(mep); |
| |
| if (mepConstant == WSDLConstants.MEP_CONSTANT_IN_OUT || |
| mepConstant == WSDLConstants.MEP_CONSTANT_IN_OPTIONAL_OUT || |
| mepConstant == WSDLConstants.MEP_CONSTANT_ROBUST_IN_ONLY) { |
| String messageId = msgContext.getOptions().getMessageId(); |
| if (messageId == null || "".equals(messageId)) { |
| AddressingFaultsHelper |
| .triggerMessageAddressingRequiredFault(msgContext, WSA_MESSAGE_ID); |
| } |
| } |
| } |
| } |
| } |