Chapter 27. BPMN process fluent API for Business Central processes Red Hat Decision Manager provides a BPMN process fluent API that enables you to create business processes using factories. You can also manually validate the business process that you created using process fluent API. The process fluent API is defined in the org.kie.api.fluent package. Therefore, instead of using BPMN2 XML standard, you can use the process fluent API to create business processes in a few lines of code. 27.1. Example requests with the BPMN process fluent API The following example includes BPMN process fluent API requests for basic interactions with a business process. For more examples, download the Red Hat Process Automation Manager 7.13.5 Source Distribution from the Red Hat Customer Portal and navigate to ~/rhpam-7.13.5-sources/src/droolsjbpm-knowledge-USDVERSION/kie-api/src/main/java/org/kie/api/fluent . Creating and interacting with Business Central business processes The following example shows basic business process with a script task, an exception handler, and a variable: Example request to create and interact with a Business Central business process Process process = // Create process builder factory.processBuilder(processId) // package and name .packageName("org.jbpm") .name("My process") // start node .startNode(1).name("Start").done() // Add variable of type string .variable(var("pepe", String.class)) // Add exception handler .exceptionHandler(IllegalArgumentException.class, Dialect.JAVA, "System.out.println(\"Exception\");") // script node in Java language that prints "action" .actionNode(2).name("Action") .action(Dialect.JAVA, "System.out.println(\"Action\");").done() // end node .endNode(3).name("End").done() // connections .connection(1, 2) .connection(2, 3) .build(); In this example, a ProcessBuilderFactory reference is obtained and then, using processBuilder(String processId) method, a ProcessBuilder instance is created, which is associated with the given process Id. The ProcessBuilder instance enables you to build a definition of the created process using the fluent API. A business process consists of three components: Header: The header section contains global elements such as the name of the process, imports, and variables. In the example, the header contains the name and version of the process and the package name. Nodes: The nodes section contains all the different nodes that are part of the process. In the example, nodes are added to the process by calling the startNode() , actionNode() , and endNode() methods. These methods return a specific NodeBuilder that allows you to set the properties of that node. After the code finishes configuring that specific node, the done() method returns the NodeContainerBuilder to add more nodes, if necessary. Connections: The connections section links the nodes to create a flow chart. In the example, once you add all the nodes, you must connect them by creating connections between them. You can call the connection() method, which links the nodes. Finally, you can call the build() method and obtain the generated process definition. The build() method also validates the process definition and throws an exception if the process definition is not valid. 27.2. Example requests to execute a business process Once you create a valid process definition instance, you can execute it using a combination of public and internal KIE APIs. To execute a process, create a Resource , which is used to create a KieBase . Using the KieBase , you can create a KieSession to execute the process. The following example uses ProcessBuilderFactory.toBytes process to create a ByteArrayResource resource. Example request to execute a process // Build resource from Process KieResources resources = ServiceRegistry.getInstance().get(KieResources.class); Resource res = resources .newByteArrayResource(factory.toBytes(process)) .setSourcePath("/tmp/processFactory.bpmn2"); // source path or target path must be set to be added into kbase // Build kie base from this resource using KIE API KieServices ks = KieServices.Factory.get(); KieRepository kr = ks.getRepository(); KieFileSystem kfs = ks.newKieFileSystem(); kfs.write(res); KieBuilder kb = ks.newKieBuilder(kfs); kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built. KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId()); KieBase kbase = kContainer.getKieBase(); // Create kie session using KieBase KieSessionConfiguration conf = ...; Environment env = ....; KieSession ksession = kbase.newKieSession(conf,env); // execute process using same process Id that is used to obtain ProcessBuilder instance ksession.startProcess(processId)

Commands:
Process process = // Create process builder factory.processBuilder(processId) // package and name .packageName("org.jbpm") .name("My process") // start node .startNode(1).name("Start").done() // Add variable of type string .variable(var("pepe", String.class)) // Add exception handler .exceptionHandler(IllegalArgumentException.class, Dialect.JAVA, "System.out.println(\"Exception\");") // script node in Java language that prints "action" .actionNode(2).name("Action") .action(Dialect.JAVA, "System.out.println(\"Action\");").done() // end node .endNode(3).name("End").done() // connections .connection(1, 2) .connection(2, 3) .build();
// Build resource from Process KieResources resources = ServiceRegistry.getInstance().get(KieResources.class); Resource res = resources .newByteArrayResource(factory.toBytes(process)) .setSourcePath("/tmp/processFactory.bpmn2"); // source path or target path must be set to be added into kbase // Build kie base from this resource using KIE API KieServices ks = KieServices.Factory.get(); KieRepository kr = ks.getRepository(); KieFileSystem kfs = ks.newKieFileSystem(); kfs.write(res); KieBuilder kb = ks.newKieBuilder(kfs); kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built. KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId()); KieBase kbase = kContainer.getKieBase(); // Create kie session using KieBase KieSessionConfiguration conf = ...; Environment env = ....; KieSession ksession = kbase.newKieSession(conf,env); // execute process using same process Id that is used to obtain ProcessBuilder instance ksession.startProcess(processId)