package org.jboss.webservice.server;
import org.jboss.axis.AxisFault;
import org.jboss.axis.Constants;
import org.jboss.axis.EngineConfiguration;
import org.jboss.axis.Handler;
import org.jboss.axis.MessageContext;
import org.jboss.axis.SimpleTargetedChain;
import org.jboss.axis.description.OperationDesc;
import org.jboss.axis.server.AxisServer;
import org.jboss.axis.soap.SOAPConstants;
import org.jboss.axis.utils.Messages;
import org.jboss.logging.Logger;
import javax.xml.soap.SOAPException;
public class ServerEngine extends AxisServer
{
static final long serialVersionUID = 5160872757245559530L;
private static final Logger log = Logger.getLogger(ServerEngine.class);
public ServerEngine(EngineConfiguration config)
{
super(config);
log.debug("new ServerEngine [config=" + config + "]");
}
public void invoke(final MessageContext msgContext) throws AxisFault
{
try
{
long t1 = System.currentTimeMillis();
msgContext.getMessage().getSOAPPart().getEnvelope();
long t2 = System.currentTimeMillis();
Logger.getLogger(Constants.TIME_LOG_CATEGORY).debug("Get SOAPEnvelope in " + (t2 - t1) + "ms");
OperationDesc currOperation = msgContext.getOperation();
if (currOperation != null && currOperation.isOneWay())
{
Thread th = new Thread()
{
public void run()
{
try
{
invokeInternal(msgContext);
}
catch (AxisFault fault)
{
log.error("Asyncronous Server error: " + fault.dumpToString());
}
}
};
th.start();
msgContext.setResponseMessage(null);
log.debug("Returning immediately from one-way operation: " + currOperation.getName());
return;
}
invokeInternal(msgContext);
}
catch (AxisFault af)
{
log.error("Server error: " + af.dumpToString());
throw af;
}
catch (SOAPException ex)
{
log.error("Server error", ex);
throw AxisFault.makeFault(ex);
}
catch (RuntimeException ex)
{
log.error("Server error", ex);
throw ex;
}
}
private void invokeInternal(MessageContext msgContext) throws AxisFault
{
log.debug("invoke: " + msgContext);
long t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0;
if (!isRunning())
{
throw new AxisFault("Server.disabled",
Messages.getMessage("serverDisabled00"),
null, null);
}
String hName = null;
Handler handler = null;
MessageContext previousContext = getCurrentMessageContext();
try
{
setCurrentMessageContext(msgContext);
hName = msgContext.getTransportName();
SimpleTargetedChain transportChain = null;
log.debug("TransportHandler: " + hName);
t1 = System.currentTimeMillis();
if (hName != null && (handler = getTransport(hName)) != null)
{
if (handler instanceof SimpleTargetedChain)
{
transportChain = (SimpleTargetedChain)handler;
handler = transportChain.getRequestHandler();
if (handler != null)
handler.invoke(msgContext);
}
}
t2 = System.currentTimeMillis();
if ((handler = getGlobalRequest()) != null)
handler.invoke(msgContext);
t3 = System.currentTimeMillis();
handler = msgContext.getService();
if (handler == null)
{
throw new AxisFault("Server.NoService",
Messages.getMessage("noService05", msgContext.getTargetService()),
null, null);
}
if (msgContext.getSOAPConstants() != null)
{
SOAPConstants soapConstants = msgContext.getSOAPConstants();
msgContext.setSOAPConstants(soapConstants);
}
handler.invoke(msgContext);
t4 = System.currentTimeMillis();
if ((handler = getGlobalResponse()) != null)
handler.invoke(msgContext);
t5 = System.currentTimeMillis();
if (transportChain != null)
{
handler = transportChain.getResponseHandler();
if (handler != null)
handler.invoke(msgContext);
}
t6 = System.currentTimeMillis();
if (log.isTraceEnabled())
{
String serviceName = msgContext.getTargetService();
if (msgContext.getOperation() != null)
serviceName += "." + msgContext.getOperation().getName();
log.trace(serviceName + " [" +
"trIn=" + (t2 - t1) +
",glIn=" + (t3 - t2) +
",invoke=" + (t4 - t3) +
",glOut=" + (t5 - t4) +
",trOut=" + (t6 - t5) +
"]");
}
}
catch (AxisFault e)
{
throw e;
}
catch (Exception e)
{
throw AxisFault.makeFault(e);
}
finally
{
setCurrentMessageContext(previousContext);
}
}
}