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