package railo.runtime.net.rpc.server; import java.util.Map; import java.util.WeakHashMap; import org.apache.axis.AxisFault; import org.apache.axis.MessageContext; import org.apache.axis.constants.Scope; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.handlers.soap.SOAPService; import org.apache.axis.providers.java.JavaProvider; import org.apache.axis.providers.java.RPCProvider; import railo.commons.lang.types.RefBoolean; import railo.commons.lang.types.RefBooleanImpl; import railo.runtime.Component; /** * Handle Component as Webservice */ public final class ComponentHandler extends BasicHandler { private static Map soapServices = new WeakHashMap(); @Override public void invoke(MessageContext msgContext) throws AxisFault { try { setupService(msgContext); } catch (Exception e) { throw AxisFault.makeFault(e); } } @Override public void generateWSDL(MessageContext msgContext) throws AxisFault { try { setupService(msgContext); } catch (Exception e) { throw AxisFault.makeFault(e); } } /** * handle all the work necessary set * up the "proxy" RPC service surrounding it as the MessageContext's * active service. * */ protected void setupService(MessageContext msgContext) throws Exception { RefBoolean isnew=new RefBooleanImpl(false); Component cfc=(Component) msgContext.getProperty(Constants.COMPONENT); Class clazz=cfc.getJavaAccessClass(isnew); String clazzName=clazz.getName(); ClassLoader classLoader=clazz.getClassLoader(); Pair pair; SOAPService rpc=null; if(!isnew.toBooleanValue() && (pair = (Pair)soapServices.get(clazzName))!=null) { if(classLoader==pair.classloader) rpc=pair.rpc; } //else classLoader = clazz.getClassLoader(); //print.out("cl:"+classLoader); msgContext.setClassLoader(classLoader); if (rpc == null) { rpc = new SOAPService(new RPCProvider()); rpc.setName(clazzName); rpc.setOption(JavaProvider.OPTION_CLASSNAME, clazzName ); rpc.setEngine(msgContext.getAxisEngine()); rpc.setOption(JavaProvider.OPTION_ALLOWEDMETHODS, "*"); rpc.setOption(JavaProvider.OPTION_SCOPE, Scope.REQUEST.getName()); rpc.getInitializedServiceDesc(msgContext); soapServices.put(clazzName, new Pair(classLoader,rpc)); } rpc.setEngine(msgContext.getAxisEngine()); rpc.init(); // ?? msgContext.setService( rpc ); } class Pair { private ClassLoader classloader; private SOAPService rpc; public Pair(ClassLoader classloader, SOAPService rpc) { this.classloader = classloader; this.rpc = rpc; } } }