package org.cad.interruptus.core.esper;
import java.util.List;
import com.espertech.esper.client.EPRuntime;
import com.espertech.esper.client.EPAdministrator;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.dataflow.EPDataFlowInstance;
import com.espertech.esper.client.dataflow.EPDataFlowRuntime;
import com.espertech.esper.client.dataflow.EPDataFlowState;
import com.google.common.collect.Lists;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cad.interruptus.entity.Flow;
public class FlowConfiguration implements EsperConfiguration<Flow>
{
final EPServiceProvider epService;
final EPAdministrator epAdministrator;
final Log logger = LogFactory.getLog(getClass());
public FlowConfiguration(final EPServiceProvider epService, final EPAdministrator epAdministrator)
{
this.epService = epService;
this.epAdministrator = epAdministrator;
}
@Override
public List<String> list()
{
final EPRuntime epRuntime = epService.getEPRuntime();
final EPDataFlowRuntime flowRuntime = epRuntime.getDataFlowRuntime();
final String[] dataFlowsNames = flowRuntime.getDataFlows();
return Lists.newArrayList(dataFlowsNames);
}
@Override
public void save(final Flow flow)
{
final String name = flow.getName();
final String query = flow.getQuery();
final EPStatement sttm = epAdministrator.getStatement(name);
if (sttm != null) {
logger.info("Existing flow detected for : " + name);
remove(name);
}
logger.info("Saving flow : " + name);
epAdministrator.createEPL(query, name);
}
@Override
public Boolean start(final String name)
{
final EPRuntime epRuntime = epService.getEPRuntime();
final EPDataFlowRuntime flowRuntime = epRuntime.getDataFlowRuntime();
EPDataFlowInstance instance = flowRuntime.getSavedInstance(name);
if (instance == null) {
instance = flowRuntime.instantiate(name);
flowRuntime.saveInstance(name, instance);
}
if (instance.getState() == EPDataFlowState.RUNNING) {
return true;
}
logger.info("Starting flow : " + name);
instance.start();
return true;
}
@Override
public Boolean stop(final String name)
{
final EPRuntime epRuntime = epService.getEPRuntime();
final EPDataFlowRuntime flowRuntime = epRuntime.getDataFlowRuntime();
final EPDataFlowInstance instance = flowRuntime.getSavedInstance(name);
if (instance == null) {
return true;
}
if (instance.getState() == EPDataFlowState.CANCELLED) {
return true;
}
logger.info("Stoping flow : " + name);
instance.cancel();
return true;
}
public EPDataFlowState getFlowState(final String name)
{
final EPRuntime epRuntime = epService.getEPRuntime();
final EPDataFlowRuntime flowRuntime = epRuntime.getDataFlowRuntime();
final EPDataFlowInstance instance = flowRuntime.getSavedInstance(name);
if (instance == null) {
return null;
}
return instance.getState();
}
@Override
public Boolean remove(final String name)
{
final EPRuntime epRuntime = epService.getEPRuntime();
final EPDataFlowRuntime flowRuntime = epRuntime.getDataFlowRuntime();
final EPDataFlowInstance instance = flowRuntime.getSavedInstance(name);
final EPStatement sttm = epAdministrator.getStatement(name);
if (instance != null) {
instance.cancel();
flowRuntime.removeSavedInstance(name);
}
if (sttm == null) {
return true;
}
logger.info("Removing flow : " + name);
sttm.destroy();
return true;
}
}