[jboss-svn-commits] JBL Code SVN: r28942 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/builder and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 14 23:06:07 EDT 2009


Author: tirelli
Date: 2009-08-14 23:06:06 -0400 (Fri, 14 Aug 2009)
New Revision: 28942

Added:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/conf/MBeansOption.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/DroolsManagementAgentMBean.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeBaseMonitoringMBean.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/ObjectTypeNodeMonitorMBean.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/ObjectTypeNodeMonitor.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/misc/
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/misc/Utils.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/Action.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/PortfolioAction.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/SuddenDropEvent.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.drl
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.rf
Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseConfiguration.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/ResourceType.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Broker.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Main.java
   labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/broker.drl
Log:
JBRULES-2247: Adding support to monitoring through MBeans

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseConfiguration.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseConfiguration.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -43,6 +43,7 @@
  * <li>drools.consequenceExceptionHandler = &lt;qualified class name&gt;</li>
  * <li>drools.maxThreads = &lt;-1|1..n&gt;</li>
  * <li>drools.multithreadEvaluation = &lt;true|false&gt;</li>
+ * <li>drools.mbeans = &lt;enabled|disabled&gt;</li>
  * </ul>
  * </p>
  * 

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/ResourceType.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/ResourceType.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/ResourceType.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -9,19 +9,25 @@
     private String                                 name;
 
     private String                                 description;
+    
+    private String                                 defaultExtension;
 
     private static final Map<String, ResourceType> CACHE = Collections.synchronizedMap( new HashMap<String, ResourceType>() );
 
     public ResourceType(String name,
-                        String description) {
+                        String description,
+                        String defaultExtension ) {
         this.name = name;
         this.description = description;
+        this.defaultExtension = defaultExtension;
     }
 
     public static ResourceType addResourceTypeToRegistry(final String resourceType,
-                                                         String description) {
+                                                         final String description,
+                                                         final String defaultExtension ) {
         ResourceType resource = new ResourceType( resourceType,
-                                                  description );
+                                                  description,
+                                                  defaultExtension );
         CACHE.put( resourceType,
                    resource );
         return resource;
@@ -29,39 +35,48 @@
 
     /** Drools Rule Language */
     public static final ResourceType DRL        = addResourceTypeToRegistry( "DRL",
-                                                                             "Drools Rule Language" );
+                                                                             "Drools Rule Language",
+                                                                             "drl");
 
     /** Drools XML Rule Language */
     public static final ResourceType XDRL       = addResourceTypeToRegistry( "XDRL",
-                                                                             "Drools XML Rule Language" );
+                                                                             "Drools XML Rule Language",
+                                                                             "xdrl" );
 
     /** Drools DSL */
     public static final ResourceType DSL        = addResourceTypeToRegistry( "DSL",
-                                                                             "Drools DSL" );
+                                                                             "Drools DSL",
+                                                                             "dsl");
 
     /** Drools DSL Rule */
     public static final ResourceType DSLR       = addResourceTypeToRegistry( "DSLR",
-                                                                             "Drools DSL Rule" );
+                                                                             "Drools DSL Rule",
+                                                                             "dslr");
 
     /** Drools Rule Flow Language */
     public static final ResourceType DRF        = addResourceTypeToRegistry( "DRF",
-                                                                             "Drools Rule Flow Language" );
+                                                                             "Drools Rule Flow Language",
+                                                                             "rf" );
 
     /** Decision Table */
     public static final ResourceType DTABLE     = addResourceTypeToRegistry( "DTABLE",
-                                                                             "Decision Table" );
+                                                                             "Decision Table",
+                                                                             "xls" );
 
     /** Binary Package */
     public static final ResourceType PKG        = addResourceTypeToRegistry( "PKG",
-                                                                             "Binary Package" );
+                                                                             "Binary Package",
+                                                                             "pkg" );
 
     /** Drools Business Rule Language */
     public static final ResourceType BRL        = addResourceTypeToRegistry( "BRL",
-                                                                             "Drools Business Rule Language" );
+                                                                             "Drools Business Rule Language",
+                                                                             "brl" );
 
     /** Change Set */
     public static final ResourceType CHANGE_SET = addResourceTypeToRegistry( "CHANGE_SET",
-                                                                             "Change Set" );
+                                                                             "Change Set",
+                                                                             "xcs" );
 
     public static ResourceType getResourceType(final String resourceType) {
         ResourceType resource = CACHE.get( resourceType );
@@ -70,6 +85,19 @@
         }
         return resource;
     }
