package org.jboss.webservice.server;
import org.jboss.axis.AxisFault;
import org.jboss.axis.MessageContext;
import org.jboss.axis.handlers.soap.SOAPService;
import org.jboss.invocation.Invocation;
import org.jboss.invocation.InvocationKey;
import org.jboss.invocation.InvocationType;
import org.jboss.logging.Logger;
import org.jboss.metadata.ApplicationMetaData;
import org.jboss.metadata.BeanMetaData;
import org.jboss.security.SecurityAssociation;
import org.jboss.webservice.Constants;
import javax.management.MBeanException;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import java.lang.reflect.Method;
import java.security.Principal;
public class InvokerProviderEJB extends InvokerProvider
{
static final long serialVersionUID = 7848928202043133442L;
private Logger log = Logger.getLogger(InvokerProviderEJB.class);
private String jndiName;
private ObjectName containerName;
public void initServiceDesc(SOAPService service, MessageContext msgContext) throws AxisFault
{
super.initServiceDesc(service, msgContext);
String ejbLink = portComponentInfo.getPortComponentMetaData().getEjbLink();
if (ejbLink == null)
throw new ServiceException("Cannot obtain ejb-link from port component");
ApplicationMetaData applMetaData = (ApplicationMetaData)portComponentInfo.getDeploymentInfo().metaData;
BeanMetaData beanMetaData = (BeanMetaData)applMetaData.getBeanByEjbName(ejbLink);
if (beanMetaData == null)
throw new ServiceException("Cannot obtain ejb meta data for: " + ejbLink);
String sei = portComponentInfo.getPortComponentMetaData().getServiceEndpointInterface();
String serviceEndpoint = beanMetaData.getServiceEndpoint();
if (sei.equals(serviceEndpoint) == false)
throw new ServiceException("The <" + sei + "> does not correspond to <" + serviceEndpoint + "> in ejb-jar.xml");
jndiName = beanMetaData.getContainerObjectNameJndiName();
if (jndiName == null)
throw new ServiceException("Cannot obtain JNDI name for: " + ejbLink);
try
{
containerName = new ObjectName("jboss.j2ee:jndiName=" + jndiName + ",service=EJB");
}
catch (MalformedObjectNameException e)
{
throw new ServiceException(e.toString());
}
}
protected ClassLoader getContextClassLoader()
{
return portComponentInfo.getDeploymentInfo().ucl;
}
protected Object makeNewServiceObject(MessageContext msgContext, String className) throws Exception
{
log.debug("makeNewServiceObject: class=" + className);
return null;
}
protected Object invokeServiceEndpoint(MessageContext msgContext,
Method method, Object obj, Object[] argValues)
throws Exception
{
log.debug("Invoke EJB: " + method);
Principal principal = SecurityAssociation.getPrincipal();
Object credential = SecurityAssociation.getCredential();
msgContext.setProperty(Constants.HANDLER_CHAIN, handlerChain);
Invocation inv = new Invocation(null, method, argValues, null, principal, credential);
inv.setValue(InvocationKey.SOAP_MESSAGE_CONTEXT, msgContext);
inv.setValue(InvocationKey.SOAP_MESSAGE, msgContext.getMessage());
inv.setType(InvocationType.SERVICE_ENDPOINT);
Object[] invArgs = {inv};
String[] sig = {Invocation.class.getName()};
Object ret = server.invoke(containerName, "invoke", invArgs, sig);
return ret;
}
protected void processException(Exception ex) throws AxisFault
{
Exception cause = ex;
if (ex instanceof MBeanException && ex.getCause() instanceof Exception)
cause = (Exception)ex.getCause();
super.processException(cause);
}
}