private static ProtobufMessages.FactHandle writeFactHandle( MarshallerWriteContext context, ObjectMarshallingStrategyStore objectMarshallingStrategyStore, InternalFactHandle handle) throws IOException { ProtobufMessages.FactHandle.Builder _handle = ProtobufMessages.FactHandle.newBuilder(); _handle.setType(getHandleType(handle)); _handle.setId(handle.getId()); _handle.setRecency(handle.getRecency()); if (_handle.getType() == ProtobufMessages.FactHandle.HandleType.EVENT) { // is event EventFactHandle efh = (EventFactHandle) handle; _handle.setTimestamp(efh.getStartTimestamp()); _handle.setDuration(efh.getDuration()); _handle.setIsExpired(efh.isExpired()); _handle.setActivationsCount(efh.getActivationsCount()); } if (handle.getEqualityKey() != null && handle.getEqualityKey().getStatus() == EqualityKey.JUSTIFIED) { _handle.setIsJustified(true); } else { _handle.setIsJustified(false); } Object object = handle.getObject(); if (object != null) { ObjectMarshallingStrategy strategy = objectMarshallingStrategyStore.getStrategyObject(object); Integer index = context.getStrategyIndex(strategy); _handle.setStrategyIndex(index.intValue()); _handle.setObject( ByteString.copyFrom( strategy.marshal(context.strategyContext.get(strategy), context, object))); } return _handle.build(); }
/** * Fire this item. * * @param activation The activation to fire * @throws org.drools.core.spi.ConsequenceException If an error occurs while attempting to fire * the consequence. */ public synchronized void fireActivation(final Activation activation) throws ConsequenceException { // We do this first as if a node modifies a fact that causes a recursion // on an empty pattern // we need to make sure it re-activates this.workingMemory.startOperation(); isFiringActivation = true; try { final EventSupport eventsupport = (EventSupport) this.workingMemory; eventsupport .getAgendaEventSupport() .fireBeforeActivationFired(activation, this.workingMemory); if (activation.getActivationGroupNode() != null) { // We know that this rule will cancel all other activations in the group // so lets remove the information now, before the consequence fires final InternalActivationGroup activationGroup = activation.getActivationGroupNode().getActivationGroup(); activationGroup.removeActivation(activation); clearAndCancelActivationGroup(activationGroup); } activation.setQueued(false); try { this.knowledgeHelper.setActivation(activation); if (log.isTraceEnabled()) { log.trace("Fire \"{}\" \n{}", activation.getRule().getName(), activation.getTuple()); } activation.getConsequence().evaluate(this.knowledgeHelper, this.workingMemory); this.knowledgeHelper.cancelRemainingPreviousLogicalDependencies(); this.knowledgeHelper.reset(); } catch (final Exception e) { if (this.legacyConsequenceExceptionHandler != null) { this.legacyConsequenceExceptionHandler.handleException(activation, this.workingMemory, e); } else if (this.consequenceExceptionHandler != null) { this.consequenceExceptionHandler.handleException( activation, this.workingMemory.getKnowledgeRuntime(), e); } else { throw new RuntimeException(e); } } finally { if (activation.getFactHandle() != null) { // update the Activation in the WM InternalFactHandle factHandle = activation.getFactHandle(); workingMemory .getEntryPointNode() .modifyActivation(factHandle, activation.getPropagationContext(), workingMemory); activation.getPropagationContext().evaluateActionQueue(workingMemory); } // if the tuple contains expired events for (LeftTuple tuple = activation.getTuple(); tuple != null; tuple = tuple.getParent()) { if (tuple.getLastHandle() == null) { // can be null for eval, not and exists that have no right input continue; } if (tuple.getLastHandle().isEvent()) { EventFactHandle handle = (EventFactHandle) tuple.getLastHandle(); // decrease the activation count for the event handle.decreaseActivationsCount(); // handles "expire" only in stream mode. if (handle.isExpired()) { if (handle.getActivationsCount() <= 0) { // and if no more activations, retract the handle handle.getEntryPoint().retract(handle); } } } } } eventsupport.getAgendaEventSupport().fireAfterActivationFired(activation, this.workingMemory); unstageActivations(); } finally { isFiringActivation = false; if (mustNotifyHalt) { mustNotifyHalt = false; notifyHalt(); } this.workingMemory.endOperation(); } }