/*
* 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.services.task.audit.service;
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.ArrayList;
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 javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.jbpm.process.audit.ProcessInstanceLog;
import org.jbpm.process.audit.strategy.StandaloneJtaStrategy;
import org.jbpm.process.instance.impl.util.LoggingPrintStream;
import org.jbpm.services.task.HumanTaskServiceFactory;
import org.jbpm.services.task.audit.JPATaskLifeCycleEventListener;
import org.jbpm.services.task.lifecycle.listeners.BAMTaskEventListener;
import org.jbpm.services.task.utils.TaskFluent;
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.api.task.model.Task;
import org.kie.internal.task.api.AuditTask;
import org.kie.internal.task.api.InternalTaskService;
import org.kie.internal.task.query.AuditTaskDeleteBuilder;
import org.kie.internal.task.query.AuditTaskQueryBuilder;
public class AuditTaskDeleteTest extends TaskJPAAuditService {
private static HashMap<String, Object> context;
private static EntityManagerFactory emf;
private Task [] taskTestData;
@BeforeClass
public static void configure() {
LoggingPrintStream.interceptSysOutSysErr();
}
@AfterClass
public static void reset() {
LoggingPrintStream.resetInterceptSysOutSysErr();
}
@Before
public void setUp() throws Exception {
context = setupWithPoolingDataSource("org.jbpm.services.task", "jdbc/jbpm-ds");
emf = (EntityManagerFactory) context.get(ENTITY_MANAGER_FACTORY);
this.persistenceStrategy = new StandaloneJtaStrategy(emf);
produceTaskInstances();
}
@After
public void cleanup() {
cleanUp(context);
}
private static Random random = new Random();
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);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.HOUR_OF_DAY, 0);
return cal;
}
private void produceTaskInstances() {
InternalTaskService taskService = (InternalTaskService) HumanTaskServiceFactory.newTaskServiceConfigurator()
.entityManagerFactory(emf)
.listener(new JPATaskLifeCycleEventListener(true))
.listener(new BAMTaskEventListener(true))
.getTaskService();
Calendar cal = randomCal();
String processId = "process";
taskTestData = new Task[10];
List<ProcessInstanceLog> pLogs = new ArrayList<>();
for (int i = 0; i < 10; i++) {
cal.add(Calendar.HOUR_OF_DAY, 1);
Task task = new TaskFluent().setName("This is my task name")
.addPotentialGroup("Knights Templer")
.setAdminUser("Administrator")
.setProcessId(processId + i)
.setProcessInstanceId(i)
.setCreatedOn(cal.getTime())
.getTask();
taskService.addTask(task, new HashMap<String, Object>());
taskTestData[i] = task;
ProcessInstanceLog plog = buildCompletedProcessInstance(i);
pLogs.add(plog);
}
StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf);
EntityManager em = jtaHelper.getEntityManager();
Object tx = jtaHelper.joinTransaction(em);
pLogs.forEach(pl -> {
em.persist(pl);
});
jtaHelper.leaveTransaction(em, tx);
}
@Test
public void testDeleteAuditTaskInfoLogByProcessId() {
int p = 0;
String processId = taskTestData[p++].getTaskData().getProcessId();
String processId2 = taskTestData[p++].getTaskData().getProcessId();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().processId(processId, processId2);
int result = updateBuilder.build().execute();
assertEquals(2, result);
}
@Test
public void testDeleteAuditTaskInfoLogByDate() {
int p = 0;
Date endDate = taskTestData[p++].getTaskData().getCreatedOn();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().date(endDate);
int result = updateBuilder.build().execute();
assertEquals(1, result);
}
@Test
public void testDeleteAuditTaskInfoLogByProcessIdAndDate() {
int p = 0;
String processId = taskTestData[p].getTaskData().getProcessId();
Date endDate = taskTestData[p].getTaskData().getCreatedOn();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().date(endDate).processId(processId);
int result = updateBuilder.build().execute();
assertEquals(1, result);
}
@Test
public void testDeleteAuditTaskInfoLogByProcessIdAndNotMatchingDate() {
int p = 0;
String processId = taskTestData[p++].getTaskData().getProcessId();
Date endDate = taskTestData[p++].getTaskData().getCreatedOn();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().date(endDate).processId(processId);
int result = updateBuilder.build().execute();
assertEquals(0, result);
}
@Test
public void testDeleteAuditTaskInfoLogByDateRangeEnd() {
Date endDate = taskTestData[4].getTaskData().getCreatedOn();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().dateRangeEnd(endDate);
int result = updateBuilder.build().execute();
assertEquals(5, result);
}
@Test
public void testDeleteAuditTaskInfoLogByDateRangeStart() {
Date endDate = taskTestData[8].getTaskData().getCreatedOn();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().dateRangeStart(endDate);
int result = updateBuilder.build().execute();
assertEquals(2, result);
}
@Test
public void testDeleteAuditTaskInfoLogByDateRange() {
Date startDate = taskTestData[4].getTaskData().getCreatedOn();
Date endDate = taskTestData[8].getTaskData().getCreatedOn();
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().dateRangeStart(startDate).dateRangeEnd(endDate);
int result = updateBuilder.build().execute();
assertEquals(5, result);
}
@Test
public void testTaskAuditServiceClear() {
AuditTaskQueryBuilder queryBuilder = this.auditTaskQuery();
List<AuditTask> tasks = queryBuilder.taskId(taskTestData[4].getId()).build().getResultList();
assertEquals(1, tasks.size());
queryBuilder.clear();
List<AuditTask> data = this.auditTaskQuery().build().getResultList();
assertEquals(10, data.size());
this.clear();
data = this.auditTaskQuery().build().getResultList();
assertEquals(0, data.size());
}
@Test
public void testDeleteAuditTaskInfoLogByTimestamp() {
List<AuditTask> tasks = this.auditTaskQuery().taskId(taskTestData[4].getId()).build().getResultList();
assertEquals(1, tasks.size());
AuditTaskDeleteBuilder updateBuilder = this.auditTaskDelete().date(tasks.get(0).getCreatedOn());
int result = updateBuilder.build().execute();
assertEquals(1, result);
}
private ProcessInstanceLog buildCompletedProcessInstance(long processInstanceId) {
ProcessInstanceLog pil = new ProcessInstanceLog(processInstanceId, "test");
pil.setDuration(0L);
pil.setExternalId("none");
pil.setIdentity("none");
pil.setOutcome("");
pil.setParentProcessInstanceId(-1L);
pil.setProcessId("test");
pil.setProcessName("test process");
pil.setProcessVersion("1");
pil.setStatus(2);
pil.setStart(null);
pil.setEnd(null);
return pil;
}
}