blob: fd00cee0b90b824efaafa86d716c91e20c4ca2b9 [file] [log] [blame]
/*
* 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;
}
}