/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.dataprocess.server.plugin; import net.codjo.agent.AgentContainer; import net.codjo.agent.ContainerConfiguration; import net.codjo.agent.DFService; import net.codjo.dataprocess.common.message.DataProcessJobRequest; import net.codjo.dataprocess.server.audit.DataProcessStringifier; import net.codjo.dataprocess.server.handler.DataProcessHandlerMapBuilder; import net.codjo.dataprocess.server.kernel.TreatmentLauncher; import net.codjo.dataprocess.server.plugin.DataProcessJobAgent.DefaultDataProcessLauncherFactory; import net.codjo.mad.server.plugin.MadServerPlugin; import net.codjo.mad.server.plugin.MadServerPlugin.MadServerPluginConfiguration; import net.codjo.plugin.common.ApplicationCore; import net.codjo.plugin.server.ServerPlugin; import net.codjo.reflect.collect.ClassCollector; import net.codjo.reflect.collect.PackageFilter; import net.codjo.sql.server.JdbcServiceUtil; import net.codjo.workflow.server.api.JobAgent; import net.codjo.workflow.server.api.JobAgent.MODE; import net.codjo.workflow.server.api.ResourcesManagerAgent; import net.codjo.workflow.server.api.ResourcesManagerAgent.AgentFactory; import net.codjo.workflow.server.plugin.WorkflowServerPlugin; import java.io.IOException; import org.picocontainer.MutablePicoContainer; /** * */ public class DataProcessServerPlugin implements ServerPlugin { public static final String DATA_PROCESS_REQUEST_TYPE = DataProcessJobRequest.DATA_PROCESS_REQUEST_TYPE; private static final String PACKAGE_HANDLER_COMMAND = "net.codjo.dataprocess.server.handlercommand"; private static final String PACKAGE_HANDLER_SELECT = "net.codjo.dataprocess.server.handlerselect"; private DataProcessServerConfiguration configuration = new DataProcessServerConfiguration(); private final MadServerPlugin madServerPlugin; private ApplicationCore applicationCore; private static final DataProcessPicoContainer PICO_CONTAINER = new DataProcessPicoContainer(); public DataProcessServerPlugin(MadServerPlugin madServerPlugin, WorkflowServerPlugin workflowServerPlugin, ApplicationCore applicationCore) { this.madServerPlugin = madServerPlugin; this.applicationCore = applicationCore; PICO_CONTAINER.setPicoContainer(applicationCore.createChildPicoContainer()); new DataProcessStringifier().install(workflowServerPlugin); } public void initContainer(ContainerConfiguration containerConfiguration) throws Exception { initHandlerCommand(); initHandlerSelect(); buildHandlerMapBuilder(); } private void buildHandlerMapBuilder() { MadServerPluginConfiguration madServerConfiguration = madServerPlugin.getConfiguration(); DataProcessHandlerMapBuilder mapBuilder = new DataProcessHandlerMapBuilder(applicationCore, madServerConfiguration.getHandlerMapBuilder(), getConfiguration().getClassCollectors()); madServerConfiguration.setHandlerMapBuilder(mapBuilder); madServerConfiguration.addGlobalComponent(mapBuilder); } private void initHandlerCommand() throws Exception { ClassCollector collector = new ClassCollector(getClass()); collector.addClassFilter(new PackageFilter(PACKAGE_HANDLER_COMMAND, true)); try { Class[] handlerClassList = collector.collect(); for (Class handlerCommand : handlerClassList) { madServerPlugin.getConfiguration().addHandlerCommand(handlerCommand); } } catch (IOException ex) { throw new Exception("Echec de la r�cup�ration de handler command (" + PACKAGE_HANDLER_COMMAND + ") : " + ex.getLocalizedMessage(), ex); } } private void initHandlerSelect() throws Exception { ClassCollector collector = new ClassCollector(getClass()); collector.addClassFilter(new PackageFilter(PACKAGE_HANDLER_SELECT, true)); try { Class[] handlerClassList = collector.collect(); for (Class handlerCommand : handlerClassList) { madServerPlugin.getConfiguration().addHandlerSql(handlerCommand); } } catch (IOException ex) { throw new Exception("Echec de la r�cup�ration de handler select (" + PACKAGE_HANDLER_SELECT + ") : " + ex.getLocalizedMessage(), ex); } } public void start(AgentContainer agentContainer) throws Exception { agentContainer.acceptNewAgent("dataprocess-scheduler", new AfterControlScheduleAgent()).start(); agentContainer.acceptNewAgent("data-process-drh-agent", new ResourcesManagerAgent(new DataProcessAgentFactory(), DFService.createAgentDescription( DATA_PROCESS_REQUEST_TYPE))).start(); agentContainer.acceptNewAgent("data-process-job-agent", createDataProcessJobAgent(MODE.NOT_DELEGATE)) .start(); } private static DataProcessJobAgent createDataProcessJobAgent(MODE mode) { return new DataProcessJobAgent(new JdbcServiceUtil(), new DefaultDataProcessLauncherFactory(), new TreatmentLauncher(), mode); } public void stop() throws Exception { } public DataProcessServerConfiguration getConfiguration() { return configuration; } public static MutablePicoContainer getPicoContainer() { return PICO_CONTAINER.getPicoContainer(); } private static class DataProcessPicoContainer { private MutablePicoContainer picoContainer; public MutablePicoContainer getPicoContainer() { return picoContainer; } public void setPicoContainer(MutablePicoContainer picoContainer) { this.picoContainer = picoContainer; } } private static class DataProcessAgentFactory implements AgentFactory { public JobAgent create() throws Exception { return createDataProcessJobAgent(MODE.DELEGATE); } } }