package org.cad.interruptus.core.zookeeper;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.curator.framework.recipes.leader.LeaderLatchListener;
import org.cad.interruptus.core.esper.FlowConfiguration;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import org.cad.interruptus.core.esper.EsperConfiguration;
import org.cad.interruptus.core.esper.StatementConfiguration;
import org.cad.interruptus.entity.Configuration;
import org.cad.interruptus.entity.Entity;
import org.cad.interruptus.entity.Flow;
import org.cad.interruptus.entity.RunnableEntity;
import org.cad.interruptus.entity.Statement;
public class ZookeeperLeaderListener implements LeaderLatchListener
{
final Log logger = LogFactory.getLog(ZookeeperLeaderListener.class);
final StatementConfiguration statementConfiguration;
final FlowConfiguration flowConfiguration;
final AtomicReference<Configuration> reference;
final AtomicBoolean isLeader;
public ZookeeperLeaderListener(final AtomicBoolean isLeader, final FlowConfiguration flowConfiguration, final StatementConfiguration statementConfiguration, final AtomicReference<Configuration> reference)
{
this.isLeader = isLeader;
this.reference = reference;
this.flowConfiguration = flowConfiguration;
this.statementConfiguration = statementConfiguration;
}
private RunnableEntity getRunnableEntity(final String name, final Class clazz)
{
try {
final Map<String, Entity> map = reference.get().mapOf(clazz);
final Entity entity = map.get(name);
if (entity instanceof RunnableEntity) {
return (RunnableEntity) entity;
}
return null;
} catch (final Exception ex) {
logger.error(this, ex);
return null;
}
}
private void startMasterOnly(final EsperConfiguration configuration, final Class clazz)
{
List<String> list = configuration.list();
for (final String name : list) {
final RunnableEntity entity = getRunnableEntity(name, clazz);
if (entity == null) {
continue;
}
if (entity.isMasterOnly() && ! isLeader.get()) {
continue;
}
configuration.start(name);
}
}
private void stopMasterOnly(final EsperConfiguration configuration, final Class clazz)
{
List<String> list = configuration.list();
for (final String name : list) {
final RunnableEntity entity = getRunnableEntity(name, clazz);
if (entity == null || (entity.isMasterOnly() && ! isLeader.get())) {
configuration.stop(name);
}
}
}
@Override
public void isLeader()
{
logger.info("Take Leadership");
isLeader.set(true);
startMasterOnly(flowConfiguration, Flow.class);
startMasterOnly(statementConfiguration, Statement.class);
}
@Override
public void notLeader()
{
logger.info("Not leader");
isLeader.set(false);
stopMasterOnly(flowConfiguration, Flow.class);
stopMasterOnly(statementConfiguration, Statement.class);
}
}