public void addActivation(AgendaItem item, boolean notify) { RuleImpl rule = item.getRule(); item.setQueued(true); // set the focus if rule autoFocus is true if (rule.getAutoFocus()) { this.setFocus(item.getPropagationContext(), rule.getAgendaGroup()); } // adds item to activation group if appropriate addItemToActivationGroup(item); final Timer timer = rule.getTimer(); if (timer != null && item instanceof ScheduledAgendaItem) { ScheduledAgendaItem sitem = (ScheduledAgendaItem) item; if (sitem.isEnqueued()) { // it's about to be re-added to scheduled list, so remove first this.scheduledActivations.remove(sitem); } scheduleItem(sitem, workingMemory); } else { addAgendaItemToGroup(item); } if (notify) { // if an activation is currently firing allows to completely fire it before to send the notify if (isFiringActivation) { mustNotifyHalt = true; } else { notifyHalt(); } } }
public boolean createPostponedActivation( final LeftTuple tuple, final PropagationContext context, final InternalWorkingMemory workingMemory, final TerminalNode rtn) { final RuleImpl rule = rtn.getRule(); AgendaItem item; if (rule.getCalendars() != null) { // for normal activations check for Calendar inclusion here, scheduled activations check on // each trigger point long timestamp = workingMemory.getSessionClock().getCurrentTime(); for (String cal : rule.getCalendars()) { if (!workingMemory.getCalendars().get(cal).isTimeIncluded(timestamp)) { return false; } } } InternalAgendaGroup agendaGroup = (InternalAgendaGroup) getAgendaGroup(rule.getAgendaGroup()); // do not add the activation if the rule is "lock-on-active" and the AgendaGroup is active if (rule.isLockOnActive() && agendaGroup.isActive() && agendaGroup.getAutoFocusActivator() != context) { return false; } item = createAgendaItem(tuple, 0, context, rtn, null, agendaGroup); item.setSalience( rule.getSalience() .getValue(new DefaultKnowledgeHelper(item, workingMemory), rule, workingMemory)); if (activationsFilter != null && !activationsFilter.accept(item, workingMemory, rtn)) { return false; } item.setQueued(true); tuple.increaseActivationCountForEvents(); ((EventSupport) workingMemory) .getAgendaEventSupport() .fireActivationCreated(item, workingMemory); return true; }
public boolean createActivation( final LeftTuple tuple, final PropagationContext context, final InternalWorkingMemory workingMemory, final TerminalNode rtn) { // First process control rules // Control rules do increase ActivationCountForEvent and agenda ActivateActivations, they do not // currently fire events // ControlRules for now re-use the same PropagationContext if (rtn.isFireDirect()) { // Fire RunLevel == 0 straight away. agenda-groups, rule-flow groups, salience are ignored AgendaItem item = createAgendaItem(tuple, 0, context, rtn, null, null); tuple.setObject(item); if (activationsFilter != null && !activationsFilter.accept(item, workingMemory, rtn)) { return false; } item.setQueued(true); tuple.increaseActivationCountForEvents(); fireActivation(item); // Control rules fire straight away. return true; } final RuleImpl rule = rtn.getRule(); AgendaItem item; final Timer timer = rule.getTimer(); InternalAgendaGroup agendaGroup = (InternalAgendaGroup) getAgendaGroup(rule.getAgendaGroup()); if (timer != null) { item = createScheduledAgendaItem(tuple, context, rtn, agendaGroup); } else { if (rule.getCalendars() != null) { // for normal activations check for Calendar inclusion here, scheduled activations check on // each trigger point long timestamp = workingMemory.getSessionClock().getCurrentTime(); for (String cal : rule.getCalendars()) { if (!workingMemory.getCalendars().get(cal).isTimeIncluded(timestamp)) { return false; } } } if (rule.isLockOnActive() && agendaGroup.isActive() && agendaGroup.getAutoFocusActivator() != context) { // do not add the activation if the rule is "lock-on-active" and the AgendaGroup is active if (tuple.getObject() == null) { tuple.setObject( Boolean .TRUE); // this is so we can do a check with a bit more intent than a null check // on modify } return false; } item = createAgendaItem(tuple, 0, context, rtn, null, agendaGroup); item.setSalience( rule.getSalience() .getValue(new DefaultKnowledgeHelper(item, workingMemory), rule, workingMemory)); } if (activationsFilter != null && !activationsFilter.accept(item, workingMemory, rtn)) { return false; } item.setQueued(true); tuple.increaseActivationCountForEvents(); ((EventSupport) workingMemory) .getAgendaEventSupport() .fireActivationCreated(item, workingMemory); return true; }