001    package railo.runtime.net.flex;
002    
003    import javax.servlet.ServletException;
004    
005    import railo.loader.engine.CFMLEngine;
006    import railo.loader.engine.CFMLEngineFactory;
007    import railo.loader.engine.EngineChangeListener;
008    import railo.runtime.util.BlazeDS;
009    import flex.messaging.FactoryInstance;
010    import flex.messaging.FlexContext;
011    import flex.messaging.config.ConfigMap;
012    import flex.messaging.messages.Message;
013    import flex.messaging.messages.RemotingMessage;
014    import flex.messaging.services.ServiceAdapter;
015    import flex.messaging.services.remoting.RemotingDestination;
016    
017    /**
018     * Railo implementation of the ServiceAdapter, forward all BlazeDS Request to the CFMLEngine. 
019     */
020    public class RailoAdapter extends ServiceAdapter implements EngineChangeListener {
021            
022            public static final short LOWER_CASE=0;
023            public static final short UPPER_CASE=1;
024            public static final short ORIGINAL_CASE=2;
025            
026            
027            private CFMLEngine engine;
028            private ConfigMap properties;
029            private BlazeDS util;
030        
031            public void initialize(String id, ConfigMap properties) {
032                    super.initialize(id, properties);
033            this.properties=properties;
034            try{
035                    // we call this because otherwse they does not exists (bug in BlazeDS)
036                    ConfigMap propertyCases = properties.getPropertyAsMap("property-case", null);
037                    if(propertyCases!=null){
038                        propertyCases.getPropertyAsBoolean("force-cfc-lowercase", false);
039                        propertyCases.getPropertyAsBoolean("force-query-lowercase", false);
040                        propertyCases.getPropertyAsBoolean("force-struct-lowercase", false);
041                    }
042                    ConfigMap access = properties.getPropertyAsMap("access", null);
043                    if(access!=null){
044                        access.getPropertyAsBoolean("use-mappings", false);
045                        access.getPropertyAsString("method-access-level","remote");
046                    }
047            }
048            catch(Throwable t){}
049            
050        }
051            
052            
053            /**
054             * @see flex.messaging.services.ServiceAdapter#invoke(flex.messaging.messages.Message)
055             */
056            public Object invoke(Message message){
057                    
058                    try {
059                            
060                            if(util==null){
061                                    util = (BlazeDS)getEngine().getBlazeDSUtil();
062                                    util.init(properties);
063                            }
064                            
065                            
066                            RemotingDestination remotingDestination = (RemotingDestination)getDestination();
067                    RemotingMessage remotingMessage = (RemotingMessage)message;
068                    FactoryInstance factoryInstance = remotingDestination.getFactoryInstance();
069    
070                            
071                            /*
072                    System.out.println("source:"+factoryInstance.getSource());
073                    System.out.println("scope:"+factoryInstance.getScope());
074                    System.out.println("properties:");
075                    System.out.println(factoryInstance.getProperties());
076    
077                    System.out.println("dest:"+remotingMessage.getDestination());
078                    System.out.println("src:"+remotingMessage.getSource());
079                    System.out.println("mid:"+remotingMessage.getMessageId());
080                    System.out.println("operation:"+remotingMessage.getOperation());
081                    System.out.println("params:");
082                    System.out.println(remotingMessage.getParameters().toArray());
083                    
084                    System.out.println("id:"+remotingDestination.getId());
085                    System.out.println("scope:"+remotingDestination.getScope());
086                    System.out.println("src:"+remotingDestination.getSource());
087                    System.out.println("channel:");
088                    System.out.println(remotingDestination.getChannels());
089                    */
090                    
091                            
092                            
093                            
094                            return util.invoke(this,message);
095                    } 
096                    catch (Exception e) {e.printStackTrace();
097                            throw new RuntimeException(e);
098                    }
099        }
100        
101        /**
102         * load (if needed) and return the CFMLEngine
103         * @return CFML Engine
104         */
105        private CFMLEngine getEngine() {
106            if(engine==null){
107                    try {CFMLEngineFactory.getInstance();
108                                    //engine=CFMLEngineFactory.getInstance(FlexContext.getServletConfig());
109                                    engine=CFMLEngineFactory.getInstance(FlexContext.getServletConfig(),this);
110                            } 
111                    catch (Throwable e) {
112                                    throw new RuntimeException(e);
113                            }
114            }
115            return engine;
116            }
117    
118            /**
119         * @see railo.loader.engine.EngineChangeListener#onUpdate(railo.loader.engine.CFMLEngine)
120         */
121        public void onUpdate(CFMLEngine newEngine) {
122            try {
123                engine=CFMLEngineFactory.getInstance(FlexContext.getServletConfig(),this);
124            } catch (ServletException e) {
125                engine=newEngine;
126            }
127        }
128    }