001 package railo.runtime.net.rpc.server; 002 003 import java.util.Map; 004 import java.util.WeakHashMap; 005 006 import org.apache.axis.AxisFault; 007 import org.apache.axis.MessageContext; 008 import org.apache.axis.constants.Scope; 009 import org.apache.axis.handlers.BasicHandler; 010 import org.apache.axis.handlers.soap.SOAPService; 011 import org.apache.axis.providers.java.JavaProvider; 012 import org.apache.axis.providers.java.RPCProvider; 013 014 import railo.commons.lang.types.RefBoolean; 015 import railo.commons.lang.types.RefBooleanImpl; 016 import railo.runtime.Component; 017 018 019 /** 020 * Handle Component as Webservice 021 */ 022 public final class ComponentHandler extends BasicHandler { 023 024 private static Map soapServices = new WeakHashMap(); 025 026 @Override 027 public void invoke(MessageContext msgContext) throws AxisFault { 028 try { 029 setupService(msgContext); 030 } 031 catch (Exception e) { 032 throw AxisFault.makeFault(e); 033 } 034 } 035 036 @Override 037 public void generateWSDL(MessageContext msgContext) throws AxisFault { 038 try { 039 setupService(msgContext); 040 } 041 catch (Exception e) { 042 throw AxisFault.makeFault(e); 043 } 044 } 045 046 /** 047 * handle all the work necessary set 048 * up the "proxy" RPC service surrounding it as the MessageContext's 049 * active service. 050 * 051 */ 052 protected void setupService(MessageContext msgContext) throws Exception { 053 RefBoolean isnew=new RefBooleanImpl(false); 054 Component cfc=(Component) msgContext.getProperty(Constants.COMPONENT); 055 Class clazz=cfc.getJavaAccessClass(isnew); 056 String clazzName=clazz.getName(); 057 058 ClassLoader classLoader=clazz.getClassLoader(); 059 Pair pair; 060 SOAPService rpc=null; 061 if(!isnew.toBooleanValue() && (pair = (Pair)soapServices.get(clazzName))!=null) { 062 if(classLoader==pair.classloader) 063 rpc=pair.rpc; 064 } 065 //else classLoader = clazz.getClassLoader(); 066 067 //print.out("cl:"+classLoader); 068 msgContext.setClassLoader(classLoader); 069 070 if (rpc == null) { 071 rpc = new SOAPService(new RPCProvider()); 072 rpc.setName(clazzName); 073 rpc.setOption(JavaProvider.OPTION_CLASSNAME, clazzName ); 074 rpc.setEngine(msgContext.getAxisEngine()); 075 076 rpc.setOption(JavaProvider.OPTION_ALLOWEDMETHODS, "*"); 077 rpc.setOption(JavaProvider.OPTION_SCOPE, Scope.REQUEST.getName()); 078 rpc.getInitializedServiceDesc(msgContext); 079 soapServices.put(clazzName, new Pair(classLoader,rpc)); 080 } 081 082 rpc.setEngine(msgContext.getAxisEngine()); 083 rpc.init(); // ?? 084 msgContext.setService( rpc ); 085 086 } 087 088 class Pair { 089 private ClassLoader classloader; 090 private SOAPService rpc; 091 public Pair(ClassLoader classloader, SOAPService rpc) { 092 this.classloader = classloader; 093 this.rpc = rpc; 094 } 095 } 096 }