package betsy.bpmn.engines.flowable; import java.nio.file.Path; import java.time.LocalDate; import java.util.LinkedList; import java.util.List; import java.util.Optional; import javax.xml.namespace.QName; import betsy.bpmn.engines.AbstractBPMNEngine; import betsy.bpmn.engines.BPMNProcessStarter; import betsy.bpmn.engines.BPMNTestcaseMerger; import betsy.bpmn.engines.BPMNTester; import betsy.bpmn.engines.GenericBPMNTester; import betsy.bpmn.engines.JsonHelper; import betsy.bpmn.engines.activiti.ActivitiLogBasedProcessInstanceOutcomeChecker; import betsy.bpmn.model.BPMNProcess; import betsy.bpmn.model.BPMNTestBuilder; import betsy.common.engines.tomcat.Tomcat; import betsy.common.model.engine.EngineExtended; import betsy.common.tasks.FileTasks; import betsy.common.tasks.XSLTTasks; import betsy.common.util.ClasspathHelper; import org.apache.log4j.Logger; import org.json.JSONObject; import pebl.ProcessLanguage; import pebl.benchmark.test.TestCase; import static betsy.bpmn.engines.BPMNProcessInstanceOutcomeChecker.ProcessInstanceOutcome.UNDEPLOYED_PROCESS; /** * Activiti 5.20.0 * */ public class Flowable5220Engine extends AbstractBPMNEngine { @Override public EngineExtended getEngineObject() { return new EngineExtended(ProcessLanguage.BPMN, "flowable", "5.22.0", LocalDate.of(2016, 10, 13), "Apache-2.0"); } @Override public void install() { FlowableInstaller installer = new FlowableInstaller(); installer.setFileName("flowable-5.22.0.zip"); installer.setDestinationDir(getServerPath()); installer.setGroovyFile(Optional.of("groovy-all-2.4.5.jar")); installer.install(); // Modify preferences FileTasks.replaceTokenInFile(installer.getClassesPath().resolve("activiti-custom-context.xml"), "\t\t<property name=\"jobExecutorActivate\" value=\"false\" />", "\t\t<property name=\"jobExecutorActivate\" value=\"true\" />"); FileTasks.replaceTokenInFile(installer.getClassesPath().resolve("activiti-custom-context.xml"),"<!--",""); FileTasks.replaceTokenInFile(installer.getClassesPath().resolve("activiti-custom-context.xml"),"-->",""); } private static final Logger LOGGER = Logger.getLogger(Flowable5220Engine.class); public static final String URL = "http://kermit:kermit@localhost:8080/flowable-rest"; @Override public void testProcess(BPMNProcess process) { for (TestCase testCase : process.getTestCases()) { BPMNTester bpmnTester = new BPMNTester(); int testCaseNumber = testCase.getNumber(); bpmnTester.setSource(process.getTargetTestSrcPathWithCase(testCaseNumber)); bpmnTester.setTarget(process.getTargetTestBinPathWithCase(testCaseNumber)); bpmnTester.setReportPath(process.getTargetReportsPathWithCase(testCaseNumber)); new GenericBPMNTester(process, testCase, getInstanceLogFile(process.getName(), testCaseNumber), bpmnTester, new FlowableApiBasedProcessOutcomeChecker(), new ActivitiLogBasedProcessInstanceOutcomeChecker(getTomcat().getTomcatLogsDir().resolve("activiti.log")), new FlowableProcessStarter() ).runTest(); } new BPMNTestcaseMerger(process.getTargetReportsPath()).mergeTestCases(); } private Path getInstanceLogFile(String processName, int testCaseNumber) { return getTomcat().getTomcatBinDir().resolve("log-"+processName + "-" + testCaseNumber + ".txt"); } @Override public BPMNProcessStarter getProcessStarter() { return new FlowableProcessStarter(); } @Override public Path getLogForInstance(String processName, String instanceId) { return getInstanceLogFile(processName, Integer.parseInt(instanceId)); } @Override public void deploy(String name, Path path) { deployBpmnProcess(path); } public static void deployBpmnProcess(Path bpmnFile) { LOGGER.info("Deploying file " + bpmnFile.toAbsolutePath()); try { JsonHelper.post(URL + "/service/repository/deployments", bpmnFile, 201); } catch (Exception e) { LOGGER.info("deployment failed", e); } } @Override public boolean isDeployed(QName process) { try { return !UNDEPLOYED_PROCESS.equals(new FlowableApiBasedProcessOutcomeChecker().checkProcessOutcome(process.getLocalPart())); } catch (Exception e) { return false; } } @Override public void undeploy(QName process) { LOGGER.info("Undeploying process " + process); try { JSONObject result = JsonHelper.get(URL + "/service/repository/deployments?name="+process.getLocalPart() +".bpmn", 200); String id = result.optJSONArray("data").optJSONObject(0).optString("id"); JsonHelper.delete(URL + "/service/repository/deployments/" + id, 204); } catch (Exception e) { LOGGER.info("undeployment failed", e); } } @Override public Path getXsltPath() { return ClasspathHelper.getFilesystemPathFromClasspathPath("/bpmn/activiti"); } @Override public Path buildArchives(BPMNProcess process) { XSLTTasks.transform(getXsltPath().resolve("../scriptTask.xsl"), process.getProcess(), process.getTargetProcessPath().resolve(process.getName() + ".bpmn-temp"), "processName", process.getName()); XSLTTasks.transform(getXsltPath().resolve("activiti.xsl"), process.getTargetProcessPath().resolve(process.getName() + ".bpmn-temp"), process.getTargetProcessFilePath()); FileTasks.deleteFile(process.getTargetProcessPath().resolve(process.getName() + ".bpmn-temp")); return process.getTargetProcessFilePath(); } @Override public void buildTest(BPMNProcess process) { BPMNTestBuilder builder = new BPMNTestBuilder(); builder.setPackageString(process.getPackageID()); builder.setLogDir(getTomcat().getTomcatBinDir()); builder.setProcess(process); builder.buildTests(); } @Override public String getEndpointUrl(String name) { return URL + "/service/repository/"; } public Tomcat getTomcat() { return Tomcat.v7(getServerPath()); } @Override public void startup() { getTomcat().startup(); } @Override public void shutdown() { getTomcat().shutdown(); } @Override public boolean isRunning() { return getTomcat().checkIfIsRunning(); } @Override public List<Path> getLogs() { List<Path> result = new LinkedList<>(); result.addAll(FileTasks.findAllInFolder(getTomcat().getTomcatLogsDir())); result.addAll(FileTasks.findAllInFolder(getTomcat().getTomcatBinDir(), "log*.txt")); return result; } }