Impossible to post an asset when no asset are present in the project #184

This commit is contained in:
nheron 2020-11-19 14:16:55 +01:00
commit d74a774ebb
4 changed files with 34 additions and 20 deletions

View file

@ -15,6 +15,7 @@
*/ */
package org.chtijbug.drools.runtime.impl; package org.chtijbug.drools.runtime.impl;
import com.rits.cloning.Cloner;
import org.chtijbug.drools.entity.DroolsFactObject; import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.history.fact.DeletedFactHistoryEvent; import org.chtijbug.drools.entity.history.fact.DeletedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.FactHistoryEvent; import org.chtijbug.drools.entity.history.fact.FactHistoryEvent;
@ -42,9 +43,11 @@ public class FactHandlerListener implements RuleRuntimeEventListener {
private static Logger logger = LoggerFactory.getLogger(FactHandlerListener.class); private static Logger logger = LoggerFactory.getLogger(FactHandlerListener.class);
private final RuleBaseStatefulSession ruleBaseSession; private final RuleBaseStatefulSession ruleBaseSession;
private Cloner cloner;
public FactHandlerListener(RuleBaseStatefulSession ruleBaseSession) { public FactHandlerListener(RuleBaseStatefulSession ruleBaseSession, Cloner cloner) {
this.ruleBaseSession = ruleBaseSession; this.ruleBaseSession = ruleBaseSession;
this.cloner=cloner;
} }
@Override @Override
@ -54,9 +57,9 @@ public class FactHandlerListener implements RuleRuntimeEventListener {
//____ Updating reference into the facts map from knowledge Session //____ Updating reference into the facts map from knowledge Session
//((RuleTerminalNode)((RuleTerminalNodeLeftTuple)((org.drools.common.DefaultFactHandle)event.getFactHandle()).getFirstLeftTuple()).getSink()).getRule().getRuleFlowGroup() //((RuleTerminalNode)((RuleTerminalNodeLeftTuple)((org.drools.common.DefaultFactHandle)event.getFactHandle()).getFirstLeftTuple()).getSink()).getRule().getRuleFlowGroup()
FactHandle f = event.getFactHandle(); FactHandle f = event.getFactHandle();
Object newObject = event.getObject(); Object newObject = cloner.deepClone(event.getObject());
DroolsFactObject ff = DroolsFactObjectFactory.createFactObject(newObject); DroolsFactObject ff = DroolsFactObjectFactory.createFactObject(newObject);
ruleBaseSession.setData(f, newObject, ff); ruleBaseSession.setData(f, event.getObject(), ff);
//____ Adding the Insert Event from the History Container //____ Adding the Insert Event from the History Container
InsertedFactHistoryEvent insertFactHistoryEvent = new InsertedFactHistoryEvent(this.ruleBaseSession.nextEventId(), ff, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId()); InsertedFactHistoryEvent insertFactHistoryEvent = new InsertedFactHistoryEvent(this.ruleBaseSession.nextEventId(), ff, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
if (insertFactHistoryEvent.getRuleName() == null && event instanceof ObjectInsertedEventImpl) { if (insertFactHistoryEvent.getRuleName() == null && event instanceof ObjectInsertedEventImpl) {
@ -77,12 +80,11 @@ public class FactHandlerListener implements RuleRuntimeEventListener {
try { try {
//____ Updating FactHandle Object reference from the knwoledge session //____ Updating FactHandle Object reference from the knwoledge session
FactHandle f = event.getFactHandle(); FactHandle f = event.getFactHandle();
Object oldValue = event.getOldObject(); Object newValue = cloner.deepClone(event.getObject());
Object newValue = event.getObject();
DroolsFactObject factOldValue = this.ruleBaseSession.getLastFactObjectVersion(oldValue); DroolsFactObject factOldValue = this.ruleBaseSession.getLastFactObjectVersion(event.getOldObject());
DroolsFactObject factNewValue = DroolsFactObjectFactory.createFactObject(newValue, factOldValue.getNextObjectVersion()); DroolsFactObject factNewValue = DroolsFactObjectFactory.createFactObject(newValue, factOldValue.getNextObjectVersion());
ruleBaseSession.setData(f, newValue, factNewValue); ruleBaseSession.setData(f, event.getObject(), factNewValue);
//____ Adding the Update Event from the History Container //____ Adding the Update Event from the History Container
UpdatedFactHistoryEvent updatedFactHistoryEvent = new UpdatedFactHistoryEvent(this.ruleBaseSession.nextEventId(), factOldValue, factNewValue, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId()); UpdatedFactHistoryEvent updatedFactHistoryEvent = new UpdatedFactHistoryEvent(this.ruleBaseSession.nextEventId(), factOldValue, factNewValue, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
if (updatedFactHistoryEvent.getRuleName() == null && event instanceof ObjectUpdatedEventImpl) { if (updatedFactHistoryEvent.getRuleName() == null && event instanceof ObjectUpdatedEventImpl) {
@ -101,9 +103,9 @@ public class FactHandlerListener implements RuleRuntimeEventListener {
try { try {
//____ Removing FactHandle from the KnowledgeBase //____ Removing FactHandle from the KnowledgeBase
FactHandle f = event.getFactHandle(); FactHandle f = event.getFactHandle();
Object newObject = event.getOldObject(); Object deletedObject = cloner.deepClone(event.getOldObject());
DroolsFactObject deletedFact = this.ruleBaseSession.getLastFactObjectVersion(newObject); DroolsFactObject deletedFact = this.ruleBaseSession.getLastFactObjectVersion(event.getOldObject());
ruleBaseSession.unsetData(f, newObject); ruleBaseSession.unsetData(f, event.getOldObject());
//____ Adding a Delete Event from the HistoryContainer //____ Adding a Delete Event from the HistoryContainer
DeletedFactHistoryEvent deleteFactEvent = new DeletedFactHistoryEvent(this.ruleBaseSession.nextEventId(), deletedFact, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId()); DeletedFactHistoryEvent deleteFactEvent = new DeletedFactHistoryEvent(this.ruleBaseSession.nextEventId(), deletedFact, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());

View file

@ -15,6 +15,7 @@
*/ */
package org.chtijbug.drools.runtime.impl; package org.chtijbug.drools.runtime.impl;
import com.rits.cloning.Cloner;
import org.chtijbug.drools.entity.DroolsJbpmVariableObject; import org.chtijbug.drools.entity.DroolsJbpmVariableObject;
import org.chtijbug.drools.entity.DroolsNodeInstanceObject; import org.chtijbug.drools.entity.DroolsNodeInstanceObject;
import org.chtijbug.drools.entity.DroolsProcessInstanceObject; import org.chtijbug.drools.entity.DroolsProcessInstanceObject;
@ -37,8 +38,10 @@ public class ProcessHandlerListener implements ProcessEventListener {
*/ */
private final RuleBaseStatefulSession ruleBaseSession; private final RuleBaseStatefulSession ruleBaseSession;
public ProcessHandlerListener(RuleBaseStatefulSession ruleBaseSession) { private Cloner cloner;
public ProcessHandlerListener(RuleBaseStatefulSession ruleBaseSession, Cloner cloner) {
this.ruleBaseSession = ruleBaseSession; this.ruleBaseSession = ruleBaseSession;
this.cloner = cloner;
} }
@Override @Override

View file

@ -87,15 +87,16 @@ public class RuleBaseStatefulSession implements RuleBaseSession {
private HistoryListener historyListener; private HistoryListener historyListener;
private EventCounter eventCounter = EventCounter.newCounter(); private EventCounter eventCounter = EventCounter.newCounter();
private Cloner cloner = new Cloner(new ObjenesisInstantiationStrategy());
public RuleBaseStatefulSession(Long ruleBaseID, Long sessionId, KieSession knowledgeSession, int maxNumberRuleToExecute, HistoryListener historyListener) throws DroolsChtijbugException { public RuleBaseStatefulSession(Long ruleBaseID, Long sessionId, KieSession knowledgeSession, int maxNumberRuleToExecute, HistoryListener historyListener) throws DroolsChtijbugException {
this.ruleBaseID = ruleBaseID; this.ruleBaseID = ruleBaseID;
this.sessionId = sessionId; this.sessionId = sessionId;
this.knowledgeSession = knowledgeSession; this.knowledgeSession = knowledgeSession;
this.maxNumberRuleToExecute = maxNumberRuleToExecute; this.maxNumberRuleToExecute = maxNumberRuleToExecute;
this.factListener = new FactHandlerListener(this); this.factListener = new FactHandlerListener(this,cloner);
this.ruleHandlerListener = new RuleHandlerListener(this); this.ruleHandlerListener = new RuleHandlerListener(this,cloner);
this.processHandlerListener = new ProcessHandlerListener(this); this.processHandlerListener = new ProcessHandlerListener(this,cloner);
this.historyContainer = new HistoryContainer(sessionId, historyListener); this.historyContainer = new HistoryContainer(sessionId, historyListener);
this.listFactObjects = new HashMap<>(); this.listFactObjects = new HashMap<>();
this.listFact = new HashMap<>(); this.listFact = new HashMap<>();
@ -389,7 +390,7 @@ public class RuleBaseStatefulSession implements RuleBaseSession {
Thread currentThread = Thread.currentThread(); Thread currentThread = Thread.currentThread();
ClassLoader old = currentThread.getContextClassLoader(); ClassLoader old = currentThread.getContextClassLoader();
currentThread.setContextClassLoader(inputObject.getClass().getClassLoader()); currentThread.setContextClassLoader(inputObject.getClass().getClassLoader());
Cloner cloner = new Cloner(new ObjenesisInstantiationStrategy());
inputObjectClone=cloner.deepClone(inputObject); inputObjectClone=cloner.deepClone(inputObject);
currentThread.setContextClassLoader(old); currentThread.setContextClassLoader(old);
inputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObjectClone); inputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObjectClone);
@ -549,7 +550,6 @@ public class RuleBaseStatefulSession implements RuleBaseSession {
Object inputObjectClone; Object inputObjectClone;
if (inputObject != null) { if (inputObject != null) {
this.insertByReflection(inputObject); this.insertByReflection(inputObject);
Cloner cloner = new Cloner();
inputObjectClone=cloner.deepClone(inputObject); inputObjectClone=cloner.deepClone(inputObject);
inputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObjectClone); inputDroolsObject = DroolsFactObjectFactory.createFactObject(inputObjectClone);
} }

View file

@ -15,6 +15,7 @@
*/ */
package org.chtijbug.drools.runtime.impl; package org.chtijbug.drools.runtime.impl;
import com.rits.cloning.Cloner;
import org.chtijbug.drools.entity.DroolsFactObject; import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.DroolsRuleFlowGroupObject; import org.chtijbug.drools.entity.DroolsRuleFlowGroupObject;
import org.chtijbug.drools.entity.DroolsRuleObject; import org.chtijbug.drools.entity.DroolsRuleObject;
@ -35,6 +36,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
//import org.drools.core.common.InternalFactHandle; //import org.drools.core.common.InternalFactHandle;
@ -66,14 +68,17 @@ public class RuleHandlerListener extends DefaultAgendaEventListener {
*/ */
private int maxNumberRuleToExecute; private int maxNumberRuleToExecute;
private Cloner cloner;
/** /**
* IfMaxNumberRulewasReached * IfMaxNumberRulewasReached
*/ */
private boolean maxNumerExecutedRulesReached = false; private boolean maxNumerExecutedRulesReached = false;
public RuleHandlerListener(RuleBaseStatefulSession ruleBaseSession) { public RuleHandlerListener(RuleBaseStatefulSession ruleBaseSession, Cloner cloner) {
this.ruleBaseSession = ruleBaseSession; this.ruleBaseSession = ruleBaseSession;
this.maxNumberRuleToExecute = ruleBaseSession.getMaxNumberRuleToExecute(); this.maxNumberRuleToExecute = ruleBaseSession.getMaxNumberRuleToExecute();
this.cloner=cloner;
} }
public boolean isMaxNumerExecutedRulesReached() { public boolean isMaxNumerExecutedRulesReached() {
@ -96,14 +101,18 @@ public class RuleHandlerListener extends DefaultAgendaEventListener {
if (h instanceof DefaultFactHandle) { if (h instanceof DefaultFactHandle) {
InternalFactHandle defaultFactHandle = (InternalFactHandle) h; InternalFactHandle defaultFactHandle = (InternalFactHandle) h;
//System.out.println(defaultFactHandle.toString()); //System.out.println(defaultFactHandle.toString());
Object object = defaultFactHandle.getObject(); Object object = cloner.deepClone(defaultFactHandle.getObject());
DroolsFactObject sourceFactObject = ruleBaseSession.getLastFactObjectVersionFromFactHandle(h); DroolsFactObject sourceFactObject = ruleBaseSession.getLastFactObjectVersionFromFactHandle(h);
if (sourceFactObject==null){ if (sourceFactObject==null){
try { try {
if (object instanceof List){ if (object instanceof List){
List lst = (List)object; List lst = (List)object;
sourceFactObject = new DroolsFactObject(lst.toArray(), 1); List clonedList=new ArrayList();
}if (object instanceof InitialFactImpl){ for (Object l : lst){
clonedList.add(cloner.deepClone(l));
}
sourceFactObject = new DroolsFactObject(clonedList.toArray(), 1);
}else if (object instanceof InitialFactImpl){
//InitialFactImpl initialFact = (InitialFactImpl)object; //InitialFactImpl initialFact = (InitialFactImpl)object;
// Do Nothing for the time // Do Nothing for the time
} }