refactoring and adding camel business proxy

This commit is contained in:
Nicolas Héron 2018-12-29 23:05:41 +01:00
commit a474dcf891
876 changed files with 1692 additions and 1038 deletions

View file

@ -0,0 +1,73 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime;
import com.google.common.base.Throwables;
import org.apache.commons.beanutils.BeanMap;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsFactObjectAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Bertrand Gressier
* @since 27 déc. 2011
*/
public class DroolsFactObjectFactory {
private static Logger logger = LoggerFactory.getLogger(DroolsFactObjectFactory.class);
protected DroolsFactObjectFactory() {
}
public static DroolsFactObject createFactObject(Object o) {
return createFactObject(o, 0);
}
public static DroolsFactObject createFactObject(Object o, int version) {
logger.debug(">> createFactObject", o, version);
DroolsFactObject createFactObject = null;
try {
if (o != null) {
createFactObject = new DroolsFactObject(o, version);
createFactObject.setFullClassName(o.getClass().getCanonicalName());
createFactObject.setHashCode(o.hashCode());
BeanMap m = new BeanMap(o);
for (Object para : m.keySet()) {
if (!para.toString().equals("class")) {
if (m.get(para) != null) {
DroolsFactObjectAttribute attribute = new DroolsFactObjectAttribute(para.toString(), m.get(para).toString(), m.get(para).getClass().getSimpleName());
createFactObject.getListfactObjectAttributes().add(attribute);
} else {
DroolsFactObjectAttribute attribute = new DroolsFactObjectAttribute(para.toString(), "null", "null");
createFactObject.getListfactObjectAttributes().add(attribute);
}
}
}
}
return createFactObject;
} catch (Exception e) {
logger.error("Not possible to introspect {} for reason {}", o, e);
throw Throwables.propagate(e);
} finally {
logger.debug("<< createFactObject", createFactObject);
}
}
}

View file

@ -0,0 +1,116 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime;
import org.chtijbug.drools.runtime.impl.RuleBaseCommandSingleton;
import org.chtijbug.drools.runtime.impl.RuleBaseSingleton;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.chtijbug.drools.runtime.resource.FileKnowledgeResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* @author nheron
*/
public abstract class RuleBaseBuilder {
/**
* Class Logger
*/
private static Logger logger = LoggerFactory.getLogger(RuleBaseBuilder.class);
public static RuleBasePackage createRemoteStandardRestBasePackage(String containerId, String url,String username,String password) throws DroolsChtijbugException {
logger.debug(">> createWorkbenchRuleBasePackage()");
RuleBaseCommandSingleton newRuleBasePackage = new RuleBaseCommandSingleton(RuleBaseSingleton.DEFAULT_RULE_THRESHOLD,containerId,url,username,password);
try {
newRuleBasePackage.connectKBase();
//_____ Returning the result
return newRuleBasePackage;
} finally {
logger.debug("<< createWorkbenchRuleBasePackage", newRuleBasePackage);
}
}
public static RuleBasePackage createWorkbenchRuleBasePackage(Long ruleBaseId, HistoryListener historyListener, String groupId, String artifactId, String version, String workbenchUrl, String username, String password) throws DroolsChtijbugException {
logger.debug(">> createWorkbenchRuleBasePackage()");
RuleBaseSingleton newRuleBasePackage = new RuleBaseSingleton(ruleBaseId, RuleBaseSingleton.DEFAULT_RULE_THRESHOLD, historyListener, groupId, artifactId, version);
try {
newRuleBasePackage.createKBase(workbenchUrl, username, password);
//_____ Returning the result
return newRuleBasePackage;
} finally {
logger.debug("<< createWorkbenchRuleBasePackage", newRuleBasePackage);
}
}
public static RuleBasePackage createRuleBasePackage(Long ruleBaseId, String modulePackage, String moduleName, String version, String... files) throws DroolsChtijbugException {
return RuleBaseBuilder.createRuleBasePackage(ruleBaseId, null, modulePackage, moduleName, version, files);
}
public static RuleBasePackage createRuleBasePackage(Long ruleBaseId, HistoryListener historyListener, String groupId, String artifactId, String version, String... files) throws DroolsChtijbugException {
logger.debug(">>createRuleBasePackage");
List<FileKnowledgeResource> fileKnowledgeResources = new ArrayList<>();
for (String s : files) {
if (s.contains("bpmn2")) {
FileKnowledgeResource fileKnowledgeResource = FileKnowledgeResource.createBPMN2ClassPathResource(s);
fileKnowledgeResources.add(fileKnowledgeResource);
} else {
FileKnowledgeResource fileKnowledgeResource = FileKnowledgeResource.createDRLClassPathResource(s);
fileKnowledgeResources.add(fileKnowledgeResource);
}
}
RuleBaseSingleton ruleBasePackage = new RuleBaseSingleton(ruleBaseId, RuleBaseSingleton.DEFAULT_RULE_THRESHOLD, historyListener, artifactId, groupId, version);
try {
ruleBasePackage.createKBase(fileKnowledgeResources);
//_____ Returning the result
return ruleBasePackage;
} finally {
logger.debug("<<createRuleBasePackage", ruleBasePackage);
}
}
public static RuleBasePackage createRuleBasePackage(Long ruleBaseId, HistoryListener historyListener, ClassLoader... classLoader) throws DroolsChtijbugException {
logger.debug(">>createRuleBasePackage");
RuleBaseSingleton ruleBasePackage = new RuleBaseSingleton(ruleBaseId, RuleBaseSingleton.DEFAULT_RULE_THRESHOLD, historyListener);
try {
ruleBasePackage.createKBase(classLoader);
//_____ Returning the result
return ruleBasePackage;
} finally {
logger.debug("<<createRuleBasePackage", ruleBasePackage);
}
}
public static RuleBasePackage createRuleBasePackage(String rulebaseName, HistoryListener historyListener, ClassLoader... classLoader) throws DroolsChtijbugException {
logger.debug(">>createRuleBasePackage");
RuleBaseSingleton ruleBasePackage = new RuleBaseSingleton(rulebaseName, RuleBaseSingleton.DEFAULT_RULE_THRESHOLD, historyListener);
try {
ruleBasePackage.createKBase(classLoader);
//_____ Returning the result
return ruleBasePackage;
} finally {
logger.debug("<<createRuleBasePackage", ruleBasePackage);
}
}
}

View file

@ -0,0 +1,42 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime;
import org.chtijbug.drools.runtime.listener.HistoryListener;
/**
* @author nheron
*/
public interface RuleBasePackage {
RuleBaseSession createRuleBaseSession() throws DroolsChtijbugException;
RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute) throws DroolsChtijbugException;
RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute, HistoryListener sessionHistoryListener) throws DroolsChtijbugException;
RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute, HistoryListener sessionHistoryListener, String sessionName) throws DroolsChtijbugException;
void loadKBase(String version) throws DroolsChtijbugException;
HistoryListener getHistoryListener();
Long getRuleBaseID();
void dispose();
}

View file

@ -0,0 +1,101 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsRuleObject;
import org.chtijbug.drools.entity.history.HistoryContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.ObjectFilter;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItemHandler;
import java.util.Collection;
import java.util.Map;
/**
* @author nheron
*/
public interface RuleBaseSession {
/**
* This method injects the newObject parameter into this session.
* No deep insertion(using relfection) is done
*
* @param newObject - object to insert into this session
*/
public void insertObject(Object newObject);
/**
* This method injects the newObject parameter into this session.
* No deep insertion(using relfection) is done
*
* @param newObject - object to insert into this session. all nested objects will be also inserted
* @throws org.chtijbug.drools.runtime.DroolsChtijbugException
*/
public void insertByReflection(Object newObject) throws DroolsChtijbugException;
/**
* This method helps for introducing a global object into the RuleBaseSession
*
* @param identifier - the key of the global variable to inject
* @param value - the value of the global variable to inject
*/
void setGlobal(String identifier, Object value);
void updateObject(Object updatedObject);
void retractObject(Object oldObject);
void fireAllRules() throws DroolsChtijbugException;
Object fireAllRulesAndStartProcess(Object inputObject, String processName) throws DroolsChtijbugException;
Object fireAllRulesAndStartProcessWithParam(Object inputObject, String processName) throws DroolsChtijbugException;
void startProcess(String processName);
void dispose();
HistoryContainer getHistoryContainer();
String getHistoryContainerXML();
Collection<DroolsFactObject> listLastVersionObjects();
String listLastVersionObjectsXML();
Collection<DroolsRuleObject> listRules();
int getNumberRulesExecuted();
Long getSessionId();
Long getRuleBaseID();
KieSession getKnowledgeSession();
Collection<? extends Object> getObjects(ObjectFilter objectFilter);
void completeWorkItem(long processId, Map<String, Object> vars);
void abortWorkItem(long processId);
void registerWorkItemHandler(String workItemName, WorkItemHandler workItemHandler);
ProcessInstance startProcess(String processName, Map<String, Object> vars);
}

View file

@ -0,0 +1,98 @@
package org.chtijbug.drools.runtime;
import org.chtijbug.drools.logging.*;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nheron on 11/06/15.
*/
public class SessionContext {
private SessionExecution sessionExecution;
private ProcessExecution processExecution;
private List<RuleflowGroup> ruleflowGroups = new ArrayList<>();
private RuleExecution ruleExecution;
private FireAllRulesExecution fireAllRulesExecution;
private Fact fact;
public SessionExecution getSessionExecution() {
return sessionExecution;
}
public void setSessionExecution(SessionExecution sessionExecution) {
this.sessionExecution = sessionExecution;
}
public ProcessExecution getProcessExecution() {
return processExecution;
}
public void setProcessExecution(ProcessExecution processExecution) {
this.processExecution = processExecution;
}
public List<RuleflowGroup> getRuleflowGroups() {
return ruleflowGroups;
}
public void setRuleflowGroups(List<RuleflowGroup> ruleflowGroups) {
this.ruleflowGroups = ruleflowGroups;
}
public RuleflowGroup findRuleFlowGroup(String name) {
RuleflowGroup result = null;
for (RuleflowGroup r : ruleflowGroups) {
if (r.getRuleflowGroup() != null && r.getRuleflowGroup().equals(name)) {
result = r;
}
}
return result;
}
public RuleExecution getRuleExecution() {
return ruleExecution;
}
public void setRuleExecution(RuleExecution ruleExecution) {
this.ruleExecution = ruleExecution;
}
public Fact getFact() {
return fact;
}
public void setFact(Fact fact) {
this.fact = fact;
}
public FireAllRulesExecution getFireAllRulesExecution() {
return fireAllRulesExecution;
}
public void setFireAllRulesExecution(FireAllRulesExecution fireAllRulesExecution) {
this.fireAllRulesExecution = fireAllRulesExecution;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("SessionContext{");
sb.append("sessionExecution=").append(sessionExecution);
sb.append(", processExecution=").append(processExecution);
sb.append(", ruleExecution=").append(ruleExecution);
sb.append(", fireAllRulesExecution=").append(fireAllRulesExecution);
sb.append(", fact=").append(fact);
sb.append('}');
return sb.toString();
}
}

View file

