package org.jboss.axis.server;
import org.jboss.axis.AxisEngine;
import org.jboss.axis.AxisFault;
import org.jboss.axis.AxisProperties;
import org.jboss.axis.Constants;
import org.jboss.axis.EngineConfiguration;
import org.jboss.axis.Handler;
import org.jboss.axis.Message;
import org.jboss.axis.MessageContext;
import org.jboss.axis.SimpleTargetedChain;
import org.jboss.axis.client.AxisClient;
import org.jboss.axis.configuration.EngineConfigurationFactoryFinder;
import org.jboss.axis.soap.SOAPConstants;
import org.jboss.axis.utils.ClassUtils;
import org.jboss.axis.utils.Messages;
import org.jboss.logging.Logger;
import java.util.Map;
public class AxisServer extends AxisEngine
{
private static Logger log = Logger.getLogger(AxisServer.class.getName());
private static Logger tlog = Logger.getLogger("org.jboss.axis.TIME");
private static AxisServerFactory factory = null;
public static AxisServer getServer(Map environment) throws AxisFault
{
if (factory == null)
{
String factoryClassName = AxisProperties.getProperty("axis.ServerFactory");
if (factoryClassName != null)
{
try
{
Class factoryClass = ClassUtils.forName(factoryClassName);
if (AxisServerFactory.class.isAssignableFrom(factoryClass))
factory = (AxisServerFactory)factoryClass.newInstance();
}
catch (Exception e)
{
log.error(Messages.getMessage("exception00"), e);
}
}
if (factory == null)
{
factory = new DefaultAxisServerFactory();
}
}
return factory.getServer(environment);
}
private AxisEngine clientEngine;
public AxisServer()
{
this(EngineConfigurationFactoryFinder.newFactory().getServerEngineConfig());
}
public AxisServer(EngineConfiguration config)
{
super(config);
setShouldSaveConfig(true);
}
private boolean running = true;
public boolean isRunning()
{
return running;
}
public void start()
{
init();
running = true;
}
public void stop()
{
running = false;
}
public synchronized AxisEngine getClientEngine()
{
if (clientEngine == null)
{
clientEngine = new AxisClient(); }
return clientEngine;
}
public void invoke(MessageContext msgContext) throws AxisFault
{
long t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0;
if (tlog.isDebugEnabled())
{
t0 = System.currentTimeMillis();
}
if (log.isDebugEnabled())
{
log.debug("Enter: AxisServer::invoke");
}
if (!isRunning())
{
throw new AxisFault("Server.disabled",
Messages.getMessage("serverDisabled00"),
null, null);
}
String hName = null;
Handler h = null;
MessageContext previousContext = getCurrentMessageContext();
try
{
setCurrentMessageContext(msgContext);
hName = msgContext.getStrProp(MessageContext.ENGINE_HANDLER);
if (hName != null)
{
if ((h = getHandler(hName)) == null)
{
ClassLoader cl = msgContext.getClassLoader();
try
{
log.debug(Messages.getMessage("tryingLoad00", hName));
Class cls = ClassUtils.forName(hName, true, cl);
h = (Handler)cls.newInstance();
}
catch (Exception e)
{
h = null;
}
}
if (tlog.isDebugEnabled())
{
t1 = System.currentTimeMillis();
}
if (h != null)
h.invoke(msgContext);
else
throw new AxisFault("Server.error",
Messages.getMessage("noHandler00", hName),
null, null);
if (tlog.isDebugEnabled())
{
t2 = System.currentTimeMillis();
tlog.debug("AxisServer.invoke " + hName + " invoke=" +
(t2 - t1) + " pre=" + (t1 - t0));
}
}
else
{
if (log.isDebugEnabled())
{
log.debug(Messages.getMessage("defaultLogic00"));
}
hName = msgContext.getTransportName();
SimpleTargetedChain transportChain = null;
if (log.isDebugEnabled())
log.debug(Messages.getMessage("transport01", "AxisServer.invoke", hName));
if (tlog.isDebugEnabled())
{
t1 = System.currentTimeMillis();
}
if (hName != null && (h = getTransport(hName)) != null)
{
if (h instanceof SimpleTargetedChain)
{
transportChain = (SimpleTargetedChain)h;
h = transportChain.getRequestHandler();
if (h != null)
h.invoke(msgContext);
}
}
if (tlog.isDebugEnabled())
{
t2 = System.currentTimeMillis();
}
if ((h = getGlobalRequest()) != null)
{
h.invoke(msgContext);
}
h = msgContext.getService();
if (h == null)
{
Message rm = msgContext.getRequestMessage();
rm.getSOAPEnvelope().getFirstBody();
h = msgContext.getService();
if (h == null)
throw new AxisFault("Server.NoService",
Messages.getMessage("noService05",
"" + msgContext.getTargetService()),
null, null);
}
if (tlog.isDebugEnabled())
{
t3 = System.currentTimeMillis();
}
if (msgContext.getRequestMessage().getSOAPEnvelope().getSOAPConstants() != null)
{
SOAPConstants soapConstants = msgContext.getRequestMessage().getSOAPEnvelope().getSOAPConstants();
msgContext.setSOAPConstants(soapConstants);
}
h.invoke(msgContext);
if (tlog.isDebugEnabled())
{
t4 = System.currentTimeMillis();
}
if ((h = getGlobalResponse()) != null)
h.invoke(msgContext);
if (transportChain != null)
{
h = transportChain.getResponseHandler();
if (h != null)
h.invoke(msgContext);
}
if (tlog.isDebugEnabled())
{
t5 = System.currentTimeMillis();
tlog.debug("AxisServer.invoke2 " +
" preTr=" +
(t1 - t0) + " tr=" + (t2 - t1) +
" preInvoke=" + (t3 - t2) +
" invoke=" + (t4 - t3) +
" postInvoke=" + (t5 - t4) +
" " + msgContext.getTargetService() + "." +
((msgContext.getOperation() == null) ?
"" : msgContext.getOperation().getName()));
}
}
}
catch (AxisFault e)
{
throw e;
}
catch (Exception e)
{
throw AxisFault.makeFault(e);
}
finally
{
setCurrentMessageContext(previousContext);
}
if (log.isDebugEnabled())
{
log.debug("Exit: AxisServer::invoke");
}
}
public void generateWSDL(MessageContext msgContext) throws AxisFault
{
if (log.isDebugEnabled())
{
log.debug("Enter: AxisServer::generateWSDL");
}
if (!isRunning())
{
throw new AxisFault("Server.disabled",
Messages.getMessage("serverDisabled00"),
null, null);
}
String hName = null;
Handler h = null;
MessageContext previousContext = getCurrentMessageContext();
try
{
setCurrentMessageContext(msgContext);
hName = msgContext.getStrProp(MessageContext.ENGINE_HANDLER);
if (hName != null)
{
if ((h = getHandler(hName)) == null)
{
ClassLoader cl = msgContext.getClassLoader();
try
{
log.debug(Messages.getMessage("tryingLoad00", hName));
Class cls = ClassUtils.forName(hName, true, cl);
h = (Handler)cls.newInstance();
}
catch (Exception e)
{
throw new AxisFault("Server.error",
Messages.getMessage("noHandler00", hName),
null, null);
}
}
h.generateWSDL(msgContext);
}
else
{
log.debug(Messages.getMessage("defaultLogic00"));
hName = msgContext.getTransportName();
SimpleTargetedChain transportChain = null;
if (log.isDebugEnabled())
log.debug(Messages.getMessage("transport01",
"AxisServer.generateWSDL",
hName));
if (hName != null && (h = getTransport(hName)) != null)
{
if (h instanceof SimpleTargetedChain)
{
transportChain = (SimpleTargetedChain)h;
h = transportChain.getRequestHandler();
if (h != null)
{
h.generateWSDL(msgContext);
}
}
}
if ((h = getGlobalRequest()) != null)
h.generateWSDL(msgContext);
h = msgContext.getService();
if (h == null)
{
Message rm = msgContext.getRequestMessage();
if (rm != null)
{
rm.getSOAPEnvelope().getFirstBody();
h = msgContext.getService();
}
if (h == null)
{
throw new AxisFault(Constants.QNAME_NO_SERVICE_FAULT_CODE,
Messages.getMessage("noService05",
"" + msgContext.getTargetService()),
null, null);
}
}
h.generateWSDL(msgContext);
if ((h = getGlobalResponse()) != null)
h.generateWSDL(msgContext);
if (transportChain != null)
{
h = transportChain.getResponseHandler();
if (h != null)
{
h.generateWSDL(msgContext);
}
}
}
}
catch (AxisFault e)
{
throw e;
}
catch (Exception e)
{
throw AxisFault.makeFault(e);
}
finally
{
setCurrentMessageContext(previousContext);
}
if (log.isDebugEnabled())
{
log.debug("Exit: AxisServer::generateWSDL");
}
}
}