/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.process.audit.query; import static org.jbpm.persistence.util.PersistenceUtil.JBPM_PERSISTENCE_UNIT_NAME; import static org.jbpm.persistence.util.PersistenceUtil.cleanUp; import static org.jbpm.persistence.util.PersistenceUtil.setupWithPoolingDataSource; import static org.junit.Assert.assertEquals; import static org.kie.api.runtime.EnvironmentName.ENTITY_MANAGER_FACTORY; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Random; import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.jbpm.process.audit.AuditLogServiceTest; import org.jbpm.process.audit.JPAAuditLogService; import org.jbpm.process.audit.NodeInstanceLog; import org.jbpm.process.audit.ProcessInstanceLog; import org.jbpm.process.audit.VariableInstanceLog; import org.jbpm.process.audit.strategy.StandaloneJtaStrategy; import org.jbpm.process.instance.impl.util.LoggingPrintStream; import org.junit.After; //import org.jbpm.process.instance.impl.util.LoggingPrintStream; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.kie.internal.runtime.manager.audit.query.NodeInstanceLogDeleteBuilder; import org.kie.internal.runtime.manager.audit.query.ProcessInstanceLogDeleteBuilder; import org.kie.internal.runtime.manager.audit.query.VariableInstanceLogDeleteBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AuditDeleteTest extends JPAAuditLogService { private static HashMap<String, Object> context; private static EntityManagerFactory emf; private static final Logger logger = LoggerFactory.getLogger(AuditLogServiceTest.class); private ProcessInstanceLog [] pilTestData; private VariableInstanceLog [] vilTestData; private NodeInstanceLog [] nilTestData; @BeforeClass public static void configure() { LoggingPrintStream.interceptSysOutSysErr(); } @AfterClass public static void reset() { LoggingPrintStream.resetInterceptSysOutSysErr(); } @Before public void setUp() throws Exception { context = setupWithPoolingDataSource(JBPM_PERSISTENCE_UNIT_NAME); emf = (EntityManagerFactory) context.get(ENTITY_MANAGER_FACTORY); if( pilTestData == null ) { pilTestData = createTestProcessInstanceLogData(); vilTestData = createTestVariableInstanceLogData(); nilTestData = createTestNodeInstanceLogData(); } this.persistenceStrategy = new StandaloneJtaStrategy(emf); } @After public void cleanup() { cleanUp(context); } private static Random random = new Random(); private long randomLong() { long result = (long) Math.abs(random.nextInt()); while( result == 23l ) { result = (long) Math.abs(random.nextInt()); } return result; } private String randomString() { return UUID.randomUUID().toString(); } private Calendar randomCal() { Calendar cal = GregorianCalendar.getInstance(); cal.roll(Calendar.DAY_OF_YEAR, -1*random.nextInt(10*365)); cal.set(Calendar.MILLISECOND, 0); cal.set(Calendar.SECOND, 0); return cal; } private ProcessInstanceLog [] createTestProcessInstanceLogData() { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numEntities = 11; ProcessInstanceLog [] testData = new ProcessInstanceLog[numEntities]; Calendar cal = randomCal(); for( int i = 0; i < numEntities; ++i ) { ProcessInstanceLog pil = new ProcessInstanceLog(randomLong(), randomString()); pil.setDuration(randomLong()); pil.setExternalId(randomString()); pil.setIdentity(randomString()); pil.setOutcome(randomString()); pil.setParentProcessInstanceId(randomLong()); pil.setProcessId(randomString()); pil.setProcessName(randomString()); pil.setProcessVersion(randomString()); pil.setStatus(random.nextInt()); cal.add(Calendar.MINUTE, 1); pil.setStart(cal.getTime()); cal.add(Calendar.DAY_OF_YEAR, 1); pil.setEnd(cal.getTime()); testData[i] = pil; } for( int i = 0; i < numEntities; ++i ) { switch(i) { case 1: testData[i-1].setDuration(testData[i].getDuration()); break; case 2: testData[i-1].setEnd(testData[i].getEnd()); break; case 3: testData[i-1].setIdentity(testData[i].getIdentity()); break; case 4: testData[i-1].setProcessId(testData[i].getProcessId()); break; case 5: testData[i-1].setProcessInstanceId(testData[i].getProcessInstanceId()); break; case 6: testData[i-1].setProcessName(testData[i].getProcessName()); break; case 7: testData[i-1].setProcessVersion(testData[i].getProcessVersion()); break; case 8: testData[i-1].setStart(testData[i].getStart()); break; case 9: testData[i-1].setStatus(testData[i].getStatus()); break; case 10: testData[i-1].setOutcome(testData[i].getOutcome()); break; } } Object tx = jtaHelper.joinTransaction(em); for( int i = 0; i < numEntities; ++i ) { em.persist(testData[i]); } jtaHelper.leaveTransaction(em, tx); return testData; } private NodeInstanceLog [] createTestNodeInstanceLogData() { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numEntities = 9; NodeInstanceLog [] testData = new NodeInstanceLog[numEntities]; ProcessInstanceLog [] testDataPI = new ProcessInstanceLog[numEntities]; Calendar cal = randomCal(); for( int i = 0; i < numEntities; ++i ) { NodeInstanceLog nil = new NodeInstanceLog(); nil.setProcessInstanceId(randomLong()); nil.setProcessId(randomString()); cal.add(Calendar.SECOND, 1); nil.setDate(cal.getTime()); nil.setType(Math.abs(random.nextInt())); nil.setNodeInstanceId(randomString()); nil.setNodeId(randomString()); nil.setNodeName(randomString()); nil.setNodeType(randomString()); nil.setWorkItemId(randomLong()); nil.setConnection(randomString()); nil.setExternalId(randomString()); testData[i] = nil; ProcessInstanceLog pLog = buildCompletedProcessInstance(nil.getProcessInstanceId()); testDataPI[i] = pLog; } for( int i = 0; i < numEntities; ++i ) { switch(i) { case 1: testData[i-1].setDate(testData[i].getDate()); break; case 2: testData[i-1].setNodeId(testData[i].getNodeId()); break; case 3: testData[i-1].setNodeInstanceId(testData[i].getNodeInstanceId()); break; case 4: testData[i-1].setNodeName(testData[i].getNodeName()); break; case 5: testData[i-1].setNodeType(testData[i].getNodeType()); break; case 6: testData[i-1].setProcessId(testData[i].getProcessId()); break; case 7: testData[i-1].setProcessInstanceId(testData[i].getProcessInstanceId()); break; case 8: testData[i-1].setWorkItemId(testData[i].getWorkItemId()); break; } } Object tx = jtaHelper.joinTransaction(em); for( int i = 0; i < numEntities; ++i ) { em.persist(testDataPI[i]); em.persist(testData[i]); } jtaHelper.leaveTransaction(em, tx); return testData; } private VariableInstanceLog [] createTestVariableInstanceLogData() { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numEntities = 8; VariableInstanceLog [] testData = new VariableInstanceLog[numEntities]; ProcessInstanceLog [] testDataPI = new ProcessInstanceLog[numEntities]; Calendar cal = randomCal(); for( int i = 0; i < numEntities; ++i ) { VariableInstanceLog vil = new VariableInstanceLog(); vil.setProcessInstanceId(randomLong()); vil.setProcessId(randomString()); cal.add(Calendar.MINUTE, 1); vil.setDate(cal.getTime()); vil.setVariableInstanceId(randomString()); vil.setVariableId(randomString()); vil.setValue(randomString()); vil.setOldValue(randomString()); vil.setExternalId(randomString()); testData[i] = vil; ProcessInstanceLog pLog = buildCompletedProcessInstance(vil.getProcessInstanceId()); testDataPI[i] = pLog; } for( int i = 0; i < numEntities; ++i ) { switch(i) { case 1: testData[i-1].setDate(testData[i].getDate()); break; case 2: testData[i-1].setOldValue(testData[i].getOldValue()); break; case 3: testData[i-1].setProcessId(testData[i].getProcessId()); break; case 4: testData[i-1].setProcessInstanceId(testData[i].getProcessInstanceId()); break; case 5: testData[i-1].setValue(testData[i].getValue()); break; case 6: testData[i-1].setVariableId(testData[i].getVariableId()); break; case 7: testData[i-1].setVariableInstanceId(testData[i].getVariableInstanceId()); break; } } Object tx = jtaHelper.joinTransaction(em); for( int i = 0; i < numEntities; ++i ) { em.persist(testDataPI[i]); em.persist(testData[i]); } jtaHelper.leaveTransaction(em, tx); return testData; } private ProcessInstanceLog buildCompletedProcessInstance(long processInstanceId) { ProcessInstanceLog pil = new ProcessInstanceLog(processInstanceId, randomString()); pil.setDuration(randomLong()); pil.setExternalId(randomString()); pil.setIdentity(randomString()); pil.setOutcome(randomString()); pil.setParentProcessInstanceId(randomLong()); pil.setProcessId(randomString()); pil.setProcessName(randomString()); pil.setProcessVersion(randomString()); pil.setStatus(2); pil.setStart(null); pil.setEnd(null); return pil; } @Test public void testDeleteProcessInstanceInfoLogByProcessId() { int p = 0; String processId = pilTestData[p++].getProcessId(); String processId2 = pilTestData[p++].getProcessId(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().processId(processId, processId2); int result = updateBuilder.build().execute(); assertEquals(2, result); } @Test public void testDeleteProcessInstanceInfoLogByDate() { int p = 0; Date endDate = pilTestData[p++].getEnd(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().endDate(endDate); int result = updateBuilder.build().execute(); assertEquals(1, result); } @Test public void testDeleteProcessInstanceInfoLogByTimestamp() { int p = 0; Date endDate = pilTestData[p++].getEnd(); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> logs = this.processInstanceLogQuery().endDate(endDate).build().getResultList(); assertEquals(1, logs.size()); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().endDate(logs.get(0).getEnd()); int result = updateBuilder.build().execute(); assertEquals(1, result); } @Test public void testDeleteProcessInstanceInfoLogByProcessIdAndDate() { int p = 0; String processId = pilTestData[p].getProcessId(); Date endDate = pilTestData[p].getEnd(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().endDate(endDate).processId(processId); int result = updateBuilder.build().execute(); assertEquals(1, result); } @Test public void testDeleteProcessInstanceInfoLogByProcessIdAndNotMatchingDate() { int p = 0; String processId = pilTestData[p++].getProcessId(); Date endDate = pilTestData[p++].getEnd(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().endDate(endDate).processId(processId); int result = updateBuilder.build().execute(); assertEquals(0, result); } @Test public void testDeleteProcessInstanceInfoLogByStatus() { int status = pilTestData[5].getStatus(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().status(status); int result = updateBuilder.build().execute(); assertEquals(1, result); } @Test public void testDeleteProcessInstanceInfoLogByDateRangeEnd() { Date endDate = pilTestData[4].getEnd(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().endDateRangeEnd(endDate); int result = updateBuilder.build().execute(); assertEquals(5, result); } @Test public void testDeleteProcessInstanceInfoLogByDateRangeStart() { Date endDate = pilTestData[8].getEnd(); ProcessInstanceLogDeleteBuilder updateBuilder = this.processInstanceLogDelete().endDateRangeStart(endDate); int result = updateBuilder.build().execute(); assertEquals(3, result); } @Test public void testDeleteNodeInstanceInfoLogByProcessId() { int p = 0; String processId = nilTestData[p++].getProcessId(); NodeInstanceLogDeleteBuilder updateBuilder = this.nodeInstanceLogDelete().processId(processId); int result = updateBuilder.build().execute(); assertEquals(1, result); } @Test public void testDeleteNodeInstanceInfoLogByDate() { int p = 0; Date date = nilTestData[p++].getDate(); NodeInstanceLogDeleteBuilder updateBuilder = this.nodeInstanceLogDelete().date(date); int result = updateBuilder.build().execute(); assertEquals(2, result); } @Test public void testDeleteNodeInstanceInfoLogByDateRangeEnd() { Date endDate = nilTestData[4].getDate(); NodeInstanceLogDeleteBuilder updateBuilder = this.nodeInstanceLogDelete().dateRangeEnd(endDate); int result = updateBuilder.build().execute(); assertEquals(5, result); } @Test public void testDeleteNodeInstanceInfoLogByTimestamp() { int p = 0; Date date = nilTestData[p++].getDate(); List<org.kie.api.runtime.manager.audit.NodeInstanceLog> logs = this.nodeInstanceLogQuery().date(date).build().getResultList(); assertEquals(2, logs.size()); NodeInstanceLogDeleteBuilder updateBuilder = this.nodeInstanceLogDelete().date(logs.get(0).getDate()); int result = updateBuilder.build().execute(); assertEquals(2, result); } @Test public void testDeleteVarInstanceInfoLogByProcessId() { int p = 0; String processId = vilTestData[p++].getProcessId(); VariableInstanceLogDeleteBuilder updateBuilder = this.variableInstanceLogDelete().processId(processId); int result = updateBuilder.build().execute(); assertEquals(1, result); } @Test public void testDeleteVarInstanceInfoLogByDate() { int p = 0; Date date = vilTestData[p++].getDate(); VariableInstanceLogDeleteBuilder updateBuilder = this.variableInstanceLogDelete().date(date); int result = updateBuilder.build().execute(); assertEquals(2, result); } @Test public void testDeleteVarInstanceInfoLogByDateRangeEnd() { Date endDate = vilTestData[4].getDate(); VariableInstanceLogDeleteBuilder updateBuilder = this.variableInstanceLogDelete().dateRangeEnd(endDate); int result = updateBuilder.build().execute(); assertEquals(5, result); } @Test public void testDeleteVarInstanceInfoLogByTimestamp() { int p = 0; Date date = vilTestData[p++].getDate(); List<org.kie.api.runtime.manager.audit.VariableInstanceLog> vars = this.variableInstanceLogQuery().date(date).build().getResultList(); assertEquals(2, vars.size()); VariableInstanceLogDeleteBuilder updateBuilder = this.variableInstanceLogDelete().date(vars.get(0).getDate()); int result = updateBuilder.build().execute(); assertEquals(2, result); } }