package org.jboss.seam.drools; import java.util.List; import org.drools.FactHandle; import org.drools.WorkingMemory; import org.jboss.seam.Component; import org.jboss.seam.bpm.Actor; import org.jboss.seam.core.Expressions; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.jpdl.el.ELException; /** * Common functionality for jBPM handlers for Drools. * * @author Jeff Delong * @author Gavin King * */ public class DroolsHandler { protected WorkingMemory getWorkingMemory(String workingMemoryName, List<String> expressions, List<String> retractions, ExecutionContext executionContext) throws ELException { WorkingMemory workingMemory = (WorkingMemory) Component.getInstance(workingMemoryName, true); if(expressions != null && expressions.size() > 0) { for (String objectName: expressions) { Object object = Expressions.instance().createValueExpression(objectName).getValue(); //Object object = new SeamVariableResolver().resolveVariable(objectName); // assert the object into the rules engine if (object instanceof Iterable) { for (Object element: (Iterable) object) { assertObject(workingMemory, element); } } else { assertObject(workingMemory, object); } } } if(retractions != null && retractions.size() > 0) { for (String objectName: retractions) { Object object = Expressions.instance().createValueExpression(objectName).getValue(); //Object object = new SeamVariableResolver().resolveVariable(objectName); // retract the object from the rules engine if (object instanceof Iterable) { for (Object element: (Iterable) object) { retractObject(workingMemory, element); } } else { retractObject(workingMemory, object); } } } //workingMemory.setGlobal( "contextInstance", executionContext.getContextInstance() ); workingMemory.insert(Actor.instance()); return workingMemory; } private void assertObject(WorkingMemory workingMemory, Object element) { FactHandle fact = workingMemory.getFactHandle(element); if (fact==null) { workingMemory.insert(element); } else { workingMemory.update(fact, element); } } private void retractObject(WorkingMemory workingMemory, Object element) { FactHandle fact = workingMemory.getFactHandle(element); if (fact != null) { workingMemory.retract(fact); } } }