[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