package railo.runtime.gateway;
import java.util.Map;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.PageException;
import railo.runtime.gateway.proxy.GatewayProFactory;
import railo.runtime.op.Caster;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
public class CFCGateway implements GatewayPro {
//private static final Object OBJ = new Object();
//private Component _cfc;
private String id;
private int state=GatewayPro.STOPPED;
private String cfcPath;
//private Config config;
//private String requestURI;
//private Resource cfcDirectory;
private GatewayEngineImpl engine;
public CFCGateway(String cfcPath) {
this.cfcPath=cfcPath;
}
@Override
public void init(GatewayEnginePro engine,String id, String cfcPath, Map config) throws GatewayException {
this.engine=GatewayProFactory.toGatewayEngineImpl(engine);
this.id=id;
//requestURI=engine.toRequestURI(cfcPath);
Struct args=new StructImpl(StructImpl.TYPE_LINKED);
args.setEL("id", id);
args.setEL("config", Caster.toStruct(config,null,false));
if(!StringUtil.isEmpty(cfcPath)){
try {
args.setEL("listener", this.engine.getComponent(cfcPath,id));
} catch (PageException e) {
engine.log(this,GatewayEnginePro.LOGLEVEL_ERROR, e.getMessage());
}
}
try {
callOneWay("init",args);
} catch (PageException pe) {
engine.log(this,GatewayEnginePro.LOGLEVEL_ERROR, pe.getMessage());
//throw new PageGatewayException(pe);
}
}
@Override
public void doRestart() throws GatewayException {
engine.log(this,GatewayEnginePro.LOGLEVEL_INFO,"restart");
Struct args=new StructImpl();
try{
boolean has=callOneWay("restart",args);
if(!has){
if(callOneWay("stop",args)){
//engine.clear(cfcPath,id);
callOneWay("start",args);
}
}
}
catch(PageException pe){
throw new PageGatewayException(pe);
}
}
@Override
public void doStart() throws GatewayException {
engine.log(this,GatewayEnginePro.LOGLEVEL_INFO,"start");
Struct args=new StructImpl();
state=STARTING;
try{
callOneWay("start",args);
engine.log(this,GatewayEnginePro.LOGLEVEL_INFO,"running");
state=RUNNING;
}
catch(PageException pe){
state=FAILED;
throw new PageGatewayException(pe);
}
}
@Override
public void doStop() throws GatewayException {
engine.log(this,GatewayEnginePro.LOGLEVEL_INFO,"stop");
Struct args=new StructImpl();
state=STOPPING;
try{
callOneWay("stop",args);
//engine.clear(cfcPath,id);
state=STOPPED;
}
catch(PageException pe){
state=FAILED;
//engine.clear(cfcPath,id);
throw new PageGatewayException(pe);
}
}
@Override
public Object getHelper() {
Struct args=new StructImpl(StructImpl.TYPE_LINKED);
return callEL("getHelper",args,null);
}
@Override
public String getId() {
return id;
}
@Override
public int getState() {
Struct args=new StructImpl();
Integer state=Integer.valueOf(this.state);
try {
return GatewayEngineImpl.toIntState(Caster.toString(call("getState",args,state)),this.state);
}
catch (PageException pe) {
engine.log(this, GatewayEnginePro.LOGLEVEL_ERROR, pe.getMessage());
}
return this.state;
}
@Override
public String sendMessage(Map data) throws GatewayException {
Struct args=new StructImpl(StructImpl.TYPE_LINKED);
args.setEL("data", Caster.toStruct(data, null, false));
try {
return Caster.toString(call("sendMessage",args,""));
} catch (PageException pe) {
throw new PageGatewayException(pe);
}
}
private Object callEL(String methodName,Struct arguments, Object defaultValue) {
return engine.callEL(cfcPath,id, methodName, arguments, true, defaultValue);
}
private boolean callOneWay(String methodName,Struct arguments) throws PageException {
return engine.callOneWay(cfcPath,id, methodName, arguments, true);
}
private Object call(String methodName,Struct arguments, Object defaultValue) throws PageException {
return engine.call(cfcPath,id, methodName, arguments, true, defaultValue);
}
}