//We'll need an instance of the EndpointController to actually
//drive the invocation.
//TODO: More work needed to determine the lifecycle of this thing
EndpointController endpointCtlr = new EndpointController();
MessageContext requestMsgCtx = new MessageContext(axisRequestMsgCtx);
requestMsgCtx.setServer(true);
requestMsgCtx.setMEPContext(new MEPContext(requestMsgCtx));
ClassLoader loader = getCachedClassLoader(axisRequestMsgCtx);
if (loader != null) {
requestMsgCtx.setProperty(org.apache.axis2.jaxws.spi.Constants.CACHE_CLASSLOADER,
loader);
}
// The adapters need to be installed on the new request Message Context
AttachmentsAdapter.install(requestMsgCtx);
TransportHeadersAdapter.install(requestMsgCtx);
SOAPHeadersAdapter.install(requestMsgCtx);
Binding binding = (Binding)axisRequestMsgCtx.getProperty(PARAM_BINDING);
EndpointInvocationContext eic = InvocationContextFactory.createEndpointInvocationContext(binding);
addInvocationListenerFactories(eic);
eic.setRequestMessageContext(requestMsgCtx);
// WARNING: This should be left disabled for now. This locks the server side
// into a single threaded invocation.
eic.getRequestMessageContext().setProperty(ServerConstants.SERVER_DISABLE_THREAD_SWITCH, true);
if (isMepInOnly(mep)) {
if (log.isDebugEnabled()) {
log.debug("Detected a one way invocation.");
}
eic.setIsOneWay(true);
endpointCtlr.invokeOneWay(eic);
} else if (JavaUtils.isTrueExplicitly(axisRequestMsgCtx.getProperty(
AddressingConstants.IS_ADDR_INFO_ALREADY_PROCESSED))
&& (axisRequestMsgCtx.getReplyTo() != null
&& !axisRequestMsgCtx.getReplyTo().hasAnonymousAddress())) {
if (log.isDebugEnabled()) {
log.debug("Detected an async invocation.");
}
EndpointCallback ecb = new EndpointCallback();
eic.setCallback(ecb);
endpointCtlr.invokeAsync(eic);
} else {
if (log.isDebugEnabled()) {
log.debug("Detected a sync invocation.");
}
eic = endpointCtlr.invoke(eic);
// If this is a two-way exchange, there should already be a
// JAX-WS MessageContext for the response. We need to pull
// the Message data out of there and set it on the Axis2
// MessageContext.
MessageContext responseMsgCtx = eic.getResponseMessageContext();
// Note that responseMsgCtx may be null if the Provider returned null
// and no wsdl was specified.
// In JAX-WS 2.2 for Providers that return null we should send back
// an empty payload, not a SOAPEnvelope.
if (responseMsgCtx == null &&
MessageContextUtils.getJaxwsProviderInterpretNullOneway(requestMsgCtx)) {
if (log.isDebugEnabled()) {
log.debug("Detected a null return from a Provider, sending back an ack instead of a response.");
}
sendAckBack(axisRequestMsgCtx);
} else {
org.apache.axis2.context.MessageContext axisResponseMsgCtx =
responseMsgCtx.getAxisMessageContext();
if (loader != null) {
responseMsgCtx.setProperty(org.apache.axis2.jaxws.spi.Constants.CACHE_CLASSLOADER,
loader);
}
MessageUtils.putMessageOnMessageContext(responseMsgCtx.getMessage(),
axisResponseMsgCtx);
OperationContext opCtx = axisResponseMsgCtx.getOperationContext();
opCtx.addMessageContext(axisResponseMsgCtx);
// If this is a fault message, we want to throw it as an
// exception so that the transport can do the appropriate things
if (responseMsgCtx.getMessage().isFault()) {
//Rather than create a new AxisFault, we should use the AxisFault that was
//created at the causedBy
if (responseMsgCtx.getCausedByException() != null) {
faultToReturn = responseMsgCtx.getCausedByException();
if (log.isDebugEnabled()) {
log.debug("Setting causedByException from response MessageContext");
}
} else if (requestMsgCtx.getCausedByException() != null) {
faultToReturn = requestMsgCtx.getCausedByException();