package org.jbpm.examples.assignment; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Iterator; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.WorkingMemory; import org.drools.compiler.PackageBuilder; import org.jbpm.context.exe.ContextInstance; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.identity.Group; import org.jbpm.identity.Membership; import org.jbpm.identity.User; import org.jbpm.identity.hibernate.IdentitySession; import org.jbpm.taskmgmt.def.AssignmentHandler; import org.jbpm.taskmgmt.exe.Assignable; public class RulesAssignmentHandler implements AssignmentHandler { protected String group; protected String ruleFile; protected List objectNames; private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(RulesAssignmentHandler.class); public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception { // load up the rule base RuleBase ruleBase = readRule(ruleFile); WorkingMemory workingMemory = ruleBase.newStatefulSession(); // load identity data IdentitySession identitySession = (IdentitySession) executionContext.getJbpmContext() .getServices() .getPersistenceService() .getCustomSession(IdentitySession.class); // users boolean debug = log.isDebugEnabled(); for (Iterator iter = identitySession.getUsers().iterator(); iter.hasNext();) { User user = (User) iter.next(); if (debug) log.debug("user: " + user.getName()); workingMemory.insert(user); } // group Group group = identitySession.getGroupByName(this.group); if (debug) log.debug("group: " + group.getName()); workingMemory.insert(group); // memberships for (Iterator iter = group.getMemberships().iterator(); iter.hasNext();) { Membership membership = (Membership) iter.next(); if (debug) log.debug("membership: " + membership.getName()); workingMemory.insert(membership); } // read variables ContextInstance ci = executionContext.getContextInstance(); for (Iterator iter = objectNames.iterator(); iter.hasNext();) { String objectName = (String) iter.next(); Object object = ci.getVariable(objectName); if (debug) log.debug("variable '" + objectName + "': " + object); workingMemory.insert(object); } // insert the assignable so that it may be used to set results if (debug) log.debug("assignable: " + assignable); workingMemory.insert(assignable); workingMemory.fireAllRules(); } /** * Please note that this is the "low level" rule assembly API. */ private static RuleBase readRule(String ruleFileName) throws Exception { InputStream resStream = RulesAssignmentHandler.class.getResourceAsStream(ruleFileName); if (resStream == null) { throw new IllegalStateException("Cannot obtain rules from: " + ruleFileName); } PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl(new InputStreamReader(resStream)); RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage(builder.getPackage()); return ruleBase; } }