+    
+    public static ResourceType determineResourceType( final String resourceName ) {
+        for( ResourceType type : CACHE.values() ) {
+            if( type.matchesExtension( resourceName ) ) {
+                return type;
+            }
+        }
+        return null;
+    }
+    
+    public boolean matchesExtension( String resourceName ) {
+        return resourceName != null && resourceName.endsWith( "."+defaultExtension );
+    }
 
     public String toString() {
         return "ResourceType = '" + this.description + "'";

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/conf/MBeansOption.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/conf/MBeansOption.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/conf/MBeansOption.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.conf;
+
+/**
+ * An Enum for MBeans Enabled option.
+ * 
+ * drools.mbeans = &lt;enabled|disabled&gt; 
+ * 
+ * DEFAULT = false
+ * 
+ * @author etirelli
+ */
+public enum MBeansOption implements SingleValueKnowledgeBaseOption {
+    
+    ENABLED(true),
+    DISABLED(false);
+
+    /**
+     * The property name for the mbeans option
+     */
+    public static final String PROPERTY_NAME = "drools.mbeans";
+    
+    private boolean value;
+    
+    MBeansOption( final boolean value ) {
+        this.value = value;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public String getPropertyName() {
+        return PROPERTY_NAME;
+    }
+    
+    public boolean isEnabled() {
+        return this.value;
+    }
+    
+    public static boolean isEnabled(final String value) {
+        if( value == null || value.trim().length() == 0 ) {
+            return false;
+        } else if ( "ENABLED".equalsIgnoreCase( value ) ) {
+            return true;
+        } else if ( "DISABLED".equalsIgnoreCase( value ) ) {
+            return false;
+        } else {
+            throw new IllegalArgumentException( "Illegal enum value '" + value + "' for MBeans option. Should be either 'enabled' or 'disabled'" );
+        }
+    }
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/conf/MBeansOption.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/DroolsManagementAgentMBean.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/DroolsManagementAgentMBean.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/DroolsManagementAgentMBean.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.management;
+
+/**
+ * A tree root level class for all the drools management 
+ * MBeans published to an MBean agent
+ *  
+ * @author etirelli
+ */
+public interface DroolsManagementAgentMBean {
+    
+    public long getKnowledgeBaseCount();
+    
+    public long getSessionCount();
+
+}

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeBaseMonitoringMBean.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeBaseMonitoringMBean.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeBaseMonitoringMBean.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.management;
+
+
+/**
+ * An interface for KnowledgeBase monitoring and management
+ * 
+ * @author etirelli
+ */
+public interface KnowledgeBaseMonitoringMBean {
+    
+    public String getId();
+    
+    public long getSessionCount();
+    
+    public String getGlobals();
+    
+    public String getPackages();
+    
+    public String getEntryPoints();     
+
+}


Property changes on: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeBaseMonitoringMBean.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/ObjectTypeNodeMonitorMBean.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/ObjectTypeNodeMonitorMBean.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/ObjectTypeNodeMonitorMBean.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,17 @@
+package org.drools.management;
+
+public interface ObjectTypeNodeMonitorMBean {
+
+    public int getId();
+
+    public String getEntryPoint();
+
+    public String getObjectType();
+
+    public String getPartitionId();
+
+    public boolean isEvent();
+
+    public long getExpirationOffset();
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemory.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemory.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -2,8 +2,6 @@
 
 import java.util.Collection;
 
-import org.drools.time.SessionClock;
-
 /**
  * The <code>WorkingMemory</code> is a super-interface for all <code>StatefulKnowledgeSession</code>s.
  * Although, users are encouraged to use <code>StatefulKnowledgeSession</code> or <code>KnowledgeRuntime</code>

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	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -28,7 +28,6 @@
 import java.util.Set;
 import java.util.Map.Entry;
 
-import org.drools.base.FireAllRulesRuleBaseUpdateListener;
 import org.drools.common.AgendaGroupFactory;
 import org.drools.common.ArrayAgendaGroupFactory;
 import org.drools.common.PriorityQueueAgendaGroupFactory;
@@ -42,6 +41,7 @@
 import org.drools.conf.IndexRightBetaMemoryOption;
 import org.drools.conf.KnowledgeBaseOption;
 import org.drools.conf.LogicalOverrideOption;
+import org.drools.conf.MBeansOption;
 import org.drools.conf.MaintainTMSOption;
 import org.drools.conf.MaxThreadsOption;
 import org.drools.conf.MultiValueKnowledgeBaseOption;
@@ -112,6 +112,7 @@
  * drools.sessionClock = &lt;qualified class name&gt;
  * drools.maxThreads = &lt;-1|1..n&gt;
  * drools.multithreadEvaluation = &lt;true|false&gt;
+ * drools.mbeans = &lt;enabled|disabled&gt;
  * </pre>
  */
 public class RuleBaseConfiguration
@@ -149,6 +150,9 @@
     private boolean                        multithread;
     private int                            maxThreads;
 
+    // this property activates MBean monitoring and management
+    private boolean                        mbeansEnabled;
+
     private ConflictResolver               conflictResolver;
 
     private ContextInstanceFactoryRegistry processContextInstanceFactoryRegistry;
@@ -299,6 +303,8 @@
             setMaxThreads( StringUtils.isEmpty( value ) ? 3 : Integer.parseInt( value ) );
         } else if ( name.equals( EventProcessingOption.PROPERTY_NAME ) ) {
             setEventProcessingMode( EventProcessingOption.determineEventProcessingMode( StringUtils.isEmpty( value ) ? "cloud" : value ) );
+        } else if ( name.equals( MBeansOption.PROPERTY_NAME ) ) {
+            setMBeansEnabled( MBeansOption.isEnabled( value ) );
         }
     }
 
@@ -348,6 +354,8 @@
             return Integer.toString( getMaxThreads() );
         } else if ( name.equals( EventProcessingOption.PROPERTY_NAME ) ) {
             return getEventProcessingMode().getMode();
+        } else if ( name.equals( MBeansOption.PROPERTY_NAME ) ) {
+            return isMBeansEnabled() ? "enabled" : "disabled";
         }
 
         return null;
@@ -439,8 +447,12 @@
 
         setMaxThreads( Integer.parseInt( this.chainedProperties.getProperty( MaxThreadsOption.PROPERTY_NAME,
                                                                              "3" ) ) );
+        
         setEventProcessingMode( EventProcessingOption.determineEventProcessingMode( this.chainedProperties.getProperty( EventProcessingOption.PROPERTY_NAME,
-                                                                                                                  "cloud" ) ) );
+                                                                                                                        "cloud" ) ) );
+        
+        setMBeansEnabled( MBeansOption.isEnabled( this.chainedProperties.getProperty( MBeansOption.PROPERTY_NAME,
+                                                                                      "disabled" ) ) );
     }
 
     /**
@@ -812,33 +824,33 @@
             List<Map<String, Object>> workDefinitionsMap = (List<Map<String, Object>>) MVEL.eval( content,
                                                                                                   new HashMap() );
             for ( Map<String, Object> workDefinitionMap : workDefinitionsMap ) {
-            	if (workDefinitionMap != null) {
-	                WorkDefinitionExtensionImpl workDefinition = new WorkDefinitionExtensionImpl();
-	                workDefinition.setName( (String) workDefinitionMap.get( "name" ) );
-	                workDefinition.setDisplayName( (String) workDefinitionMap.get( "displayName" ) );
-	                workDefinition.setIcon( (String) workDefinitionMap.get( "icon" ) );
-	                workDefinition.setCustomEditor( (String) workDefinitionMap.get( "customEditor" ) );
-	                Set<ParameterDefinition> parameters = new HashSet<ParameterDefinition>();
-	                Map<String, DataType> parameterMap = (Map<String, DataType>) workDefinitionMap.get( "parameters" );
-	                if ( parameterMap != null ) {
-	                    for ( Map.Entry<String, DataType> entry : parameterMap.entrySet() ) {
-	                        parameters.add( new ParameterDefinitionImpl( entry.getKey(),
-	                                                                     entry.getValue() ) );
-	                    }
-	                }
-	                workDefinition.setParameters( parameters );
-	                Set<ParameterDefinition> results = new HashSet<ParameterDefinition>();
-	                Map<String, DataType> resultMap = (Map<String, DataType>) workDefinitionMap.get( "results" );
-	                if ( resultMap != null ) {
-	                    for ( Map.Entry<String, DataType> entry : resultMap.entrySet() ) {
-	                        results.add( new ParameterDefinitionImpl( entry.getKey(),
-	                                                                  entry.getValue() ) );
-	                    }
-	                }
-	                workDefinition.setResults( results );
-	                this.workDefinitions.put( workDefinition.getName(),
-	                                          workDefinition );
-            	}
+                if ( workDefinitionMap != null ) {
+                    WorkDefinitionExtensionImpl workDefinition = new WorkDefinitionExtensionImpl();
+                    workDefinition.setName( (String) workDefinitionMap.get( "name" ) );
+                    workDefinition.setDisplayName( (String) workDefinitionMap.get( "displayName" ) );
+                    workDefinition.setIcon( (String) workDefinitionMap.get( "icon" ) );
+                    workDefinition.setCustomEditor( (String) workDefinitionMap.get( "customEditor" ) );
+                    Set<ParameterDefinition> parameters = new HashSet<ParameterDefinition>();
+                    Map<String, DataType> parameterMap = (Map<String, DataType>) workDefinitionMap.get( "parameters" );
+                    if ( parameterMap != null ) {
+                        for ( Map.Entry<String, DataType> entry : parameterMap.entrySet() ) {
+                            parameters.add( new ParameterDefinitionImpl( entry.getKey(),
+                                                                         entry.getValue() ) );
+                        }
+                    }
+                    workDefinition.setParameters( parameters );
+                    Set<ParameterDefinition> results = new HashSet<ParameterDefinition>();
+                    Map<String, DataType> resultMap = (Map<String, DataType>) workDefinitionMap.get( "results" );
+                    if ( resultMap != null ) {
+                        for ( Map.Entry<String, DataType> entry : resultMap.entrySet() ) {
+                            results.add( new ParameterDefinitionImpl( entry.getKey(),
+                                                                      entry.getValue() ) );
+                        }
+                    }
+                    workDefinition.setResults( results );
+                    this.workDefinitions.put( workDefinition.getName(),
+                                              workDefinition );
+                }
             }
         } catch ( Throwable t ) {
             System.err.println( "Error occured while loading work definitions " + location );
@@ -962,6 +974,26 @@
         this.classLoader = classLoader;
     }
 
+    /**
+     * Defines if the RuleBase should expose management and monitoring MBeans
+     * 
+     * @param enableMultithread true for multi-thread or 
+     *                     false for single-thread. Default is false.
+     */
+    public void setMBeansEnabled(boolean mbeansEnabled) {
+        checkCanChange();
+        this.mbeansEnabled = mbeansEnabled;
+    }
+
+    /**
+     * Returns true if the management and monitoring through MBeans is active 
+     * 
+     * @return
+     */
+    public boolean isMBeansEnabled() {
+        return this.mbeansEnabled;
+    }
+
     public static class AssertBehaviour
         implements
         Externalizable {
@@ -1169,11 +1201,11 @@
         } else if ( IndexRightBetaMemoryOption.class.equals( option ) ) {
             return (T) (this.indexRightBetaMemory ? IndexRightBetaMemoryOption.YES : IndexRightBetaMemoryOption.NO);
         } else if ( AssertBehaviorOption.class.equals( option ) ) {
-            return (T) ( ( this.assertBehaviour == AssertBehaviour.IDENTITY ) ? AssertBehaviorOption.IDENTITY : AssertBehaviorOption.EQUALITY);
+            return (T) ((this.assertBehaviour == AssertBehaviour.IDENTITY) ? AssertBehaviorOption.IDENTITY : AssertBehaviorOption.EQUALITY);
         } else if ( LogicalOverrideOption.class.equals( option ) ) {
-            return (T) ( ( this.logicalOverride == LogicalOverride.DISCARD ) ? LogicalOverrideOption.DISCARD : LogicalOverrideOption.PRESERVE);
+            return (T) ((this.logicalOverride == LogicalOverride.DISCARD) ? LogicalOverrideOption.DISCARD : LogicalOverrideOption.PRESERVE);
         } else if ( SequentialAgendaOption.class.equals( option ) ) {
-            return (T) ( ( this.sequentialAgenda == SequentialAgenda.SEQUENTIAL ) ? SequentialAgendaOption.SEQUENTIAL : SequentialAgendaOption.DYNAMIC);
+            return (T) ((this.sequentialAgenda == SequentialAgenda.SEQUENTIAL) ? SequentialAgendaOption.SEQUENTIAL : SequentialAgendaOption.DYNAMIC);
         } else if ( AlphaThresholdOption.class.equals( option ) ) {
             return (T) AlphaThresholdOption.get( alphaNodeHashingThreshold );
         } else if ( CompositeKeyDepthOption.class.equals( option ) ) {
@@ -1183,7 +1215,8 @@
             try {
                 handler = (Class< ? extends ConsequenceExceptionHandler>) Class.forName( consequenceExceptionHandler );
             } catch ( ClassNotFoundException e ) {
-                throw new RuntimeDroolsException("Unable to resolve ConsequenceExceptionHandler class: "+consequenceExceptionHandler, e);
+                throw new RuntimeDroolsException( "Unable to resolve ConsequenceExceptionHandler class: " + consequenceExceptionHandler,
+                                                  e );
             }
             return (T) ConsequenceExceptionHandlerOption.get( handler );
         } else if ( EventProcessingOption.class.equals( option ) ) {
@@ -1192,9 +1225,11 @@
             return (T) MaxThreadsOption.get( getMaxThreads() );
         } else if ( MultithreadEvaluationOption.class.equals( option ) ) {
             return (T) (this.multithread ? MultithreadEvaluationOption.YES : MultithreadEvaluationOption.NO);
+        } else if ( MBeansOption.class.equals( option ) ) {
+            return (T) (this.isMBeansEnabled() ? MBeansOption.ENABLED : MBeansOption.DISABLED);
         }
         return null;
