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 }