/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.segmentation.server.participant; import java.sql.SQLException; import java.util.concurrent.TimeUnit; import net.codjo.database.common.api.JdbcFixture; import net.codjo.segmentation.server.blackboard.message.BlackboardActionStringifier; import net.codjo.segmentation.server.blackboard.message.InformOfFailure; import net.codjo.segmentation.server.blackboard.message.Level; import net.codjo.segmentation.server.blackboard.message.Todo; import net.codjo.segmentation.server.participant.context.ContextManagerMock; import net.codjo.segmentation.server.participant.context.FamilyContext; import net.codjo.segmentation.server.participant.context.SegmentationContext; import net.codjo.segmentation.server.participant.context.TodoContent; import net.codjo.segmentation.server.preference.family.XmlFamilyPreferenceMock; import net.codjo.test.common.AssertUtil; import net.codjo.workflow.common.message.Arguments; import net.codjo.workflow.common.message.JobRequest; /** * */ public class JobRequestAnalyzerParticipantTest extends SegmentationParticipantTestCase<JobRequestAnalyzerParticipant> { public void test_oneSegmentation() throws Exception { XmlFamilyPreferenceMock preference = new XmlFamilyPreferenceMock(); preference.mockGetArgumentNameList("segmentations", "period"); contextManager.mockGetFamilyPreference("my-family", preference); insertSegmentation(jdbc, "1", "my-family", 1, "period=$period$", "name"); JobRequest request = new JobRequest("segmentation"); request.setId("job-200256456"); request.setArguments(new Arguments()); request.getArguments().put("segmentations", "1"); request.getArguments().put("period", "200501"); executeHandleTodo(new Todo<JobRequest>(1, request)); log.assertContent("erase(Todo{1}, Level{initial-job-request}), " + "write(todo{jobId:job-200256456, familyId:my-family}, NextLevel{Level{initial-job-request}}), " + "write(audit{family=my-family, level=initial-job-request}, Level{information})"); sessionContext = contextManager.get(request.getId()); assertNotNull(sessionContext); FamilyContext context = sessionContext.get("my-family"); assertNotNull(context); assertEquals("{period=200501, segmentations=1}", context.getParameters().toString()); assertNotNull(context.getFamilyPreference()); assertSame(contextManager.getFamilyPreference("my-family"), context.getFamilyPreference()); assertEquals(1, context.getSegmentationContexts().size()); SegmentationContext segmentation = context.getSegmentationContext(1); assertEquals("{period=200501, segmentationId=1}", segmentation.getParameters().toString()); assertSame(contextManager.getFamilyPreference("my-family"), segmentation.getFamilyPreference()); assertEquals(1, segmentation.getSegmentationId()); assertEquals(1, segmentation.getSegmentationPreference().getSegmentationId()); AssertUtil.assertEquals(new String[]{"name"}, preference.getTableMetaData().getColumnNames()); } public void test_twoSegmentations() throws Exception { contextManager.mockGetFamilyPreference("family-a", new XmlFamilyPreferenceMock()); contextManager.mockGetFamilyPreference("family-b", new XmlFamilyPreferenceMock()); insertSegmentation(jdbc, "1", "family-a", 10, "period=$period$", "DEST_1"); insertSegmentation(jdbc, "2", "family-b", 20, "period=$period$", "DEST_1"); insertSegmentation(jdbc, "3", "family-a", 30, "period=$period$", "DEST_1"); JobRequest request = new JobRequest("segmentation"); request.setId("job-200256456"); request.setArguments(new Arguments()); request.getArguments().put("segmentations", "1, 2 , 3"); request.getArguments().put("period", "200501"); executeHandleTodo(new Todo<JobRequest>(1, request)); log.assertContent("erase(Todo{1}, Level{initial-job-request}), " + "write(todo{jobId:job-200256456, familyId:family-a}, NextLevel{Level{initial-job-request}}), " + "write(todo{jobId:job-200256456, familyId:family-b}, NextLevel{Level{initial-job-request}}), " + "write(audit{family=family-a,family-b, level=initial-job-request}, Level{information})"); sessionContext = contextManager.get(request.getId()); assertNotNull(sessionContext); FamilyContext context = sessionContext.get("family-a"); assertEquals(2, context.getSegmentationContexts().size()); assertNotNull(context.getSegmentationContext(1)); assertNotNull(context.getSegmentationContext(3)); context = sessionContext.get("family-b"); assertEquals(1, context.getSegmentationContexts().size()); assertNotNull(context.getSegmentationContext(2)); AssertUtil.assertEquals(new String[]{}, context.getFamilyPreference().getTableMetaData().getColumnNames()); } public void test_differentSegmentations_withSameSegmentationId() throws Exception { // Lancement de la premiere seg sur l'axe 1 test_oneSegmentation(); log.clear(); // Lance une deuxi�me qui doit se mettre en echec JobRequest request = new JobRequest("segmentation"); request.setId("other"); request.setArguments(new Arguments()); request.getArguments().put("segmentations", "1"); request.getArguments().put("period", "200501"); executeHandleTodo(new Todo<JobRequest>(2, request)); log.assertContent("informOfFailure(Level{initial-job-request}, Todo{2})" + ", dueto(L'axe 'TEST' est en cours de calcul.)"); } @Override protected void doSetup() throws Exception { super.doSetup(); jdbc.executeUpdate("delete from PM_EXPRESSION"); jdbc.executeUpdate("delete from PM_SEGMENTATION"); contextManager = new ContextManagerMock(); setActionStringifier(new MyBlackboardActionStringifier()); } @Override protected void doTearDown() throws Exception { jdbc.executeUpdate("delete from PM_EXPRESSION"); jdbc.executeUpdate("delete from PM_SEGMENTATION"); } @Override protected Level getListenedLevel() { return new Level("initial-job-request"); } @Override protected JobRequestAnalyzerParticipant createParticipant() { return new JobRequestAnalyzerParticipant(contextManager, 0, TimeUnit.SECONDS); } public static void insertSegmentation(JdbcFixture jdbc, String segmentationId, String familyId, int expressionId, String expression, String destField) throws SQLException { jdbc.executeUpdate("insert into PM_SEGMENTATION (SEGMENTATION_ID, SEGMENTATION_NAME, FAMILY)" + " values (" + segmentationId + ", 'TEST', '" + familyId + "')"); jdbc.executeUpdate("insert into PM_EXPRESSION " + "(EXPRESSION_ID,SEGMENTATION_ID,DESTINATION_FIELD,EXPRESSION,PRIORITY,IS_VARIABLE,VARIABLE_TYPE)" + " values (" + expressionId + ", " + segmentationId + ", '" + destField + "', '" + expression + "', 1, 0, null)"); jdbc.executeUpdate("insert into PM_EXPRESSION " + "(EXPRESSION_ID,SEGMENTATION_ID,DESTINATION_FIELD,EXPRESSION,PRIORITY,IS_VARIABLE,VARIABLE_TYPE)" + " values (" + expressionId + 1 + ", " + segmentationId + ", 'SLEEVE_CODE', 'cpft', 999, 0, null)"); } private class MyBlackboardActionStringifier extends BlackboardActionStringifier { private MyBlackboardActionStringifier() { super(JobRequestAnalyzerParticipantTest.this.log); } @Override protected String toString(Todo todo) { if (todo.getId() != -1) { return super.toString(todo); } else if (todo.getContent() instanceof TodoContent) { TodoContent content = (TodoContent)todo.getContent(); return "todo{jobId:" + content.getRequestJobId() + ", familyId:" + content.getFamilyId() + "}"; } else { Arguments content = (Arguments)todo.getContent(); return "audit" + content.toMap(); } } @Override public void visit(InformOfFailure failure) { super.visit(failure); log.call("dueto", failure.getErrorMessage()); } } }