package org.cad.interruptus.core.esper;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener;
import com.espertech.esper.client.EPAdministrator;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.EPStatementException;
import com.espertech.esper.client.EPStatementState;
import com.google.common.collect.Lists;
import java.util.List;
import org.cad.interruptus.entity.Statement;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
public class StatementConfiguration implements EsperConfiguration<Statement>
{
final Log logger = LogFactory.getLog(getClass());
final EPAdministrator epAdministrator;
public StatementConfiguration(final EPAdministrator epAdministrator)
{
this.epAdministrator = epAdministrator;
}
@Override
public List<String> list()
{
final String[] statementNames = epAdministrator.getStatementNames();
final List<String> statements = Lists.newArrayList(statementNames);
return statements;
}
@Override
public void save(final Statement statement) throws EPStatementException
{
final String name = statement.getName();
final String query = statement.getQuery();
final EPStatement existing = epAdministrator.getStatement(name);
if (existing != null) {
logger.info("Existing statement detected for : " + name);
remove(name);
}
logger.info("Saving statement : " + name);
final EPStatement sttm = epAdministrator.createEPL(query, name);
if ( ! statement.isRunning() && ! sttm.isStopped()) {
sttm.stop();
}
if ( ! statement.getDebug()) {
return;
}
sttm.addListener(new UpdateListener() {
@Override
public void update(EventBean[] newEvents, EventBean[] oldEvents)
{
for (EventBean newEvent : newEvents) {
logger.info(newEvent.getUnderlying());
}
}
});
}
@Override
public Boolean start(final String name)
{
try {
final EPStatement sttm = epAdministrator.getStatement(name);
if (sttm == null) {
return false;
}
if (sttm.isStarted()) {
return true;
}
logger.info("Starting statement : " + name);
sttm.start();
return true;
} catch (EPStatementException e) {
logger.info(e.getMessage());
return false;
}
}
@Override
public Boolean stop(final String name)
{
try {
final EPStatement epStatement = epAdministrator.getStatement(name);
if (epStatement == null) {
return false;
}
if (epStatement.isStopped()) {
return true;
}
logger.info("Stoping statement : " + name);
epStatement.stop();
return true;
} catch (EPStatementException e) {
logger.info(e.getMessage());
return false;
}
}
public EPStatementState getStatementState(final String statementName) throws EPStatementException
{
try {
final EPStatement epStatement = epAdministrator.getStatement(statementName);
if (epStatement != null) {
return epStatement.getState();
}
} catch (EPStatementException e) {
logger.info(e.getMessage());
}
return null;
}
@Override
public Boolean remove(final String name)
{
try {
final EPStatement epStatement = epAdministrator.getStatement(name);
if (epStatement != null) {
logger.info("Removing statement : " + name);
epStatement.destroy();
}
return true;
} catch (EPStatementException e) {
logger.info(e.getMessage());
return false;
}
}
}