package org.jboss.webservice.server;
import org.jboss.axis.MessageContext;
import org.jboss.axis.providers.java.RPCInvocation;
import org.jboss.axis.providers.java.RPCProvider;
import org.jboss.logging.Logger;
import org.jboss.metadata.WebMetaData;
import org.jboss.webservice.Constants;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class InvokerProviderJSE extends InvokerProvider
{
static final long serialVersionUID = 17292705231485822L;
private Logger log = Logger.getLogger(InvokerProviderJSE.class);
private Map methodMap = new HashMap();
protected Object makeNewServiceObject(MessageContext msgContext, String className) throws Exception
{
log.debug("makeNewServiceObject: class=" + className);
String serviceEndpointBean = portComponentInfo.getPortComponentMetaData().getServiceEndpointBean();
if (serviceEndpointBean == null)
throw new ServiceException("Service endpoint bean class not set");
ClassLoader ctxLoader = getContextClassLoader();
msgContext.setClassLoader(ctxLoader);
Object obj = super.makeNewServiceObject(msgContext, serviceEndpointBean);
return obj;
}
protected Object invokeTarget(RPCInvocation invocation) throws Exception
{
MessageContext msgContext = invocation.getMessageContext();
try
{
if (handlerChain.handleRequest(msgContext) == false)
{
log.warn("FIXME: handlerChain.handleRequest() returned false");
return null;
}
invocation = (RPCInvocation)msgContext.getProperty(RPCProvider.RPC_INVOCATION);
}
catch (Exception e)
{
log.error("Error processing request handler chain", e);
throw e;
}
Object retObj = null;
try
{
retObj = super.invokeTarget(invocation);
}
catch (Exception e)
{
msgContext.setProperty(Constants.LAST_FAULT, e);
log.error("Error from service endpoint, processing fault handler chain", e);
if (handlerChain.handleFault(msgContext) == false)
{
log.warn("FIXME: handlerChain.handleFault() returned false");
return null;
}
throw e;
}
try
{
invocation.prepareResponseEnvelope(retObj);
if (handlerChain.handleResponse(msgContext) == false)
{
log.warn("FIXME: handlerChain.handleResponse() returned false");
return null;
}
}
catch (Exception e)
{
log.error("Error processing response handler chain", e);
throw e;
}
return retObj;
}
protected Object invokeServiceEndpoint(MessageContext msgContext, Method method, Object obj, Object[] argValues)
throws Exception
{
log.debug("Invoke JSE: " + method);
Method beanMethod = (Method)methodMap.get(method);
if (beanMethod == null)
{
beanMethod = obj.getClass().getMethod(method.getName(), method.getParameterTypes());
methodMap.put(method, beanMethod);
}
Object retObj = beanMethod.invoke(obj, argValues);
return retObj;
}
protected ClassLoader getContextClassLoader()
{
WebMetaData metaData = (WebMetaData)portComponentInfo.getDeploymentInfo().metaData;
return metaData.getContextLoader();
}
}