/* * 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.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Calendar; import java.util.GregorianCalendar; 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.NodeInstanceLog; import org.jbpm.process.audit.ProcessInstanceLog; import org.jbpm.process.audit.VariableInstanceLog; import org.jbpm.process.audit.strategy.StandaloneJtaStrategy; public class AuditQueryDataUtil { private static Random random = new Random(); static long randomLong() { long result = (long) Math.abs(random.nextInt()); while( result == 23l ) { result = (long) Math.abs(random.nextInt()); } return result; } static String randomString() { return UUID.randomUUID().toString(); } static 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; } static ProcessInstanceLog [] createTestProcessInstanceLogData(EntityManagerFactory emf) { 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()); pil.setCorrelationKey(randomString()); 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; } static VariableInstanceLog [] createTestVariableInstanceLogData(EntityManagerFactory emf) { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numEntities = 8; VariableInstanceLog [] testData = new VariableInstanceLog[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; } 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(testData[i]); } jtaHelper.leaveTransaction(em, tx); return testData; } static NodeInstanceLog [] createTestNodeInstanceLogData(EntityManagerFactory emf) { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numEntities = 9; NodeInstanceLog [] testData = new NodeInstanceLog[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; } 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(testData[i]); } jtaHelper.leaveTransaction(em, tx); return testData; } static int MAX = 2; static int MIN = 1; static int BOTH = 0; static void verifyMaxMinDuration( List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> procInstLogs, int test, long... maxOrMin ) { for( org.kie.api.runtime.manager.audit.ProcessInstanceLog log : procInstLogs ) { assertNotNull( "Duration is null" , log.getDuration() ); long dur = log.getDuration(); if( test == MAX ) { assertTrue( "Duration " + dur + " is larger than max " + maxOrMin[0] + ": " + dur, dur <= maxOrMin[0] ); } else if( test == MIN ) { assertTrue( "Duration " + dur + " is smaller than min " + maxOrMin[0], dur >= maxOrMin[0] ); } else { // BOTH assertTrue( "Duration " + dur + " is smaller than min " + maxOrMin[0], dur >= maxOrMin[0] ); assertTrue( "Duration " + dur + " is larger than max " + maxOrMin[1], dur <= maxOrMin[1] ); } } } }