-        
+
     }
 
     public <T extends KnowledgeBaseOption> void setOption(T option) {
@@ -1213,16 +1248,16 @@
         } else if ( option instanceof IndexRightBetaMemoryOption ) {
             setIndexRightBetaMemory( ((IndexRightBetaMemoryOption) option).isIndexRightBetaMemory() );
         } else if ( option instanceof AssertBehaviorOption ) {
-            setAssertBehaviour( ( option == AssertBehaviorOption.IDENTITY ) ? AssertBehaviour.IDENTITY : AssertBehaviour.EQUALITY );
+            setAssertBehaviour( (option == AssertBehaviorOption.IDENTITY) ? AssertBehaviour.IDENTITY : AssertBehaviour.EQUALITY );
         } else if ( option instanceof LogicalOverrideOption ) {
-            setLogicalOverride( ( option == LogicalOverrideOption.DISCARD ) ? LogicalOverride.DISCARD : LogicalOverride.PRESERVE );
+            setLogicalOverride( (option == LogicalOverrideOption.DISCARD) ? LogicalOverride.DISCARD : LogicalOverride.PRESERVE );
         } else if ( option instanceof SequentialAgendaOption ) {
-            setSequentialAgenda( ( option == SequentialAgendaOption.SEQUENTIAL ) ? SequentialAgenda.SEQUENTIAL : SequentialAgenda.DYNAMIC );
+            setSequentialAgenda( (option == SequentialAgendaOption.SEQUENTIAL) ? SequentialAgenda.SEQUENTIAL : SequentialAgenda.DYNAMIC );
         } else if ( option instanceof AlphaThresholdOption ) {
             setAlphaNodeHashingThreshold( ((AlphaThresholdOption) option).getThreshold() );
         } else if ( option instanceof CompositeKeyDepthOption ) {
             setCompositeKeyDepth( ((CompositeKeyDepthOption) option).getDepth() );
-        } else if ( option instanceof ConsequenceExceptionHandlerOption) {
+        } else if ( option instanceof ConsequenceExceptionHandlerOption ) {
             setConsequenceExceptionHandler( ((ConsequenceExceptionHandlerOption) option).getHandler().getName() );
         } else if ( option instanceof EventProcessingOption ) {
             setEventProcessingMode( (EventProcessingOption) option );
@@ -1230,7 +1265,9 @@
             setMaxThreads( ((MaxThreadsOption) option).getMaxThreads() );
         } else if ( option instanceof MultithreadEvaluationOption ) {
             setMultithreadEvaluation( ((MultithreadEvaluationOption) option).isMultithreadEvaluation() );
-        } 
+        } else if ( option instanceof MBeansOption ) {
+            setMBeansEnabled( ((MBeansOption) option).isEnabled() );
+        }
 
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -46,6 +46,7 @@
 import org.drools.event.RuleBaseEventListener;
 import org.drools.event.RuleBaseEventSupport;
 import org.drools.impl.EnvironmentFactory;
