[jboss-svn-commits] JBL Code SVN: r12475 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/common and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jun 11 20:09:02 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-06-11 20:09:02 -0400 (Mon, 11 Jun 2007)
New Revision: 12475
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DefaultConflictResolver.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
Log:
JBRULES-919 Pluggeable Conflict Resolvers
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java 2007-06-12 00:09:02 UTC (rev 12475)
@@ -20,6 +20,7 @@
import java.util.Properties;
import org.drools.concurrent.ExecutorService;
+import org.drools.spi.ConflictResolver;
import org.drools.util.ChainedProperties;
/**
@@ -76,6 +77,8 @@
private LogicalOverride logicalOverride;
private ExecutorService executorService;
+ private ConflictResolver conflictResolver;
+
public RuleBaseConfiguration(Properties properties) {
init(properties);
}
@@ -125,7 +128,10 @@
"DISCARD" ) ) );
setExecutorService( RuleBaseConfiguration.determineExecutorService( this.chainedProperties.getProperty( "drools.executorService",
- "org.drools.concurrent.DefaultExecutorService" ) ) );
+ "org.drools.concurrent.DefaultExecutorService" ) ) );
+
+ setConflictResolver( RuleBaseConfiguration.determineConflictResolver( this.chainedProperties.getProperty( "drools.conflictResolver",
+ "org.drools.conflict.DepthConflictResolver" ) ) );
}
/**
@@ -369,5 +375,38 @@
return "LogicalOverride : " + ( ( this.value == 0) ? "preserve" : "discard" );
}
}
+
+ public static ConflictResolver determineConflictResolver(String className) {
+ Class clazz = null;
+ try {
+ clazz = Thread.currentThread().getContextClassLoader().loadClass( className );
+ } catch ( ClassNotFoundException e ) {
+ }
+ if ( clazz == null ) {
+ try {
+ clazz = RuleBaseConfiguration.class.getClassLoader().loadClass( className );
+ } catch ( ClassNotFoundException e ) {
+ }
+ }
+
+ if ( clazz != null ) {
+ try {
+ return (ConflictResolver) clazz.getMethod( "getInstance", null ).invoke( null, null );
+ } catch ( Exception e ) {
+ throw new IllegalArgumentException( "Unable to Conflict Resolver '" + className + "'" );
+ }
+ } else {
+ throw new IllegalArgumentException( "conflict Resolver '" + className + "' not found" );
+ }
+ }
+
+ public void setConflictResolver(ConflictResolver conflictResolver) {
+ this.conflictResolver = conflictResolver;
+ }
+
+ public ConflictResolver getConflictResolver() {
+ return this.conflictResolver;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java 2007-06-12 00:09:02 UTC (rev 12475)
@@ -19,6 +19,7 @@
import org.drools.conflict.DepthConflictResolver;
import org.drools.spi.Activation;
import org.drools.spi.AgendaGroup;
+import org.drools.spi.ConflictResolver;
import org.drools.util.BinaryHeapQueue;
import org.drools.util.Queueable;
@@ -53,10 +54,12 @@
* @param name
* The <AgendaGroup> name.
*/
- public AgendaGroupImpl(final String name) {
+
+
+ public AgendaGroupImpl(final String name, final ConflictResolver conflictResolver) {
this.name = name;
- this.queue = new BinaryHeapQueue( DepthConflictResolver.getInstance() );
- }
+ this.queue = new BinaryHeapQueue( conflictResolver );
+ }
/* (non-Javadoc)
* @see org.drools.spi.AgendaGroup#getName()
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java 2007-06-12 00:09:02 UTC (rev 12475)
@@ -31,6 +31,7 @@
import org.drools.spi.ActivationGroup;
import org.drools.spi.AgendaFilter;
import org.drools.spi.AgendaGroup;
+import org.drools.spi.ConflictResolver;
import org.drools.spi.ConsequenceException;
import org.drools.spi.RuleFlowGroup;
import org.drools.util.LinkedListNode;
@@ -64,32 +65,33 @@
/**
*
*/
- private static final long serialVersionUID = 320L;
+ private static final long serialVersionUID = 320L;
/** Working memory of this Agenda. */
private final InternalWorkingMemory workingMemory;
- private org.drools.util.LinkedList scheduledActivations;
+ private org.drools.util.LinkedList scheduledActivations;
/** Items time-delayed. */
- private final Map agendaGroups;
+ private final Map agendaGroups;
- private final Map activationGroups;
+ private final Map activationGroups;
- private final Map ruleFlowGroups;
+ private final Map ruleFlowGroups;
- private final LinkedList focusStack;
+ private final LinkedList focusStack;
- private AgendaGroupImpl currentModule;
+ private AgendaGroupImpl currentModule;
- private AgendaGroup main;
+ private final AgendaGroup main;
- private DefaultKnowledgeHelper knowledgeHelper;
+ private DefaultKnowledgeHelper knowledgeHelper;
- public int activeActivations;
- public int dormantActivations;
+ public int activeActivations;
+ public int dormantActivations;
+
// ------------------------------------------------------------
// Constructors
// ------------------------------------------------------------
@@ -111,7 +113,8 @@
this.focusStack = new LinkedList();
// MAIN should always be the first AgendaGroup and can never be removed
- this.main = new AgendaGroupImpl( AgendaGroup.MAIN );
+ this.main = new AgendaGroupImpl( AgendaGroup.MAIN,
+ ((InternalRuleBase) this.workingMemory.getRuleBase()).getConfiguration().getConflictResolver() );
this.agendaGroups.put( AgendaGroup.MAIN,
this.main );
@@ -181,13 +184,7 @@
* @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 );
- }
+ AgendaGroup agendaGroup = getAgendaGroup( name );
setFocus( agendaGroup );
}
@@ -245,7 +242,15 @@
* @see org.drools.common.AgendaI#getAgendaGroup(java.lang.String)
*/
public AgendaGroup getAgendaGroup(final String name) {
- return (AgendaGroup) this.agendaGroups.get( name );
+ AgendaGroup agendaGroup = (AgendaGroup) this.agendaGroups.get( name );
+ if ( agendaGroup == null ) {
+ // The AgendaGroup is defined but not yet added to the
+ // Agenda, so create the AgendaGroup and add to the Agenda.
+ agendaGroup = new AgendaGroupImpl( name,
+ ((InternalRuleBase) this.workingMemory.getRuleBase()).getConfiguration().getConflictResolver() );
+ addAgendaGroup( agendaGroup );
+ }
+ return agendaGroup;
}
/* (non-Javadoc)
@@ -279,8 +284,7 @@
RuleFlowGroup ruleFlowGroup = (RuleFlowGroup) this.ruleFlowGroups.get( name );
if ( ruleFlowGroup == null ) {
ruleFlowGroup = new RuleFlowGroupImpl( name );
- ((InternalRuleFlowGroup) ruleFlowGroup).setWorkingMemory(
- (InternalWorkingMemory) getWorkingMemory() );
+ ((InternalRuleFlowGroup) ruleFlowGroup).setWorkingMemory( (InternalWorkingMemory) getWorkingMemory() );
this.ruleFlowGroups.put( name,
ruleFlowGroup );
}
@@ -288,7 +292,7 @@
}
public void activateRuleFlowGroup(final String name) {
- ((InternalRuleFlowGroup) getRuleFlowGroup( name )).setActive( true );
+ ((InternalRuleFlowGroup) getRuleFlowGroup( name )).setActive( true );
}
public void deactivateRuleFlowGroup(final String name) {
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DefaultConflictResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DefaultConflictResolver.java 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DefaultConflictResolver.java 2007-06-12 00:09:02 UTC (rev 12475)
@@ -1,71 +0,0 @@
-package org.drools.conflict;
-
-/*
- * 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 org.drools.spi.ConflictResolver;
-
-/**
- * Strategy for resolving conflicts amongst multiple rules.
- *
- * <p>
- * Since a fact or set of facts may activate multiple rules, a
- * <code>ConflictResolutionStrategy</code> is used to provide priority
- * ordering of conflicting rules.
- * </p>
- *
- * @see org.drools.spi.Activation
- * @see org.drools.spi.Tuple
- * @see org.drools.rule.Rule
- *
- * @author <a href="mailto:bob at werken.com">bob mcwhirter </a>
- * @author <a href="mailto:simon at redhillconsulting.com.au">Simon Harris </a>
- */
-public class DefaultConflictResolver extends CompositeConflictResolver {
- // ----------------------------------------------------------------------
- // Class members
- // ----------------------------------------------------------------------
-
- /**
- *
- */
- private static final long serialVersionUID = 8177623789776261668L;
-
- private static final ConflictResolver[] CONFLICT_RESOLVERS = new ConflictResolver[]{DepthConflictResolver.getInstance()};
-
- /** Singleton instance. */
- private static final DefaultConflictResolver INSTANCE = new DefaultConflictResolver();
-
- // ----------------------------------------------------------------------
- // Class methods
- // ----------------------------------------------------------------------
-
- /**
- * Retrieve the singleton instance.
- *
- * @return The singleton instance.
- */
- public static ConflictResolver getInstance() {
- return DefaultConflictResolver.INSTANCE;
- }
-
- /**
- * Setup a default ConflictResolver configuration
- */
- public DefaultConflictResolver() {
- super( DefaultConflictResolver.CONFLICT_RESOLVERS );
- }
-}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2007-06-12 00:09:02 UTC (rev 12475)
@@ -202,13 +202,6 @@
agendaGroup = (AgendaGroupImpl) agenda.getAgendaGroup( this.rule.getAgendaGroup() );
}
- if ( agendaGroup == null ) {
- // The AgendaGroup is defined but not yet added to the
- // Agenda, so create the AgendaGroup and add to the Agenda.
- agendaGroup = new AgendaGroupImpl( this.rule.getAgendaGroup() );
- agenda.addAgendaGroup( agendaGroup );
- }
-
memory.setAgendaGroup( agendaGroup );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf 2007-06-12 00:09:02 UTC (rev 12475)
@@ -9,4 +9,5 @@
drools.indexRightBetaMemory = true
drools.assertBehaviour = IDENTITY
drools.logicalOverride = DISCARD
-drools.executorService = org.drools.concurrent.DefaultExecutorService
\ No newline at end of file
+drools.executorService = org.drools.concurrent.DefaultExecutorService
+drools.conflictResolver = org.drools.conflict.DepthConflictResolver
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2007-06-11 22:21:21 UTC (rev 12474)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2007-06-12 00:09:02 UTC (rev 12475)
@@ -32,6 +32,7 @@
import org.drools.common.InternalAgenda;
import org.drools.common.PropagationContextImpl;
import org.drools.common.RuleFlowGroupImpl;
+import org.drools.conflict.DepthConflictResolver;
import org.drools.rule.Rule;
import org.drools.spi.Activation;
import org.drools.spi.ActivationGroup;
@@ -202,15 +203,15 @@
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
// // create the AgendaGroups
- final AgendaGroupImpl agendaGroup1 = new AgendaGroupImpl( "agendaGroup1" );
+ final AgendaGroupImpl agendaGroup1 = new AgendaGroupImpl( "agendaGroup1", DepthConflictResolver.getInstance() );
agenda.addAgendaGroup( agendaGroup1 );
// ActivationQueue queue1 = agendaGroup1.getActivationQueue( 0 );
- final AgendaGroupImpl agendaGroup2 = new AgendaGroupImpl( "agendaGroup2" );
+ final AgendaGroupImpl agendaGroup2 = new AgendaGroupImpl( "agendaGroup2", DepthConflictResolver.getInstance() );
agenda.addAgendaGroup( agendaGroup2 );
// ActivationQueue queue2 = agendaGroup2.getActivationQueue( 0 );
- final AgendaGroupImpl agendaGroup3 = new AgendaGroupImpl( "agendaGroup3" );
+ final AgendaGroupImpl agendaGroup3 = new AgendaGroupImpl( "agendaGroup3", DepthConflictResolver.getInstance() );
agenda.addAgendaGroup( agendaGroup3 );
// ActivationQueue queue3 = agendaGroup3.getActivationQueue( 0 );
@@ -426,7 +427,7 @@
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
// create the agendaGroup
- final AgendaGroupImpl agendaGroup = new AgendaGroupImpl( "agendaGroup" );
+ final AgendaGroupImpl agendaGroup = new AgendaGroupImpl( "agendaGroup", DepthConflictResolver.getInstance() );
agenda.addAgendaGroup( agendaGroup );
// create the consequence
@@ -503,7 +504,7 @@
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
// create the agendaGroup
- final AgendaGroupImpl agendaGroup = new AgendaGroupImpl( "agendaGroup" );
+ final AgendaGroupImpl agendaGroup = new AgendaGroupImpl( "agendaGroup", DepthConflictResolver.getInstance() );
agenda.addAgendaGroup( agendaGroup );
final ReteTuple tuple = new ReteTuple( new DefaultFactHandle( 1,
More information about the jboss-svn-commits
mailing list