@ -0,0 +1,124 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.history.fact.DeletedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.FactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.InsertedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.UpdatedFactHistoryEvent;
import org.chtijbug.drools.runtime.DroolsFactObjectFactory;
import org.drools.core.definitions.rule.impl.RuleImpl;
import org.drools.core.event.rule.impl.RuleRuntimeEventImpl;
import org.drools.core.spi.PropagationContext;
import org.kie.api.event.rule.ObjectDeletedEvent;
import org.kie.api.event.rule.ObjectInsertedEvent;
import org.kie.api.event.rule.ObjectUpdatedEvent;
import org.kie.api.event.rule.RuleRuntimeEventListener;
import org.kie.api.runtime.rule.FactHandle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FactHandlerListener implements RuleRuntimeEventListener {
private static Logger logger = LoggerFactory.getLogger(FactHandlerListener.class);
private final RuleBaseStatefulSession ruleBaseSession;
public FactHandlerListener(RuleBaseStatefulSession ruleBaseSession) {
this.ruleBaseSession = ruleBaseSession;
}
@Override
public void objectInserted(ObjectInsertedEvent event) {
logger.debug(">>objectInserted", event);
try {
//____ Updating reference into the facts map from knowledge Session
//((RuleTerminalNode)((RuleTerminalNodeLeftTuple)((org.drools.common.DefaultFactHandle)event.getFactHandle()).getFirstLeftTuple()).getSink()).getRule().getRuleFlowGroup()
FactHandle f = event.getFactHandle();
Object newObject = event.getObject();
DroolsFactObject ff = DroolsFactObjectFactory.createFactObject(newObject);
ruleBaseSession.setData(f, newObject, ff);
//____ Adding the Insert Event from the History Container
InsertedFactHistoryEvent insertFactHistoryEvent = new InsertedFactHistoryEvent(this.ruleBaseSession.nextEventId(), ff, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
if (insertFactHistoryEvent.getRuleName() == null && event instanceof RuleRuntimeEventImpl) {
PropagationContext propagationContext = ((RuleRuntimeEventImpl) event).getPropagationContext();
this.updateRuleDetailFromPropagationContext(propagationContext, insertFactHistoryEvent);
}
this.ruleBaseSession.addHistoryElement(insertFactHistoryEvent);
} finally
{
logger.debug("<<objectInserted");
}
}
@Override
public void objectUpdated(ObjectUpdatedEvent event) {
logger.debug(">>objectUpdated", event);
try {
//____ Updating FactHandle Object reference from the knwoledge session
FactHandle f = event.getFactHandle();
Object oldValue = event.getOldObject();
Object newValue = event.getObject();
DroolsFactObject factOldValue = this.ruleBaseSession.getLastFactObjectVersion(oldValue);
DroolsFactObject factNewValue = DroolsFactObjectFactory.createFactObject(newValue, factOldValue.getNextObjectVersion());
ruleBaseSession.setData(f, newValue, factNewValue);
//____ Adding the Update Event from the History Container
UpdatedFactHistoryEvent updatedFactHistoryEvent = new UpdatedFactHistoryEvent(this.ruleBaseSession.nextEventId(), factOldValue, factNewValue, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
if (updatedFactHistoryEvent.getRuleName() == null && event instanceof RuleRuntimeEventImpl) {
PropagationContext propagationContext = ((RuleRuntimeEventImpl) event).getPropagationContext();
this.updateRuleDetailFromPropagationContext(propagationContext, updatedFactHistoryEvent);
}
this.ruleBaseSession.addHistoryElement(updatedFactHistoryEvent);
} finally {
logger.debug("<<objectUpdated");
}
}
@Override
public void objectDeleted(ObjectDeletedEvent event) {
logger.debug(">>objectRetracted", event);
try {
//____ Removing FactHandle from the KnowledgeBase
FactHandle f = event.getFactHandle();
Object newObject = event.getOldObject();
DroolsFactObject deletedFact = this.ruleBaseSession.getLastFactObjectVersion(newObject);
ruleBaseSession.unsetData(f, newObject);
//____ Adding a Delete Event from the HistoryContainer
DeletedFactHistoryEvent deleteFactEvent = new DeletedFactHistoryEvent(this.ruleBaseSession.nextEventId(), deletedFact, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
if (event instanceof RuleRuntimeEventImpl) {
PropagationContext propagationContext = ((RuleRuntimeEventImpl) event).getPropagationContext();
this.updateRuleDetailFromPropagationContext(propagationContext, deleteFactEvent);
this.ruleBaseSession.addHistoryElement(deleteFactEvent);
}
} finally {
logger.debug("<<objectRetracted");
}
}
private void updateRuleDetailFromPropagationContext(PropagationContext propagationContext, FactHistoryEvent historyEvent) {
if (propagationContext.getRuleOrigin() instanceof RuleImpl) {
RuleImpl ruleOrigin = (RuleImpl) propagationContext.getRuleOrigin();
historyEvent.setRuleName(ruleOrigin.getName());
historyEvent.setRulePackageName(ruleOrigin.getPackageName());
historyEvent.setRuleflowGroup(ruleOrigin.getRuleFlowGroup());
}
}
}

View file

@ -0,0 +1,21 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.impl;
public enum JavaDialect {
ECLIPSE, JANINO
}

View file

@ -0,0 +1,187 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.DroolsJbpmVariableObject;
import org.chtijbug.drools.entity.DroolsNodeInstanceObject;
import org.chtijbug.drools.entity.DroolsProcessInstanceObject;
import org.chtijbug.drools.entity.DroolsProcessObject;
import org.chtijbug.drools.entity.history.process.*;
import org.kie.api.event.process.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author nheron
*/
public class ProcessHandlerListener implements ProcessEventListener {
/**
* Class logger
*/
private static Logger logger = LoggerFactory.getLogger(ProcessHandlerListener.class);
/**
* The knowledge session sending event
*/
private final RuleBaseStatefulSession ruleBaseSession;
public ProcessHandlerListener(RuleBaseStatefulSession ruleBaseSession) {
this.ruleBaseSession = ruleBaseSession;
}
@Override
public void beforeProcessStarted(ProcessStartedEvent event) {
logger.debug(">>beforeProcessStarted", event);
try {
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
BeforeProcessStartHistoryEvent beforeProcessStart = new BeforeProcessStartHistoryEvent(this.ruleBaseSession.nextEventId(), droolsProcessInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(beforeProcessStart);
} finally {
logger.debug("<<beforeProcessStarted");
}
}
@Override
public void afterProcessStarted(ProcessStartedEvent event) {
logger.debug(">>afterProcessStarted", event);
try {
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
AfterProcessStartHistoryEvent afterProcessStart = new AfterProcessStartHistoryEvent(this.ruleBaseSession.nextEventId(), droolsProcessInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(afterProcessStart);
} finally {
logger.debug("<<afterProcessStarted");
}
}
@Override
public void beforeProcessCompleted(ProcessCompletedEvent event) {
logger.debug(">>beforeProcessCompleted", event);
try {
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
BeforeProcessEndHistoryEvent beforeProcessEndHistoryEvent = new BeforeProcessEndHistoryEvent(this.ruleBaseSession.nextEventId(), droolsProcessInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(beforeProcessEndHistoryEvent);
} finally {
logger.debug("<<beforeProcessCompleted");
}
}
@Override
public void afterProcessCompleted(ProcessCompletedEvent event) {
logger.debug(">>afterProcessCompleted", event);
try {
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
AfterProcessEndHistoryEvent AfterProcessStart = new AfterProcessEndHistoryEvent(this.ruleBaseSession.nextEventId(), droolsProcessInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(AfterProcessStart);
} finally {
logger.debug("<<afterProcessCompleted");
}
}
@Override
public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
logger.debug(">>beforeNodeTriggered", event);
try {
DroolsNodeInstanceObject droolsNodeInstanceObject = ruleBaseSession.getDroolsNodeInstanceObject(event.getNodeInstance());
BeforeNodeInstanceTriggeredHistoryEvent beforeNodeInstanceTriggeredHistoryEvent = new BeforeNodeInstanceTriggeredHistoryEvent(this.ruleBaseSession.nextEventId(), droolsNodeInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
beforeNodeInstanceTriggeredHistoryEvent.setProcessInstance(droolsProcessInstanceObject);
ruleBaseSession.addHistoryElement(beforeNodeInstanceTriggeredHistoryEvent);
} finally {
logger.debug("<<beforeNodeTriggered");
}
}
@Override
public void afterNodeTriggered(ProcessNodeTriggeredEvent event) {
logger.debug(">>afterNodeTriggered", event);
try {
DroolsNodeInstanceObject droolsNodeInstanceObject = ruleBaseSession.getDroolsNodeInstanceObject(event.getNodeInstance());
AfterNodeInstanceTriggeredHistoryEvent afterNodeInstanceTriggeredHistoryEvent = new AfterNodeInstanceTriggeredHistoryEvent(this.ruleBaseSession.nextEventId(), droolsNodeInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
afterNodeInstanceTriggeredHistoryEvent.setProcessInstance(droolsProcessInstanceObject);
ruleBaseSession.addHistoryElement(afterNodeInstanceTriggeredHistoryEvent);
} finally {
logger.debug("<<afterNodeTriggered");
}
}
@Override
public void beforeNodeLeft(ProcessNodeLeftEvent event) {
logger.debug(">>beforeNodeLeft", event);
try {
DroolsNodeInstanceObject droolsNodeInstanceObject = ruleBaseSession.getDroolsNodeInstanceObject(event.getNodeInstance());
BeforeNodeLeftHistoryEvent afterHistoryEvent = new BeforeNodeLeftHistoryEvent(this.ruleBaseSession.nextEventId(), droolsNodeInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
afterHistoryEvent.setProcessInstance(droolsProcessInstanceObject);
ruleBaseSession.addHistoryElement(afterHistoryEvent);
} finally {
logger.debug("<<beforeNodeLeft");
}
}
@Override
public void afterNodeLeft(ProcessNodeLeftEvent event) {
logger.debug(">>afterNodeLeft", event);
try {
DroolsNodeInstanceObject droolsNodeInstanceObject = ruleBaseSession.getDroolsNodeInstanceObject(event.getNodeInstance());
AfterNodeLeftHistoryEvent afterHistoryEvent = new AfterNodeLeftHistoryEvent(this.ruleBaseSession.nextEventId(), droolsNodeInstanceObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
afterHistoryEvent.setProcessInstance(droolsProcessInstanceObject);
ruleBaseSession.addHistoryElement(afterHistoryEvent);
} finally {
logger.debug("<<afterNodeLeft");
}
}
@Override
public void beforeVariableChanged(ProcessVariableChangedEvent event) {
logger.debug(">>beforeVariableChanged", event);
try {
DroolsJbpmVariableObject oldValue = new DroolsJbpmVariableObject(event.getVariableId(), event.getVariableInstanceId(), event.getOldValue());
DroolsProcessObject droolsProcessObject = new DroolsProcessObject(String.valueOf(event.getProcessInstance().getId()), event.getProcessInstance().getProcessName(), event.getProcessInstance().getProcess().getPackageName(), event.getProcessInstance().getProcess().getType(), event.getProcessInstance().getProcess().getVersion());
BeforeVariableChangeChangedHistoryEvent beforeVariableChangeChangedHistoryEvent = new BeforeVariableChangeChangedHistoryEvent(this.ruleBaseSession.nextEventId(), droolsProcessObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId(), oldValue);
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
beforeVariableChangeChangedHistoryEvent.setProcessInstance(droolsProcessInstanceObject);
ruleBaseSession.addHistoryElement(beforeVariableChangeChangedHistoryEvent);
} finally {
logger.debug("<<beforeVariableChanged");
}
}
@Override
public void afterVariableChanged(ProcessVariableChangedEvent event) {
logger.debug(">>afterVariableChanged", event);
try {
DroolsJbpmVariableObject oldValue = new DroolsJbpmVariableObject(event.getVariableId(), event.getVariableInstanceId(), event.getOldValue());
DroolsJbpmVariableObject newValue = new DroolsJbpmVariableObject(event.getVariableId(), event.getVariableInstanceId(), event.getNewValue());
DroolsProcessObject droolsProcessObject = new DroolsProcessObject(String.valueOf(event.getProcessInstance().getId()), event.getProcessInstance().getProcessName(), event.getProcessInstance().getProcess().getPackageName(), event.getProcessInstance().getProcess().getType(), event.getProcessInstance().getProcess().getVersion());
AfterVariableChangeChangedHistoryEvent afterVariableChangeChangedHistoryEvent = new AfterVariableChangeChangedHistoryEvent(this.ruleBaseSession.nextEventId(), droolsProcessObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId(), oldValue, newValue);
DroolsProcessInstanceObject droolsProcessInstanceObject = ruleBaseSession.getDroolsProcessInstanceObject(event.getProcessInstance());
afterVariableChangeChangedHistoryEvent.setProcessInstance(droolsProcessInstanceObject);
ruleBaseSession.addHistoryElement(afterVariableChangeChangedHistoryEvent);
} finally {
logger.debug("<<afterVariableChanged");
}
}
}

View file

@ -0,0 +1,221 @@
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.common.reflection.ReflectionUtils;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsRuleObject;
import org.chtijbug.drools.entity.history.HistoryContainer;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.kie.api.KieServices;
import org.kie.api.command.BatchExecutionCommand;
import org.kie.api.command.Command;
import org.kie.api.command.KieCommands;
import org.kie.api.runtime.ExecutionResults;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.ObjectFilter;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.client.KieServicesClient;
import org.kie.server.client.RuleServicesClient;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Created by nheron on 07/06/2016.
*/
public class RuleBaseCommandSession implements RuleBaseSession {
private List<Command<?>> commands = new ArrayList<Command<?>>();
private KieCommands commandsFactory = KieServices.Factory.get().getCommands();
private int maxNumberRuleToExecute = 2000;
private KieServicesClient kieServicesClient;
private String containerId;
public RuleBaseCommandSession(int maxNumberRuleToExecute,KieServicesClient kieServicesClient,String containerId) {
this.maxNumberRuleToExecute = maxNumberRuleToExecute;
this.kieServicesClient=kieServicesClient;
this.containerId = containerId;
}
@Override
public void insertObject(Object newObject) {
commands.add(commandsFactory.newInsert(newObject, newObject.toString()));
}
@Override
public void insertByReflection(Object newObject) throws DroolsChtijbugException {
if (newObject.getClass().getPackage().getName().startsWith("java.")) {
return;
}
//____ Then foreach getters insert item by reflection
for (Method method : newObject.getClass().getMethods()) {
//____ only manage getters
if (!ReflectionUtils.IsGetter(method)) {
continue;
}
Object getterValue;
try {
getterValue = method.invoke(newObject, (Object[]) null);
} catch (Exception e) {
throw new DroolsChtijbugException(DroolsChtijbugException.insertByReflection, "getterValue = method.invoke(newObject, (Object[]) null);", e);
}
if (getterValue == null)
continue;
//____ If returned value is not a collection, insert it in the ksession
if (!(getterValue instanceof Iterable)) {
this.insertByReflection(getterValue);
} else {
Iterable<?> iterable = (Iterable) getterValue;
for (Object item : iterable) {
this.insertByReflection(item);
}
}
}
this.insertObject(newObject);
}
@Override
public void setGlobal(String identifier, Object value) {
commands.add(commandsFactory.newSetGlobal(identifier, value));
}
@Override
public void updateObject(Object updatedObject) {
// Not Possible
}
@Override
public void retractObject(Object oldObject) {
// Not Possible
}
@Override
public void fireAllRules() throws DroolsChtijbugException {
commands.add(commandsFactory.newFireAllRules(maxNumberRuleToExecute));
}
@Override
public Object fireAllRulesAndStartProcess(Object inputObject, String processName) throws DroolsChtijbugException {
Object outputObject=null;
if (inputObject != null) {
//this.insertObject(inputObject);
this.insertByReflection(inputObject);
}
if (processName != null && processName.length() > 0) {
this.startProcess(processName);
}
this.fireAllRules();
commands.add(commandsFactory.newGetObjects(inputObject.getClass().getName()));
RuleServicesClient ruleClient = kieServicesClient.getServicesClient(RuleServicesClient.class);
BatchExecutionCommand batchCommand = commandsFactory.newBatchExecution(commands);
ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(this.containerId, batchCommand);
if (response.equals(ServiceResponse.ResponseType.SUCCESS)){
ExecutionResults actualData = response.getResult();
Collection<String> identifiers = actualData.getIdentifiers();
for (String id : identifiers){
outputObject=actualData.getValue(id);
}
}
return outputObject;
}
@Override
public Object fireAllRulesAndStartProcessWithParam(Object inputObject, String processName) throws DroolsChtijbugException {
//commands.add(commandsFactory.newFireAllRules(maxNumberRuleToExecute));
return this.fireAllRulesAndStartProcess(inputObject,processName);
}
@Override
public void startProcess(String processName) {
commands.add(commandsFactory.newStartProcess(processName));
}
@Override
public void dispose() {
}
@Override
public HistoryContainer getHistoryContainer() {
return null;
}
@Override
public String getHistoryContainerXML() {
return null;
}
@Override
public Collection<DroolsFactObject> listLastVersionObjects() {
return null;
}
@Override
public String listLastVersionObjectsXML() {
return null;
}
@Override
public Collection<DroolsRuleObject> listRules() {
return null;
}
@Override
public int getNumberRulesExecuted() {
return 0;
}
@Override
public Long getSessionId() {
return null;
}
@Override
public Long getRuleBaseID() {
return null;
}
@Override
public KieSession getKnowledgeSession() {
return null;
}
@Override
public Collection<? extends Object> getObjects(ObjectFilter objectFilter) {
return null;
}
@Override
public void completeWorkItem(long processId, Map<String, Object> vars) {
commands.add(commandsFactory.newCompleteWorkItem(processId, vars));
}
@Override
public void abortWorkItem(long processId) {
commands.add(commandsFactory.newAbortWorkItem(processId));
}
@Override
public void registerWorkItemHandler(String workItemName, WorkItemHandler workItemHandler) {
commands.add(commandsFactory.newRegisterWorkItemHandlerCommand(workItemHandler, workItemName));
}
@Override
public ProcessInstance startProcess(String processName, Map<String, Object> vars) {
commands.add(commandsFactory.newStartProcess(processName, vars));
return null;
}
public List<Command<?>> getCommands() {
return commands;
}
}

View file

@ -0,0 +1,127 @@
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.history.EventCounter;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.client.KieServicesClient;
import org.kie.server.client.KieServicesConfiguration;
import org.kie.server.client.KieServicesFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Semaphore;
/**
* Created by nheron on 07/06/2016.
*/
public class RuleBaseCommandSingleton implements RuleBasePackage {
/**
* default rule threshold
*/
public static int DEFAULT_RULE_THRESHOLD = 2000;
/**
* Class Logger
*/
private static Logger logger = LoggerFactory.getLogger(RuleBaseCommandSingleton.class);
/**
* unique ID of the RuleBase in the JVM
*/
protected EventCounter eventCounter = EventCounter.newCounter();
protected EventCounter sessionCounter = EventCounter.newCounter();
private int maxNumberRuleToExecute = DEFAULT_RULE_THRESHOLD;
/**
* Semaphore used to void concurrent access to the singleton
*/
private Semaphore lockKbase = new Semaphore(1);
/**
* History Listener
*/
private String containerId;
private String url;
private String username;
private String password;
private KieServicesClient kieServicesClient;
public RuleBaseCommandSingleton(int maxNumberRuleToExecute) {
this.maxNumberRuleToExecute = maxNumberRuleToExecute;
}
public RuleBaseCommandSingleton(int defaultRuleThreshold, String containerId,String url, String username, String password) {
this(defaultRuleThreshold);
this.containerId=containerId;
this.url=url;
this.username=username;
this.password=password;
}
@Override
public RuleBaseSession createRuleBaseSession() throws DroolsChtijbugException {
logger.debug(">>createRuleBaseSession");
try {
//____ Creating new Rule Base Session using default rule threshold
return this.createRuleBaseSession(this.maxNumberRuleToExecute);
} finally {
logger.debug("<<createRuleBaseSession");
}
}
@Override
public RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute) throws DroolsChtijbugException {
return this.createRuleBaseSession(maxNumberRulesToExecute, null);
}
@Override
public RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute, HistoryListener sessionHistoryListener) throws DroolsChtijbugException {
logger.debug(">>createRuleBaseSession", maxNumberRulesToExecute);
RuleBaseSession newRuleBaseSession = null;
try {
//_____ Wrapping the knowledge Session
newRuleBaseSession = new RuleBaseCommandSession(maxNumberRulesToExecute,this.kieServicesClient,this.containerId);
//_____ Release semaphore
lockKbase.release();
return newRuleBaseSession;
} finally {
logger.debug("<<createRuleBaseSession", newRuleBaseSession);
}
}
@Override
public RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute, HistoryListener sessionHistoryListener, String sessionName) throws DroolsChtijbugException {
return this.createRuleBaseSession(maxNumberRulesToExecute, sessionHistoryListener);
}
@Override
public void loadKBase(String version) throws DroolsChtijbugException {
//
}
@Override
public HistoryListener getHistoryListener() {
return null;
}
@Override
public Long getRuleBaseID() {
return null;
}
@Override
public void dispose() {
}
public void connectKBase() {
KieServicesConfiguration config;
config = KieServicesFactory.newRestConfiguration(url, username, password);
MarshallingFormat marshallingFormat = MarshallingFormat.XSTREAM;
config.setMarshallingFormat(marshallingFormat);
this.kieServicesClient = KieServicesFactory.newKieServicesClient(config);
}
}

View file

@ -0,0 +1,332 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.history.EventCounter;
import org.chtijbug.drools.entity.history.knowledge.*;
import org.chtijbug.drools.kieserver.extension.KieServerAddOnElement;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.chtijbug.drools.runtime.resource.FileKnowledgeResource;
import org.chtijbug.drools.runtime.resource.KnowledgeModule;
import org.chtijbug.drools.runtime.resource.WorkbenchClient;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Semaphore;
import static com.google.common.base.Throwables.propagate;
/**
* @author Bertrand Gressier
*/
public class RuleBaseSingleton implements RuleBasePackage {
/**
* default rule threshold
*/
public static int DEFAULT_RULE_THRESHOLD = 2000;
/**
* Class Logger
*/
private static Logger logger = LoggerFactory.getLogger(RuleBaseSingleton.class);
/**
* unique ID of the RuleBase in the JVM
*/
protected EventCounter eventCounter = EventCounter.newCounter();
protected EventCounter sessionCounter = EventCounter.newCounter();
/**
* Rule Base ID
*/
private String ruleBaseName;
private Long ruleBaseID;
private KieContainer kieContainer;
private ReleaseId releaseId;
private String groupId;
private String artifactId;
private String version;
private KnowledgeModule knowledgeModule;
/**
* Max rule to be fired threshold.
*/
private int maxNumberRuleToExecute = DEFAULT_RULE_THRESHOLD;
/**
* Semaphore used to void concurrent access to the singleton
*/
private Semaphore lockKbase = new Semaphore(1);
/**
* History Listener
*/
private HistoryListener historyListener = null;
/**
* Global Maps
*/
Map<String, Object> globals = new HashMap<>();
/**
* extensions Points
*/
private KieServerAddOnElement kieServerAddOnElement = null;
/**
* @param kieContainer
* @param maxNumberRulesToExecute
*/
public RuleBaseSingleton(KieContainer kieContainer, int maxNumberRulesToExecute) {
this.kieContainer = kieContainer;
this.maxNumberRuleToExecute = maxNumberRulesToExecute;
}
public RuleBaseSingleton(KieContainer kieContainer, int maxNumberRulesToExecute, KieServerAddOnElement kieServerAddOnElement) {
this.kieServerAddOnElement = kieServerAddOnElement;
this.kieContainer = kieContainer;
this.maxNumberRuleToExecute = maxNumberRulesToExecute;
}
public RuleBaseSingleton(KieContainer kieContainer, int maxNumberRulesToExecute, HistoryListener historyListener) {
this.kieContainer = kieContainer;
this.maxNumberRuleToExecute = maxNumberRulesToExecute;
this.historyListener = historyListener;
}
public RuleBaseSingleton(Long ruleBaseID, int maxNumberRulesToExecute, HistoryListener historyListener, String groupId, String artifactId, String version) throws DroolsChtijbugException {
this.ruleBaseID = ruleBaseID;
this.maxNumberRuleToExecute = maxNumberRulesToExecute;
this.historyListener = historyListener;
if (this.historyListener != null) {
KnowledgeBaseCreatedEvent knowledgeBaseCreatedEvent = new KnowledgeBaseCreatedEvent(eventCounter.next(), new Date(), ruleBaseID);
this.historyListener.fireEvent(knowledgeBaseCreatedEvent);
}
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.knowledgeModule = new KnowledgeModule(this.ruleBaseID, this.historyListener, groupId, artifactId, version, eventCounter);
}
public RuleBaseSingleton(String ruleBaseName, int maxNumberRulesToExecute, HistoryListener historyListener) throws DroolsChtijbugException {
this.ruleBaseName = ruleBaseName;
this.maxNumberRuleToExecute = maxNumberRulesToExecute;
this.historyListener = historyListener;
if (this.historyListener != null) {
KnowledgeBaseCreatedEvent knowledgeBaseCreatedEvent = new KnowledgeBaseCreatedEvent(eventCounter.next(), new Date(), ruleBaseID);
this.historyListener.fireEvent(knowledgeBaseCreatedEvent);
}
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.knowledgeModule = new KnowledgeModule(this.ruleBaseName, this.historyListener, eventCounter);
}
public RuleBaseSingleton(Long ruleBaseID, int maxNumberRulesToExecute, HistoryListener historyListener) throws DroolsChtijbugException {
this.ruleBaseID = ruleBaseID;
this.maxNumberRuleToExecute = maxNumberRulesToExecute;
this.historyListener = historyListener;
if (this.historyListener != null) {
KnowledgeBaseCreatedEvent knowledgeBaseCreatedEvent = new KnowledgeBaseCreatedEvent(eventCounter.next(), new Date(), ruleBaseID);
this.historyListener.fireEvent(knowledgeBaseCreatedEvent);
}
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.knowledgeModule = new KnowledgeModule(this.ruleBaseID, this.historyListener, eventCounter);
}
@Override
public RuleBaseSession createRuleBaseSession() throws DroolsChtijbugException {
logger.debug(">>createRuleBaseSession");
try {
//____ Creating new Rule Base Session using default rule threshold
return this.createRuleBaseSession(this.maxNumberRuleToExecute);
} finally {
logger.debug("<<createRuleBaseSession");
}
}
@Override
public RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute) throws DroolsChtijbugException {
return this.createRuleBaseSession(maxNumberRulesToExecute, this.historyListener);
}
@Override
public RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute, HistoryListener sessionHistoryListener) throws DroolsChtijbugException {
return this.createRuleBaseSession(maxNumberRulesToExecute, sessionHistoryListener, null);
}
@Override
public RuleBaseSession createRuleBaseSession(int maxNumberRulesToExecute, HistoryListener sessionHistoryListener, String sessionName) throws DroolsChtijbugException {
logger.debug(">>createRuleBaseSession", maxNumberRulesToExecute);
RuleBaseSession newRuleBaseSession = null;
try {
if (kieContainer != null) {
//____ Acquire semaphore
try {
lockKbase.acquire();
} catch (Exception e) {
throw new DroolsChtijbugException(DroolsChtijbugException.KbaseAcquire, "", e);
}
//_____ Now we can create a new stateful session using KnowledgeBase
//_____ Now we can create a new stateful session using KnowledgeBase
KieSession newDroolsSession = null;
if (sessionName == null) {
if (ruleBaseName != null && ruleBaseName.length() > 0) {
newDroolsSession = this.kieContainer.getKieBase(ruleBaseName).newKieSession();
} else {
newDroolsSession = this.kieContainer.getKieBase().newKieSession();
}
} else {
newDroolsSession = this.kieContainer.newKieSession(sessionName);
}
for (String globalVariableName : globals.keySet()) {
if (globals.get(globalVariableName) != null) {
newDroolsSession.setGlobal(globalVariableName, globals.get(globalVariableName));
}
}
Long sessionId = this.sessionCounter.next();
if (sessionHistoryListener != null) {
KnowledgeBaseCreateSessionEvent knowledgeBaseCreateSessionEvent = new KnowledgeBaseCreateSessionEvent(eventCounter.next(), new Date(), this.ruleBaseID);
knowledgeBaseCreateSessionEvent.setSessionId(sessionId);
sessionHistoryListener.fireEvent(knowledgeBaseCreateSessionEvent);
}
//_____ Wrapping the knowledge Session
newRuleBaseSession = new RuleBaseStatefulSession(this.ruleBaseID, sessionId, newDroolsSession, maxNumberRulesToExecute, sessionHistoryListener);
//_____ Release semaphore
lockKbase.release();
} else {
throw new DroolsChtijbugException(DroolsChtijbugException.KbaseNotInitialised, "", null);
}
//____ return the wrapped KnowledgeSession
return newRuleBaseSession;
} finally {
logger.debug("<<createRuleBaseSession", newRuleBaseSession);
}
}
public synchronized void createKBase(String workbenchUrl, String username, String password) throws DroolsChtijbugException {
if (kieContainer != null) {
if (this.historyListener != null) {
this.historyListener.fireEvent(new KnowledgeBaseReloadedEvent(eventCounter.next(), new Date(), this.ruleBaseID));
}
// TODO dispose all elements
} else {
if (this.historyListener != null) {
this.historyListener.fireEvent(new KnowledgeBaseInitialLoadEvent(eventCounter.next(), new Date(), this.ruleBaseID));
}
}
try {
//___ TODO add URI Resource
this.knowledgeModule.addWorkbenchResource(workbenchUrl, username, password);
kieContainer = this.knowledgeModule.build();
} catch (Exception e) {
logger.error("error to load Agent", e);
throw new DroolsChtijbugException(DroolsChtijbugException.ErrorToLoadAgent, "", e);
}
}
@Override
public void loadKBase(String version) throws DroolsChtijbugException {
if (this.knowledgeModule.getWorkbenchClient() != null) {
try {
WorkbenchClient client = this.knowledgeModule.getWorkbenchClient();
lockKbase.acquire();
//this.releaseId = kieServices.newReleaseId(this.releaseId.getGroupId(), this.releaseId.getArtifactId(), version);
this.version = version;
kieContainer = null;
this.knowledgeModule = null;
this.knowledgeModule = new KnowledgeModule(this.ruleBaseID, this.historyListener, groupId, artifactId, version, eventCounter);
this.createKBase(client.getWorkbenchUrl(), client.getUsername(), client.getPassword());
lockKbase.release();
if (this.historyListener != null) {
// TODO change the following event...
this.historyListener.fireEvent(new KnowledgeBaseAddResourceEvent(eventCounter.next(), new Date(), this.ruleBaseID));
}
} catch (InterruptedException e) {
throw propagate(e);
}
}
}
@Override
public HistoryListener getHistoryListener() {
return historyListener;
}
public Long getRuleBaseID() {
return ruleBaseID;
}
@Override
public void dispose() {
if (this.historyListener != null) {
try {
this.historyListener.fireEvent(new KnowledgeBaseDisposeEvent(eventCounter.next(), new Date(), this.ruleBaseID));
} catch (DroolsChtijbugException e) {
throw propagate(e);
}
}
this.kieContainer = null;
}
public void createKBase(List<FileKnowledgeResource> files) {
try {
if (this.historyListener != null) {
this.historyListener.fireEvent(new KnowledgeBaseInitialLoadEvent(eventCounter.next(), new Date(), this.ruleBaseID));
}
lockKbase.acquire();
this.knowledgeModule.addAllFiles(files);
kieContainer = this.knowledgeModule.build();
lockKbase.release();
} catch (InterruptedException | DroolsChtijbugException e) {
propagate(e);
}
}
public void createKBase(ClassLoader... classLoaders) {
try {
if (this.historyListener != null) {
this.historyListener.fireEvent(new KnowledgeBaseInitialLoadEvent(eventCounter.next(), new Date(), this.ruleBaseID));
}
lockKbase.acquire();
if (classLoaders.length == 0) {
kieContainer = this.knowledgeModule.buildFromClassPath();
} else {
kieContainer = this.knowledgeModule.buildFromClassPath(classLoaders[0]);
}
lockKbase.release();
} catch (InterruptedException | DroolsChtijbugException e) {
propagate(e);
}
}
}

View file

@ -0,0 +1,558 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.impl;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import org.chtijbug.drools.common.reflection.ReflectionUtils;
import org.chtijbug.drools.entity.*;
import org.chtijbug.drools.entity.history.EventCounter;
import org.chtijbug.drools.entity.history.HistoryContainer;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.fact.InsertedByReflectionFactEndHistoryEvent;
import org.chtijbug.drools.entity.history.fact.InsertedByReflectionFactStartHistoryEvent;
import org.chtijbug.drools.entity.history.session.*;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.DroolsFactObjectFactory;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.drools.core.definitions.rule.impl.RuleImpl;
import org.jbpm.workflow.core.node.RuleSetNode;
import org.jbpm.workflow.instance.node.*;
import org.kie.api.definition.rule.Rule;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.ObjectFilter;
import org.kie.api.runtime.process.NodeInstance;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.rule.FactHandle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.*;
/**
* @author nheron
*/
public class RuleBaseStatefulSession implements RuleBaseSession {
/**
* Class Logger
*/
private static Logger logger = LoggerFactory.getLogger(RuleBaseStatefulSession.class);
/**
* All objects inserted into the session as fact
*/
private final Map<FactHandle, Object> listObject;
private final Map<Object, FactHandle> listFact;
private final Map<Object, List<DroolsFactObject>> listFactObjects;
private final HistoryContainer historyContainer;
/**
* All the
*/
private final Map<String, DroolsRuleObject> listRules;
private final Map<String, DroolsProcessObject> processList;
private final Map<String, DroolsProcessInstanceObject> processInstanceList;
/**
* The wrapped Drools KnowledgeSession
*/
private KieSession knowledgeSession = null;
// Listeners can be dispose ...
private FactHandlerListener factListener;
private RuleHandlerListener ruleHandlerListener;
private ProcessHandlerListener processHandlerListener;
private int maxNumberRuleToExecute;
private XStream xstream = new XStream(new JettisonMappedXmlDriver());
private Long ruleBaseID;
private Long sessionId;
private HistoryListener historyListener;
private EventCounter eventCounter = EventCounter.newCounter();
public RuleBaseStatefulSession(Long ruleBaseID, Long sessionId, KieSession knowledgeSession, int maxNumberRuleToExecute, HistoryListener historyListener) throws DroolsChtijbugException {
this.ruleBaseID = ruleBaseID;
this.sessionId = sessionId;
this.knowledgeSession = knowledgeSession;
this.maxNumberRuleToExecute = maxNumberRuleToExecute;
this.factListener = new FactHandlerListener(this);
this.ruleHandlerListener = new RuleHandlerListener(this);
this.processHandlerListener = new ProcessHandlerListener(this);
this.historyContainer = new HistoryContainer(sessionId, historyListener);
this.listFactObjects = new HashMap<>();
this.listFact = new HashMap<>();
this.listObject = new HashMap<>();
this.listRules = new HashMap<>();
this.processList = new HashMap<>();
this.processInstanceList = new HashMap<>();
knowledgeSession.addEventListener(factListener);
knowledgeSession.addEventListener(ruleHandlerListener);
knowledgeSession.addEventListener(processHandlerListener);
this.historyListener = historyListener;
if (this.historyListener != null) {
SessionCreatedEvent sessionCreatedEvent = new SessionCreatedEvent(eventCounter.next(), this.ruleBaseID, this.sessionId);
this.addHistoryElement(sessionCreatedEvent);
}
}
public int getMaxNumberRuleToExecute() {
return maxNumberRuleToExecute;
}
public DroolsProcessInstanceObject getDroolsProcessInstanceObject(ProcessInstance processInstance) {
DroolsProcessInstanceObject droolsProcessInstanceObject = processInstanceList.get(Long.toString(processInstance.getId()));
if (droolsProcessInstanceObject == null) {
DroolsProcessObject droolsProcessObject = processList.get(processInstance.getProcess().getId());
if (droolsProcessObject == null) {
droolsProcessObject = DroolsProcessObject.createDroolsProcessObject(processInstance.getProcess().getId(),
processInstance.getProcess().getName(),
processInstance.getProcess().getPackageName(), processInstance.getProcess().getType(), processInstance.getProcess().getVersion());
processList.put(processInstance.getProcess().getId(), droolsProcessObject);
}
droolsProcessInstanceObject = DroolsProcessInstanceObject.createDroolsProcessInstanceObject(String.valueOf(processInstance.getId()), droolsProcessObject);
processInstanceList.put(droolsProcessInstanceObject.getId(), droolsProcessInstanceObject);
}
return droolsProcessInstanceObject;
}
public DroolsNodeInstanceObject getDroolsNodeInstanceObject(NodeInstance nodeInstance) {
DroolsNodeType nodeType = DroolsNodeType.Other;
String ruleFlowGroupName = null;
if (nodeInstance instanceof StartNodeInstance) {
nodeType = DroolsNodeType.StartNode;
} else if (nodeInstance instanceof RuleSetNodeInstance) {
nodeType = DroolsNodeType.RuleNode;
RuleSetNode ruleSetNode = this.getRuleSetNode(nodeInstance);
if (ruleSetNode != null) {
ruleFlowGroupName = ruleSetNode.getRuleFlowGroup();
}
} else if (nodeInstance instanceof SplitInstance) {
nodeType = DroolsNodeType.SplitNode;
} else if (nodeInstance instanceof JoinInstance) {
nodeType = DroolsNodeType.JoinNode;
} else if (nodeInstance instanceof EndNodeInstance) {
nodeType = DroolsNodeType.EndNode;
}
DroolsProcessInstanceObject droolsProcessInstanceObject = processInstanceList.get(Long.toString(nodeInstance.getProcessInstance().getId()));
if (droolsProcessInstanceObject == null) {
droolsProcessInstanceObject = this.getDroolsProcessInstanceObject(nodeInstance.getProcessInstance());
}
DroolsNodeInstanceObject droolsNodeInstanceObject = droolsProcessInstanceObject.getDroolsNodeInstanceObjet(String.valueOf(nodeInstance.getId()));
if (droolsNodeInstanceObject == null) {
DroolsNodeObject droolsNodeObject = DroolsNodeObject.createDroolsNodeObject(String.valueOf(nodeInstance.getNode().getId()), nodeType);
droolsProcessInstanceObject.getProcess().addDroolsNodeObject(droolsNodeObject);
droolsNodeObject.setRuleflowGroupName(ruleFlowGroupName);
droolsNodeInstanceObject = DroolsNodeInstanceObject.createDroolsNodeInstanceObject(String.valueOf(nodeInstance.getId()), droolsNodeObject);
droolsProcessInstanceObject.addDroolsNodeInstanceObject(droolsNodeInstanceObject);
}
return droolsNodeInstanceObject;
}
public DroolsRuleObject getDroolsRuleObject(Rule rule) {
DroolsRuleObject droolsRuleObject = listRules.get(rule.toString());
RuleImpl ruleInstance = (RuleImpl) rule;
if (droolsRuleObject == null) {
droolsRuleObject = DroolsRuleObject.createDroolRuleObject(rule.getName(), rule.getPackageName());
droolsRuleObject.setRuleFlowGroup(ruleInstance.getRuleFlowGroup());
addDroolsRuleObject(droolsRuleObject);
}
return droolsRuleObject;
}
public void addDroolsRuleObject(DroolsRuleObject droolsRuleObject) {
listRules.put(droolsRuleObject.getRulePackageName() + droolsRuleObject.getRuleName(), droolsRuleObject);
}
public DroolsFactObject getLastFactObjectVersion(Object searchO) {
int lastVersion = listFactObjects.get(searchO).size() - 1;
DroolsFactObject result = getFactObjectVersion(searchO, lastVersion);
try {
result.updateRealObjectFromJSON();
} catch (ClassNotFoundException e) {
logger.error("getLastFactObjectVersion",e);
} catch (IOException e) {
logger.error("getLastFactObjectVersion",e);
}
return result;
}
public DroolsFactObject getFactObjectVersion(Object search0, int version) {
return listFactObjects.get(search0).get(version);
}
public DroolsFactObject getLastFactObjectVersionFromFactHandle(FactHandle factToFind) {
Object searchObject = this.listObject.get(factToFind);
if (searchObject == null) {
return null;
}
List<DroolsFactObject> facto = listFactObjects.get(searchObject);
if (facto == null) {
logger.error("List of FactObject can not be null for FactHandle {}", factToFind);
return null;
}
int lastVersion = facto.size() - 1;
return listFactObjects.get(searchObject).get(lastVersion);
}
@Override
public HistoryContainer getHistoryContainer() {
return historyContainer;
}
@Override
public String getHistoryContainerXML() {
String result = null;
if (historyContainer != null) {
xstream.setMode(XStream.NO_REFERENCES);
result = xstream.toXML(historyContainer);
}
return result;
}
@Override
public Collection<DroolsFactObject> listLastVersionObjects() {
Collection<DroolsFactObject> list = new ArrayList<>();
for (Object o : this.listFact.keySet()) {
FactHandle factHandle = this.listFact.get(o);
list.add(this.getLastFactObjectVersionFromFactHandle(factHandle));
}
return list;
}
@Override
public String listLastVersionObjectsXML() {
String result = null;
Collection<DroolsFactObject> list = this.listLastVersionObjects();
if (list != null) {
xstream.setMode(XStream.NO_REFERENCES);
result = xstream.toXML(list);
}
return result;
}
public void setData(FactHandle f, Object o, DroolsFactObject fObject) {
Object objectSearch = listObject.containsKey(f);
listFact.remove(objectSearch);
listObject.put(f, o);
listFact.put(o, f);
if (!listFactObjects.containsKey(o)) {
List<DroolsFactObject> newList = new LinkedList<>();
newList.add(fObject);
listFactObjects.put(o, newList);
} else {
listFactObjects.get(o).add(fObject);
}
}
public void unsetData(FactHandle f, Object o) {
listObject.remove(f);
listFact.remove(o);
}
@Override
public void dispose() {
knowledgeSession.removeEventListener(factListener);
knowledgeSession.removeEventListener(ruleHandlerListener);
knowledgeSession.removeEventListener(processHandlerListener);
for (FactHandle f : listObject.keySet()) {
knowledgeSession.delete(f);
}
factListener = null;
ruleHandlerListener = null;
processHandlerListener = null;
knowledgeSession.dispose();
knowledgeSession = null;
if (this.historyListener != null) {
try {
SessionDisposedEvent sessionDisposedEvent = new SessionDisposedEvent(eventCounter.next(), this.ruleBaseID, this.sessionId);
this.addHistoryElement(sessionDisposedEvent);
} catch (Exception e) {
logger.error("Exception in calling historyEvent", e);
}
}
}
@Override
public void insertObject(Object newObject) {
FactHandle newFactHandle = this.knowledgeSession.insert(newObject);
listFact.put(newObject, newFactHandle);
}
@Override
public void insertByReflection(Object newObject) throws DroolsChtijbugException {
// Avoid inserting java.* classes
if (newObject.getClass().getPackage().getName().startsWith("java.")) {
return;
}
if (this.historyListener != null) {
DroolsFactObject topDroolsObject = DroolsFactObjectFactory.createFactObject(newObject);
InsertedByReflectionFactStartHistoryEvent insertedByReflectionFactStartHistoryEvent = new InsertedByReflectionFactStartHistoryEvent(eventCounter.next(), topDroolsObject, this.ruleBaseID, this.sessionId);
this.addHistoryElement(insertedByReflectionFactStartHistoryEvent);
}
//____ First insert the root object
insertObject(newObject);
//____ Then foreach getters insert item by reflection
for (Method method : newObject.getClass().getMethods()) {
//____ only manage getters
if (!ReflectionUtils.IsGetter(method)) {
continue;
}
Object getterValue;
try {
getterValue = method.invoke(newObject, (Object[]) null);
} catch (Exception e) {
throw new DroolsChtijbugException(DroolsChtijbugException.insertByReflection, "getterValue = method.invoke(newObject, (Object[]) null);", e);
}
if (getterValue == null)
continue;
//____ If returned value is not a collection, insert it in the ksession
if (!(getterValue instanceof Iterable)) {
this.insertByReflection(getterValue);
} else {
Iterable<?> iterable = (Iterable) getterValue;
for (Object item : iterable) {
this.insertByReflection(item);
}
}
}
if (this.historyListener != null) {
InsertedByReflectionFactEndHistoryEvent insertedByReflectionFactEndHistoryEvent = new InsertedByReflectionFactEndHistoryEvent(eventCounter.next(), this.ruleBaseID, this.sessionId);
this.addHistoryElement(insertedByReflectionFactEndHistoryEvent);
}
}
@Override
public void setGlobal(String identifier, Object value) {
this.knowledgeSession.setGlobal(identifier, value);
}
@Override
public void updateObject(Object updatedObject) {
FactHandle factToUpdate = listFact.get(updatedObject);
this.knowledgeSession.update(factToUpdate, updatedObject);
}
@Override
public void retractObject(Object oldObject) {
FactHandle factToDelete = listFact.get(oldObject);
this.knowledgeSession.delete(factToDelete);
}
@Override
public Object fireAllRulesAndStartProcess(Object inputObject, String processName) throws DroolsChtijbugException {
DroolsFactObject inputDroolsObject = null;
DroolsFactObject outputDroolsObject = null;
if (inputObject != null) {
this.insertByReflection(inputObject);
inputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObject);
}
if (processName != null && processName.length() > 0) {
this.startProcess(processName);
}
this.fireAllRules();
if (inputDroolsObject != null) {
outputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObject);
}
if (this.historyListener != null) {
SessionFireAllRulesAndStartProcess sessionFireAllRulesAndStartProcess = new SessionFireAllRulesAndStartProcess(eventCounter.next(), this.ruleBaseID, this.sessionId, inputDroolsObject, outputDroolsObject);
this.addHistoryElement(sessionFireAllRulesAndStartProcess);
}
return inputObject;
}
@Override
public void fireAllRules() throws DroolsChtijbugException {
if (this.historyListener != null) {
SessionFireAllRulesBeginEvent sessionFireAllRulesBeginEvent = new SessionFireAllRulesBeginEvent(eventCounter.next(), this.ruleBaseID, this.sessionId);
this.addHistoryElement(sessionFireAllRulesBeginEvent);
}
long startTime = System.currentTimeMillis();
long beforeNumberRules = ruleHandlerListener.getNbRuleFired();
try {
this.knowledgeSession.fireAllRules();
} catch (Exception e) {
throw new DroolsChtijbugException(DroolsChtijbugException.fireAllRules, "", e);
}
long stopTime = System.currentTimeMillis();
long afterNumberRules = ruleHandlerListener.getNbRuleFired();
if (ruleHandlerListener.isMaxNumerExecutedRulesReached()) {
if (this.historyListener != null) {
SessionFireAllRulesMaxNumberReachedEvent sessionFireAllRulesMaxNumberReachedEvent = new SessionFireAllRulesMaxNumberReachedEvent(eventCounter.next(), ruleHandlerListener.getNbRuleFired(), maxNumberRuleToExecute, this.ruleBaseID, this.sessionId);
this.addHistoryElement(sessionFireAllRulesMaxNumberReachedEvent);
}
throw new DroolsChtijbugException(DroolsChtijbugException.MaxNumberRuleExecutionReached, "nbRulesExecuted" + afterNumberRules + " and MaxNumberRules for the session is set to " + maxNumberRuleToExecute, null);
}
if (this.historyListener != null) {
SessionFireAllRulesEndEvent sessionFireAllRulesEndEvent = new SessionFireAllRulesEndEvent(eventCounter.next(), this.ruleBaseID, this.sessionId, stopTime - startTime, afterNumberRules - beforeNumberRules);
this.addHistoryElement(sessionFireAllRulesEndEvent);
}
}
@Override
public void startProcess(String processName) {
if (this.historyListener != null) {
try {
SessionStartProcessBeginEvent sessionStartProcessBeginEvent = new SessionStartProcessBeginEvent(eventCounter.next(), processName, this.ruleBaseID, this.sessionId);
this.addHistoryElement(sessionStartProcessBeginEvent);
} catch (Exception e) {
logger.error("Exception in calling historyEvent", e);
}
}
ProcessInstance processInstance = this.knowledgeSession.startProcess(processName);
if (this.historyListener != null) {
try {
SessionStartProcessEndEvent sessionStartProcessEndEvent = new SessionStartProcessEndEvent(eventCounter.next(), processName, this.ruleBaseID, this.sessionId, processInstance.getProcessId());
this.addHistoryElement(sessionStartProcessEndEvent);
} catch (Exception e) {
logger.error("Exception in calling historyEvent", e);
}
}
}
@Override
public Collection<DroolsRuleObject> listRules() {
return listRules.values();
}
@Override
public int getNumberRulesExecuted() {
int result = 0;
if (this.ruleHandlerListener != null) {
result = this.ruleHandlerListener.getNbRuleFired();
}
return result;
}
public void addHistoryElement(HistoryEvent newHistoryElement) {
this.historyContainer.addHistoryElement(this.ruleBaseID, this.sessionId, newHistoryElement);
}
public Long getSessionId() {
return sessionId;
}
public Long getRuleBaseID() {
return ruleBaseID;
}
@Override
public KieSession getKnowledgeSession() {
return knowledgeSession;
}
@Override
public Collection<? extends java.lang.Object> getObjects(ObjectFilter objectFilter) {
return this.knowledgeSession.getObjects(objectFilter);
}
@Override
public void completeWorkItem(long processId, Map<String, Object> vars) {
if (this.knowledgeSession != null && this.knowledgeSession.getWorkItemManager() != null) {
this.knowledgeSession.getWorkItemManager().completeWorkItem(processId, vars);
}
}
@Override
public void abortWorkItem(long processId) {
if (this.knowledgeSession != null && this.knowledgeSession.getWorkItemManager() != null) {
this.knowledgeSession.getWorkItemManager().abortWorkItem(processId);
}
}
@Override
public void registerWorkItemHandler(String workItemName, WorkItemHandler workItemHandler) {
if (this.knowledgeSession != null && this.knowledgeSession.getWorkItemManager() != null) {
this.knowledgeSession.getWorkItemManager().registerWorkItemHandler(workItemName, workItemHandler);
}
}
@Override
public ProcessInstance startProcess(String processName, Map<String, Object> vars) {
if (this.knowledgeSession != null && this.knowledgeSession.getWorkItemManager() != null) {
return this.knowledgeSession.startProcess(processName, vars);
}
return null;
}
private RuleSetNode getRuleSetNode(NodeInstance nodeInstance) {
RuleSetNode ruleSetNode = null;
if (nodeInstance instanceof RuleSetNodeInstance) {
if (nodeInstance.getNode() instanceof RuleSetNode) {
ruleSetNode = (RuleSetNode) nodeInstance.getNode();
}
}
return ruleSetNode;
}
public Long nextEventId() {
return this.eventCounter.next();
}
@Override
public Object fireAllRulesAndStartProcessWithParam(Object inputObject, String processName) throws DroolsChtijbugException {
DroolsFactObject inputDroolsObject = null;
DroolsFactObject outputDroolsObject = null;
if (inputObject != null) {
this.insertByReflection(inputObject);
inputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObject);
}
Map<String, Object> maps = new HashMap<String, Object>();
maps.put("inputObject", inputObject);
if (processName != null && processName.length() > 0) {
this.startProcess(processName, maps);
}
this.fireAllRules();
if (inputDroolsObject != null) {
outputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObject);
}
if (this.historyListener != null) {
SessionFireAllRulesAndStartProcess sessionFireAllRulesAndStartProcess = new SessionFireAllRulesAndStartProcess(eventCounter.next(), this.ruleBaseID, this.sessionId, inputDroolsObject, outputDroolsObject);
this.addHistoryElement(sessionFireAllRulesAndStartProcess);
}
return inputObject;
}
}

View file

@ -0,0 +1,180 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsRuleFlowGroupObject;
import org.chtijbug.drools.entity.DroolsRuleObject;
import org.chtijbug.drools.entity.history.rule.AfterRuleFiredHistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFlowActivatedHistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFlowDeactivatedHistoryEvent;
import org.chtijbug.drools.entity.history.rule.BeforeRuleFiredHistoryEvent;
import org.chtijbug.drools.entity.history.session.SessionFireAllRulesMaxNumberReachedEvent;
import org.drools.core.common.InternalFactHandle;
import org.drools.core.reteoo.InitialFactImpl;
import org.kie.api.event.rule.*;
import org.kie.api.runtime.KieRuntime;
import org.kie.api.runtime.rule.FactHandle;
import org.kie.api.runtime.rule.Match;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* @author nheron
*/
public class RuleHandlerListener extends DefaultAgendaEventListener {
/**
* Class logger
*/
private static Logger logger = LoggerFactory.getLogger(RuleHandlerListener.class);
/**
* The Knowledge sessions sending events
*/
private final RuleBaseStatefulSession ruleBaseSession;
/**
* The rule fired count
*/
private int nbRuleFired = 0;
/**
* the RuleFLowGroup count
*/
private int nbRuleFlowGroupUsed = 0;
/**
* The rule fire limit
*/
private int maxNumberRuleToExecute;
/**
* IfMaxNumberRulewasReached
*/
private boolean maxNumerExecutedRulesReached = false;
public RuleHandlerListener(RuleBaseStatefulSession ruleBaseSession) {
this.ruleBaseSession = ruleBaseSession;
this.maxNumberRuleToExecute = ruleBaseSession.getMaxNumberRuleToExecute();
}
public boolean isMaxNumerExecutedRulesReached() {
return maxNumerExecutedRulesReached;
}
@Override
public void beforeMatchFired(BeforeMatchFiredEvent event) {
logger.debug(">>beforeActivationFired", event);
try {
Match match = event.getMatch();
List<? extends FactHandle> listFact = match.getFactHandles();
//____ Getting the Rule object summary from the session
DroolsRuleObject droolsRuleObject = ruleBaseSession.getDroolsRuleObject(match.getRule());
//____ Creating the specific History event for history managment
BeforeRuleFiredHistoryEvent newBeforeRuleEvent = new BeforeRuleFiredHistoryEvent(this.ruleBaseSession.nextEventId(), this.nbRuleFired + 1, droolsRuleObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
//____ Adding all objects info contained in the Activation object into the history Events
for (FactHandle h : listFact) {
if (h instanceof InternalFactHandle) {
InternalFactHandle defaultFactHandle = (InternalFactHandle) h;
//System.out.println(defaultFactHandle.toString());
if (defaultFactHandle.getObject() instanceof InitialFactImpl) {
// org.drools.reteoo.InitialFactImpl initialFact = (org.drools.reteoo.InitialFactImpl)defaultFactHandle.getObject();
//TODO in case of NOT, OR, etc..
} else {
DroolsFactObject sourceFactObject = ruleBaseSession.getLastFactObjectVersionFromFactHandle(h);
newBeforeRuleEvent.getWhenObjects().add(sourceFactObject);
}
}
}
//_____ Add Event into the History Container
ruleBaseSession.addHistoryElement(newBeforeRuleEvent);
} finally {
logger.debug("<<beforeActivationFired");
}
}
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
logger.debug(">>afterActivationFired", event);
try {
//____ Increment the global rule fired count
nbRuleFired++;
Match match = event.getMatch();
//____ Getting the Rule Object Summary from the session
DroolsRuleObject droolsRuleObject = ruleBaseSession.getDroolsRuleObject(match.getRule());
//____ Creating the specific "After Rule Fired" History Event
AfterRuleFiredHistoryEvent newAfterRuleEvent = new AfterRuleFiredHistoryEvent(this.ruleBaseSession.nextEventId(), this.nbRuleFired, droolsRuleObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(newAfterRuleEvent);
//____ If the max number rule able to be executed threshold is raised, stop the session execution
if (nbRuleFired >= maxNumberRuleToExecute) {
logger.warn(String.format("%d rules have been fired. This is the limit.", maxNumberRuleToExecute));
logger.warn("The session execution will be stop");
KieRuntime runtime = event.getKieRuntime();
this.maxNumerExecutedRulesReached = true;
//(int eventID, int sessionId, int numberOfRulesExecuted, int maxNumberOfRulesForSession)
SessionFireAllRulesMaxNumberReachedEvent sessionFireAllRulesMaxNumberReachedEvent = new SessionFireAllRulesMaxNumberReachedEvent(this.ruleBaseSession.nextEventId(), nbRuleFired, maxNumberRuleToExecute, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(sessionFireAllRulesMaxNumberReachedEvent);
runtime.halt();
}
logger.debug("nbre RDG Fired ==> ", nbRuleFired);
} finally {
logger.debug("<<afterActivationFired");
}
}
@Override
public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent ruleFlowGroupActivatedEvent) {
logger.debug(">>afterRuleFlowGroupActivated", ruleFlowGroupActivatedEvent);
try {
String ruleFlowGroupName = null;
//____ Filling the event with the rule flow group name activated
if (ruleFlowGroupActivatedEvent.getRuleFlowGroup() != null && ruleFlowGroupActivatedEvent.getRuleFlowGroup().getName() != null) {
ruleFlowGroupName = ruleFlowGroupActivatedEvent.getRuleFlowGroup().getName();
}
DroolsRuleFlowGroupObject droolsRuleFlowGroupObject = new DroolsRuleFlowGroupObject(this.nbRuleFlowGroupUsed + 1, ruleFlowGroupName);
//____ Creating history event
AfterRuleFlowActivatedHistoryEvent afterRuleFlowActivatedHistoryEvent = new AfterRuleFlowActivatedHistoryEvent(this.ruleBaseSession.nextEventId(), droolsRuleFlowGroupObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
//____ Adding into the History container
ruleBaseSession.addHistoryElement(afterRuleFlowActivatedHistoryEvent);
} finally {
logger.debug("<<afterRuleFlowGroupActivated");
}
}
@Override
public void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent ruleFlowGroupDeactivatedEvent) {
logger.debug(">>afterRuleFlowGroupDeactivated", ruleFlowGroupDeactivatedEvent);
try {
String ruleFlowGroupName = null;
if (ruleFlowGroupDeactivatedEvent.getRuleFlowGroup() != null && ruleFlowGroupDeactivatedEvent.getRuleFlowGroup().getName() != null) {
ruleFlowGroupName = ruleFlowGroupDeactivatedEvent.getRuleFlowGroup().getName();
}
this.nbRuleFlowGroupUsed++;
DroolsRuleFlowGroupObject droolsRuleFlowGroupObject = new DroolsRuleFlowGroupObject(this.nbRuleFlowGroupUsed, ruleFlowGroupName);
//____ Creating history event
AfterRuleFlowDeactivatedHistoryEvent afterRuleFlowGroupDeactivated = new AfterRuleFlowDeactivatedHistoryEvent(this.ruleBaseSession.nextEventId(), droolsRuleFlowGroupObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
//_____ Adding the event to the History container
ruleBaseSession.addHistoryElement(afterRuleFlowGroupDeactivated);
} finally {
logger.debug("<<afterRuleFlowGroupDeactivated");
}
}
public int getNbRuleFired() {
return nbRuleFired;
}
}

View file

@ -0,0 +1,135 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.resource;
import com.google.common.base.Throwables;
import org.apache.commons.io.IOUtils;
import org.chtijbug.drools.entity.history.KnowledgeResource;
import org.kie.api.io.Resource;
import org.kie.internal.io.ResourceFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Created by IntelliJ IDEA.
* Date: 23/01/14
* Time: 15:40
* To change this template use File | Settings | File Templates.
*/
public class FileKnowledgeResource implements Serializable, KnowledgeResource {
private String content;
private String path;
private boolean bpmn2;
private Resource resource;
public FileKnowledgeResource(String content, String path, boolean bpmn2, Resource resource) {
this.content = content;
this.path = path;
this.bpmn2 = bpmn2;
this.resource = resource;
}
public FileKnowledgeResource(Resource resource, String path, String fileContent) {
this.content = fileContent;
this.path = path;
this.resource = resource;
this.bpmn2 = true;
}
public FileKnowledgeResource() {
}
public static FileKnowledgeResource createFileSystemPathResource(String path) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(path);
String fileContent = IOUtils.toString(inputStream);
return new FileKnowledgeResource(ResourceFactory.newFileResource(path), path, fileContent);
} catch (IOException ex) {
Logger.getLogger(FileKnowledgeResource.class.getName()).log(Level.SEVERE, null, ex);
throw Throwables.propagate(ex);
}
}
public static FileKnowledgeResource createBPMN2ClassPathResource(String path) {
FileKnowledgeResource bpmn2Resource = createDRLClassPathResource(path);
bpmn2Resource.setBpmn2(true);
return bpmn2Resource;
}
public static FileKnowledgeResource createDRLClassPathResource(String path) {
ClassLoader classLoader = Thread.currentThread()
.getContextClassLoader();
InputStream inputStream;
if (classLoader == null) {
inputStream = FileKnowledgeResource.class.getResourceAsStream("/" + path);
} else {
inputStream = classLoader.getResourceAsStream(path);
}
String fileContent = null;
try {
fileContent = IOUtils.toString(inputStream);
} catch (IOException ex) {
Logger.getLogger(FileKnowledgeResource.class.getName()).log(Level.SEVERE, null, ex);
throw Throwables.propagate(ex);
}
return new FileKnowledgeResource(ResourceFactory.newClassPathResource(path), path, fileContent);
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public boolean isBpmn2() {
return bpmn2;
}
public void setBpmn2(boolean bpmn2) {
this.bpmn2 = bpmn2;
}
public Resource getResource() {
return resource;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("DrlRessourceFile{");
sb.append("fileName='").append(path).append('\'');
sb.append(", content='").append(content).append('\'');
sb.append('}');
return sb.toString();
}
}

View file

@ -0,0 +1,154 @@
package org.chtijbug.drools.runtime.resource;
import org.chtijbug.drools.entity.history.EventCounter;
import org.chtijbug.drools.entity.history.knowledge.KnowledgeBaseAddResourceEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.io.KieResources;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import java.util.Date;
import java.util.List;
import static com.google.common.base.Throwables.propagate;
public class KnowledgeModule {
private final String groupId;
private final String artifactId;
private final String version;
private final KieServices kieServices;
private String ruleBaseName;
private final KieResources kieResources;
private final KieFileSystem kieFileSystem;
private final KieRepository kieRepository;
private final HistoryListener historyListener;
private final EventCounter sharedCounter;
private final Long ruleBaseId;
private ReleaseId releaseId;
private boolean fileBaseModule = false;
private WorkbenchClient workbenchClient;
public KnowledgeModule(Long ruleBaseId, HistoryListener historyListener, String groupId, String artifactId, String version, EventCounter sharedCounter) {
this.ruleBaseId = ruleBaseId;
this.historyListener = historyListener;
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.kieServices = KieServices.Factory.get();
this.kieRepository = kieServices.getRepository();
this.kieResources = kieServices.getResources();
this.kieFileSystem = kieServices.newKieFileSystem();
this.sharedCounter = sharedCounter;
}
public KnowledgeModule(String ruleBaseName, HistoryListener historyListener, EventCounter sharedCounter) {
this.ruleBaseName = ruleBaseName;
this.historyListener = historyListener;
this.groupId = null;
this.artifactId = null;
this.version = null;
this.kieServices = KieServices.Factory.get();
this.kieRepository = kieServices.getRepository();
this.kieResources = kieServices.getResources();
this.kieFileSystem = kieServices.newKieFileSystem();
this.sharedCounter = sharedCounter;
this.ruleBaseId = 1L;
}
public KnowledgeModule(Long ruleBaseId, HistoryListener historyListener, EventCounter sharedCounter) {
this.ruleBaseId = ruleBaseId;
this.historyListener = historyListener;
this.groupId = null;
this.artifactId = null;
this.version = null;
this.kieServices = KieServices.Factory.get();
this.kieRepository = kieServices.getRepository();
this.kieResources = kieServices.getResources();
this.kieFileSystem = kieServices.newKieFileSystem();
this.sharedCounter = sharedCounter;
}
public void addAllFiles(List<FileKnowledgeResource> files) {
for (FileKnowledgeResource file : files) {
addRuleFile(groupId + ".rules", file);
}
}
public void addRuleFile(String packageName, FileKnowledgeResource ruleResource) {
this.fileBaseModule = true;
packageName = packageName.replace(".", "/");
String resourcePath = "src/main/resources/" + packageName + "/" + ruleResource.getPath();
kieFileSystem.write(resourcePath, ruleResource.getResource());
if (historyListener != null)
try {
historyListener.fireEvent(
new KnowledgeBaseAddResourceEvent(
sharedCounter.next(), new Date(), this.ruleBaseId, ruleResource));
} catch (DroolsChtijbugException e) {
throw propagate(e);
}
}
public KieContainer build() {
this.releaseId = kieServices.newReleaseId(groupId, artifactId, version);
if (fileBaseModule) {
this.kieFileSystem.generateAndWritePomXML(releaseId);
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
kb.buildAll();
if (kb.getResults().hasMessages(Message.Level.ERROR)) {
throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
}
}
return this.kieServices.newKieContainer(releaseId);
}
public KieContainer buildFromClassPath(ClassLoader classLoader) {
return this.kieServices.getKieClasspathContainer(classLoader);
}
public KieContainer buildFromClassPath() {
return this.kieServices.getKieClasspathContainer();
}
public void addWorkbenchResource(String workbenchUrl, String username, String password) {
try (WorkbenchClient client = new WorkbenchClient(workbenchUrl, username, password)) {
this.workbenchClient = client;
Resource resource = kieServices.getResources().newInputStreamResource(client.getWorkbenchResource(this));
this.kieRepository.addKieModule(resource);
if (historyListener != null)
try {
WorkbenchKnowledgeResource workbenchRuleResource = new WorkbenchKnowledgeResource(workbenchUrl, this.groupId, this.artifactId, this.version);
historyListener.fireEvent(
new KnowledgeBaseAddResourceEvent(
sharedCounter.next(), new Date(), this.ruleBaseId,
workbenchRuleResource));
} catch (DroolsChtijbugException e) {
throw propagate(e);
}
}
}
public String getGroupId() {
return groupId;
}
public String getArtifactId() {
return artifactId;
}
public String getVersion() {
return version;
}
public WorkbenchClient getWorkbenchClient() {
return workbenchClient;
}
}

View file

@ -0,0 +1,75 @@
package org.chtijbug.drools.runtime.resource;
import com.google.common.base.Throwables;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import static org.apache.http.client.utils.HttpClientUtils.closeQuietly;
public class WorkbenchClient implements Closeable {
private final CloseableHttpClient httpClient;
private final String workbenchUrl;
private CloseableHttpResponse response;
private String username;
private String password;
public WorkbenchClient(String workbenchUrl, String username, String password) {
this.workbenchUrl = workbenchUrl;
this.username = username;
this.password = password;
try {
URI submittedURI = new URI(workbenchUrl);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(submittedURI.getHost(), submittedURI.getPort()),
new UsernamePasswordCredentials(username, password)
);
this.httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
} catch (URISyntaxException e) {
throw Throwables.propagate(e);
}
}
public InputStream getWorkbenchResource(KnowledgeModule knowledgeModule) {
// Build up url
String url = workbenchUrl + "maven2/" + knowledgeModule.getGroupId().replaceAll("\\.", "/") + "/" + knowledgeModule.getArtifactId() + "/" + knowledgeModule.getVersion() + "/" + knowledgeModule.getArtifactId() + "-" + knowledgeModule.getVersion() + ".jar";
HttpGet httpget = new HttpGet(url);
this.response = null;
try {
response = httpClient.execute(httpget);
return response.getEntity().getContent();
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
@Override
public void close() {
closeQuietly(this.response);
closeQuietly(this.httpClient);
}
public String getWorkbenchUrl() {
return workbenchUrl;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}

View file

@ -0,0 +1,121 @@
/*
* Copyright 2014 Pymma Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.resource;
import org.chtijbug.drools.entity.history.KnowledgeResource;
import java.io.Serializable;
/**
* Created by IntelliJ IDEA.
* Date: 23/01/14
* Time: 15:40
* To change this template use File | Settings | File Templates.
*/
public class WorkbenchKnowledgeResource implements Serializable, KnowledgeResource {
private String guvnor_url;
private String groupId;
private String artifactID;
private String version;
private String userName;
private String password;
public WorkbenchKnowledgeResource(String guvnor_url, String groupId, String artifactID, String version) {
this.guvnor_url = guvnor_url;
this.groupId = groupId;
this.artifactID = artifactID;
this.version = version;
}
public WorkbenchKnowledgeResource(String guvnor_url, String groupId, String artifactId, String version, String userName, String password) {
this(guvnor_url, groupId, artifactId, version);
this.userName = userName;
this.password = password;
}
public WorkbenchKnowledgeResource() {
}
public static WorkbenchKnowledgeResource createGuvnorRessource(String guvnor_url, String groupId, String artifactID, String version) {
return new WorkbenchKnowledgeResource(guvnor_url, groupId, artifactID, version);
}
public static WorkbenchKnowledgeResource createGuvnorRessource(String guvnor_url, String groupId, String artifactID, String version, String userName, String password) {
return new WorkbenchKnowledgeResource(guvnor_url, groupId, artifactID, version, userName, password);
}
public String getGuvnor_url() {
return guvnor_url;
}
public void setGuvnor_url(String guvnor_url) {
this.guvnor_url = guvnor_url;
}
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getArtifactID() {
return artifactID;
}
public void setArtifactID(String artifactID) {
this.artifactID = artifactID;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("GuvnorRessourceFile{");
sb.append("guvnor_url='").append(guvnor_url).append('\'');
sb.append('}');
return sb.toString();
}
}

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="Definition"
targetNamespace="http://www.jboss.org/drools"
typeLanguage="http://www.java.com/javaTypes"
expressionLanguage="http://www.mvel.org/2.0"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:g="http://www.jboss.org/drools/flow/gpd"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:tns="http://www.jboss.org/drools">
<process processType="Private" isExecutable="true" id="P1" artifactId="Hello World" tns:groupId="org.chtijbug.drools.runtime.test" >
<!-- nodes -->
<startEvent id="_1" artifactId="StartProcess" />
<endEvent id="_3" artifactId="EndProcess" />
<businessRuleTask id="_4" artifactId="Group1" g:ruleFlowGroup="Group1" >
</businessRuleTask>
<businessRuleTask id="_5" artifactId="Group2" g:ruleFlowGroup="Group2" >
</businessRuleTask>
<!-- connections -->
<sequenceFlow id="_5-_3" sourceRef="_5" targetRef="_3" />
<sequenceFlow id="_1-_4" sourceRef="_1" targetRef="_4" />
<sequenceFlow id="_4-_5" sourceRef="_4" targetRef="_5" />
</process>
<bpmndi:BPMNDiagram>
<bpmndi:BPMNPlane bpmnElement="P1" >
<bpmndi:BPMNShape bpmnElement="_1" >
<dc:Bounds x="16" y="16" width="48" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_3" >
<dc:Bounds x="462" y="28" width="48" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_4" >
<dc:Bounds x="161" y="64" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_5" >
<dc:Bounds x="304" y="50" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="_5-_3" >
<di:waypoint x="344" y="74" />
<di:waypoint x="486" y="52" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_1-_4" >
<di:waypoint x="40" y="40" />
<di:waypoint x="201" y="88" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_4-_5" >
<di:waypoint x="201" y="88" />
<di:waypoint x="344" y="74" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:change-set="http://drools.org/drools-5.0/change-set"
elementFormDefault="qualified"
targetNamespace="http://drools.org/drools-5.0/change-set">
<xsd:import namespace="http://www.w3.org/2001/XMLSchema-instance"/>
<xsd:element artifactId="change-set">
<xsd:complexType>
<xsd:choice>
<xsd:element ref="change-set:add"/>
<xsd:element ref="change-set:remove"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:element artifactId="add">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="change-set:resource"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element artifactId="remove">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="change-set:resource"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element artifactId="resource">
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0"/>
<xsd:element minOccurs="0" ref="change-set:decisiontable-conf"/>
</xsd:sequence>
<!-- URL to the resource, can be file based -->
<xsd:attribute artifactId="source" use="required" type="xsd:anyURI"/>
<!-- for example, DRL, or PKG -->
<xsd:attribute artifactId="type" use="required" type="xsd:string"/>
<xsd:attribute artifactId="basicAuthentication" type="xsd:string"/>
<xsd:attribute artifactId="username" type="xsd:string"/>
<xsd:attribute artifactId="password" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element artifactId="decisiontable-conf">
<xsd:complexType>
<xsd:attribute artifactId="input-type" use="required" type="xsd:NCName"/>
<xsd:attribute artifactId="worksheet-artifactId" use="required" type="xsd:NCName"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<change-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://drools.org/drools-5.0/change-set"
xsi:schemaLocation="http://drools.org/drools-5.0/change-set changeset-1.0.0.xsd">
<add>
<resource
type="PKG"
source="%s"
basicAuthentication="enabled"
username="%s"
password="%s">
</resource>
</add>
</change-set>

View file

@ -0,0 +1,49 @@
/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime
import org.chtijbug.drools.runtime.Fibonacci;
dialect "mvel"
rule Recurse
salience 10
when
not ( Fibonacci ( sequence == 1 ) )
f : Fibonacci ( value == -1 )
then
insert( new Fibonacci( f.sequence - 1 ) );
System.out.println( "recurse for " + f.sequence );
end
rule Bootstrap
when
f : Fibonacci( sequence == 1 || == 2, value == -1 ) // this is a multi-restriction || on a single field
then
modify ( f ){ value = 1 };
System.out.println( f.sequence + " == " + f.value );
end
rule Calculate
when
f1 : Fibonacci( s1 : sequence, value != -1 ) // here we bind sequence
f2 : Fibonacci( sequence == (s1 + 1 ), value != -1 ) // here we don't, just to demonstrate the different way bindings can be used
f3 : Fibonacci( s3 : sequence == (f2.sequence + 1 ), value == -1 )
then
modify ( f3 ) { value = f1.value + f2.value };
System.out.println( s3 + " == " + f3.value ); // see how you can access pattern and field bindings
end

View file

@ -0,0 +1,26 @@
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.Fibonacci;
rule "Account group1"
no-loop
ruleflow-group "Group1"
when
f : Fibonacci(sequence==0 )
then
update(f);
insert( new Fibonacci( 1 ) );
end
rule "Account group2"
ruleflow-group "Group2"
when
f : Fibonacci(sequence==1 )
then
retract(f);
insert( new Fibonacci( 2 ) );
end

View file

@ -0,0 +1,13 @@
package org.chtijbug;
public class Test {
String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View file

@ -0,0 +1,85 @@
package org.chtijbug.drools.runtime.impl;
import com.thoughtworks.xstream.XStream;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.io.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
/**
* Created with IntelliJ IDEA.
* User: Samuel
* Date: 26/11/12
* Time: 12:21
* To change this template use File | Settings | File Templates.
*/
public class RuleBasePackageTestCase {
private static String readFileAsString(String filePath)
throws java.io.IOException {
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(
new FileReader(filePath));
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
@Before
public void justBefore() {
// fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
}
@Test
@Ignore
public void testXStreamSerialization() {
try {
XStream xstream = new XStream();
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
String pkgXML = xstream.toXML(ruleBasePackage);
FileWriter fstream = new FileWriter("/tmp/chtijbug-rule-cache");
BufferedWriter out = new BufferedWriter(fstream);
out.write(pkgXML);
out.close();
} catch (IOException ex) {
Assert.fail(ex.getMessage());
} catch (DroolsChtijbugException e) {
Assert.fail(e.getMessage());
}
}
@Test
@Ignore
public void testXStreamDeserialization() {
String ruleBaseXML = null;
try {
ruleBaseXML = readFileAsString("/tmp/chtijbug-rule-cache");
if (ruleBaseXML == null)
fail();
XStream xStream = new XStream();
RuleBaseSingleton ruleBasePackage = (RuleBaseSingleton) xStream.fromXML(ruleBaseXML);
assertNotNull(ruleBasePackage);
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
fail();
}
}
}

View file

@ -0,0 +1,103 @@
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.runtime.resource.FileKnowledgeResource;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.*;
/**
* Created with IntelliJ IDEA.
* User: samuel
* Date: 28/09/12
* Time: 17:55
*/
public class RuleBaseStatefulSessionTestCase {
private static RuleBaseSingleton ruleBase;
private RuleBaseStatefulSession session;
private FileKnowledgeResource fibonacciFile;
@Before
public void before() throws Exception {
fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
ruleBase = new RuleBaseSingleton(1L, 5000, null, "com.pymmasoftware.test", "fibonacci", "1.0.0-SNAPSHOT");
// TODO Créer une kbase
ruleBase.createKBase(Arrays.asList(fibonacciFile));
// TODO créer une session à partir dela KBase
session = (RuleBaseStatefulSession) ruleBase.createRuleBaseSession();
}
@Test
public void runInsertByReflection() throws Exception {
DummyFact sibling = new DummyFact("sibling");
DummyFact item1 = new DummyFact("items 1");
DummyFact item2 = new DummyFact("items 2");
DummyFact root = new DummyFact("ROOT", sibling, Arrays.asList(item1, item2));
try {
//_____ Execute reflection insertion
session.insertByReflection(root);
//_____ Assert that all fact handle have been correctly created
Collection<DroolsFactObject> droolsFactObjects = session.listLastVersionObjects();
assertEquals(4, droolsFactObjects.size());
DroolsFactObject rootFactObject = session.getLastFactObjectVersion(root);
assertNotNull(rootFactObject);
DroolsFactObject siblingFactObject = session.getLastFactObjectVersion(sibling);
assertNotNull(siblingFactObject);
DroolsFactObject item1FactObject = session.getLastFactObjectVersion(item1);
assertNotNull(item1FactObject);
DroolsFactObject item2FactObject = session.getLastFactObjectVersion(item2);
assertNotNull(item2FactObject);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
public class DummyFact {
private String name;
private DummyFact property;
private List<DummyFact> listOfFacts;
DummyFact(String name) {
this.name = name;
}
DummyFact(String name, DummyFact property) {
this(name);
this.property = property;
}
DummyFact(String name, DummyFact property, List<DummyFact> listOfFacts) {
this(name, property);
this.listOfFacts = listOfFacts;
}
public String getName() {
return name;
}
public DummyFact getProperty() {
return property;
}
public List<DummyFact> getListOfFacts() {
return listOfFacts;
}
}
}

View file

@ -0,0 +1,79 @@
package org.chtijbug.drools.runtime.resource;
/**
* Created with IntelliJ IDEA.
* User: samuel
* Date: 26/09/12
* Time: 18:01
*/
public class WorkbenchResourceTestCase {
/**
@Test public void testRemoveTrailingSlash() {
String expected = "//String";
String toEval = WorkbenchResource.removeTrailingSlash("//String/");
assertEquals("Remove trailind '/' operation failed", expected, toEval);
}
@Test public void testGetWebResourceUrl() {
WorkbenchResource toTest = new WorkbenchResource("http://localhost:8080/", "drools-guvnor", "amag/", "LATEST", "tomcat", "tomcat");
String expected = "http://localhost:8080/drools-guvnor/org.drools.guvnor.Guvnor/package/amag/LATEST";
String toEval = toTest.getWebResourceUrl();
assertEquals("Expected webresource url not match", expected, toEval);
}
@Test public void testGetResource() {
WorkbenchResource toTest = new WorkbenchResource("http://localhost:8080/", "drools-guvnor", "amag/", "LATEST", "tomcat", "tomcat");
final String expectedChangeSet = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<change-set xmlns=\"http://drools.org/drools-5.0/change-set\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xsi:schemaLocation=\"http://drools.org/drools-5.0/change-set changeset-1.0.0.xsd\">" +
" <add>" +
" <resource" +
" type=\"PKG\"" +
" source=\"http://localhost:8080/drools-guvnor/org.drools.guvnor.Guvnor/package/amag/LATEST\"" +
" basicAuthentication=\"enabled\"" +
" username=\"tomcat\"" +
" password=\"tomcat\">" +
" </resource>" +
" </add>" +
"</change-set>";
try {
Resource toEval = toTest.getResource();
InputStreamReader reader = new InputStreamReader(toEval.getInputStream());
BufferedReader bufferedReader = new BufferedReader(reader);
StringWriter writer = new StringWriter();
String line;
while ( (line=bufferedReader.readLine()) != null ){
writer.write(line);
}
String generatedChangeSet = writer.toString();
assertEquals("Generated Change set does not match with the expected one.", expectedChangeSet, generatedChangeSet);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
public static String prettyFormat(String input, int indent) {
try {
Source xmlInput = new StreamSource(new StringReader(input));
StringWriter stringWriter = new StringWriter();
StreamResult xmlOutput = new StreamResult(stringWriter);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setAttribute("indent-number", indent);
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
return xmlOutput.getWriter().toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
*/
}

View file

@ -0,0 +1,123 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.runtime.*;
import org.junit.*;
import java.math.BigDecimal;
import static org.junit.Assert.assertTrue;
/**
* @author nheron
*/
public class DroolsFactObjectFactoryTest {
public DroolsFactObjectFactoryTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
// TODO add test methods here.
// The methods must be annotated with annotation @Test. For example:
//
@Test
public void TestIntrosepct() {
TestPojoOne underTest = new TestPojoOne();
DroolsFactObject fact = DroolsFactObjectFactory.createFactObject(underTest, 1);
assertTrue(fact.getListfactObjectAttributes().size() == 7);
}
@Test
@Ignore
public void TestIntrosepct2() throws DroolsChtijbugException {
RuleBasePackage kbase = RuleBaseBuilder.createRuleBasePackage(new Long("1"), null);
RuleBaseSession session = kbase.createRuleBaseSession(2000, null, null);
}
public class TestPojoOne {
private Long at01 = new Long(12);
private String at02 = "hello";
private Integer at03 = new Integer("12");
private BigDecimal at04 = new BigDecimal(12.04);
private int at10 = 1;
private short at11 = 1;
private double at12 = 12.99;
public Long getAt01() {
return at01;
}
public void setAt01(Long at01) {
this.at01 = at01;
}
public String getAt02() {
return at02;
}
public void setAt02(String at02) {
this.at02 = at02;
}
public Integer getAt03() {
return at03;
}
public void setAt03(Integer at03) {
this.at03 = at03;
}
public BigDecimal getAt04() {
return at04;
}
public void setAt04(BigDecimal at04) {
this.at04 = at04;
}
public int getAt10() {
return at10;
}
public void setAt10(int at10) {
this.at10 = at10;
}
public short getAt11() {
return at11;
}
public void setAt11(short at11) {
this.at11 = at11;
}
public double getAt12() {
return at12;
}
public void setAt12(double at12) {
this.at12 = at12;
}
}
}

View file

@ -0,0 +1,157 @@
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsFactObjectAttribute;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.fact.DeletedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.InsertedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.UpdatedFactHistoryEvent;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.junit.*;
/**
* Created by IntelliJ IDEA.
* Date: 26/09/12
* Time: 14:31
* To change this template use File | Settings | File Templates.
*/
public class FactHandlerListernerTestTest {
static RuleBaseSession session;
static RuleBasePackage ruleBasePackage;
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Before
public void justBefore() {
// insert1File = FileKnowledgeResource.createDRLClassPathResource("insert1.drl");
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
session.dispose();
}
@Test
public void test1ObjectInserted() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 1);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(0);
if (event instanceof InsertedFactHistoryEvent) {
Assert.assertEquals(1, 1);
Assert.assertEquals(session.getRuleBaseID(), event.getRuleBaseID());
Assert.assertEquals(session.getSessionId(), event.getSessionId());
InsertedFactHistoryEvent insertedFactHistoryEvent = (InsertedFactHistoryEvent) event;
DroolsFactObject droolsFactObject = insertedFactHistoryEvent.getInsertedObject();
for (DroolsFactObjectAttribute droolsFactObjectAttribute : droolsFactObject.getListfactObjectAttributes()) {
if (droolsFactObjectAttribute.getAttributeName().equals("value")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "-1");
} else if (droolsFactObjectAttribute.getAttributeName().equals("sequence")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "0");
}
}
}
}
@Test
public void test1ObjectUpdated() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
newObject.setValue(100);
session.updateObject(newObject);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 2);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(1);
if (event instanceof UpdatedFactHistoryEvent) {
Assert.assertEquals(1, 1);
Assert.assertEquals(session.getRuleBaseID(), event.getRuleBaseID());
Assert.assertEquals(session.getSessionId(), event.getSessionId());
UpdatedFactHistoryEvent updatedFactHistoryEvent = (UpdatedFactHistoryEvent) event;
DroolsFactObject droolsFactObject = updatedFactHistoryEvent.getObjectOldValue();
for (DroolsFactObjectAttribute droolsFactObjectAttribute : droolsFactObject.getListfactObjectAttributes()) {
if (droolsFactObjectAttribute.getAttributeName().equals("value")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "-1");
} else if (droolsFactObjectAttribute.getAttributeName().equals("sequence")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "0");
}
}
DroolsFactObject droolsFactObject2 = updatedFactHistoryEvent.getObjectNewValue();
Assert.assertEquals(droolsFactObject2.getObjectVersion(), 1);
for (DroolsFactObjectAttribute droolsFactObjectAttribute : droolsFactObject2.getListfactObjectAttributes()) {
if (droolsFactObjectAttribute.getAttributeName().equals("value")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "100");
} else if (droolsFactObjectAttribute.getAttributeName().equals("sequence")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "0");
}
}
}
}
@Test
public void retracted() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
session.retractObject(newObject);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 2);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(1);
if (event instanceof DeletedFactHistoryEvent) {
Assert.assertEquals(1, 1);
Assert.assertEquals(session.getRuleBaseID(), event.getRuleBaseID());
Assert.assertEquals(session.getSessionId(), event.getSessionId());
DeletedFactHistoryEvent deletedFactHistoryEvent = (DeletedFactHistoryEvent) event;
DroolsFactObject droolsFactObject = deletedFactHistoryEvent.getDeletedObject();
for (DroolsFactObjectAttribute droolsFactObjectAttribute : droolsFactObject.getListfactObjectAttributes()) {
if (droolsFactObjectAttribute.getAttributeName().equals("value")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "-1");
} else if (droolsFactObjectAttribute.getAttributeName().equals("sequence")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "0");
}
}
}
}
@Test
public void test1RuleFired() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
session.fireAllRules();
Assert.assertEquals(session.listRules().size(), 1);
Assert.assertEquals(session.listLastVersionObjects().size(), 1);
for (DroolsFactObject droolsFactObject : session.listLastVersionObjects()) {
Assert.assertEquals(droolsFactObject.getObjectVersion(), 0);
Assert.assertEquals(droolsFactObject.getFullClassName(), "org.chtijbug.drools.runtime.test.Fibonacci");
for (DroolsFactObjectAttribute droolsFactObjectAttribute : droolsFactObject.getListfactObjectAttributes()) {
if (droolsFactObjectAttribute.getAttributeName().equals("value")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "-1");
} else if (droolsFactObjectAttribute.getAttributeName().equals("sequence")) {
Assert.assertEquals(droolsFactObjectAttribute.getAttributeValue(), "0");
}
}
}
}
}

