[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 = <qualified class name></li>
* <li>drools.maxThreads = <-1|1..n></li>
* <li>drools.multithreadEvaluation = <true|false></li>
+ * <li>drools.mbeans = <enabled|disabled></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 = <enabled|disabled>
+ *
+ * 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 = <qualified class name>
* drools.maxThreads = <-1|1..n>
* drools.multithreadEvaluation = <true|false>
+ * drools.mbeans = <enabled|disabled>
* </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