package pl.net.bluesoft.awf.ext.droolsstep;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.model.*;
import pl.net.bluesoft.rnd.processtool.steps.ProcessToolProcessStep;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AliasName;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AutoWiredProperty;
import pl.net.bluesoft.util.lang.Strings;
import java.io.InputStream;
import java.util.*;
/**
* @author tlipski@bluesoft.net.pl
*/
@AliasName(name = "DroolsStep")
public class DroolsStep implements ProcessToolProcessStep {
@AutoWiredProperty
private String ruleUrl;
@AutoWiredProperty
private String bundleResource;
@Override
public String invoke(BpmStep step, Map<String, String> params) throws Exception {
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
DroolsUtils.DroolsResource resource;
if (Strings.hasText(bundleResource)) {
InputStream ruleStream = ctx.getRegistry().loadResource(bundleResource, ruleUrl);
String fullRuleUrl = bundleResource.replace(".", "/") + "/" + ruleUrl;
resource = new DroolsUtils.DroolsResource(fullRuleUrl, ruleStream);
}
else {
if (ruleUrl.startsWith("/")) {
ruleUrl = ctx.getSetting("drools.rules.baseurl") + ruleUrl;
}
resource = new DroolsUtils.DroolsResource(ruleUrl);
}
ProcessInstance processInstance = step.getProcessInstance();
List facts = new ArrayList();
facts.add(processInstance);
for (ProcessInstanceAttribute attr : processInstance.getProcessAttributes()) {
if (attr instanceof ProcessInstanceSimpleAttribute) {
facts.add(attr);
}
}
Map<String, Object> globals = new HashMap<String, Object>();
HashMap resultMap = new HashMap();
globals.put("result", resultMap);
DroolsUtils.processRules(facts, globals, resource);
String logEntryVal = (String) resultMap.get("logEntry");
if (logEntryVal != null) {
ProcessInstanceLog logEntry = new ProcessInstanceLog();
logEntry.setEntryDate(Calendar.getInstance());
logEntry.setLogType(ProcessInstanceLog.LOG_TYPE_INFO);
//logEntry.setLogType(LogType.INFO);
//TODO - process can be in a various states in that moment
// logEntry.setState(ctx.getProcessDefinitionDAO().getProcessStateConfiguration(step.getStateName()));
logEntry.setEventI18NKey(logEntryVal);
logEntry.setOwnProcessInstance(processInstance);
processInstance.getRootProcessInstance().addProcessLog(logEntry);
}
return (String) resultMap.get("value");
}
public String getRuleUrl() {
return ruleUrl;
}
public void setRuleUrl(String ruleUrl) {
this.ruleUrl = ruleUrl;
}
public String getBundleResource() {
return bundleResource;
}
public void setBundleResource(String bundleResource) {
this.bundleResource = bundleResource;
}
}