private void checkDelaying(final BuildContext context, final Constraint constraint) { if (constraint instanceof VariableConstraint) { // variable constraints always require a single declaration Declaration target = constraint.getRequiredDeclarations()[0]; if (target.isPatternDeclaration() && target.getPattern().getObjectType().isEvent()) { long uplimit = ((VariableConstraint) constraint).getInterval().getUpperBound(); Timer timer = context.getRule().getTimer(); DurationTimer durationTimer = new DurationTimer(uplimit); if (timer instanceof CompositeMaxDurationTimer) { // already a composite so just add ((CompositeMaxDurationTimer) timer).addDurationTimer(durationTimer); } else { if (timer == null) { // no timer exists, so ok on it's own timer = durationTimer; } else { // timer exists so we need to make a composite CompositeMaxDurationTimer temp = new CompositeMaxDurationTimer(); if (timer instanceof DurationTimer) { // previous timer was a duration, so add another DurationTimer temp.addDurationTimer((DurationTimer) timer); } else { // previous timer was not a duration, so set it as the delegate Timer. temp.setTimer(context.getRule().getTimer()); } // now add the new durationTimer temp.addDurationTimer(durationTimer); timer = temp; } // with the composite made, reset it on the Rule context.getRule().setTimer(timer); } } } }
public void build(BuildContext context, BuildUtils utils, RuleConditionElement rce) { NamedConsequence namedConsequence = (NamedConsequence) rce; Timer timer = context.getRule().getTimer(); if (timer != null) { ReteooComponentBuilder builder = utils.getBuilderFor(Timer.class); builder.build(context, utils, context.getRule().getTimer()); } RuleTerminalNode terminalNode = buildTerminalNodeForNamedConsequence(context, namedConsequence); terminalNode.attach(context); terminalNode.networkUpdated(new UpdateContext()); // adds the terminal node to the list of nodes created/added by this sub-rule context.getNodes().add(terminalNode); if (timer != null) { context.setTupleSource(context.getTupleSource().getLeftTupleSource()); } context.setTerminated(namedConsequence.isTerminal()); }
static RuleTerminalNode buildTerminalNodeForNamedConsequence( BuildContext context, NamedConsequence namedConsequence) { RuleImpl rule = context.getRule(); GroupElement subrule = (GroupElement) context.peek(); ActivationListenerFactory factory = context .getKnowledgeBase() .getConfiguration() .getActivationListenerFactory(rule.getActivationListener()); context.setConsequenceName(namedConsequence.getConsequenceName()); TerminalNode terminal = factory.createActivationListener( context.getNextId(), context.getTupleSource(), rule, subrule, 0, // subruleIndex, context); context.setConsequenceName(null); return (RuleTerminalNode) terminal; }