Package railo.runtime.net.rpc.server

Source Code of railo.runtime.net.rpc.server.ComponentHandler

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;
    }
    }
}
TOP

Related Classes of railo.runtime.net.rpc.server.ComponentHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.