package ****.conditions; import static ****.KEY_DATA_MODEL; import static ****.KEY_XVARS; import ****.Constants; import ****.DataModel; import ****.RuleResult; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.StatefulSession; import org.drools.compiler.PackageBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.workflow.Condition; import com.opensymphony.workflow.WorkflowException; /** * A class used by osworkflow to evaluate a condition. * */ public class DroolsCondition implements Condition { private static final String RULE = "rule"; private static final String RULE_GROUP = "ruleGroup"; private static final Logger LOG = LoggerFactory.getLogger(Constants.VTPIE_LOGGER); private Map MPRULE = new HashMap(); @SuppressWarnings("unchecked") public boolean passesCondition(Map transientVars, Map args, PropertySet arg2) throws WorkflowException { LOG.trace("Drools start"); StatefulSession session = setupRule((String) args.get(RULE)); LOG.trace("Drools elaborating"); String ruleGroupName = (String) args.get(RULE_GROUP); RuleResult result = new RuleResult(); DataModel dm = (DataModel) transientVars.get(KEY_DATA_MODEL); session.insert(result); session.insert(dm); session.insert(transientVars.get(KEY_XVARS)); if (!"".equals(ruleGroupName) && ruleGroupName != null) session.getAgenda().activateRuleFlowGroup(ruleGroupName); session.fireAllRules(); session.dispose(); LOG.info("Drools Condition {}: {}", ruleGroupName, result.isVerified()); return result.isVerified(); } private StatefulSession setupRule(String ruleFile) throws WorkflowException { RuleBase ruleBase = MPRULE.get(ruleFile); if (ruleBase == null) { try { synchronized (MPRULE) { LOG.info("Drools builder Conditions : " + ruleFile); PackageBuilder builder = new PackageBuilder(); builder .addPackageFromDrl(new InputStreamReader(DroolsCondition.class .getResourceAsStream(ruleFile))); ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage(builder.getPackage()); MPRULE.put(ruleFile, ruleBase); } } catch (Exception e) { throw new WorkflowException(e); } } return ruleBase.newStatefulSession(); } }