📄 defaultagenda.java
字号:
package org.drools.common;
/*
* Copyright 2005 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.drools.Agenda;
import org.drools.WorkingMemory;
import org.drools.spi.Activation;
import org.drools.spi.ActivationGroup;
import org.drools.spi.AgendaFilter;
import org.drools.spi.AgendaGroup;
import org.drools.spi.ConsequenceException;
import org.drools.spi.KnowledgeHelper;
import org.drools.util.LinkedListNode;
import org.drools.util.Queueable;
/**
* Rule-firing Agenda.
*
* <p>
* Since many rules may be matched by a single assertObject(...) all scheduled
* actions are placed into the <code>Agenda</code>.
* </p>
*
* <p>
* While processing a scheduled action, it may modify or retract objects in
* other scheduled actions, which must then be removed from the agenda.
* Non-invalidated actions are left on the agenda, and are executed in turn.
* </p>
*
* @author <a href="mailto:bob@eng.werken.com">bob mcwhirter </a>
* @author <a href="mailto:simon@redhillconsulting.com.au">Simon Harris </a>
*/
public class DefaultAgenda
implements
Serializable,
InternalAgenda {
// ------------------------------------------------------------
// Instance members
// ------------------------------------------------------------
/**
*
*/
private static final long serialVersionUID = -9112292414291983688L;
/** Working memory of this Agenda. */
private final WorkingMemory workingMemory;
private org.drools.util.LinkedList scheduledActivations;
/** Items time-delayed. */
private final Map agendaGroups;
private final Map activationGroups;
private final LinkedList focusStack;
private AgendaGroupImpl currentModule;
private AgendaGroup main;
// ------------------------------------------------------------
// Constructors
// ------------------------------------------------------------
/**
* Construct.
*
* @param workingMemory
* The <code>WorkingMemory</code> of this agenda.
* @param conflictResolver
* The conflict resolver.
*/
public DefaultAgenda(final WorkingMemory workingMemory) {
this.workingMemory = workingMemory;
this.agendaGroups = new HashMap();
this.activationGroups = new HashMap();
this.focusStack = new LinkedList();
// MAIN should always be the first AgendaGroup and can never be removed
this.main = new AgendaGroupImpl( AgendaGroup.MAIN );
this.agendaGroups.put( AgendaGroup.MAIN,
this.main );
this.focusStack.add( this.main );
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#getWorkingMemory()
*/
public WorkingMemory getWorkingMemory() {
return this.workingMemory;
}
/**
* Schedule an agenda item for delayed firing.
*
* @param item
* The item to schedule.
*/
public void scheduleItem(final ScheduledAgendaItem item) {
Scheduler.getInstance().scheduleAgendaItem( item );
if ( this.scheduledActivations == null ) {
this.scheduledActivations = new org.drools.util.LinkedList();
}
this.scheduledActivations.add( item );
}
public void removeScheduleItem(final ScheduledAgendaItem item) {
this.scheduledActivations.remove( item );
item.cancel();
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#getScheduledItems()
*/
public org.drools.util.LinkedList getScheduledItems() {
return this.scheduledActivations;
}
public void addAgendaGroup(final AgendaGroup agendaGroup) {
this.agendaGroups.put( agendaGroup.getName(),
agendaGroup );
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#setFocus(org.drools.spi.AgendaGroup)
*/
public boolean setFocus(final AgendaGroup agendaGroup) {
// Set the focus to the agendaGroup if it doesn't already have the focus
if ( this.focusStack.getLast() != agendaGroup ) {
this.focusStack.add( agendaGroup );
return true;
}
return false;
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#setFocus(java.lang.String)
*/
public void setFocus(final String name) {
AgendaGroup agendaGroup = (AgendaGroup) this.agendaGroups.get( name );
// Agenda may not have been created yet, if not create it.
if ( agendaGroup == null ) {
agendaGroup = new AgendaGroupImpl( name );
( ( DefaultAgenda ) this.workingMemory.getAgenda() ).addAgendaGroup( agendaGroup );
}
setFocus( agendaGroup );
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#getFocus()
*/
public AgendaGroup getFocus() {
return (AgendaGroup) this.focusStack.getLast();
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#getNextFocus()
*/
public AgendaGroup getNextFocus() {
AgendaGroupImpl agendaGroup = null;
// Iterate untill we find a populate AgendaModule or we reach the MAIN, default, AgendaGroup
while ( true ) {
agendaGroup = (AgendaGroupImpl) this.focusStack.getLast();
final boolean empty = agendaGroup.isEmpty();
// No populated queus found so pop the focusStack and repeat
if ( empty && (this.focusStack.size() > 1) ) {
this.focusStack.removeLast();
} else {
agendaGroup = (empty) ? null : agendaGroup;
break;
}
}
return agendaGroup;
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#setCurrentAgendaGroup(org.drools.spi.AgendaGroup)
*/
public void setCurrentAgendaGroup(final AgendaGroup agendaGroup) {
this.currentModule = (AgendaGroupImpl) agendaGroup;
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#getCurrentAgendaGroup()
*/
public AgendaGroup getCurrentAgendaGroup() {
return this.currentModule;
}
/* (non-Javadoc)
* @see org.drools.common.AgendaI#getAgendaGroup(java.lang.String)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -