use of org.drools.core.WorkingMemoryEntryPoint in project drools by kiegroup.
the class EntryPointNode method updateSink.
public void updateSink(final ObjectSink sink, final PropagationContext context, final InternalWorkingMemory workingMemory) {
final ObjectTypeNode node = (ObjectTypeNode) sink;
final ObjectType newObjectType = node.getObjectType();
WorkingMemoryEntryPoint wmEntryPoint = workingMemory.getEntryPoint(this.entryPoint.getEntryPointId());
for (ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values()) {
if (objectTypeConf.getConcreteObjectTypeNode() != null && newObjectType.isAssignableFrom(objectTypeConf.getConcreteObjectTypeNode().getObjectType())) {
objectTypeConf.resetCache();
ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
Iterator<InternalFactHandle> it = workingMemory.getNodeMemory(sourceNode).iterator();
while (it.hasNext()) {
sink.assertObject(it.next(), context, workingMemory);
}
}
}
}
use of org.drools.core.WorkingMemoryEntryPoint in project drools by kiegroup.
the class RuleUnitExecutorImpl method dispose.
@Override
public void dispose() {
for (WorkingMemoryEntryPoint ep : this.entryPointsManager.getEntryPoints()) {
ep.dispose();
}
this.ruleRuntimeEventSupport.clear();
this.ruleEventListenerSupport.clear();
this.timerService.shutdown();
}
use of org.drools.core.WorkingMemoryEntryPoint in project drools by kiegroup.
the class ProtobufOutputMarshaller method serializeSession.
private static ProtobufMessages.KnowledgeSession serializeSession(MarshallerWriteContext context) throws IOException {
StatefulKnowledgeSessionImpl wm = (StatefulKnowledgeSessionImpl) context.getWorkingMemory();
try {
wm.getLock().lock();
for (EntryPoint ep : wm.getEntryPoints()) {
if (ep instanceof NamedEntryPoint) {
((NamedEntryPoint) ep).lock();
}
}
evaluateRuleActivations(wm);
ProtobufMessages.RuleData.Builder _ruleData = ProtobufMessages.RuleData.newBuilder();
long time = 0;
if (context.getWorkingMemory().getTimerService() instanceof PseudoClockScheduler) {
time = context.getClockTime();
}
_ruleData.setLastId(wm.getFactHandleFactory().getId());
_ruleData.setLastRecency(wm.getFactHandleFactory().getRecency());
InternalFactHandle handle = context.getWorkingMemory().getInitialFactHandle();
if (handle != null) {
// can be null for RETE, if fireAllRules has not yet been called
ProtobufMessages.FactHandle _ifh = ProtobufMessages.FactHandle.newBuilder().setType(ProtobufMessages.FactHandle.HandleType.INITIAL_FACT).setId(handle.getId()).setRecency(handle.getRecency()).build();
_ruleData.setInitialFact(_ifh);
}
writeAgenda(context, _ruleData);
writeNodeMemories(context, _ruleData);
for (EntryPoint wmep : wm.getEntryPoints()) {
ProtobufMessages.EntryPoint.Builder _epb = ProtobufMessages.EntryPoint.newBuilder();
_epb.setEntryPointId(wmep.getEntryPointId());
writeObjectTypeConfiguration(context, ((WorkingMemoryEntryPoint) wmep).getObjectTypeConfigurationRegistry(), _epb);
writeFactHandles(context, _epb, ((NamedEntryPoint) wmep).getObjectStore());
writeTruthMaintenanceSystem(context, wmep, _epb);
_ruleData.addEntryPoint(_epb.build());
}
writeActionQueue(context, _ruleData);
ProtobufMessages.KnowledgeSession.Builder _session = ProtobufMessages.KnowledgeSession.newBuilder().setMultithread(false).setTime(time).setRuleData(_ruleData.build());
if (processMarshaller != null) {
Builder _pdata = ProtobufMessages.ProcessData.newBuilder();
if (context.isMarshalProcessInstances()) {
context.setParameterObject(_pdata);
processMarshaller.writeProcessInstances(context);
}
if (context.isMarshalWorkItems()) {
context.setParameterObject(_pdata);
processMarshaller.writeWorkItems(context);
}
// this now just assigns the writer, it will not write out any timer information
context.setParameterObject(_pdata);
processMarshaller.writeProcessTimers(context);
_session.setProcessData(_pdata.build());
}
Timers _timers = writeTimers(context.getWorkingMemory().getTimerJobInstances(context.getWorkingMemory().getIdentifier()), context);
if (_timers != null) {
_session.setTimers(_timers);
}
return _session.build();
} finally {
for (EntryPoint ep : wm.getEntryPoints()) {
if (ep instanceof NamedEntryPoint) {
((NamedEntryPoint) ep).unlock();
}
}
wm.getLock().unlock();
}
}
use of org.drools.core.WorkingMemoryEntryPoint in project drools by kiegroup.
the class InputMarshaller method readFactHandle.
public static InternalFactHandle readFactHandle(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
int type = context.readInt();
long id = context.readLong();
long recency = context.readLong();
long startTimeStamp = 0;
long duration = 0;
boolean expired = false;
long activationsCount = 0;
if (type == 2) {
startTimeStamp = context.readLong();
duration = context.readLong();
expired = context.readBoolean();
activationsCount = context.readLong();
}
int strategyIndex = context.readInt();
ObjectMarshallingStrategy strategy = null;
// This is the old way of de/serializing strategy objects
if (strategyIndex >= 0) {
strategy = context.getResolverStrategyFactory().getStrategy(strategyIndex);
} else // This is the new way
if (strategyIndex == -2) {
String strategyClassName = context.readUTF();
if (!StringUtils.isEmpty(strategyClassName)) {
strategy = context.getResolverStrategyFactory().getStrategyObject(strategyClassName);
if (strategy == null) {
throw new IllegalStateException("No strategy of type " + strategyClassName + " available.");
}
}
}
// If either way retrieves a strategy, use it
Object object = null;
if (strategy != null) {
object = strategy.read((ObjectInputStream) context);
}
EntryPoint entryPoint = null;
if (context.readBoolean()) {
String entryPointId = context.readUTF();
if (entryPointId != null && !entryPointId.equals("")) {
entryPoint = ((RuleRuntime) context.getWorkingMemory()).getEntryPoint(entryPointId);
}
}
EntryPointId confEP;
if (entryPoint != null) {
confEP = ((NamedEntryPoint) entryPoint).getEntryPoint();
} else {
confEP = context.getWorkingMemory().getEntryPoint();
}
ObjectTypeConf typeConf = context.getWorkingMemory().getObjectTypeConfigurationRegistry().getOrCreateObjectTypeConf(confEP, object);
InternalFactHandle handle = null;
switch(type) {
case 0:
{
handle = new DefaultFactHandle(id, object, recency, (WorkingMemoryEntryPoint) entryPoint, typeConf != null && typeConf.isTrait());
break;
}
case 1:
{
handle = new QueryElementFactHandle(object, id, recency);
break;
}
case 2:
{
handle = new EventFactHandle(id, object, recency, startTimeStamp, duration, (WorkingMemoryEntryPoint) entryPoint, typeConf != null && typeConf.isTrait());
((EventFactHandle) handle).setExpired(expired);
((EventFactHandle) handle).setActivationsCount(activationsCount);
break;
}
default:
{
throw new IllegalStateException("Unable to marshal FactHandle, as type does not exist:" + type);
}
}
return handle;
}
use of org.drools.core.WorkingMemoryEntryPoint in project drools by kiegroup.
the class SimpleBeliefSystem method delete.
@Override
public void delete(SimpleMode mode, RuleImpl rule, Activation activation, Object payload, BeliefSet<SimpleMode> beliefSet, PropagationContext context) {
beliefSet.remove(mode);
InternalFactHandle bfh = beliefSet.getFactHandle();
if (beliefSet.isEmpty() && bfh.getEqualityKey() != null && bfh.getEqualityKey().getStatus() == EqualityKey.JUSTIFIED) {
ep.delete(bfh, bfh.getObject(), getObjectTypeConf(beliefSet), context.getRuleOrigin(), null, activation != null ? activation.getTuple().getTupleSink() : null);
} else if (!beliefSet.isEmpty() && bfh.getObject() == payload && payload != bfh.getObject()) {
// prime has changed, to update new object
// Equality might have changed on the object, so remove (which uses the handle id) and add back in
WorkingMemoryEntryPoint ep = bfh.getEntryPoint(this.ep.getReteEvaluator());
ep.getObjectStore().updateHandle(bfh, beliefSet.getFirst().getObject().getObject());
ep.update(bfh, bfh.getObject(), allSetButTraitBitMask(), Object.class, null);
}
if (beliefSet.isEmpty() && bfh.getEqualityKey() != null) {
// if the beliefSet is empty, we must null the logical handle
EqualityKey key = bfh.getEqualityKey();
key.setLogicalFactHandle(null);
((TruthMaintenanceSystemEqualityKey) key).setBeliefSet(null);
if (key.getStatus() == EqualityKey.JUSTIFIED) {
// if it's stated, there will be other handles, so leave it in the TMS
tms.remove(key);
}
}
}
Aggregations