package net.codjo.dataprocess.server.handler;
import net.codjo.agent.UserId;
import net.codjo.mad.server.handler.Handler;
import net.codjo.mad.server.handler.HandlerMap;
import net.codjo.mad.server.handler.HandlerMapBuilder;
import net.codjo.plugin.common.ApplicationCore;
import net.codjo.reflect.collect.ClassCollector;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.picocontainer.MutablePicoContainer;
/**
*
*/
public class DataProcessHandlerMapBuilder implements HandlerMapBuilder {
private HandlerMapBuilder defaultBuilder;
private ApplicationCore applicationCore;
private List<ClassCollector> classCollectors;
public DataProcessHandlerMapBuilder(ApplicationCore applicationCore,
HandlerMapBuilder defaultBuilder,
List<ClassCollector> classCollectors) {
this.defaultBuilder = defaultBuilder;
this.applicationCore = applicationCore;
this.classCollectors = classCollectors;
}
public void collectHandlerFrom(Class fromClass, String inPackage) throws BuildException {
defaultBuilder.collectHandlerFrom(fromClass, inPackage);
}
public void addGlobalComponent(Class aClass) {
defaultBuilder.addGlobalComponent(aClass);
}
public void addGlobalComponent(Object object) {
defaultBuilder.addGlobalComponent(object);
}
public void addSessionComponent(Class aClass) {
defaultBuilder.addSessionComponent(aClass);
}
public void removeSessionComponent(Class aClass) {
defaultBuilder.removeSessionComponent(aClass);
}
public void addUserHandler(Class<? extends Handler> handlerCommandClass) {
defaultBuilder.addUserHandler(handlerCommandClass);
}
public HandlerMap createHandlerMap(UserId userId, Object[] contextualInstances) {
MutablePicoContainer pico = applicationCore.createChildPicoContainer();
try {
Class[] classes = collectHandler();
return new DataProcessHandlerMap(pico,
defaultBuilder.createHandlerMap(userId, contextualInstances),
classes);
}
catch (Exception ex) {
throw new RuntimeException("Echec de la r�cup�ration de handlers : " + ex.getLocalizedMessage());
}
}
private Class[] collectHandler() throws Exception {
Set<Class> classes = new HashSet<Class>();
for (ClassCollector classCollector : classCollectors) {
Collections.addAll(classes, classCollector.collect());
}
return classes.toArray(new Class[classes.size()]);
}
}