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    }