diff --git a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java index ac7b3617558..2542d90d44b 100644 --- a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java +++ b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java @@ -34,7 +34,6 @@ import org.kie.api.runtime.conf.QueryListenerOption; import org.kie.api.runtime.conf.SingleValueKieSessionOption; import org.kie.api.runtime.conf.ThreadSafeOption; -import org.kie.api.runtime.conf.TimedRuleExecutionFilter; import org.kie.api.runtime.conf.TimedRuleExecutionOption; import org.kie.internal.conf.CompositeConfiguration; import org.kie.internal.conf.InternalPropertiesConfiguration; @@ -47,27 +46,28 @@ public class RuleSessionConfiguration extends BaseConfiguration void setOption(T option) { switch (option.propertyName()) { - case DirectFiringOption.PROPERTY_NAME: { - setDirectFiring(((DirectFiringOption) option).isDirectFiring()); - break; - } - case ThreadSafeOption.PROPERTY_NAME: { - setThreadSafe(((ThreadSafeOption) option).isThreadSafe()); + case AccumulateNullPropagationOption.PROPERTY_NAME: { + setAccumulateNullPropagation(((AccumulateNullPropagationOption) option)); + break; + } + case BeliefSystemTypeOption.PROPERTY_NAME: { + setBeliefSystemType(((BeliefSystemType.resolveBeliefSystemType(((BeliefSystemTypeOption) option).getBeliefSystemType())))); break; } - case AccumulateNullPropagationOption.PROPERTY_NAME: { - setAccumulateNullPropagation(((AccumulateNullPropagationOption) option).isAccumulateNullPropagation()); + case DirectFiringOption.PROPERTY_NAME: { + setDirectFiringOption(((DirectFiringOption) option)); break; } case ForceEagerActivationOption.PROPERTY_NAME: { setForceEagerActivationFilter(((ForceEagerActivationOption) option).getFilter()); break; } - case TimedRuleExecutionOption.PROPERTY_NAME: { - setTimedRuleExecutionFilter(((TimedRuleExecutionOption) option).getFilter()); - break; - } case QueryListenerOption.PROPERTY_NAME: { setQueryListenerOption((QueryListenerOption) option); break; } - case BeliefSystemTypeOption.PROPERTY_NAME: { - setBeliefSystemType(((BeliefSystemType.resolveBeliefSystemType(((BeliefSystemTypeOption) option).getBeliefSystemType())))); + case ThreadSafeOption.PROPERTY_NAME: { + setThreadSafeOption(((ThreadSafeOption) option)); + break; + } + case TimedRuleExecutionOption.PROPERTY_NAME: { + setTimedRuleExecutionFilter(((TimedRuleExecutionOption) option)); break; } default: @@ -198,23 +177,32 @@ public final void setOption(T option) { } } - @SuppressWarnings("unchecked") + private void setThreadSafeOption(ThreadSafeOption threadSafeOption) { + checkCanChange(); + this.threadSafeOption = threadSafeOption; + + } + + @SuppressWarnings("unchecked") public final T getOption(OptionKey option) { switch (option.name()) { - case DirectFiringOption.PROPERTY_NAME: { - return (T) (isDirectFiring() ? DirectFiringOption.YES : DirectFiringOption.NO); - } - case ThreadSafeOption.PROPERTY_NAME: { - return (T) (isThreadSafe() ? ThreadSafeOption.YES : ThreadSafeOption.NO); + case AccumulateNullPropagationOption.PROPERTY_NAME: { + return (T) accumulateNullPropagation; + } + case BeliefSystemTypeOption.PROPERTY_NAME: { + return (T) BeliefSystemTypeOption.get( this.getBeliefSystemType().getId() ); } - case AccumulateNullPropagationOption.PROPERTY_NAME: { - return (T) (isAccumulateNullPropagation() ? AccumulateNullPropagationOption.YES : AccumulateNullPropagationOption.NO); + case DirectFiringOption.PROPERTY_NAME: { + return (T) directFiringOption; } case QueryListenerOption.PROPERTY_NAME: { - return (T) getQueryListenerOption(); + return (T) queryListenerOption; } - case BeliefSystemTypeOption.PROPERTY_NAME: { - return (T) BeliefSystemTypeOption.get( this.getBeliefSystemType().getId() ); + case ThreadSafeOption.PROPERTY_NAME: { + return (T) threadSafeOption; + } + case TimedRuleExecutionOption.PROPERTY_NAME: { + return (T) timedRuleExecutionOption; } default: return compConfig.getOption(option); @@ -234,15 +222,15 @@ public Set getOptionSubKeys(Optio public boolean setInternalProperty(String name, String value) { switch(name) { case DirectFiringOption.PROPERTY_NAME: { - setDirectFiring(!StringUtils.isEmpty(value) && Boolean.parseBoolean(value)); + setDirectFiringOption(DirectFiringOption.resolve(value)); break; } case ThreadSafeOption.PROPERTY_NAME: { - setThreadSafe(StringUtils.isEmpty(value) || Boolean.parseBoolean(value)); + setThreadSafeOption(ThreadSafeOption.resolve(value)); break; } case AccumulateNullPropagationOption.PROPERTY_NAME: { - setAccumulateNullPropagation(!StringUtils.isEmpty(value) && Boolean.parseBoolean(value)); + setAccumulateNullPropagation(AccumulateNullPropagationOption.resolve(value)); break; } case ForceEagerActivationOption.PROPERTY_NAME: { @@ -250,7 +238,7 @@ public boolean setInternalProperty(String name, String value) { break; } case TimedRuleExecutionOption.PROPERTY_NAME: { - setTimedRuleExecutionFilter(TimedRuleExecutionOption.resolve(StringUtils.isEmpty(value) ? "false" : value).getFilter()); + setTimedRuleExecutionFilter(TimedRuleExecutionOption.resolve(StringUtils.isEmpty(value) ? "false" : value)); break; } case QueryListenerOption.PROPERTY_NAME: { @@ -273,13 +261,13 @@ public boolean setInternalProperty(String name, String value) { public String getInternalProperty(String name) { switch(name) { case DirectFiringOption.PROPERTY_NAME: { - return Boolean.toString(isDirectFiring()); + return Boolean.toString(directFiringOption.isDirectFiring()); } case ThreadSafeOption.PROPERTY_NAME: { - return Boolean.toString(isThreadSafe()); + return Boolean.toString(threadSafeOption.isThreadSafe()); } case AccumulateNullPropagationOption.PROPERTY_NAME: { - return Boolean.toString(isAccumulateNullPropagation()); + return Boolean.toString(accumulateNullPropagation.isAccumulateNullPropagation()); } case QueryListenerOption.PROPERTY_NAME: { - return getQueryListenerOption().getAsString(); + return this.queryListenerOption.getAsString(); } case BeliefSystemTypeOption.PROPERTY_NAME: { return getBeliefSystemType().getId(); } diff --git a/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java b/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java index 99aa7325c81..2d952785537 100644 --- a/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java +++ b/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java @@ -30,6 +30,7 @@ import org.drools.core.util.ArrayQueue; import org.drools.core.util.Queue; import org.drools.core.util.QueueFactory; +import org.kie.api.runtime.conf.DirectFiringOption; /** * AgendaGroup implementation that uses a PriorityQueue to prioritise the evaluation of added @@ -89,7 +90,7 @@ public String getName() { public void setReteEvaluator(ReteEvaluator reteEvaluator) { this.reteEvaluator = reteEvaluator; // workingMemory can be null during deserialization - if (reteEvaluator != null && reteEvaluator.getRuleSessionConfiguration().isDirectFiring()) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { this.priorityQueue = new ArrayQueue<>(); } else { this.priorityQueue = QueueFactory.createQueue(RuleAgendaConflictResolver.INSTANCE); diff --git a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java index af13b91d4b5..e52344f7134 100644 --- a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java +++ b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java @@ -120,7 +120,4 @@ default FactHandleClassStore getStoreForClass(Class clazz) { void cancelActivation(InternalMatch internalMatch, boolean declarativeAgenda); - default boolean isThreadSafe() { - return getRuleSessionConfiguration().isThreadSafe(); - } } diff --git a/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java b/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java index bcad264fc93..58895531e01 100644 --- a/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java +++ b/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java @@ -94,9 +94,7 @@ default Collection getTimerJobInstances(long id) { long getNextPropagationIdCounter(); - default boolean isThreadSafe() { - return true; - } + boolean isThreadSafe(); default FactHandleClassStore getStoreForClass(Class clazz) { return getDefaultEntryPoint().getObjectStore().getStoreForClass(clazz); @@ -137,6 +135,8 @@ default KnowledgeHelper createKnowledgeHelper() { int fireAllRules(int max); int fireAllRules(AgendaFilter agendaFilter); int fireAllRules(AgendaFilter agendaFilter, int max); + + default void setWorkingMemoryActionListener(Consumer listener) { throw new UnsupportedOperationException(); diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java index df200e51249..c271be3f7cd 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java @@ -37,6 +37,7 @@ import org.drools.core.reteoo.Tuple; import org.drools.core.util.AbstractHashTable; import org.drools.core.util.FastIterator; +import org.kie.api.runtime.conf.AccumulateNullPropagationOption; import org.kie.api.runtime.rule.FactHandle; import static org.drools.core.phreak.RuleNetworkEvaluator.normalizeStagedTuples; @@ -633,7 +634,7 @@ protected void evaluateResultConstraints(final AccumulateNode accNode, Object result = accumulate.getResult(memory.workingMemoryContext, accctx, leftTuple, reteEvaluator); propagateResult( accNode, sink, leftTuple, context, reteEvaluator, memory, trgLeftTuples, stagedLeftTuples, - null, result, (AccumulateContextEntry) accctx, propagationContext, reteEvaluator.getRuleSessionConfiguration().isAccumulateNullPropagation()); + null, result, (AccumulateContextEntry) accctx, propagationContext, reteEvaluator.getRuleSessionConfiguration().getOption(AccumulateNullPropagationOption.KEY).isAccumulateNullPropagation()); } protected final void propagateResult(AccumulateNode accNode, LeftTupleSink sink, LeftTuple leftTuple, PropagationContext context, diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java index 2ae181fb55e..51c816254b8 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java @@ -32,6 +32,7 @@ import org.drools.core.rule.consequence.InternalMatch; import org.kie.api.definition.rule.Rule; import org.kie.api.event.rule.MatchCancelledCause; +import org.kie.api.runtime.conf.DirectFiringOption; /** * Created with IntelliJ IDEA. @@ -93,7 +94,7 @@ public static void doLeftTupleInsert(TerminalNode rtnNode, RuleExecutor executor ActivationsManager activationsManager, RuleAgendaItem ruleAgendaItem, LeftTuple leftTuple) { ReteEvaluator reteEvaluator = activationsManager.getReteEvaluator(); - if ( reteEvaluator.getRuleSessionConfiguration().isDirectFiring() ) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { executor.addLeftTuple(leftTuple); return; } @@ -172,7 +173,7 @@ public static void doLeftTupleUpdate(TerminalNode rtnNode, RuleExecutor executor RuleTerminalNodeLeftTuple rtnLeftTuple = (RuleTerminalNodeLeftTuple) leftTuple; ReteEvaluator reteEvaluator = activationsManager.getReteEvaluator(); - if ( reteEvaluator.getRuleSessionConfiguration().isDirectFiring() ) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { if (!rtnLeftTuple.isQueued() ) { executor.addLeftTuple( leftTuple ); reteEvaluator.getRuleEventSupport().onUpdateMatch( rtnLeftTuple ); diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java index 44a295b41c4..94f4ee09dc8 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java @@ -46,6 +46,7 @@ import org.kie.api.definition.rule.Rule; import org.kie.api.runtime.Calendars; import org.kie.api.runtime.conf.TimedRuleExecutionFilter; +import org.kie.api.runtime.conf.TimedRuleExecutionOption; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -376,7 +377,7 @@ private TimerAction( TimerNodeJobContext timerJobCtx ) { @Override public boolean requiresImmediateFlushing() { - return timerJobCtx.getReteEvaluator().getRuleSessionConfiguration().getTimedRuleExecutionFilter() != null; + return timerJobCtx.getReteEvaluator().getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY).getFilter() != null; } @Override @@ -404,7 +405,7 @@ public void execute( final ReteEvaluator reteEvaluator, boolean needEvaluation ) timerJobCtx.getTimerNodeMemory().setNodeDirtyWithoutNotify(); - TimedRuleExecutionFilter filter = reteEvaluator.getRuleSessionConfiguration().getTimedRuleExecutionFilter(); + TimedRuleExecutionFilter filter = reteEvaluator.getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY).getFilter(); needEvaluation &= filter != null; for (final PathMemory pmem : timerJobCtx.getPathMemories()) { diff --git a/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java b/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java index c41174eae9f..12bee318f76 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java +++ b/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java @@ -39,6 +39,7 @@ import org.drools.core.util.index.TupleList; import org.kie.api.event.rule.BeforeMatchFiredEvent; import org.kie.api.event.rule.MatchCancelledCause; +import org.kie.api.runtime.conf.DirectFiringOption; import org.kie.api.runtime.rule.AgendaFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,7 +89,7 @@ public int evaluateNetworkAndFire( ActivationsManager activationsManager, reEvaluateNetwork( activationsManager ); - if ( reteEvaluator.getRuleSessionConfiguration().isDirectFiring() ) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { RuleTerminalNode rtn = (RuleTerminalNode) pmem.getPathEndNode(); RuleImpl rule = rtn.getRule(); int directFirings = tupleList.size(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java index df8599620f4..fa0cbfe425f 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java @@ -71,6 +71,7 @@ import org.drools.wiring.api.ComponentsFactory; import org.kie.api.conf.EventProcessingOption; import org.kie.api.event.rule.MatchCancelledCause; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.AgendaFilter; import org.kie.api.runtime.rule.AgendaGroup; import org.slf4j.Logger; @@ -209,7 +210,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { this.workingMemory = workingMemory; this.agendaGroupsManager.setReteEvaluator( workingMemory ); - if ( !workingMemory.getRuleSessionConfiguration().isThreadSafe() ) { + if (!workingMemory.isThreadSafe()) { executionStateMachine = new UnsafeExecutionStateMachine(); } @@ -218,7 +219,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { } protected PropagationList createPropagationList() { - if (!workingMemory.getRuleSessionConfiguration().isThreadSafe()) { + if (!workingMemory.isThreadSafe()) { return new ThreadUnsafePropagationList( workingMemory ); } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java index 84b61b23bd9..34667e78c57 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java @@ -735,4 +735,8 @@ public SessionClock getSessionClock() { public ProcessInstance startProcessFromNodeIds(String processId, Map params, String... nodeIds) { return delegate.startProcessFromNodeIds(processId, params, nodeIds); } + + public boolean isThreadSafe() { + return delegate.isThreadSafe(); + } } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java index ef9c6ef273b..ce8a51e67ab 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java @@ -107,7 +107,7 @@ public NamedEntryPoint(EntryPointId entryPoint, this.entryPointNode = entryPointNode; this.reteEvaluator = reteEvaluator; this.ruleBase = this.reteEvaluator.getKnowledgeBase(); - this.lock = reteEvaluator.getRuleSessionConfiguration().isThreadSafe() ? new ReentrantLock() : null; + this.lock = reteEvaluator.isThreadSafe() ? new ReentrantLock() : null; this.handleFactory = this.reteEvaluator.getFactHandleFactory(); RuleBaseConfiguration conf = this.ruleBase.getRuleBaseConfiguration(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java index d9536eba62e..1c97f9cdfcc 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java @@ -124,6 +124,7 @@ import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.runtime.RequestContext; import org.kie.api.runtime.conf.QueryListenerOption; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.process.ProcessInstance; import org.kie.api.runtime.process.WorkItemHandler; import org.kie.api.runtime.process.WorkItemManager; @@ -243,6 +244,8 @@ public class StatefulKnowledgeSessionImpl extends AbstractRuntime private Consumer workingMemoryActionListener; + private boolean isThreadSafe; + // ------------------------------------------------------------ // Constructors // ------------------------------------------------------------ @@ -321,6 +324,9 @@ private StatefulKnowledgeSessionImpl(final long id, this.propagationIdCounter = new AtomicLong(propagationContext); this.config = config; this.ruleSessionConfig = config.as(RuleSessionConfiguration.KEY); + + isThreadSafe = ruleSessionConfig.getOption(ThreadSafeOption.KEY).isThreadSafe(); + this.environment = environment; this.propagationIdCounter = new AtomicLong( propagationContext); @@ -348,6 +354,7 @@ private StatefulKnowledgeSessionImpl(final long id, if (initInitFactHandle) { this.initialFactHandle = initInitialFact(null); } + } public StatefulKnowledgeSessionImpl setStateless( boolean stateless ) { @@ -517,6 +524,10 @@ public boolean isAlive() { public void destroy() { dispose(); } + + public boolean isThreadSafe() { + return isThreadSafe; + } public void update(FactHandle factHandle) { this.update(factHandle, @@ -1508,7 +1519,7 @@ public long getTotalFactCount() { */ @Override public void startOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().isThreadSafe() && this.opCounter.getAndIncrement() == 0 ) { + if (isThreadSafe() && this.opCounter.getAndIncrement() == 0 ) { // means the engine was idle, reset the timestamp this.lastIdleTimestamp.set(-1); } @@ -1530,7 +1541,7 @@ public void setEndOperationListener(EndOperationListener listener) { */ @Override public void endOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().isThreadSafe() && this.opCounter.decrementAndGet() == 0 ) { + if (isThreadSafe() && this.opCounter.decrementAndGet() == 0 ) { // means the engine is idle, so, set the timestamp if (this.timerService != null) { this.lastIdleTimestamp.set(this.timerService.getCurrentTime()); @@ -1754,4 +1765,6 @@ public ProcessInstance startProcessFromNodeIds(String processId, Map params, String... nodeIds) { return getProcessRuntime().startProcessFromNodeIds(processId, key, params, nodeIds); } + + } diff --git a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java index ca6f7522eb9..0faa6e45735 100644 --- a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java +++ b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java @@ -260,14 +260,25 @@ private Optional methodCallExprParameter(PatternDescr basePattern, B String rootNodeName = getRootNodeName(methodCallWithoutRootNode); Optional decl = context.getDeclarationById(rootNodeName); - Class clazz = decl.map(DeclarationSpec::getDeclarationClass) - .orElseGet( () -> { - try { - return context.getTypeResolver().resolveType(rootNodeName); - } catch (ClassNotFoundException e) { - throw new RuntimeException( e ); - } - } ); + Class clazz = null; + if (decl.isPresent()) { + clazz = decl.get().getDeclarationClass(); + } else { + try { + clazz= context.getTypeResolver().resolveType(rootNodeName); + } catch (ClassNotFoundException e) { + throw new RuntimeException( e ); + } + + } +// decl.map(DeclarationSpec::getDeclarationClass) +// .orElseGet( () -> { +// try { +// return context.getTypeResolver().resolveType(rootNodeName); +// } catch (ClassNotFoundException e) { +// throw new RuntimeException( e ); +// } +// } ); final ExpressionTyperContext expressionTyperContext = new ExpressionTyperContext(); final ExpressionTyper expressionTyper = new ExpressionTyper(context, clazz, bindingId, false, expressionTyperContext); diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java index def38ba6d76..8d76967db1e 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java @@ -148,6 +148,7 @@ import org.kie.api.definition.rule.Direct; import org.kie.api.definition.rule.Propagation; import org.kie.api.definition.type.Role; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.internal.builder.KnowledgeBuilderConfiguration; import org.kie.internal.builder.conf.PropertySpecificOption; @@ -391,6 +392,7 @@ private void processConsequence( RuleContext ctx, Consequence consequence, Strin // This is changed, because we must use the Declarations provided by the RTN, otherwise tuple indexes are not set. Declaration[] requiredDeclarations = getRequiredDeclarationsIfPossible( ctx, consequence, name ); boolean enabledTupleOptimization = requiredDeclarations != null && requiredDeclarations.length > 0; + if ( name.equals( RuleImpl.DEFAULT_CONSEQUENCE_NAME ) ) { if ("java".equals(consequence.getLanguage())) { diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java index b881816b9be..f97cccd8da2 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java @@ -30,6 +30,7 @@ import org.drools.core.reteoo.RuleTerminalNode; import org.drools.core.rule.consequence.KnowledgeHelper; import org.drools.model.Variable; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.FactHandle; public class LambdaConsequence implements Consequence { @@ -124,7 +125,7 @@ private Object[] fetchFacts( KnowledgeHelper knowledgeHelper, ValueResolver valu Object[] facts; FactHandleLookup fhLookup = null; - if (reteEvaluator.getRuleSessionConfiguration().isThreadSafe()) { + if (reteEvaluator.isThreadSafe()) { if ( consequence.isUsingDrools() ) { facts = new Object[consequence.getVariables().length + 1]; fhLookup = FactHandleLookup.create( factSuppliers.length ); @@ -216,7 +217,7 @@ private Object[] initConsequence( KnowledgeHelper knowledgeHelper, ReteEvaluator this.globalSuppliers = globalSuppliers.isEmpty() ? null : globalSuppliers.toArray( new GlobalSupplier[globalSuppliers.size()] ); this.factSuppliers = factSuppliers.toArray( new TupleFactSupplier[factSuppliers.size()] ); - if (!reteEvaluator.getRuleSessionConfiguration().isThreadSafe()) { + if (!reteEvaluator.isThreadSafe()) { this.facts = facts; this.fhLookup = fhLookup; } diff --git a/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java b/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java index 889bcd13fde..8850491eef8 100644 --- a/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java +++ b/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java @@ -300,6 +300,11 @@ public void dispose() { this.timerService.shutdown(); } + + @Override + public boolean isThreadSafe() { + return true; + } @Override public QueryResults getQueryResults(String queryName, Object... arguments) { diff --git a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java index c4428b9775a..453322dca71 100644 --- a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java +++ b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java @@ -57,6 +57,7 @@ import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.KieSessionConfiguration; +import org.kie.api.runtime.conf.AccumulateNullPropagationOption; import org.kie.api.runtime.rule.AccumulateFunction; import org.kie.api.runtime.rule.FactHandle; import org.kie.api.runtime.rule.Match; @@ -3674,7 +3675,7 @@ public void testAverageWithNoFacts() throws Exception { kieSession.delete( fh ); // changed by DROOLS-6064 - if ((kieSession.getSessionConfiguration().as(RuleSessionConfiguration.KEY)).isAccumulateNullPropagation()) { + if (kieSession.getSessionConfiguration().as(RuleSessionConfiguration.KEY).getOption(AccumulateNullPropagationOption.KEY).isAccumulateNullPropagation()) { assertThat(kieSession.fireAllRules()).isEqualTo(1); assertThat(list.size()).isEqualTo(1); assertThat(list.get(0)).isNull(); diff --git a/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java b/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java index 89abf9ed369..1ca37143173 100644 --- a/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java +++ b/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java @@ -61,4 +61,10 @@ public boolean isAccumulateNullPropagation() { return accumulateNullPropagation; } + + + public static AccumulateNullPropagationOption resolve(String value) { + return Boolean.valueOf( value ) ? YES : NO; + } + } diff --git a/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java b/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java index 448a2427a41..0a6d09b7991 100644 --- a/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java +++ b/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java @@ -62,4 +62,8 @@ public boolean isDirectFiring() { return directFiring; } + public static DirectFiringOption resolve(String value) { + return Boolean.valueOf( value ) ? YES : NO; + } + } \ No newline at end of file diff --git a/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java b/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java index 23f6d51cdc0..9cb62503ad1 100644 --- a/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java +++ b/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java @@ -61,5 +61,9 @@ public String getPropertyName() { public boolean isThreadSafe() { return threadSafe; } + + public static ThreadSafeOption resolve(String value) { + return Boolean.valueOf( value ) ? YES : NO; + } } \ No newline at end of file