package org.cad.interruptus.repository.zookeeper.listener;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cad.interruptus.entity.Configuration;
import org.cad.interruptus.entity.Entity;
import org.cad.interruptus.entity.Flow;
import org.cad.interruptus.entity.Statement;
import org.cad.interruptus.entity.Type;
import org.cad.interruptus.repository.ConfigDiffTool;
public class ConfigurationEventDispatcher
{
final Log logger = LogFactory.getLog(getClass());
final Map<String, List<EntityConfigurationListener>> listeners;
public ConfigurationEventDispatcher(final Map<String, List<EntityConfigurationListener>> listeners)
{
this.listeners = listeners;
}
protected String classType(final Class clazz)
{
return clazz.getSimpleName().toLowerCase();
}
public void dispatchSave(final Entity entity)
{
final String type = classType(entity.getClass());
if ( ! listeners.containsKey(type)) {
return;
}
logger.debug(String.format("onSave : %s@%s", entity.getClass().getSimpleName(), entity.getId()));
for (final EntityConfigurationListener listener : listeners.get(type)) {
listener.onSave(entity);
}
}
public void dispatchDelete(final Entity entity)
{
final String type = classType(entity.getClass());
if ( ! listeners.containsKey(type)) {
return;
}
logger.debug(String.format("onDelete : %s@%s", entity.getClass().getSimpleName(), entity.getId()));
for (final EntityConfigurationListener listener : listeners.get(type)) {
listener.onDelete(entity);
}
}
public void dispatchSave(final Collection<Entity> collection)
{
for (final Entity entity : collection) {
dispatchSave(entity);
}
}
public void dispatchDelete(final Collection<Entity> collection)
{
for (final Entity entity : collection) {
dispatchDelete(entity);
}
}
public void dispatchEvents(final Configuration newConfig, final Configuration oldConfig)
{
final ConfigDiffTool diffTool = new ConfigDiffTool(oldConfig, newConfig);
dispatchSave(diffTool.computeInsertMap(Type.class).values());
dispatchSave(diffTool.computeUpdateMap(Type.class).values());
dispatchDelete(diffTool.computeDeleteMap(Type.class).values());
dispatchSave(diffTool.computeInsertMap(Flow.class).values());
dispatchSave(diffTool.computeUpdateMap(Flow.class).values());
dispatchDelete(diffTool.computeDeleteMap(Flow.class).values());
dispatchSave(diffTool.computeInsertMap(Statement.class).values());
dispatchSave(diffTool.computeUpdateMap(Statement.class).values());
dispatchDelete(diffTool.computeDeleteMap(Statement.class).values());
}
}