package betsy.bpmn;
import java.awt.Desktop;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import betsy.bpmn.cli.BPMNCliParameter;
import betsy.bpmn.cli.BPMNCliParser;
import betsy.bpmn.engines.AbstractBPMNEngine;
import betsy.bpmn.model.BPMNProcess;
import betsy.common.timeouts.calibration.CalibrationTimeoutRepository;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.codehaus.groovy.runtime.StackTraceUtils;
import pebl.benchmark.test.Test;
public class BPMNMain {
private static final Logger LOGGER = Logger.getLogger(BPMNMain.class);
public static void main(String... args) {
activateLogging();
// parsing cli params
BPMNCliParser parser = new BPMNCliParser(args);
BPMNCliParameter params = parser.parse();
// usage information if required
if (params.showHelp()) {
parser.printUsage();
return;
}
try {
printSelectedEnginesAndProcesses(params.getEngines(), params.getProcesses());
BPMNBetsy betsy = new BPMNBetsy();
onlyBuildSteps(params, betsy);
betsy.setEngines(params.getEngines());
betsy.setProcesses(params.getProcesses());
betsy.setTestFolder(params.getTestFolderName());
if (params.keepEngineRunning() && params.useInstalledEngine()) {
betsy.setComposite(new BPMNComposite() {
@Override
protected void shutdown(BPMNProcess process) {
// keep engine running - no shutdown!
}
@Override
protected void install(BPMNProcess process) {
// is already installed - use existing installation
}
});
} else if (params.keepEngineRunning() && params.useRunningEngine()) {
betsy.setComposite(new BPMNComposite() {
@Override
protected void checkRunning(AbstractBPMNEngine engine) {
// no checks as the engine should be running
}
@Override
protected void start(BPMNProcess process) {
// already started
}
@Override
protected void shutdown(BPMNProcess process) {
// keep engine running - no shutdown!
}
@Override
protected void install(BPMNProcess process) {
// is already installed - use existing installation
}
});
} else if (params.useInstalledEngine()) {
betsy.setComposite(new BPMNComposite() {
@Override
protected void install(BPMNProcess process) {
// is already installed - use existing installation
}
});
} else if (params.keepEngineRunning()) {
betsy.setComposite(new BPMNComposite() {
@Override
protected void shutdown(BPMNProcess process) {
// keep engine running - no shutdown!
}
});
}
// execute
try {
betsy.execute();
} catch (Exception e) {
Throwable cleanedException = StackTraceUtils.deepSanitize(e);
LOGGER.error("something went wrong during execution", cleanedException);
}
// open results in browser
if (params.openResultsInBrowser()) {
try {
Desktop.getDesktop().browse(Paths.get("test/reports/results.html").toUri());
} catch (Exception ignore) {
// ignore any exceptions
}
}
if(params.saveTimeouts()){
CalibrationTimeoutRepository.writeToCSV();
}
} catch (Exception e) {
Throwable cleanedException = StackTraceUtils.deepSanitize(e);
LOGGER.error(cleanedException.getMessage(), cleanedException);
}
}
protected static void activateLogging() {
// activate log4j logging
DOMConfigurator.configure(BPMNMain.class.getResource("/log4j.xml"));
// set log4j property to avoid conflicts with soapUIs -> effectly disabling soapUI's own logging
System.setProperty("soapui.log4j.config", "src/main/resources/soapui-log4j.xml");
}
protected static void printSelectedEnginesAndProcesses(List<AbstractBPMNEngine> engines, List<Test> processes) {
// print selection of engines and processes
LOGGER.info("Engines (" + engines.size() + "): " + ((List<? extends pebl.HasName>) engines).stream().map(pebl.HasName::getName).collect(Collectors.toList()));
LOGGER.info("Processes (" + processes.size() + "): " + ((List<? extends pebl.HasName>) processes).stream().map(pebl.HasName::getName).collect(Collectors.toList()).stream().limit(10).collect(Collectors.toList()));
}
public static void onlyBuildSteps(BPMNCliParameter params, BPMNBetsy betsy) {
if (params.buildArtifactsOnly()) {
betsy.setComposite(new BPMNComposite() {
@Override
protected void collect(BPMNProcess process) {
}
@Override
protected void test(BPMNProcess process) {
}
@Override
protected void start(BPMNProcess process) {
}
@Override
protected void deploy(BPMNProcess process) {
}
@Override
protected void shutdown(BPMNProcess process) {
}
@Override
protected void createReports() {
}
});
}
}
}