001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019:
020: package org.apache.axis2.dispatchers;
021:
022: import org.apache.axis2.AxisFault;
023: import org.apache.axis2.addressing.AddressingConstants;
024: import org.apache.axis2.context.MessageContext;
025: import org.apache.axis2.context.OperationContext;
026: import org.apache.axis2.context.ServiceContext;
027: import org.apache.axis2.context.ServiceGroupContext;
028: import org.apache.axis2.description.AxisOperation;
029: import org.apache.axis2.description.AxisService;
030: import org.apache.axis2.description.HandlerDescription;
031: import org.apache.axis2.engine.AbstractDispatcher;
032: import org.apache.axis2.i18n.Messages;
033: import org.apache.axis2.util.LoggingControl;
034: import org.apache.commons.logging.Log;
035: import org.apache.commons.logging.LogFactory;
036:
037: /**
038: * Dispatcher based on the WS-Addressing properties.
039: */
040: public class AddressingBasedDispatcher extends AbstractDispatcher
041: implements AddressingConstants {
042:
043: /**
044: * Field NAME
045: */
046: public static final String NAME = "AddressingBasedDispatcher";
047: private static final Log log = LogFactory
048: .getLog(AddressingBasedDispatcher.class);
049: private RequestURIBasedServiceDispatcher rubsd = new RequestURIBasedServiceDispatcher();
050: private ActionBasedOperationDispatcher abod = new ActionBasedOperationDispatcher();
051:
052: public AxisOperation findOperation(AxisService service,
053: MessageContext messageContext) throws AxisFault {
054: return abod.findOperation(service, messageContext);
055: }
056:
057: public AxisService findService(MessageContext messageContext)
058: throws AxisFault {
059: return rubsd.findService(messageContext);
060: }
061:
062: public void initDispatcher() {
063: init(new HandlerDescription(NAME));
064: }
065:
066: /**
067: * @param msgctx
068: * @throws org.apache.axis2.AxisFault
069: * @noinspection MethodReturnOfConcreteClass
070: */
071: public InvocationResponse invoke(MessageContext msgctx)
072: throws AxisFault {
073: // first check we can dispatch using the relates to
074: if (msgctx.getRelatesTo() != null) {
075: String relatesTo = msgctx.getRelatesTo().getValue();
076:
077: if (LoggingControl.debugLoggingAllowed
078: && log.isDebugEnabled()) {
079: log.debug(msgctx.getLogIDString()
080: + " "
081: + Messages.getMessage("checkingrelatesto",
082: relatesTo));
083: }
084: if (relatesTo != null && !"".equals(relatesTo)
085: && (msgctx.getOperationContext() == null)) {
086: OperationContext operationContext = msgctx
087: .getConfigurationContext().getOperationContext(
088: relatesTo);
089:
090: if (operationContext != null) //noinspection TodoComment
091: {
092: // if(operationContext.isComplete()){
093: // // If the dispatch happens because of the RelatesTo and the mep is complete
094: // // we should throw a more descriptive fault.
095: // throw new AxisFault(Messages.getMessage("duplicaterelatesto",relatesTo));
096: // }
097: msgctx.setAxisOperation(operationContext
098: .getAxisOperation());
099: msgctx.setOperationContext(operationContext);
100: msgctx
101: .setServiceContext((ServiceContext) operationContext
102: .getParent());
103: msgctx
104: .setAxisService(((ServiceContext) operationContext
105: .getParent()).getAxisService());
106:
107: // TODO : Is this necessary here?
108: msgctx.getAxisOperation().registerMessageContext(
109: msgctx, operationContext);
110:
111: msgctx
112: .setServiceGroupContextId(((ServiceGroupContext) msgctx
113: .getServiceContext().getParent())
114: .getId());
115:
116: if (LoggingControl.debugLoggingAllowed
117: && log.isDebugEnabled()) {
118: log
119: .debug(msgctx.getLogIDString()
120: + " Dispatched successfully on the RelatesTo. operation="
121: + operationContext
122: .getAxisOperation());
123: }
124: return InvocationResponse.CONTINUE;
125: }
126: }
127: }
128: return super.invoke(msgctx);
129: }
130: }
|