/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.wordpress.salaboy.services; import com.wordpress.salaboy.model.Procedure; import com.wordpress.salaboy.model.events.EmergencyEndsEvent; import com.wordpress.salaboy.services.workitemhandlers.AsyncStartProcedureWorkItemHandler; import java.io.IOException; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseConfiguration; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.conf.EventProcessingOption; import org.drools.io.impl.ClassPathResource; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.process.ProcessInstance; /** * * @author salaboy */ public class AdHocProcedureImpl implements AdHocProcedure{ private String emergencyId; private StatefulKnowledgeSession internalSession; private String procedureName; public AdHocProcedureImpl() { this.procedureName = "AdHocProcedure"; } private StatefulKnowledgeSession createAdHocProcedureSession(String callId) throws IOException { // Map<String, GridServiceDescription> coreServicesMap = new HashMap<String, GridServiceDescription>(); // GridServiceDescriptionImpl gsd = new GridServiceDescriptionImpl(WhitePages.class.getName()); // Address addr = gsd.addAddress("socket"); // addr.setObject(new InetSocketAddress[]{new InetSocketAddress("localhost", 8000)}); // coreServicesMap.put(WhitePages.class.getCanonicalName(), gsd); // // GridImpl grid = new GridImpl(new ConcurrentHashMap<String, Object>()); // // GridPeerConfiguration conf = new GridPeerConfiguration(); // GridPeerServiceConfiguration coreSeviceConf = new CoreServicesLookupConfiguration(coreServicesMap); // conf.addConfiguration(coreSeviceConf); // // GridPeerServiceConfiguration wprConf = new WhitePagesRemoteConfiguration(); // conf.addConfiguration(wprConf); // // conf.configure(grid); // // GridServiceDescription<GridNode> n1Gsd = grid.get(WhitePages.class).lookup("n1"); // GridConnection<GridNode> conn = grid.get(ConnectionFactoryService.class).createConnection(n1Gsd); // GridNode remoteN1 = conn.connect(); // // KnowledgeBuilderConfiguration kbuilderConf = remoteN1.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilderConfiguration(); // KnowledgeBuilder kbuilder = remoteN1.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder(kbuilderConf); // // kbuilder.add(new ByteArrayResource(IOUtils.toByteArray(new ClassPathResource("processes/procedures/AdHocProcedure.bpmn").getInputStream())), ResourceType.BPMN2); // // // KnowledgeBuilderErrors errors = kbuilder.getErrors(); // if (errors != null && errors.size() > 0) { // for (KnowledgeBuilderError error : errors) { // System.out.println(">>>>>>> Error: " + error.getMessage()); // // } // throw new IllegalStateException("Failed to parse knowledge!"); // } // // KnowledgeBaseConfiguration kbaseConf = remoteN1.get(KnowledgeBaseFactoryService.class).newKnowledgeBaseConfiguration(); // kbaseConf.setOption(EventProcessingOption.STREAM); // KnowledgeBase kbase = remoteN1.get(KnowledgeBaseFactoryService.class).newKnowledgeBase(kbaseConf); // // kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); // // StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); // // remoteN1.set("AdHocProcedureSession" + this.callId, session); // // return session; System.out.println("Starting Local Session because Remote takes to long!!!"); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(new ClassPathResource("processes/procedures/AdHocProcedure.bpmn"), ResourceType.BPMN2); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors != null && errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.out.println(">>>>>>> Error: " + error.getMessage()); } throw new IllegalStateException("Failed to parse knowledge!"); } KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbaseConf.setOption(EventProcessingOption.STREAM); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConf); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); return ksession; } @Override public void configure(String emergencyId, Procedure procedure, Map<String, Object> parameters) { this.emergencyId = emergencyId; try { internalSession = createAdHocProcedureSession(this.emergencyId); } catch (IOException ex) { Logger.getLogger(AdHocProcedureImpl.class.getName()).log(Level.SEVERE, null, ex); } setWorkItemHandlers(internalSession); new Thread(new Runnable() { public void run() { internalSession.fireUntilHalt(); } }).start(); ProcessInstance pi = internalSession.startProcess("com.wordpress.salaboy.bpmn2.AdHocProcedure", parameters); procedure.setProcessInstanceId(pi.getId()); } private void setWorkItemHandlers(StatefulKnowledgeSession session) { session.getWorkItemManager().registerWorkItemHandler("Start Procedure", new AsyncStartProcedureWorkItemHandler()); } @Override public void procedureEndsNotification(EmergencyEndsEvent event) { throw new UnsupportedOperationException("Not supported yet."); } }