package railo.runtime.net.flex; import javax.servlet.ServletException; import railo.loader.engine.CFMLEngine; import railo.loader.engine.CFMLEngineFactory; import railo.loader.engine.EngineChangeListener; import railo.runtime.util.BlazeDS; import flex.messaging.FlexContext; import flex.messaging.config.ConfigMap; import flex.messaging.messages.Message; import flex.messaging.services.ServiceAdapter; // FUTURE make this class independent from flex.messaging... so that the loader no longer need the flex jar /** * Railo implementation of the ServiceAdapter, forward all BlazeDS Request to the CFMLEngine. */ public class RailoAdapter extends ServiceAdapter implements EngineChangeListener { public static final short LOWER_CASE=0; public static final short UPPER_CASE=1; public static final short ORIGINAL_CASE=2; private CFMLEngine engine; private ConfigMap properties; private BlazeDS util; public void initialize(String id, ConfigMap properties) { super.initialize(id, properties); this.properties=properties; try{ // we call this because otherwse they does not exist (bug in BlazeDS) ConfigMap propertyCases = properties.getPropertyAsMap("property-case", null); if(propertyCases!=null){ propertyCases.getPropertyAsBoolean("force-cfc-lowercase", false); propertyCases.getPropertyAsBoolean("force-query-lowercase", false); propertyCases.getPropertyAsBoolean("force-struct-lowercase", false); } ConfigMap access = properties.getPropertyAsMap("access", null); if(access!=null){ access.getPropertyAsBoolean("use-mappings", false); access.getPropertyAsString("method-access-level","remote"); } } catch(Throwable t){} } /** * @see flex.messaging.services.ServiceAdapter#invoke(flex.messaging.messages.Message) */ public Object invoke(Message message){ try { if(util==null){ util = (BlazeDS)getEngine().getBlazeDSUtil(); util.init(properties); } //RemotingDestination remotingDestination = (RemotingDestination)getDestination(); //FactoryInstance factoryInstance = remotingDestination.getFactoryInstance(); /* System.out.println("source:"+factoryInstance.getSource()); System.out.println("scope:"+factoryInstance.getScope()); System.out.println("properties:"); System.out.println(factoryInstance.getProperties()); System.out.println("dest:"+remotingMessage.getDestination()); System.out.println("src:"+remotingMessage.getSource()); System.out.println("mid:"+remotingMessage.getMessageId()); System.out.println("operation:"+remotingMessage.getOperation()); System.out.println("params:"); System.out.println(remotingMessage.getParameters().toArray()); System.out.println("id:"+remotingDestination.getId()); System.out.println("scope:"+remotingDestination.getScope()); System.out.println("src:"+remotingDestination.getSource()); System.out.println("channel:"); System.out.println(remotingDestination.getChannels()); */ return util.invoke(this,message); } catch (Exception e) {e.printStackTrace(); throw new RuntimeException(e); } } /** * load (if needed) and return the CFMLEngine * @return CFML Engine */ private CFMLEngine getEngine() { if(engine==null){ try {CFMLEngineFactory.getInstance(); //engine=CFMLEngineFactory.getInstance(FlexContext.getServletConfig()); engine=CFMLEngineFactory.getInstance(FlexContext.getServletConfig(),this); } catch (Throwable e) { throw new RuntimeException(e); } } return engine; } /** * @see railo.loader.engine.EngineChangeListener#onUpdate(railo.loader.engine.CFMLEngine) */ public void onUpdate(CFMLEngine newEngine) { try { engine=CFMLEngineFactory.getInstance(FlexContext.getServletConfig(),this); } catch (ServletException e) { engine=newEngine; } } }