package railo.runtime.gateway;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map.Entry;
import railo.commons.lang.ClassException;
import railo.commons.lang.ClassUtil;
import railo.commons.lang.StringUtil;
import railo.runtime.config.Config;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.PageException;
import railo.runtime.gateway.proxy.GatewayProFactory;
import railo.runtime.op.Caster;
import railo.runtime.op.Duplicator;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.Struct;
public class GatewayEntryImpl implements GatewayEntry {
private String id;
private Struct custom;
private boolean readOnly;
private String listenerCfcPath;
private int startupMode;
private GatewayPro gateway;
private String cfcPath;
private String className;
private GatewayEnginePro engine;
public GatewayEntryImpl(GatewayEnginePro engine,String id, String className, String cfcPath, String listenerCfcPath, String startupMode,Struct custom, boolean readOnly) {
this.engine=engine;
this.id=id;
this.listenerCfcPath=listenerCfcPath;
this.className=className;
this.custom=custom;
this.readOnly=readOnly;
this.cfcPath=cfcPath;
startupMode=startupMode.trim().toLowerCase();
if("manual".equals(startupMode))this.startupMode=STARTUP_MODE_MANUAL;
else if("disabled".equals(startupMode))this.startupMode=STARTUP_MODE_DISABLED;
else this.startupMode=STARTUP_MODE_AUTOMATIC;
}
/**
* @return the gateway
* @throws ClassException
* @throws PageException
*/
public void createGateway(Config config) throws ClassException, PageException {
if(gateway==null){
if(!StringUtil.isEmpty(className)){
Class clazz = ClassUtil.loadClass(config.getClassLoader(),className);
gateway=GatewayProFactory.toGatewayPro(ClassUtil.loadInstance(clazz));
}
else if(!StringUtil.isEmpty(cfcPath)){
gateway=new CFCGateway(cfcPath);
}
else throw new ApplicationException("missing gateway source definitions");
try{
//new GatewayThread(engine,gateway,GatewayThread.START).run();
gateway.init(engine,getId(), getListenerCfcPath(),getCustom());
if(getStartupMode()==GatewayEntry.STARTUP_MODE_AUTOMATIC){
new GatewayThread(engine,gateway,GatewayThread.START).start();
/*try{
//gateway.doStart();
}
catch(GatewayException ge){
engine.log(gateway,GatewayEngine.LOGLEVEL_ERROR, ge.getMessage());
}*/
}
}
catch(IOException ioe){
throw Caster.toPageException(ioe);
}
}
}
@Override
public GatewayPro getGateway() {
return gateway;
}
@Override
public String getId() {
return id;
}
@Override
public Struct getCustom() {
return (Struct) Duplicator.duplicate(custom,true);
}
@Override
public boolean isReadOnly() {
return readOnly;
}
/**
* @return the cfcPath
*/
public String getListenerCfcPath() {
return listenerCfcPath;
}
@Override
public String getCfcPath() {
return cfcPath;
}
/**
* @return the className
*/
public String getClassName() {
return className;
}
/**
* @return the startupMode
*/
public int getStartupMode() {
return startupMode;
}
public static String toStartup(int mode,String defautValue) {
if(mode==STARTUP_MODE_MANUAL) return "manual";
else if(mode==STARTUP_MODE_DISABLED) return "disabled";
else if(mode==STARTUP_MODE_AUTOMATIC) return "automatic";
return defautValue;
}
public static int toStartup(String strMode, int defaultValue) {
strMode=strMode.trim().toLowerCase();
if("manual".equals(strMode)) return STARTUP_MODE_MANUAL;
else if("disabled".equals(strMode)) return STARTUP_MODE_DISABLED;
else if("automatic".equals(strMode)) return STARTUP_MODE_AUTOMATIC;
return defaultValue;
}
@Override
public boolean equals(Object obj){
if(obj==this) return true;
if(!(obj instanceof GatewayEntryImpl))return false;
GatewayEntryImpl other=(GatewayEntryImpl) obj;
if(!other.getId().equals(id)) return false;
if(!equal(other.className,className)) return false;
if(!equal(other.cfcPath,cfcPath)) return false;
if(!equal(other.listenerCfcPath,listenerCfcPath)) return false;
if(other.getStartupMode()!=startupMode) return false;
Struct otherCustom = other.getCustom();
if(otherCustom.size()!=custom.size()) return false;
//Key[] keys = otherCustom.keys();
Iterator<Entry<Key, Object>> it = otherCustom.entryIterator();
Entry<Key, Object> e;
Object ot,oc;
while(it.hasNext()){
e = it.next();
ot=custom.get(e.getKey(),null);
oc=e.getValue();
if(ot==null) return false;
if(!ot.equals(oc)) return false;
}
return true;
}
private static boolean equal(String left, String right) {
if(left==null && right==null) return true;
if(left!=null && right!=null) return left.equals(right);
return false;
}
}