/* * Copyright 2004,2005 The Apache Software Foundation. * * Licensed 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.transport.base; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.OperationContext; import org.apache.axis2.AxisFault; import org.apache.axis2.description.AxisOperation; import org.apache.axis2.description.AxisMessage; import org.apache.axis2.wsdl.WSDLConstants; public class SynchronousCallback { private MessageContext outMessageContext; private MessageContext inMessageContext; private boolean isComplete; public SynchronousCallback(MessageContext outMessageContext) { this.outMessageContext = outMessageContext; this.isComplete = false; } public synchronized void setInMessageContext(MessageContext inMessageContext) throws AxisFault { // if some other thread has access and complete then return without doing any thing. // thread should have activate by the first message. if (!isComplete) { // this code is invoked only if the code use with axis2 at the client side // when axis2 client receive messages it waits in the sending thread until the response comes. // so this thread only notify the waiting thread and hence we need to build the message here. inMessageContext.getEnvelope().build(); OperationContext operationContext = outMessageContext.getOperationContext(); MessageContext msgCtx = operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); if (msgCtx == null) { // try to see whether there is a piggy back message context if (outMessageContext.getProperty(org.apache.axis2.Constants.PIGGYBACK_MESSAGE) != null) { msgCtx = (MessageContext) outMessageContext.getProperty(org.apache.axis2.Constants.PIGGYBACK_MESSAGE); msgCtx.setTransportIn(inMessageContext.getTransportIn()); msgCtx.setTransportOut(inMessageContext.getTransportOut()); msgCtx.setServerSide(false); msgCtx.setProperty(BaseConstants.MAIL_CONTENT_TYPE, inMessageContext.getProperty(BaseConstants.MAIL_CONTENT_TYPE)); // FIXME: this class must not be transport dependent since it is used by AbstractTransportListener msgCtx.setIncomingTransportName(org.apache.axis2.Constants.TRANSPORT_MAIL); msgCtx.setEnvelope(inMessageContext.getEnvelope()); } else { inMessageContext.setOperationContext(operationContext); inMessageContext.setServiceContext(outMessageContext.getServiceContext()); if (!operationContext.isComplete()) { operationContext.addMessageContext(inMessageContext); } AxisOperation axisOp = operationContext.getAxisOperation(); AxisMessage inMessage = axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE); inMessageContext.setAxisMessage(inMessage); inMessageContext.setServerSide(false); } } else { msgCtx.setOperationContext(operationContext); msgCtx.setServiceContext(outMessageContext.getServiceContext()); AxisOperation axisOp = operationContext.getAxisOperation(); AxisMessage inMessage = axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE); msgCtx.setAxisMessage(inMessage); msgCtx.setTransportIn(inMessageContext.getTransportIn()); msgCtx.setTransportOut(inMessageContext.getTransportOut()); msgCtx.setServerSide(false); msgCtx.setProperty(BaseConstants.MAIL_CONTENT_TYPE, inMessageContext.getProperty(BaseConstants.MAIL_CONTENT_TYPE)); // FIXME: this class must not be transport dependent since it is used by AbstractTransportListener msgCtx.setIncomingTransportName(org.apache.axis2.Constants.TRANSPORT_MAIL); msgCtx.setEnvelope(inMessageContext.getEnvelope()); } this.inMessageContext = inMessageContext; isComplete = true; this.notifyAll(); } } public boolean isComplete() { return isComplete; } public void setComplete(boolean complete) { isComplete = complete; } }