/* * 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.simulation.helper; import static org.junit.Assert.assertTrue; import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.drools.core.impl.EnvironmentFactory; import org.eclipse.bpmn2.FlowElement; import org.jbpm.simulation.PathContext; import org.jbpm.simulation.impl.SimulationNodeInstanceFactoryRegistry; import org.json.JSONObject; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; import org.kie.api.builder.KieModule; import org.kie.api.builder.ReleaseId; import org.kie.api.builder.model.KieBaseModel; import org.kie.api.builder.model.KieModuleModel; import org.kie.api.builder.model.KieSessionModel; import org.kie.api.conf.EqualityBehaviorOption; import org.kie.api.conf.EventProcessingOption; import org.kie.api.io.Resource; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.runtime.conf.ClockTypeOption; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; public class TestUtils { public static boolean matchExpected(List<PathContext> paths, List<String>... expectedIds) { for (PathContext context : paths) { List<FlowElement> elements = removeDuplicates(context.getPathElements()); boolean match = false; for (int i = 0; i < expectedIds.length; i++) { List<String> expected = expectedIds[i]; if (expected != null && elements.size() == expected.size()) { for (FlowElement fe : elements) { if (!expected.contains(fe.getId())) { System.err.println("Following element not matched: " + fe.getId() + " " + fe.getName()); match = false; break; } match = true; } if (match) { expectedIds[i] = null; break; } } } if (!match) { return false; } } return true; } public static void printOutPaths(List<PathContext> paths, String name) { if (!"true".equalsIgnoreCase(System.getProperty("test.debug.off"))) { System.out.println("###################" + name + "###################"); for (PathContext context : paths) { System.out.println("PATH: " + context.getId()); System.out.println("AS TEXT:"); for (FlowElement fe : context.getPathElements()) { System.out.println(fe.getName() + " - " + fe.eClass().getName()); } } System.out.println("#####################################################"); } } public static void printOutPaths(List<PathContext> paths, JSONObject jsonPaths, String name) { if (!"true".equalsIgnoreCase(System.getProperty("test.debug.off"))) { System.out.println("###################" + name + "###################"); for (PathContext context : paths) { System.out.println("$$$$$$$$ PATH: " + context.getId() + " " + context.getType()); System.out.println("$$$ AS TEXT:"); for (FlowElement fe : context.getPathElements()) { System.out.println(fe.getName() + " - " + fe.eClass().getName()); } } if (jsonPaths != null) { System.out.println("$$$ AS JSON:"); System.out.println(jsonPaths.toString()); System.out.println("$$$$$$$$"); } System.out.println("#####################################################"); } } public static StatefulKnowledgeSession createSession(String process) { KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); builder.add(ResourceFactory.newClassPathResource(process), ResourceType.BPMN2); KnowledgeBase kbase = builder.newKnowledgeBase(); KieSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); config.setOption(ClockTypeOption.get("pseudo") ); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(config, EnvironmentFactory.newEnvironment()); session.getEnvironment().set("NodeInstanceFactoryRegistry", SimulationNodeInstanceFactoryRegistry.getInstance()); return session; } public static List<FlowElement> removeDuplicates(Set<FlowElement> orig) { Set<String> uniqueIds = new HashSet<String>(); List<FlowElement> unique = new ArrayList<FlowElement>(); for (FlowElement fElement : orig) { if (!uniqueIds.contains(fElement.getId())) { uniqueIds.add(fElement.getId()); unique.add(fElement); } } System.out.println("Size of flow elements after removing duplicates " + unique.size()); return unique; } public static ReleaseId createKJarWithMultipleResources(String id, String[] resourceFiles, ResourceType[] types) throws IOException { KieServices ks = KieServices.Factory.get(); KieModuleModel kproj = ks.newKieModuleModel(); KieFileSystem kfs = ks.newKieFileSystem(); for (int i = 0; i < resourceFiles.length; i++) { Resource resource = ResourceFactory.newClassPathResource(resourceFiles[i]); String res = readResourceContent(resource); String type = types[i].getDefaultExtension(); kfs.write("src/main/resources/" + id.replaceAll("\\.", "/") + "/org/test/res" + i + "." + type, res); } KieBaseModel kBase1 = kproj.newKieBaseModel(id) .setEqualsBehavior(EqualityBehaviorOption.EQUALITY) .setEventProcessingMode(EventProcessingOption.STREAM); KieSessionModel ksession1 = kBase1 .newKieSessionModel(id + ".KSession1") .setType(KieSessionModel.KieSessionType.STATEFUL) .setClockType(ClockTypeOption.get("pseudo")); kfs.writeKModuleXML(kproj.toXML()); KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll(); assertTrue(kieBuilder.getResults().getMessages().isEmpty()); KieModule kieModule = kieBuilder.getKieModule(); return kieModule.getReleaseId(); } protected static String readResourceContent(Resource resource) { StringBuilder contents = new StringBuilder(); BufferedReader reader = null; try { reader = new BufferedReader(resource.getReader()); String text = null; // repeat until all lines is read while ((text = reader.readLine()) != null) { contents.append(text); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return contents.toString(); } }