View file

@ -0,0 +1,178 @@
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsFactObjectAttribute;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.fact.*;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by IntelliJ IDEA.
* Date: 17/02/14
* Time: 15:37
* To change this template use File | Settings | File Templates.
*/
public class FactHistoryEventTest {
@Before
public void justBefore() {
//fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
}
@Test
public void KnowledgeSessionFact() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession = ruleBasePackage.createRuleBaseSession();
Fibonacci fibonacci = new Fibonacci(1);
ruleBaseSession.insertObject(fibonacci);
assertThat(historyEvents).hasSize(6);
assertThat(historyEvents.get(5)).isInstanceOfAny(InsertedFactHistoryEvent.class);
InsertedFactHistoryEvent insertedFactHistoryEvent = (InsertedFactHistoryEvent) historyEvents.get(5);
assertThat(insertedFactHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(insertedFactHistoryEvent.getEventID()).isEqualTo(2);
assertThat(insertedFactHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(insertedFactHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Fact);
DroolsFactObject droolsFactObject = insertedFactHistoryEvent.getInsertedObject();
assertThat(droolsFactObject.getFullClassName()).isEqualTo("org.chtijbug.drools.runtime.test.Fibonacci");
assertThat(droolsFactObject.getObjectVersion()).isEqualTo(0);
assertThat(droolsFactObject.getRealObject() instanceof Fibonacci);
assertThat(droolsFactObject.getListfactObjectAttributes()).hasSize(2);
DroolsFactObjectAttribute droolsFactObjectAttribute1 = droolsFactObject.getListfactObjectAttributes().get(0);
assertThat(droolsFactObjectAttribute1.getAttributeName()).isEqualTo("sequence");
assertThat(droolsFactObjectAttribute1.getAttributeValue()).isEqualTo("1");
assertThat(droolsFactObjectAttribute1.getAttributeType()).isEqualTo("Integer");
DroolsFactObjectAttribute droolsFactObjectAttribute2 = droolsFactObject.getListfactObjectAttributes().get(1);
assertThat(droolsFactObjectAttribute2.getAttributeName()).isEqualTo("value");
assertThat(droolsFactObjectAttribute2.getAttributeValue()).isEqualTo("-1");
assertThat(droolsFactObjectAttribute2.getAttributeType()).isEqualTo("Long");
fibonacci.setValue(-2);
ruleBaseSession.updateObject(fibonacci);
assertThat(historyEvents).hasSize(7);
assertThat(historyEvents.get(6) instanceof UpdatedFactHistoryEvent);
UpdatedFactHistoryEvent updatedFactHistoryEvent = (UpdatedFactHistoryEvent) historyEvents.get(6);
assertThat(updatedFactHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(updatedFactHistoryEvent.getEventID()).isEqualTo(3);
assertThat(updatedFactHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(updatedFactHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Fact);
DroolsFactObject oldDroolsFactObject = updatedFactHistoryEvent.getObjectOldValue();
assertThat(oldDroolsFactObject.getFullClassName()).isEqualTo("org.chtijbug.drools.runtime.test.Fibonacci");
assertThat(oldDroolsFactObject.getObjectVersion()).isEqualTo(0);
assertThat(oldDroolsFactObject.getRealObject()).isInstanceOf(Fibonacci.class);
assertThat(oldDroolsFactObject.getListfactObjectAttributes()).hasSize(2);
DroolsFactObjectAttribute oldDroolsFactObjectAttribute1 = oldDroolsFactObject.getListfactObjectAttributes().get(0);
assertThat(oldDroolsFactObjectAttribute1.getAttributeName()).isEqualTo("sequence");
assertThat(oldDroolsFactObjectAttribute1.getAttributeValue()).isEqualTo("1");
assertThat(oldDroolsFactObjectAttribute1.getAttributeType()).isEqualTo("Integer");
DroolsFactObjectAttribute oldDroolsFactObjectAttribute2 = oldDroolsFactObject.getListfactObjectAttributes().get(1);
assertThat(oldDroolsFactObjectAttribute2.getAttributeName()).isEqualTo("value");
assertThat(oldDroolsFactObjectAttribute2.getAttributeValue()).isEqualTo("-1");
assertThat(oldDroolsFactObjectAttribute2.getAttributeType()).isEqualTo("Long");
DroolsFactObject newDroolsFactObject = updatedFactHistoryEvent.getObjectNewValue();
assertThat(newDroolsFactObject.getFullClassName()).isEqualTo("org.chtijbug.drools.runtime.test.Fibonacci");
assertThat(newDroolsFactObject.getObjectVersion()).isEqualTo(1);
assertThat(newDroolsFactObject.getRealObject()).isInstanceOf(Fibonacci.class);
assertThat(newDroolsFactObject.getListfactObjectAttributes()).hasSize(2);
DroolsFactObjectAttribute newDroolsFactObjectAttribute1 = newDroolsFactObject.getListfactObjectAttributes().get(0);
assertThat(newDroolsFactObjectAttribute1.getAttributeName()).isEqualTo("sequence");
assertThat(newDroolsFactObjectAttribute1.getAttributeValue()).isEqualTo("1");
assertThat(newDroolsFactObjectAttribute1.getAttributeType()).isEqualTo("Integer");
DroolsFactObjectAttribute newDroolsFactObjectAttribute2 = newDroolsFactObject.getListfactObjectAttributes().get(1);
assertThat(newDroolsFactObjectAttribute2.getAttributeName()).isEqualTo("value");
assertThat(newDroolsFactObjectAttribute2.getAttributeValue()).isEqualTo("-2");
assertThat(newDroolsFactObjectAttribute2.getAttributeType()).isEqualTo("Long");
ruleBaseSession.retractObject(fibonacci);
assertThat(historyEvents).hasSize(8);
assertThat(historyEvents.get(7)).isInstanceOf(DeletedFactHistoryEvent.class);
DeletedFactHistoryEvent deletedFactHistoryEvent = (DeletedFactHistoryEvent) historyEvents.get(7);
assertThat(deletedFactHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(deletedFactHistoryEvent.getEventID()).isEqualTo(4);
assertThat(deletedFactHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(deletedFactHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Fact);
DroolsFactObject deletedDroolsFactObject = deletedFactHistoryEvent.getDeletedObject();
assertThat(deletedDroolsFactObject.getFullClassName()).isEqualTo("org.chtijbug.drools.runtime.test.Fibonacci");
assertThat(deletedDroolsFactObject.getObjectVersion()).isEqualTo(1);
assertThat(deletedDroolsFactObject.getRealObject()).isInstanceOf(Fibonacci.class);
assertThat(deletedDroolsFactObject.getListfactObjectAttributes()).hasSize(2);
DroolsFactObjectAttribute deletedDroolsFactObjectAttribute1 = deletedDroolsFactObject.getListfactObjectAttributes().get(0);
assertThat(deletedDroolsFactObjectAttribute1.getAttributeName()).isEqualTo("sequence");
assertThat(deletedDroolsFactObjectAttribute1.getAttributeValue()).isEqualTo("1");
assertThat(deletedDroolsFactObjectAttribute1.getAttributeType()).isEqualTo("Integer");
DroolsFactObjectAttribute deletedDroolsFactObjectAttribute2 = deletedDroolsFactObject.getListfactObjectAttributes().get(1);
assertThat(deletedDroolsFactObjectAttribute2.getAttributeName()).isEqualTo("value");
assertThat(deletedDroolsFactObjectAttribute2.getAttributeValue()).isEqualTo("-2");
assertThat(deletedDroolsFactObjectAttribute2.getAttributeType()).isEqualTo("Long");
}
@Test
public void KnowledgeSessionFactByReflection() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession = ruleBasePackage.createRuleBaseSession();
Fibonacci fibonacci = new Fibonacci(1);
ruleBaseSession.insertByReflection(fibonacci);
assertThat(historyEvents.size() == 8);
assertThat(historyEvents.get(5)).isInstanceOf(InsertedByReflectionFactStartHistoryEvent.class);
InsertedByReflectionFactStartHistoryEvent insertedByReflectionFactHistoryEvent = (InsertedByReflectionFactStartHistoryEvent) historyEvents.get(5);
assertThat(insertedByReflectionFactHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(insertedByReflectionFactHistoryEvent.getEventID()).isEqualTo(2);
assertThat(insertedByReflectionFactHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(insertedByReflectionFactHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Fact);
assertThat(historyEvents.get(6)).isInstanceOf(InsertedFactHistoryEvent.class);
InsertedFactHistoryEvent insertedFactHistoryEvent = (InsertedFactHistoryEvent) historyEvents.get(6);
assertThat(insertedFactHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(insertedFactHistoryEvent.getEventID()).isEqualTo(3);
assertThat(insertedFactHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(insertedFactHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Fact);
DroolsFactObject droolsFactObject = insertedFactHistoryEvent.getInsertedObject();
assertThat(droolsFactObject.getFullClassName()).isEqualTo("org.chtijbug.drools.runtime.test.Fibonacci");
assertThat(droolsFactObject.getObjectVersion()).isEqualTo(0);
assertThat(droolsFactObject.getRealObject()).isInstanceOf(Fibonacci.class);
assertThat(droolsFactObject.getListfactObjectAttributes()).hasSize(2);
DroolsFactObjectAttribute droolsFactObjectAttribute1 = droolsFactObject.getListfactObjectAttributes().get(0);
assertThat(droolsFactObjectAttribute1.getAttributeName()).isEqualTo("sequence");
assertThat(droolsFactObjectAttribute1.getAttributeValue()).isEqualTo("1");
assertThat(droolsFactObjectAttribute1.getAttributeType()).isEqualTo("Integer");
DroolsFactObjectAttribute droolsFactObjectAttribute2 = droolsFactObject.getListfactObjectAttributes().get(1);
assertThat(droolsFactObjectAttribute2.getAttributeName()).isEqualTo("value");
assertThat(droolsFactObjectAttribute2.getAttributeValue()).isEqualTo("-1");
assertThat(droolsFactObjectAttribute2.getAttributeType()).isEqualTo("Long");
assertThat(historyEvents.get(7)).isInstanceOf(InsertedByReflectionFactEndHistoryEvent.class);
InsertedByReflectionFactEndHistoryEvent insertedByReflectionFactEndHistoryEvent = (InsertedByReflectionFactEndHistoryEvent) historyEvents.get(7);
assertThat(insertedByReflectionFactEndHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(insertedByReflectionFactEndHistoryEvent.getEventID()).isEqualTo(4);
assertThat(insertedByReflectionFactEndHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(insertedByReflectionFactEndHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Fact);
}
}

View file

@ -0,0 +1,46 @@
/**
*
*/
package org.chtijbug.drools.runtime.test;
/**
* @author Bertrand Gressier
* @date 12 déc. 2011
* <p/>
* <p/>
* Source: http://legacy.drools.codehaus.org/Fibonacci+Example
*/
public class Fibonacci {
private int sequence;
private long value;
public Fibonacci(int sequence) {
this.sequence = sequence;
this.value = -1;
}
public Fibonacci(int sequence, long value) {
this.sequence = sequence;
this.value = value;
}
public Fibonacci() {
}
public int getSequence() {
return this.sequence;
}
public long getValue() {
return this.value;
}
public void setValue(long value) {
this.value = value;
}
@Override
public String toString() {
return "Fibonacci(" + this.sequence + "/" + this.value + ")";
}
}

View file

@ -0,0 +1,167 @@
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.knowledge.KnowledgeBaseCreateSessionEvent;
import org.chtijbug.drools.entity.history.session.SessionCreatedEvent;
import org.chtijbug.drools.entity.history.session.SessionDisposedEvent;
import org.chtijbug.drools.entity.history.session.SessionFireAllRulesBeginEvent;
import org.chtijbug.drools.entity.history.session.SessionFireAllRulesEndEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by IntelliJ IDEA.
* Date: 17/02/14
* Time: 15:09
* To change this template use File | Settings | File Templates.
*/
public class KnowledgeBaseHistoryEventTest {
@Before
public void justBefore() {
// fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
}
@Test
public void KnowledgeSessionEventOneSession() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession = ruleBasePackage.createRuleBaseSession();
assertThat(historyEvents).hasSize(5);
assertThat(historyEvents.get(3)).isInstanceOf(KnowledgeBaseCreateSessionEvent.class);
KnowledgeBaseCreateSessionEvent knowledgeBaseCreateSessionEvent = (KnowledgeBaseCreateSessionEvent) historyEvents.get(3);
assertThat(knowledgeBaseCreateSessionEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(knowledgeBaseCreateSessionEvent.getEventID()).isEqualTo(4);
assertThat(knowledgeBaseCreateSessionEvent.getSessionId()).isEqualTo(1);
assertThat(knowledgeBaseCreateSessionEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
assertThat(historyEvents.get(4)).isInstanceOf(SessionCreatedEvent.class);
SessionCreatedEvent sessionCreatedEvent = (SessionCreatedEvent) historyEvents.get(4);
assertThat(sessionCreatedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionCreatedEvent.getEventID()).isEqualTo(1);
assertThat(sessionCreatedEvent.getSessionId()).isEqualTo(1);
assertThat(sessionCreatedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
ruleBaseSession.dispose();
assertThat(historyEvents).hasSize(6);
assertThat(historyEvents.get(5)).isInstanceOf(SessionDisposedEvent.class);
SessionDisposedEvent sessionDisposedEvent = (SessionDisposedEvent) historyEvents.get(5);
assertThat(sessionDisposedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionDisposedEvent.getEventID()).isEqualTo(2);
assertThat(sessionDisposedEvent.getSessionId()).isEqualTo(1);
assertThat(sessionCreatedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
}
@Test
public void KnowledgeSessionEventTwoSession() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession1 = ruleBasePackage.createRuleBaseSession();
assertThat(historyEvents).hasSize(5);
assertThat(historyEvents.get(3)).isInstanceOf(KnowledgeBaseCreateSessionEvent.class);
KnowledgeBaseCreateSessionEvent knowledgeBaseCreateSessionEvent = (KnowledgeBaseCreateSessionEvent) historyEvents.get(3);
assertThat(knowledgeBaseCreateSessionEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(knowledgeBaseCreateSessionEvent.getEventID()).isEqualTo(4);
assertThat(knowledgeBaseCreateSessionEvent.getSessionId()).isEqualTo(1);
assertThat(knowledgeBaseCreateSessionEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
assertThat(historyEvents.get(4)).isInstanceOf(SessionCreatedEvent.class);
SessionCreatedEvent sessionCreatedEvent = (SessionCreatedEvent) historyEvents.get(4);
assertThat(sessionCreatedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionCreatedEvent.getEventID()).isEqualTo(1);
assertThat(sessionCreatedEvent.getSessionId()).isEqualTo(1);
assertThat(sessionCreatedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
RuleBaseSession ruleBaseSession2 = ruleBasePackage.createRuleBaseSession();
assertThat(historyEvents).hasSize(7);
assertThat(historyEvents.get(5)).isInstanceOf(KnowledgeBaseCreateSessionEvent.class);
KnowledgeBaseCreateSessionEvent knowledgeBaseCreateSessionEvent2 = (KnowledgeBaseCreateSessionEvent) historyEvents.get(5);
assertThat(knowledgeBaseCreateSessionEvent2.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(knowledgeBaseCreateSessionEvent2.getEventID()).isEqualTo(5);
assertThat(knowledgeBaseCreateSessionEvent2.getSessionId()).isEqualTo(2);
assertThat(knowledgeBaseCreateSessionEvent2.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
assertThat(historyEvents.get(6)).isInstanceOf(SessionCreatedEvent.class);
SessionCreatedEvent sessionCreatedEvent2 = (SessionCreatedEvent) historyEvents.get(6);
assertThat(sessionCreatedEvent2.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionCreatedEvent2.getEventID()).isEqualTo(1);
assertThat(sessionCreatedEvent2.getSessionId()).isEqualTo(2);
assertThat(sessionCreatedEvent2.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
ruleBaseSession1.dispose();
assertThat(historyEvents).hasSize(8);
assertThat(historyEvents.get(7)).isInstanceOf(SessionDisposedEvent.class);
SessionDisposedEvent sessionDisposedEvent = (SessionDisposedEvent) historyEvents.get(7);
assertThat(sessionDisposedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionDisposedEvent.getEventID()).isEqualTo(2);
assertThat(sessionDisposedEvent.getSessionId()).isEqualTo(1);
assertThat(sessionCreatedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
ruleBaseSession2.dispose();
assertThat(historyEvents).hasSize(9);
assertThat(historyEvents.get(8)).isInstanceOf(SessionDisposedEvent.class);
SessionDisposedEvent sessionDisposedEvent2 = (SessionDisposedEvent) historyEvents.get(8);
assertThat(sessionDisposedEvent2.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionDisposedEvent2.getEventID()).isEqualTo(2);
assertThat(sessionDisposedEvent2.getSessionId()).isEqualTo(2);
assertThat(sessionDisposedEvent2.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
}
@Test
public void KnowledgeBaseFireAllRules() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession1 = ruleBasePackage.createRuleBaseSession();
Fibonacci fibonacci = new Fibonacci(1);
ruleBaseSession1.insertObject(fibonacci);
ruleBaseSession1.fireAllRules();
assertThat(historyEvents).hasSize(11);
assertThat(historyEvents.get(6)).isInstanceOf(SessionFireAllRulesBeginEvent.class);
SessionFireAllRulesBeginEvent sessionFireAllRulesBeginEvent = (SessionFireAllRulesBeginEvent) historyEvents.get(6);
assertThat(sessionFireAllRulesBeginEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionFireAllRulesBeginEvent.getEventID()).isEqualTo(3);
assertThat(sessionFireAllRulesBeginEvent.getSessionId()).isEqualTo(1);
assertThat(sessionFireAllRulesBeginEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
assertThat(historyEvents.get(10)).isInstanceOf(SessionFireAllRulesEndEvent.class);
SessionFireAllRulesEndEvent sessionFireAllRulesEndEvent = (SessionFireAllRulesEndEvent) historyEvents.get(10);
assertThat(sessionFireAllRulesEndEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionFireAllRulesEndEvent.getEventID()).isEqualTo(7);
assertThat(sessionFireAllRulesEndEvent.getSessionId()).isEqualTo(1);
assertThat(sessionFireAllRulesEndEvent.getNumberRulesExecuted()).isEqualTo(1);
assertThat(sessionFireAllRulesEndEvent.getExecutionTime() > 0l);
assertThat(sessionFireAllRulesEndEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
}
}

View file

@ -0,0 +1,87 @@
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.knowledge.KnowledgeBaseAddResourceEvent;
import org.chtijbug.drools.entity.history.knowledge.KnowledgeBaseCreatedEvent;
import org.chtijbug.drools.entity.history.knowledge.KnowledgeBaseInitialLoadEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.chtijbug.drools.runtime.resource.FileKnowledgeResource;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by IntelliJ IDEA.
* Date: 17/02/14
* Time: 14:02
* To change this template use File | Settings | File Templates.
*/
public class RuleBaseHistoryEventTest {
private FileKnowledgeResource fibonacciFile;
@Before
public void justBefore() {
// fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
}
@Test
public void PackageCreationEvent() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
assertThat(historyEvents).hasSize(3);
assertThat(historyEvents.get(0)).isInstanceOf(KnowledgeBaseCreatedEvent.class);
KnowledgeBaseCreatedEvent knowledgeBaseCreatedEvent = (KnowledgeBaseCreatedEvent) historyEvents.get(0);
assertThat(knowledgeBaseCreatedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(knowledgeBaseCreatedEvent.getEventID()).isEqualTo(1);
assertThat(knowledgeBaseCreatedEvent.getSessionId()).isNull();
assertThat(knowledgeBaseCreatedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
assertThat(historyEvents.get(2)).isInstanceOf(KnowledgeBaseAddResourceEvent.class);
KnowledgeBaseAddResourceEvent knowledgeBaseAddResourceEvent = (KnowledgeBaseAddResourceEvent) historyEvents.get(2);
assertThat(knowledgeBaseAddResourceEvent.getEventID()).isEqualTo(3);
assertThat(knowledgeBaseAddResourceEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
assertThat(knowledgeBaseAddResourceEvent.getKnowledgeResources()).hasSize(1);
assertThat(knowledgeBaseAddResourceEvent.getKnowledgeResources().get(0)).isInstanceOf(FileKnowledgeResource.class);
FileKnowledgeResource drlRessourceFile = (FileKnowledgeResource) knowledgeBaseAddResourceEvent.getKnowledgeResources().get(0);
assertThat(drlRessourceFile.getPath()).isEqualTo("fibonacci.drl");
assertThat(historyEvents.get(1)).isInstanceOf(KnowledgeBaseInitialLoadEvent.class);
KnowledgeBaseInitialLoadEvent knowledgeBaseInitialLoadEvent = (KnowledgeBaseInitialLoadEvent) historyEvents.get(1);
assertThat(knowledgeBaseInitialLoadEvent.getEventID()).isEqualTo(2);
assertThat(knowledgeBaseInitialLoadEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
/** ruleBasePackage.RecreateKBaseWithNewResources(DrlDroolsResource.createClassPathResource("fibonacciBis.drl"));
assertThat(historyEvents.size() == 6);
assertThat(historyEvents.get(4) instanceof KnowledgeBaseAddResourceEvent);
KnowledgeBaseAddResourceEvent knowledgeBaseAddRessourceEvent2 = (KnowledgeBaseAddResourceEvent) historyEvents.get(4);
assertThat(knowledgeBaseAddRessourceEvent2.getEventID(), 5l);
assertThat(knowledgeBaseAddRessourceEvent2.getTypeEvent(), HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
assertThat(knowledgeBaseAddRessourceEvent2.getResourceFiles().size() == 1);
assertThat(knowledgeBaseAddRessourceEvent2.getResourceFiles().get(0) instanceof DrlResourceFile);
DrlResourceFile drlRessourceFile2 = (DrlResourceFile)knowledgeBaseAddRessourceEvent2.getResourceFiles().get(0);
assertThat(drlRessourceFile2.getFileName().equals("fibonacciBis.drl"));
assertThat(historyEvents.get(5) instanceof KnowledgeBaseReloadedEvent);
KnowledgeBaseReloadedEvent knowledgeBaseReloadedEvent = (KnowledgeBaseReloadedEvent) historyEvents.get(5);
assertThat(knowledgeBaseReloadedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(knowledgeBaseReloadedEvent.getEventID()).isEqualTo(6);
assertThat(knowledgeBaseReloadedEvent.getSessionId()).isEqualTo(0);
assertThat(knowledgeBaseReloadedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.KnowledgeBaseSingleton);
*/
}
}

View file

@ -0,0 +1,116 @@
/**
*
*/
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.resource.FileKnowledgeResource;
import org.junit.*;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
/**
* @author Bertrand Gressier @date 12 déc. 2011
*/
@RunWith(MockitoJUnitRunner.class)
public class RuleBaseStatefullSessionfibonacciTest {
static RuleBasePackage ruleBasePackage;
static private FileKnowledgeResource fibonacciFile;
RuleBaseSession session;
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
}
@Before
public void justBefore() {
}
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
session = ruleBasePackage.createRuleBaseSession();
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
session.dispose();
}
@Test
public void testFireAllRulesIsOk() throws Exception {
Assert.assertNotNull("RuleBaseSession can't be null", session);
// for (int i = 0; i < 1000; i++) {
RuleBaseSession session1 = ruleBasePackage.createRuleBaseSession();
Fibonacci fibonacci = new Fibonacci(5);
session1.insertObject(fibonacci);
session1.fireAllRules();
Assert.assertEquals(3, session1.listRules().size());
session1.dispose();
//Thread.sleep(2000);
//}
}
@Test
public void testFireAllRulesIsOk1() throws Exception {
Assert.assertNotNull("RuleBaseSession can't be null", session);
Fibonacci fibonacci = new Fibonacci(5);
session.insertObject(fibonacci);
session.fireAllRules();
for (HistoryEvent hevent : session.getHistoryContainer().getListHistoryEvent()) {
System.out.println(hevent);
}
Assert.assertEquals(3, session.listRules().size());
}
@Test
public void testFireAllRulesIsOk2() throws Exception {
Assert.assertNotNull("RuleBaseSession can't be null", session);
Fibonacci fibonacci = new Fibonacci(5);
session.insertObject(fibonacci);
session.fireAllRules();
for (HistoryEvent hevent : session.getHistoryContainer().getListHistoryEvent()) {
System.out.println(hevent);
}
Assert.assertEquals(3, session.listRules().size());
}
@Test
public void testFireAllRulesIs3Ok() throws Exception {
Assert.assertNotNull("RuleBaseSession can't be null", session);
Fibonacci fibonacci = new Fibonacci(5);
session.insertObject(fibonacci);
session.fireAllRules();
for (HistoryEvent hevent : session.getHistoryContainer().getListHistoryEvent()) {
System.out.println(hevent);
}
Assert.assertEquals(3, session.listRules().size());
}
}

View file

@ -0,0 +1,141 @@
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.DroolsFactObjectAttribute;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFiredHistoryEvent;
import org.chtijbug.drools.entity.history.rule.BeforeRuleFiredHistoryEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
/**
* Created by IntelliJ IDEA.
* Date: 23/11/12
* Time: 09:44
* To change this template use File | Settings | File Templates.
*/
public class RuleHandlerListenerTest {
static RuleBasePackage ruleBasePackage;
RuleBaseSession session;
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Before
public void justBefore() {
//infiniteLoopFile = FileKnowledgeResource.createDRLClassPathResource("infiniteLoop.drl");
//ruleflow1File = FileKnowledgeResource.createDRLClassPathResource("ruleflow1.drl");
//ruleFlowProcess1File = FileKnowledgeResource.createDRLClassPathResource("RuleFlowProcess1.bpmn2");
}
/**
* @throws java.lang.Exception
*/
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
@Test
public void DefaultMaxNumberRUleExecuted() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "infiniteLoop.drl");
session = ruleBasePackage.createRuleBaseSession();
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
try {
session.fireAllRules();
fail();
} catch (DroolsChtijbugException e) {
assertThat(e.getKey()).isEqualTo(DroolsChtijbugException.MaxNumberRuleExecutionReached);
}
}
@Test
public void max10tMaxNumberRUleExecuted() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "infiniteLoop.drl");
session = ruleBasePackage.createRuleBaseSession(10);
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
try {
session.fireAllRules();
fail();
} catch (DroolsChtijbugException e) {
assertThat(session.getNumberRulesExecuted()).isEqualTo(10);
assertThat(e.getKey()).isEqualTo(DroolsChtijbugException.MaxNumberRuleExecutionReached);
}
}
@Test
public void RuleEvent() throws DroolsChtijbugException {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "infiniteLoop.drl");
session = ruleBasePackage.createRuleBaseSession();
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
try {
session.fireAllRules();
} catch (DroolsChtijbugException e) {
e.printStackTrace();
}
List<HistoryEvent> eventList = session.getHistoryContainer().getListHistoryEvent();
assertThat(eventList).hasSize(6002);
/*
BeforeRuleFiredHistoryEvent
*/
HistoryEvent event1 = eventList.get(1);
assertThat(event1).isInstanceOf(BeforeRuleFiredHistoryEvent.class);
BeforeRuleFiredHistoryEvent beforeRuleFiredHistoryEvent = (BeforeRuleFiredHistoryEvent) event1;
assertThat(beforeRuleFiredHistoryEvent.getRule().getRuleName()).isEqualTo("infiniteLoop");
assertThat(beforeRuleFiredHistoryEvent.getWhenObjects().size()).isEqualTo(1);
assertThat(beforeRuleFiredHistoryEvent.getWhenObjects().get(0).getFullClassName()).isEqualTo("org.chtijbug.drools.runtime.test.Fibonacci");
assertThat(beforeRuleFiredHistoryEvent.getWhenObjects().get(0).getListfactObjectAttributes()).hasSize(2);
List<DroolsFactObjectAttribute> droolsFactObjectAttributes = beforeRuleFiredHistoryEvent.getWhenObjects().get(0).getListfactObjectAttributes();
assertThat(droolsFactObjectAttributes.get(0).getAttributeValue()).isEqualTo("0");
/*
AfterRuleFiredHistoryEvent
*/
HistoryEvent event3 = eventList.get(3);
assertThat(event3).isInstanceOf(AfterRuleFiredHistoryEvent.class);
AfterRuleFiredHistoryEvent afterRuleFiredHistoryEvent = (AfterRuleFiredHistoryEvent) event3;
assertThat(afterRuleFiredHistoryEvent.getRule().getRuleName()).isEqualTo("infiniteLoop");
}
@Test
public void RuleFLowgroup1() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "ruleflow1.drl", "RuleFlowProcess1.bpmn2");
session = ruleBasePackage.createRuleBaseSession();
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
session.startProcess("P1");
session.fireAllRules();
//assertThat(session.getNumberRulesExecuted(), 10);
}
}

View file

@ -0,0 +1,130 @@
package org.chtijbug.drools.runtime.test;
import org.chtijbug.drools.entity.DroolsRuleObject;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFiredHistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFlowActivatedHistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFlowDeactivatedHistoryEvent;
import org.chtijbug.drools.entity.history.rule.BeforeRuleFiredHistoryEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by IntelliJ IDEA.
* Date: 18/02/14
* Time: 13:11
* To change this template use File | Settings | File Templates.
*/
public class RuleHistoryEventTest {
@Before
public void justBefore() {
// fibonacciFile = FileKnowledgeResource.createDRLClassPathResource("fibonacci.drl");
// ruleflow2File = FileKnowledgeResource.createDRLClassPathResource("ruleflow2.drl");
// ruleFlowProcess2File = FileKnowledgeResource.createDRLClassPathResource("RuleFlowProcess2.bpmn2");
}
@Test
public void KnowledgeBaseFireAllRules() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession1 = ruleBasePackage.createRuleBaseSession();
Fibonacci fibonacci = new Fibonacci(1);
ruleBaseSession1.insertObject(fibonacci);
ruleBaseSession1.fireAllRules();
Assert.assertTrue(historyEvents.size() == 11);
Assert.assertTrue(historyEvents.get(7) instanceof BeforeRuleFiredHistoryEvent);
BeforeRuleFiredHistoryEvent beforeRuleFiredHistoryEvent = (BeforeRuleFiredHistoryEvent) historyEvents.get(7);
assertThat(beforeRuleFiredHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(beforeRuleFiredHistoryEvent.getEventID()).isEqualTo(4);
assertThat(beforeRuleFiredHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(beforeRuleFiredHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Rule);
DroolsRuleObject droolsRuleObject = beforeRuleFiredHistoryEvent.getRule();
assertThat(droolsRuleObject.getRuleName()).isEqualTo("Bootstrap");
assertThat(droolsRuleObject.getRulePackageName()).isEqualTo("org.chtijbug.drools.runtime.test");
Assert.assertTrue(historyEvents.get(9) instanceof AfterRuleFiredHistoryEvent);
AfterRuleFiredHistoryEvent afterRuleFiredHistoryEvent = (AfterRuleFiredHistoryEvent) historyEvents.get(9);
assertThat(afterRuleFiredHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(afterRuleFiredHistoryEvent.getEventID()).isEqualTo(6);
assertThat(afterRuleFiredHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(afterRuleFiredHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Rule);
DroolsRuleObject droolsRuleObject2 = afterRuleFiredHistoryEvent.getRule();
assertThat(droolsRuleObject2.getRuleName()).isEqualTo("Bootstrap");
assertThat(droolsRuleObject2.getRulePackageName()).isEqualTo("org.chtijbug.drools.runtime.test");
assertThat(afterRuleFiredHistoryEvent.getRuleInstanceId()).isEqualTo(1);
}
@Test
public void KnowledgeBaseFireAllRulesRuleFlowGroup() throws DroolsChtijbugException {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "ruleflow2.drl", "RuleFlowProcess2.bpmn2");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
RuleBaseSession ruleBaseSession1 = ruleBasePackage.createRuleBaseSession();
Fibonacci fibonacci = new Fibonacci(0);
ruleBaseSession1.insertObject(fibonacci);
ruleBaseSession1.startProcess("P1");
ruleBaseSession1.fireAllRules();
assertThat(historyEvents).hasSize(41);
assertThat(historyEvents.get(12)).isInstanceOfAny(AfterRuleFlowActivatedHistoryEvent.class);
AfterRuleFlowActivatedHistoryEvent afterRuleFlowActivatedHistoryEvent = (AfterRuleFlowActivatedHistoryEvent) historyEvents.get(12);
assertThat(afterRuleFlowActivatedHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(afterRuleFlowActivatedHistoryEvent.getEventID()).isEqualTo(8);
assertThat(afterRuleFlowActivatedHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(afterRuleFlowActivatedHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.RuleFlowGroup);
assertThat(afterRuleFlowActivatedHistoryEvent.getDroolsRuleFlowGroupObject().getName()).isEqualTo("Group1");
assertThat(historyEvents.get(15)).isInstanceOfAny(AfterRuleFiredHistoryEvent.class);
AfterRuleFiredHistoryEvent afterRuleFiredHistoryEvent = (AfterRuleFiredHistoryEvent) historyEvents.get(15);
assertThat(afterRuleFiredHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(afterRuleFiredHistoryEvent.getEventID()).isEqualTo(11);
assertThat(afterRuleFiredHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(afterRuleFiredHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Rule);
DroolsRuleObject droolsRuleObject2 = afterRuleFiredHistoryEvent.getRule();
assertThat(droolsRuleObject2.getRuleName()).isEqualTo("Account group1");
assertThat(droolsRuleObject2.getRulePackageName()).isEqualTo("org.chtijbug.drools.runtime.test");
assertThat(afterRuleFiredHistoryEvent.getRuleInstanceId()).isEqualTo(1);
assertThat(historyEvents.get(23)).isInstanceOf(AfterRuleFlowDeactivatedHistoryEvent.class);
AfterRuleFlowDeactivatedHistoryEvent afterRuleFlowDeactivatedHistoryEvent = (AfterRuleFlowDeactivatedHistoryEvent) historyEvents.get(23);
assertThat(afterRuleFlowDeactivatedHistoryEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(afterRuleFlowDeactivatedHistoryEvent.getEventID()).isEqualTo(19);
assertThat(afterRuleFlowDeactivatedHistoryEvent.getSessionId()).isEqualTo(1);
assertThat(afterRuleFlowDeactivatedHistoryEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.RuleFlowGroup);
assertThat(afterRuleFlowDeactivatedHistoryEvent.getDroolsRuleFlowGroupObject().getName()).isEqualTo("Group2");
}
}

View file

@ -0,0 +1,38 @@
/**
*
*/
package org.chtijbug.test.fibonacci;
/**
* @author Bertrand Gressier
* @date 12 déc. 2011
* <p/>
* <p/>
* Source: http://legacy.drools.codehaus.org/Fibonacci+Example
*/
public class Fibonacci {
private final int sequence;
private long value;
public Fibonacci(int sequence) {
this.sequence = sequence;
this.value = -1;
}
public int getSequence() {
return this.sequence;
}
public long getValue() {
return this.value;
}
public void setValue(long value) {
this.value = value;
}
@Override
public String toString() {
return "Fibonacci(" + this.sequence + "/" + this.value + ")";
}
}

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="Definition"
targetNamespace="http://www.jboss.org/drools"
typeLanguage="http://www.java.com/javaTypes"
expressionLanguage="http://www.mvel.org/2.0"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:g="http://www.jboss.org/drools/flow/gpd"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:tns="http://www.jboss.org/drools">
<process processType="Private" isExecutable="true" id="P1" artifactId="Hello World" tns:groupId="org.chtijbug.drools.runtime.test" >
<!-- nodes -->
<startEvent id="_1" artifactId="StartProcess" />
<endEvent id="_3" artifactId="EndProcess" />
<businessRuleTask id="_4" artifactId="Group1" g:ruleFlowGroup="Group1" >
</businessRuleTask>
<businessRuleTask id="_5" artifactId="Group2" g:ruleFlowGroup="Group2" >
</businessRuleTask>
<!-- connections -->
<sequenceFlow id="_5-_3" sourceRef="_5" targetRef="_3" />
<sequenceFlow id="_1-_4" sourceRef="_1" targetRef="_4" />
<sequenceFlow id="_4-_5" sourceRef="_4" targetRef="_5" />
</process>
<bpmndi:BPMNDiagram>
<bpmndi:BPMNPlane bpmnElement="P1" >
<bpmndi:BPMNShape bpmnElement="_1" >
<dc:Bounds x="16" y="16" width="48" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_3" >
<dc:Bounds x="462" y="28" width="48" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_4" >
<dc:Bounds x="161" y="64" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_5" >
<dc:Bounds x="304" y="50" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="_5-_3" >
<di:waypoint x="344" y="74" />
<di:waypoint x="486" y="52" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_1-_4" >
<di:waypoint x="40" y="40" />
<di:waypoint x="201" y="88" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_4-_5" >
<di:waypoint x="201" y="88" />
<di:waypoint x="344" y="74" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="Definition"
targetNamespace="http://www.jboss.org/drools"
typeLanguage="http://www.java.com/javaTypes"
expressionLanguage="http://www.mvel.org/2.0"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:g="http://www.jboss.org/drools/flow/gpd"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:tns="http://www.jboss.org/drools">
<process processType="Private" isExecutable="true" id="P1" artifactId="Hello World" tns:groupId="org.chtijbug.drools.runtime.test" >
<!-- nodes -->
<startEvent id="_1" artifactId="StartProcess" />
<endEvent id="_3" artifactId="EndProcess" />
<businessRuleTask id="_4" artifactId="Group1" g:ruleFlowGroup="Group1" >
</businessRuleTask>
<businessRuleTask id="_5" artifactId="Group2" g:ruleFlowGroup="Group2" >
</businessRuleTask>
<!-- connections -->
<sequenceFlow id="_5-_3" sourceRef="_5" targetRef="_3" />
<sequenceFlow id="_1-_4" sourceRef="_1" targetRef="_4" />
<sequenceFlow id="_4-_5" sourceRef="_4" targetRef="_5" />
</process>
<bpmndi:BPMNDiagram>
<bpmndi:BPMNPlane bpmnElement="P1" >
<bpmndi:BPMNShape bpmnElement="_1" >
<dc:Bounds x="16" y="16" width="48" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_3" >
<dc:Bounds x="462" y="28" width="48" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_4" >
<dc:Bounds x="161" y="64" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_5" >
<dc:Bounds x="304" y="50" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="_5-_3" >
<di:waypoint x="344" y="74" />
<di:waypoint x="486" y="52" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_1-_4" >
<di:waypoint x="40" y="40" />
<di:waypoint x="201" y="88" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_4-_5" >
<di:waypoint x="201" y="88" />
<di:waypoint x="344" y="74" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View file

@ -0,0 +1,49 @@
/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
dialect "mvel"
rule Recurse
salience 10
when
not ( Fibonacci ( sequence == 1 ) )
f : Fibonacci ( value == -1 )
then
insert( new Fibonacci( f.sequence - 1 ) );
System.out.println( "recurse for " + f.sequence );
end
rule Bootstrap
when
f : Fibonacci( sequence == 1 || == 2, value == -1 ) // this is a multi-restriction || on a single field
then
modify ( f ){ value = 1 };
System.out.println( f.sequence + " == " + f.value );
end
rule Calculate
when
f1 : Fibonacci( s1 : sequence, value != -1 ) // here we bind sequence
f2 : Fibonacci( sequence == (s1 + 1 ), value != -1 ) // here we don't, just to demonstrate the different way bindings can be used
f3 : Fibonacci( s3 : sequence == (f2.sequence + 1 ), value == -1 )
then
modify ( f3 ) { value = f1.value + f2.value };
System.out.println( s3 + " == " + f3.value ); // see how you can access pattern and field bindings
end

View file

@ -0,0 +1,49 @@
/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
dialect "mvel"
rule Recurse
salience 10
when
not ( Fibonacci ( sequence == 1 ) )
f : Fibonacci ( value == -1 )
then
insert( new Fibonacci( f.sequence - 1 ) );
System.out.println( "recurse for " + f.sequence );
end
rule Bootstrap
when
f : Fibonacci( sequence == 1 || == 2, value == -1 ) // this is a multi-restriction || on a single field
then
modify ( f ){ value = 1 };
System.out.println( f.sequence + " == " + f.value );
end
rule Calculate
when
f1 : Fibonacci( s1 : sequence, value != -1 ) // here we bind sequence
f2 : Fibonacci( sequence == (s1 + 1 ), value != -1 ) // here we don't, just to demonstrate the different way bindings can be used
f3 : Fibonacci( s3 : sequence == (f2.sequence + 1 ), value == -1 )
then
modify ( f3 ) { value = f1.value + f2.value };
System.out.println( s3 + " == " + f3.value ); // see how you can access pattern and field bindings
end

View file

@ -0,0 +1,29 @@
/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
dialect "mvel"
rule "infiniteLoop"
when
f : Fibonacci( )
then
update(f);
end

View file

@ -0,0 +1,28 @@
/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
dialect "mvel"
rule Recurse
when
then
insert( new Fibonacci( 0 ) );
end

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="org.chtijbug.drools.runtime" level="TRACE"/>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>

View file

@ -0,0 +1,22 @@
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
rule "Account group1"
ruleflow-group "Group1"
when
Fibonacci(sequence==0 )
then
insert( new Fibonacci( 1 ) );
end
rule "Account group2"
ruleflow-group "Group2"
when
Fibonacci(sequence==1 )
then
insert( new Fibonacci( 2 ) );
end

View file

@ -0,0 +1,22 @@
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
rule "Account group1"
ruleflow-group "Group1"
when
Fibonacci(sequence==0 )
then
insert( new Fibonacci( 1 ) );
end
rule "Account group2"
ruleflow-group "Group2"
when
Fibonacci(sequence==1 )
then
insert( new Fibonacci( 2 ) );
end

View file

@ -0,0 +1,29 @@
/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.chtijbug.drools.runtime.test
import org.chtijbug.drools.runtime.test.Fibonacci;
dialect "mvel"
rule "rule1"
when
Fibonacci(sequence==0 )
then
insert( new Fibonacci( 1 ) );
end