CorDispatcher.java
package eu.javaexperience.patterns.behavioral.cor;
import java.util.LinkedHashMap;
import java.util.Map;
import eu.javaexperience.asserts.AssertArgument;
import eu.javaexperience.collection.map.RWLockMap;
import eu.javaexperience.dispatch.Dispatcher;
import eu.javaexperience.patterns.behavioral.cor.CorChain;
/**
* chain of desponsibility dispatcher
* */
public class CorDispatcher<CTX> implements Dispatcher<CTX>
{
protected Map<String, CorChain<CTX>> chains = new RWLockMap<String, CorChain<CTX>>(new LinkedHashMap<String, CorChain<CTX>>());
protected CorChain<CTX> root_chain;
public void setRootChain(CorChain<CTX> root)
{
AssertArgument.assertNotNull(root, "root");
this.root_chain = root;
}
public CorChain<CTX> addChain(CorChain<CTX> chain)
{
return chains.put(chain.getChainName(), chain);
}
public CorChain<CTX> getChainByName(String name)
{
return chains.get(name);
}
@Override
public boolean dispatch(CTX ctx)
{
if(null == root_chain)
{
if(!chains.isEmpty())
{
for(CorChain<CTX> c:chains.values())
{
if(c.dispatch(ctx))
{
return true;
}
}
}
return false;
}
else
{
return root_chain.dispatch(ctx);
}
}
}