+import org.drools.management.DroolsManagementAgent;
 import org.drools.process.core.Process;
 import org.drools.rule.CompositeClassLoader;
 import org.drools.rule.DialectRuntimeRegistry;
@@ -130,6 +131,10 @@
     public synchronized int nextWorkingMemoryCounter() {
         return this.workingMemoryCounter++;
     }
+    
+    public synchronized long getWorkingMemoryCounter() {
+        return this.workingMemoryCounter;
+    }
 
     /**
      * Construct.
@@ -139,13 +144,10 @@
     public AbstractRuleBase(final String id,
                             final RuleBaseConfiguration config,
                             final FactHandleFactory factHandleFactory) {
-        if ( id != null ) {
-            this.id = id;
-        } else {
-            this.id = "default";
-        }
+        
         this.config = (config != null) ? config : new RuleBaseConfiguration();
         this.config.makeImmutable();
+        createRulebaseId( id );
         this.factHandleFactory = factHandleFactory;
 
         if ( this.config.isSequential() ) {
@@ -164,6 +166,19 @@
         this.classFieldAccessorCache = new ClassFieldAccessorCache( this.rootClassLoader );
     }
 
+    private void createRulebaseId(final String id) {
+        String key = ""; 
+        if( config.isMBeansEnabled() ) {
+            DroolsManagementAgent agent = DroolsManagementAgent.getInstance();
+            key = String.valueOf( agent.getNextKnowledgeBaseId() );
+        }
+        if ( id != null ) {
+            this.id = id+key;
+        } else {
+            this.id = "default"+key;
+        }
+    }
+
     // ------------------------------------------------------------
     // Instance methods
     // ------------------------------------------------------------

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.management;
+
+import java.lang.management.ManagementFactory;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.drools.reteoo.ReteooRuleBase;
+
+/**
+ * The main management agent for Drools. The purpose of this 
+ * agent is to serve as a singleton for knowledge base and session
+ * monitoring mbeans registration and management.
+ *  
+ * @author etirelli
+ *
+ */
+public class DroolsManagementAgent
+    implements
+    DroolsManagementAgentMBean {
+
+    private static final String          MBEAN_NAME = "org.drools:type=DroolsManagementAgent";
+
+    private static DroolsManagementAgent INSTANCE;
+    private static MBeanServer           mbs;
+    
+    private long                         kbases;
+    private long                         ksessions;
+    private Map<Object, List<ObjectName>>    mbeans;
+
+    private DroolsManagementAgent() {
+        kbases = 0;
+        ksessions = 0;
+        mbeans = new HashMap<Object, List<ObjectName>>();
+    }
+
+    public static synchronized DroolsManagementAgent getInstance() {
+        if ( INSTANCE == null ) {
+            INSTANCE = new DroolsManagementAgent();
+            try {
+                MBeanServer mbs = getMBeanServer();
+                ObjectName mbName = createObjectName( MBEAN_NAME );
+                if ( !mbs.isRegistered( mbName ) ) {
+                    mbs.registerMBean( INSTANCE,
+                                       mbName );
+                }
+            } catch ( Exception e ) {
+                System.err.println( "Unable to register DroolsManagementAgent into the platform MBean Server" );
+                e.printStackTrace();
+            }
+        }
+        return INSTANCE;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.reteoo.monitoring.DroolsManagementAgentMBean#getRulebaseCount()
+     */
+    public synchronized long getKnowledgeBaseCount() {
+        return kbases;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.reteoo.monitoring.DroolsManagementAgentMBean#getSessionCount()
+     */
+    public synchronized long getSessionCount() {
+        return ksessions;
+    }
+
+    public synchronized long getNextKnowledgeBaseId() {
+        return ++kbases;
+    }
+
+    public synchronized long getNextKnowledgeSessionId() {
+        return ++ksessions;
+    }
+
+    public void registerKnowledgeBase(ReteooRuleBase kbase) {
+        KnowledgeBaseMonitoring mbean = new KnowledgeBaseMonitoring( kbase );
+        registerMBean( kbase,
+                       mbean,
+                       mbean.getName() );
+    }
+
+    public void registerMBean(Object owner,
+                              Object mbean,
+                              ObjectName name) {
+        try {
+            MBeanServer mbs = getMBeanServer();
+            if ( !mbs.isRegistered( name ) ) {
+                mbs.registerMBean( mbean,
+                                   name );
+                List<ObjectName> mbl = mbeans.get( owner );
+                if( mbl == null ) {
+                    mbl = new LinkedList<ObjectName>();
+                    mbeans.put( owner, mbl );
+                }
+                mbl.add( name );
+            }
+        } catch ( Exception e ) {
+            System.err.println( "Unable to register mbean " + name + " into the platform MBean Server" );
+            e.printStackTrace();
+        }
+    }
+    
+    public void unregisterMBeansFromOwner( Object owner ) {
+        List<ObjectName> mbl = mbeans.remove( owner );
+        if( mbl != null ) {
+            MBeanServer mbs = getMBeanServer();
+            for( ObjectName name : mbl ) {
+                try {
+                    mbs.unregisterMBean( name );
+                } catch ( Exception e ) {
+                    System.err.println("Exception unregistering mbean: "+name);
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    
+    public static ObjectName createObjectName( String name ) {
+        try {
+            return new ObjectName( name );
+        } catch ( Exception e ) {
+            System.err.println("This is a bug. Error creating ObjectName for MBean: "+name);
+            System.err.println("Please contact the development team and provide the following stack trace: "+e.getMessage() );
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private static MBeanServer getMBeanServer() {
+        if ( mbs == null ) {
+            mbs = ManagementFactory.getPlatformMBeanServer();
+        }
+        return mbs;
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.management;
+
+import javax.management.ObjectName;
+
+import org.drools.base.ClassObjectType;
+import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.ReteooRuleBase;
+
+/**
+ * An implementation for the KnowledgeBaseMBean
+ * 
+ * @author etirelli
+ */
+public class KnowledgeBaseMonitoring
+    implements
+    KnowledgeBaseMonitoringMBean {
+
+    private static final String KBASE_PREFIX = "org.drools.kbases.";
+    
+    private ReteooRuleBase kbase;
+    private ObjectName name;
+    
+    public KnowledgeBaseMonitoring(ReteooRuleBase kbase) {
+        this.kbase = kbase;
+        this.name = DroolsManagementAgent.createObjectName(KBASE_PREFIX + kbase.getId() + ":type=KnowledgeBase");
+    }
+    
+    public ObjectName getName() {
+        return name;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeBaseMBean#getGlobals()
+     */
+    public String getGlobals() {
+        return kbase.getGlobals().toString();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeBaseMBean#getId()
+     */
+    public String getId() {
+        return kbase.getId();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeBaseMBean#getPackages()
+     */
+    public String getPackages() {
+        return kbase.getPackagesMap().keySet().toString();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeBaseMBean#getSessionCount()
+     */
+    public long getSessionCount() {
+        return kbase.getWorkingMemoryCounter();
+    }
+    
+    public String getEntryPoints() {
+        for( EntryPointNode epn : kbase.getRete().getEntryPointNodes().values() ) {
+            for( ObjectTypeNode otn : epn.getObjectTypeNodes().values() ) {
+                ObjectTypeNodeMonitor otnm = new ObjectTypeNodeMonitor( otn );
+                ObjectName name = DroolsManagementAgent.createObjectName( this.name.getDomain() + ":type=EntryPoints,EntryPoint=" + otnm.getNameSufix() + ",ObjectType="+((ClassObjectType)otn.getObjectType()).getClassName() );
+                DroolsManagementAgent.getInstance().registerMBean( kbase, otnm, name );
+            }
+        }
+        return kbase.getRete().getEntryPointNodes().keySet().toString();
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/ObjectTypeNodeMonitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/ObjectTypeNodeMonitor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/ObjectTypeNodeMonitor.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.management;
+
+import org.drools.reteoo.ObjectTypeNode;
+
+/**
+ * The monitor MBean for ObjectTypeNodes
+ * 
+ * @author etirelli
+ */
+public class ObjectTypeNodeMonitor implements ObjectTypeNodeMonitorMBean  {
+    
+    private ObjectTypeNode node;
+
+    public ObjectTypeNodeMonitor(ObjectTypeNode node) {
+        this.node = node;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.ObjectTypeNodeMonitorMbean#getId()
+     */
+    public int getId() {
+        return node.getId();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.ObjectTypeNodeMonitorMbean#getEntryPoint()
+     */
+    public String getEntryPoint() {
+        return node.getEntryPoint().toString();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.ObjectTypeNodeMonitorMbean#getObjectType()
+     */
+    public String getObjectType() {
+        return node.getObjectType().toString();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.ObjectTypeNodeMonitorMbean#getPartitionId()
+     */
+    public String getPartitionId() {
+        return node.getPartitionId().toString();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.ObjectTypeNodeMonitorMbean#isEvent()
+     */
+    public boolean isEvent() {
+        return node.getObjectType().isEvent();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.ObjectTypeNodeMonitorMbean#getExpirationOffset()
+     */
+    public long getExpirationOffset() {
+        return node.getExpirationOffset();
+    }
+    
+    public String getNameSufix() {
+        char[] name = node.getEntryPoint().getEntryPointId().toCharArray();
+        for( int i = 0; i < name.length; i++ ) {
+            if( ! Character.isLetter( name[i] ) ) {
+                name[i] = '_';
+            }
+        }
+        return new String( name );
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -44,6 +44,7 @@
 import org.drools.impl.EnvironmentFactory;
 import org.drools.impl.KnowledgeBaseImpl;
 import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.management.DroolsManagementAgent;
 import org.drools.marshalling.Marshaller;
 import org.drools.marshalling.MarshallerFactory;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
@@ -140,8 +141,11 @@
                           final FactHandleFactory factHandleFactory) {
         super( id,
                config,
-               factHandleFactory );
+               factHandleFactory ); 
         setupRete();
+        if( config.isMBeansEnabled() ) {
+            DroolsManagementAgent.getInstance().registerKnowledgeBase( this ); 
+        }
     }
 
     private void setupRete() {

Modified: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Broker.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Broker.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Broker.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -23,6 +23,7 @@
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
 import org.drools.conf.EventProcessingOption;
+import org.drools.conf.MBeansOption;
 import org.drools.examples.broker.events.Event;
 import org.drools.examples.broker.events.EventReceiver;
 import org.drools.examples.broker.model.Company;
@@ -30,8 +31,6 @@
 import org.drools.examples.broker.model.StockTick;
 import org.drools.examples.broker.ui.BrokerWindow;
 import org.drools.io.ResourceFactory;
-import org.drools.logger.KnowledgeRuntimeLogger;
-import org.drools.logger.KnowledgeRuntimeLoggerFactory;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.WorkingMemoryEntryPoint;
 
@@ -41,7 +40,7 @@
  * @author etirelli
  */
 public class Broker implements EventReceiver, BrokerServices {
-    private static final String RULES_FILE = "/broker.drl";
+    private static final String[] ASSET_FILES = { "/broker.drl", "/position.drl", "/position.rf" };
     
     private BrokerWindow window;
     private CompanyRegistry companies;
@@ -89,10 +88,13 @@
     private KnowledgeBase loadRuleBase() {
         KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         try {
-            builder.add( ResourceFactory.newInputStreamResource( Broker.class.getResourceAsStream( RULES_FILE ) ),
-                         ResourceType.DRL);
+            for( int i = 0; i < ASSET_FILES.length; i++ ) {
+                builder.add( ResourceFactory.newInputStreamResource( Broker.class.getResourceAsStream( ASSET_FILES[i] ) ),
+                             ResourceType.determineResourceType( ASSET_FILES[i] ));
+            }
         } catch ( Exception e ) {
             e.printStackTrace();
+            System.exit( 0 );
         }
         if( builder.hasErrors() ) {
             System.err.println(builder.getErrors());
@@ -100,7 +102,7 @@
         }
         KnowledgeBaseConfiguration conf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
         conf.setOption( EventProcessingOption.STREAM );
-        //System.out.println(((RuleBaseConfiguration)conf).getEventProcessingMode());
+        conf.setOption( MBeansOption.ENABLED );
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( conf );
         kbase.addKnowledgePackages( builder.getKnowledgePackages() );
         return kbase;

Modified: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Main.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Main.java	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/Main.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -47,7 +47,7 @@
         CompanyRegistry registry = new CompanyRegistry();
         BrokerWindow window = new BrokerWindow( registry.getCompanies() );
         window.show();
-        
+        Thread.currentThread().sleep( 10000 );
         Broker broker = new Broker( window, registry );
         
         TimerService clock = new JDKTimerService(1);

Added: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/misc/Utils.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/misc/Utils.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/misc/Utils.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,24 @@
+package org.drools.examples.broker.misc;
+
+import java.text.DecimalFormat;
+import java.util.Random;
+
+import org.drools.examples.broker.model.Action;
+
+public class Utils {
+    private static final Random rand = new Random(System.currentTimeMillis()); 
+    
+    public static String percent( double number ) {
+        return new DecimalFormat( "0.00%" ).format( number );
+    }
+    
+    public static Action selectAction() {
+        return Action.NOACTION;
+//        int action = rand.nextInt( 3 );
+//        switch (action) {
+//            case 1 : return Action.BUY;
+//            case 2 : return Action.SELL;
+//            default : return Action.NOACTION;
+//        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/misc/Utils.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/Action.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/Action.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/Action.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.examples.broker.model;
+
+/**
+ * Possible actions on a portfolio
+ * 
+ * @author etirelli
+ */
+public enum Action {
+    
+    NOACTION, BUY, SELL
+
+}


Property changes on: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/Action.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/PortfolioAction.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/PortfolioAction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/PortfolioAction.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.examples.broker.model;
+
+/**
+ * @author etirelli
+ *
+ */
+public class PortfolioAction {
+    private Action action;
+    private String symbol;
+    private int quant;
+    
+    public PortfolioAction() {
+        super();
+    }
+    public PortfolioAction(Action action,
+                           String symbol,
+                           int quant) {
+        super();
+        this.action = action;
+        this.symbol = symbol;
+        this.quant = quant;
+    }
+
+    public Action getAction() {
+        return action;
+    }
+    public void setAction(Action action) {
+        this.action = action;
+    }
+    public String getSymbol() {
+        return symbol;
+    }
+    public void setSymbol(String symbol) {
+        this.symbol = symbol;
+    }
+    public int getQuant() {
+        return quant;
+    }
+    public void setQuant(int quant) {
+        this.quant = quant;
+    }
+
+    
+    
+
+
+}


Property changes on: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/PortfolioAction.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/SuddenDropEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/SuddenDropEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/SuddenDropEvent.java	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * 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.
+ *
+ */
+package org.drools.examples.broker.model;
+
+/**
+ * @author etirelli
+ *
+ */
+public class SuddenDropEvent {
+    
+    private String symbol;
+    private double percent;
+    private long timestamp;
+    
+    public SuddenDropEvent() {
+        super();
+    }
+    
+    public SuddenDropEvent(String symbol,
+                           double percent,
+                           long timestamp) {
+        super();
+        this.symbol = symbol;
+        this.percent = percent;
+        this.timestamp = timestamp;
+    }
+
+    public String getSymbol() {
+        return symbol;
+    }
+    public void setSymbol(String symbol) {
+        this.symbol = symbol;
+    }
+    public double getPercent() {
+        return percent;
+    }
+    public void setPercent(double percent) {
+        this.percent = percent;
+    }
+    public long getTimestamp() {
+        return timestamp;
+    }
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/java/org/drools/examples/broker/model/SuddenDropEvent.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/broker.drl
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/broker.drl	2009-08-14 23:14:18 UTC (rev 28941)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/broker.drl	2009-08-15 03:06:06 UTC (rev 28942)
@@ -3,9 +3,10 @@
 # importing classes
 import org.drools.examples.broker.model.Company
 import org.drools.examples.broker.model.StockTick
+import org.drools.examples.broker.model.SuddenDropEvent
 
 # it is possible to import static methods as functions for usage in the rules
-import function org.drools.examples.broker.ui.Utils.percent
+import function org.drools.examples.broker.misc.Utils.percent
 
 # a common pattern is to expose services to rules through
 # a helper service class
@@ -22,6 +23,13 @@
     @expires( 2m )
 end 
 
+# an event declaration to represent situations
+# where a suddent drop happens. In this case we are not
+# defining any explicit expiration policy. 
+declare SuddenDropEvent
+    @role( event )
+end
+
 # One can even declare helper facts to make rules easier and
 # simpler to write and maintain
 declare Statistics
@@ -78,6 +86,15 @@
     $st : StockTick( $sb : symbol, $ts : timestamp, $pr : price, $dt : delta < -0.05 ) from entry-point "StockTick stream"
     not( StockTick( symbol == $sb, timestamp > $ts ) from entry-point "StockTick stream" )
 then
-    services.log( "Drop >5%: "+$sb+" delta: $"+percent($dt)+" price: $"+$pr );
+    services.log( "Drop >5%: "+$sb+" delta: "+percent($dt)+" price: $"+$pr );
+    
+    # we also want to create an event and forward it into the engine to a predefined entry point
+    # that is being listened by other rules 
+    with( sde = new SuddenDropEvent() ) {
+        symbol = $sb,
+        percent = $dt,
+        timestamp = $ts
+    }
+    entryPoints["Analysis Events"].insert( sde );
 end
 

Added: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.drl
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.drl	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,42 @@
+package org.drools.examples.broker
+
+import org.drools.examples.broker.model.SuddenDropEvent
+import org.drools.examples.broker.model.PortfolioAction
+import java.util.Map
+import java.util.HashMap
+
+import function org.drools.examples.broker.misc.Utils.selectAction
+
+dialect "mvel"
+
+declare PortfolioAction
+    @role( event )
+end
+
+# an event declaration to represent situations
+# where a suddent drop happens. In this case we are not
+# defining any explicit expiration policy. 
+declare SuddenDropEvent
+    @role( event )
+end
+
+rule "Start adjust position process"
+when
+    $sde : SuddenDropEvent( ) from entry-point "Analysis Events"
+then
+    variables = [ "symbol" : $sde.symbol ];
+    drools.getKnowledgeRuntime().startProcess( "adjust position", variables );
+end
+
+rule "Check current position and take action if necessary"
+    ruleflow-group "evaluate position"
+when
+    $sde : SuddenDropEvent( ) from entry-point "Analysis Events"
+then
+    with( pa = new PortfolioAction() ) {
+        action = selectAction(),
+        symbol = $sde.symbol,
+        quant = 100
+    }
+    entryPoints["Analysis Events"].insert( pa );
+end    
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.drl
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.rf
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.rf	2009-08-15 03:06:06 UTC (rev 28942)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<process xmlns="http://drools.org/drools-5.0/process"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+         type="RuleFlow" name="Adjust Position" id="adjust position" package-name="org.drools.examples.broker.model" >
+
+  <header>
+    <imports>
+      <import name="org.drools.examples.broker.model.Action" />
+      <import name="org.drools.examples.broker.model.PortfolioAction" />
+    </imports>
+    <variables>
+      <variable name="symbol" >
+        <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+      </variable>
+      <variable name="quant" >
+        <type name="org.drools.process.core.datatype.impl.type.UndefinedDataType" />
+      </variable>
+    </variables>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" x="16" y="101" width="48" height="48" />
+    <end id="3" name="End" x="515" y="101" width="48" height="48" />
+    <ruleSet id="4" name="Evaluate Position" x="96" y="101" width="106" height="48" ruleFlowGroup="evaluate position" />
+    <actionNode id="6" name="Buy Shares" x="315" y="16" width="87" height="48" >
+        <action type="expression" dialect="mvel" >System.out.println( "Buying #{quant}  "+symbol+" shares" );</action>
+    </actionNode>
+    <actionNode id="7" name="Sell Shares" x="317" y="192" width="87" height="48" >
+        <action type="expression" dialect="mvel" >System.out.println( "Selling #{quant}  "+symbol+" shares" );</action>
+    </actionNode>
+    <split id="11" name="Take Action" x="234" y="101" width="49" height="49" type="2" >
+      <constraints>
+        <constraint toNodeId="7" name="Sell" priority="1" type="rule" dialect="mvel" >PortfolioAction( action == Action.SELL )  from entry-point "Analysis Events"</constraint>
+        <constraint toNodeId="12" name="No action" priority="1" type="rule" dialect="mvel" >PortfolioAction( action == Action.NOACTION ) from entry-point "Analysis Events"</constraint>
+        <constraint toNodeId="6" name="Buy" priority="1" type="rule" dialect="mvel" >PortfolioAction( action == Action.BUY )  from entry-point "Analysis Events"</constraint>
+      </constraints>
+    </split>
+    <join id="12" name="Action taken" x="434" y="101" width="49" height="49" type="2" />
+  </nodes>
+
+  <connections>
+    <connection from="12" to="3" />
+    <connection from="1" to="4" />
+    <connection from="11" to="6" />
+    <connection from="11" to="7" />
+    <connection from="4" to="11" />
+    <connection from="11" to="12" />
+    <connection from="6" to="12" />
+    <connection from="7" to="12" />
+  </connections>
+
+</process>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-examples/drools-examples-fusion/src/main/rules/position.rf
___________________________________________________________________
Name: svn:executable
   + *



More information about the jboss-svn-commits mailing list