package org.jbpm.migration;
import java.io.File;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.jbpm.migration.tools.MigrationHelper;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.test.JbpmJUnitBaseTestCase;
import org.junit.After;
import org.kie.api.io.ResourceType;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Migration test wrapper.
*
* Contains methods for test preparation.
*/
public class JbpmMigrationRuntimeTest extends JbpmJUnitBaseTestCase {
protected static KieBase kbase;
private static KnowledgeBuilder kbuilder;
protected static KieSession ksession;
protected static ProcessDefinition processDef;
private static JbpmMigrationRuntimeTest instance = new JbpmMigrationRuntimeTest();
private static File basedir;
private static Properties properties;
private static final Logger logger = LoggerFactory.getLogger(JbpmMigrationRuntimeTest.class);
protected static List<File> migrate(String... processDefinitions) {
final List<File> migratedFiles = new ArrayList<File>(processDefinitions.length);
for (String processDefinition : processDefinitions) {
migratedFiles.add(migrate(processDefinition));
}
return migratedFiles;
}
protected static File migrate(String processDefinition) {
File jpdlFile = null;
try {
jpdlFile = new File(JbpmMigrationRuntimeTest.class.getResource("/" + processDefinition).toURI());
} catch (URISyntaxException ex) {
logger.error(null, ex);
}
return migrate(jpdlFile);
}
protected static File migrate(File processDefinition) {
return migrate(processDefinition, processDefinition.getParentFile().getName());
}
protected static File migrate(File processDefinition, String bpmnFileName) {
File bpmnFile = instance.createTempFile(bpmnFileName, "bpmn2");
MigrationHelper.migration(processDefinition, bpmnFile);
return bpmnFile;
}
protected static void buildNewKbase(File... bpmnFiles) {
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
for (File bpmnFile : bpmnFiles) {
kbuilder.add(ResourceFactory.newFileResource(bpmnFile), ResourceType.BPMN2);
}
if (kbuilder.hasErrors()) {
throw new RuntimeException(kbuilder.getErrors().toString());
}
kbase = kbuilder.newKnowledgeBase();
}
protected static void createProcessDefinition(String processDefinition) {
processDef = ProcessDefinition.parseXmlResource(processDefinition);
}
/**
* Creates jpdl process definition, migrates to BPMN2 and builds
* KnowledgeBase.
*
* @param allProcesses
* JPDL process definition files, the first one is used for
* createProcessDefinition().
*/
protected static void prepareProcess(String... allProcesses) {
final List<File> bpmnFiles = migrate(allProcesses);
createProcessDefinition(allProcesses[0]);
buildNewKbase(bpmnFiles.toArray(new File[] {}));
}
/**
* Creates jpdl process definition, migrates to BPMN2 and builds
* KnowledgeBase.
*
* @param processDefinition
* JPDL process definition file.
*/
protected static void prepareProcess(String processDefinition) {
File bpmnFile = migrate(processDefinition);
createProcessDefinition(processDefinition);
buildNewKbase(bpmnFile);
}
/**
* Adds new classpath bpmn2 definition to an existing knowledge base.
*
* @path path to bpmn2 definition file on classpath.
*/
protected static void addBpmnProcessFromClassPath(String... paths) {
for (String path : paths) {
kbuilder.add(ResourceFactory.newClassPathResource(path, JbpmMigrationRuntimeTest.class), ResourceType.BPMN2);
}
if (kbuilder.hasErrors()) {
throw new RuntimeException(kbuilder.getErrors().toString());
}
kbase = kbuilder.newKnowledgeBase();
}
/**
* Creates new knowledge base from classpath bpmn2 definition.
*
* @path path to bpmn2 definition file on classpath.
*/
protected static void createBpmnProcessFromClassPath(String... paths) {
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
addBpmnProcessFromClassPath(paths);
}
protected final File createTempFile(String name) {
return createTempFile(name, "");
}
public File targetDir(){
String relPath = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
File targetDir = new File(relPath+"../../target");
if(!targetDir.exists()) {
targetDir.mkdir();
}
return targetDir;
}
protected final File createTempFile(String name, String extension) {
File dir = new File(targetDir(), getClass().getSimpleName());
if (!dir.exists()) {
dir.mkdir();
}
int i = 0;
File temp;
while ((temp = new File(dir, String.format("%s_%03d.%s", name, i++, extension))).exists()) {
}
return temp;
}
@After
public void dispose() {
if (ksession != null) {
ksession.dispose();
}
}
}