if (log.isDebugEnabled()) {
log.debug("Enter: LocalSender::invoke");
}
AxisServer targetServer =
(AxisServer)clientContext.getProperty(LocalTransport.LOCAL_SERVER);
if (log.isDebugEnabled()) {
log.debug(Messages.getMessage("usingServer00",
"LocalSender", "" + targetServer));
}
if (targetServer == null) {
// This should have already been done, but it doesn't appear to be
// something that can be relied on. Oh, well...
if (server == null) init();
targetServer = server;
}
// Define a new messageContext per request
MessageContext serverContext = new MessageContext(targetServer);
// copy the request, and force its format to String in order to
// exercise the serializers.
// START FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17161
Message clientRequest = clientContext.getRequestMessage();
String msgStr = clientRequest.getSOAPPartAsString();
if (log.isDebugEnabled()) {
log.debug(Messages.getMessage("sendingXML00", "LocalSender"));
log.debug(msgStr);
}
Message serverRequest = new Message(msgStr);
Attachments serverAttachments = serverRequest.getAttachmentsImpl();
Attachments clientAttachments = clientRequest.getAttachmentsImpl();
if (null != clientAttachments && null != serverAttachments) {
serverAttachments.setAttachmentParts(clientAttachments.getAttachments());
}
serverContext.setRequestMessage(serverRequest);
// END FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17161
serverContext.setTransportName("local");
// Also copy authentication info if present
String user = clientContext.getUsername();
if (user != null) {
serverContext.setUsername(user);
String pass = clientContext.getPassword();
if (pass != null)
serverContext.setPassword(pass);
}
// set the realpath if possible
String transURL = clientContext.getStrProp(MessageContext.TRANS_URL);
if (transURL != null) {
try {
URL url = new URL(transURL);
String file = url.getFile();
if (file.length()>0 && file.charAt(0)=='/") {
file = file.substring(1);
}
serverContext.setProperty(Constants.MC_REALPATH, file);
serverContext.setProperty(MessageContext.TRANS_URL,
"local:///" + file);
// This enables "local:///AdminService" and the like to work.
serverContext.setTargetService(file);
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
}
// If we've been given an explicit "remote" service to invoke,
// use it. (Note that right now this overrides the setting above;
// is this the correct precedence?)
String remoteService = clientContext.getStrProp(LocalTransport.REMOTE_SERVICE);
if (remoteService != null)
serverContext.setTargetService(remoteService);
// invoke the request
try {
targetServer.invoke(serverContext);
} catch (AxisFault fault) {
Message respMsg = serverContext.getResponseMessage();
if (respMsg == null) {
respMsg = new Message(fault);
serverContext.setResponseMessage(respMsg);
} else {
SOAPFault faultEl = new SOAPFault(fault);
SOAPEnvelope env = respMsg.getSOAPEnvelope();
env.clearBody();
env.addBodyElement(faultEl);
}
}
// copy back the response, and force its format to String in order to
// exercise the deserializers.
clientContext.setResponseMessage(serverContext.getResponseMessage());
clientContext.getResponseMessage().getSOAPPartAsString();
if (log.isDebugEnabled()) {
log.debug("Exit: LocalSender::invoke");
}