[jboss-svn-commits] JBL Code SVN: r25412 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/process/builder and 10 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Feb 24 19:45:47 EST 2009


Author: KrisVerlaenen
Date: 2009-02-24 19:45:47 -0500 (Tue, 24 Feb 2009)
New Revision: 25412

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/ContextResolver.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ActionNodeBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ExtendedNodeBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ActionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaActionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/process/builder/StoreNodeBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/impl/ProcessImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java
Log:
JBRULES-1979: Validate variable types in actions in MVEL
 - validating types of process variables in MVEL actions

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -16,25 +16,14 @@
  * limitations under the License.
  */
 
-import java.io.BufferedInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.Reader;
 import java.io.StringReader;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
 import org.drools.definition.process.Connection;
 import org.drools.definition.process.Node;
 import org.drools.definition.process.NodeContainer;
@@ -51,6 +40,7 @@
 import org.drools.process.core.context.exception.ActionExceptionHandler;
 import org.drools.process.core.context.exception.ExceptionHandler;
 import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.core.impl.ProcessImpl;
 import org.drools.process.core.validation.ProcessValidationError;
 import org.drools.process.core.validation.ProcessValidator;
 import org.drools.rule.builder.ProcessBuildContext;
@@ -167,7 +157,7 @@
     					ActionDescr actionDescr = new ActionDescr();
     			        actionDescr.setText( action.getConsequence() );   
     			        Dialect dialect = buildContext.getDialectRegistry().getDialect( action.getDialect() );            
-    			        dialect.getActionBuilder().build( buildContext, action, actionDescr );
+    			        dialect.getActionBuilder().build( buildContext, action, actionDescr, (ProcessImpl) buildContext.getProcess() );
     				}
     			}
     		}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ActionNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ActionNodeBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ActionNodeBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -7,6 +7,7 @@
 import org.drools.lang.descr.ProcessDescr;
 import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.workflow.core.node.ActionNode;
 
 public class ActionNodeBuilder extends ExtendedNodeBuilder {
@@ -21,7 +22,7 @@
         ActionDescr actionDescr = new ActionDescr();
         actionDescr.setText( action.getConsequence() );   
         Dialect dialect = context.getDialectRegistry().getDialect( action.getDialect() );            
-        dialect.getActionBuilder().build( context, action, actionDescr );
+        dialect.getActionBuilder().build( context, action, actionDescr, (NodeImpl) node );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -8,6 +8,7 @@
 import org.drools.process.core.timer.Timer;
 import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.workflow.core.node.EventBasedNode;
 
 public class EventBasedNodeBuilder extends ExtendedNodeBuilder {
@@ -20,7 +21,7 @@
         Map<Timer, DroolsAction> timers = ((EventBasedNode) node).getTimers();
         if (timers != null) {
 	        for (DroolsAction action: timers.values()) {
-	        	buildAction(action, context);
+	        	buildAction(action, context, (NodeImpl) node );
 	        }
         }
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ExtendedNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ExtendedNodeBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ExtendedNodeBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -11,6 +11,7 @@
 import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.impl.ExtendedNodeImpl;
+import org.drools.workflow.core.impl.NodeImpl;
 
 public class ExtendedNodeBuilder
     implements
@@ -25,18 +26,18 @@
         	List<DroolsAction> actions = extendedNode.getActions(type);
         	if (actions != null) {
 	        	for (DroolsAction droolsAction: actions) {
-	                buildAction(droolsAction, context);
+	                buildAction(droolsAction, context, (NodeImpl) node);
 	        	}
         	}
         }
     }
     
-    protected void buildAction(DroolsAction droolsAction, ProcessBuildContext context) {
+    protected void buildAction(DroolsAction droolsAction, ProcessBuildContext context, NodeImpl node) {
     	DroolsConsequenceAction action = (DroolsConsequenceAction) droolsAction;
         ActionDescr actionDescr = new ActionDescr();
         actionDescr.setText( action.getConsequence() );   
         Dialect dialect = context.getDialectRegistry().getDialect( action.getDialect() );            
-        dialect.getActionBuilder().build( context, action, actionDescr );
+        dialect.getActionBuilder().build( context, action, actionDescr, node);
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ActionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ActionBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ActionBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -1,12 +1,14 @@
 package org.drools.rule.builder;
 
 import org.drools.lang.descr.ActionDescr;
+import org.drools.process.core.ContextResolver;
 import org.drools.workflow.core.DroolsAction;
 
 public interface ActionBuilder {
 
     public void build(final PackageBuildContext context,
                       final DroolsAction action,
-                      final ActionDescr actionDescr);
+                      final ActionDescr actionDescr,
+                      final ContextResolver contextResolver);
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaActionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaActionBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaActionBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -23,7 +23,7 @@
 
 import org.drools.compiler.Dialect;
 import org.drools.lang.descr.ActionDescr;
-import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.ContextResolver;
 import org.drools.rule.builder.ActionBuilder;
 import org.drools.rule.builder.PackageBuildContext;
 import org.drools.rule.builder.ProcessBuildContext;
@@ -51,7 +51,7 @@
     public void build(final PackageBuildContext context,
                       final DroolsAction action,
                       final ActionDescr actionDescr,
-                      final VariableScope variableScope) {
+                      final ContextResolver contextResolver) {
 
         final String className = "action" + context.getNextId();               
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -2,6 +2,7 @@
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -10,9 +11,12 @@
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.lang.descr.ActionDescr;
+import org.drools.process.core.ContextResolver;
+import org.drools.process.core.context.variable.VariableScope;
 import org.drools.rule.MVELDialectRuntimeData;
 import org.drools.rule.builder.ActionBuilder;
 import org.drools.rule.builder.PackageBuildContext;
+import org.drools.spi.KnowledgeHelper;
 import org.drools.spi.ProcessContext;
 import org.drools.workflow.core.DroolsAction;
 import org.mvel2.Macro;
@@ -66,7 +70,8 @@
 
     public void build(final PackageBuildContext context,
                       final DroolsAction action,
-                      final ActionDescr actionDescr) {
+                      final ActionDescr actionDescr,
+                      final ContextResolver contextResolver) {
 
         String text = processMacros( actionDescr.getText() );
 
@@ -76,24 +81,48 @@
             Set<String> variables = new HashSet<String>();
             variables.add("context");
             variables.add("kcontext");
+            variables.add("drools");
             Dialect.AnalysisResult analysis = dialect.analyzeBlock( context,
                                                                     actionDescr,
                                                                     dialect.getInterceptors(),
                                                                     text,
                                                                     new Set[]{variables, context.getPkg().getGlobals().keySet()},
                                                                     null );                       
-            
+
+
             Map<String, Class> variableClasses = new HashMap<String, Class>();
             variableClasses.put("context", ProcessContext.class);
             variableClasses.put("kcontext", org.drools.runtime.process.ProcessContext.class);
+            variableClasses.put("drools", KnowledgeHelper.class);
+
+            List<String> variableNames = analysis.getNotBoundedIdentifiers();
+            if (contextResolver != null) {
+	            for (String variableName: variableNames) {
+	            	VariableScope variableScope = (VariableScope) contextResolver.resolveContext(VariableScope.VARIABLE_SCOPE, variableName);
+	            	if (variableScope == null) {
+	            		context.getErrors().add(
+	        				new DescrBuildError(
+	    						context.getParentDescr(),
+	                            actionDescr,
+	                            null,
+	                            "Could not find variable '" + variableName + "' for action '" + actionDescr.getText() + "'" ) );            		
+	            	} else {
+	            		variableClasses.put(variableName, Class.forName(
+            				variableScope.findVariable(variableName).getType().getStringType()));
+	            	}
+	            }
+            }
+
             MVELCompilationUnit unit = dialect.getMVELCompilationUnit( text,
                                                                        analysis,
                                                                        null,
                                                                        null,
                                                                        variableClasses,
                                                                        context );              
-            MVELAction expr = new MVELAction( unit, context.getDialect().getId() );   
-            expr.setVariableNames(analysis.getNotBoundedIdentifiers());
+            MVELAction expr = new MVELAction( unit, context.getDialect().getId() );
+            expr.setVariableNames(variableNames);
+            
+            
             action.setMetaData("Action",  expr );
             
             MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( dialect.getId() );            

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/process/builder/StoreNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/process/builder/StoreNodeBuilder.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/process/builder/StoreNodeBuilder.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -7,6 +7,7 @@
 import org.drools.lang.descr.ProcessDescr;
 import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.workflow.core.node.ActionNode;
 
 public class StoreNodeBuilder
@@ -24,7 +25,7 @@
         
         Dialect dialect = context.getDialectRegistry().getDialect( action.getDialect() );            
         
-        dialect.getActionBuilder().build( context, action, actionDescr );
+        dialect.getActionBuilder().build( context, action, actionDescr, (NodeImpl) node );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -58,7 +58,7 @@
         DroolsAction action = new DroolsConsequenceAction("java", null);
         actionNode.setAction(action);
         
-        javaDialect.getActionBuilder().build( context, action, actionDescr );
+        javaDialect.getActionBuilder().build( context, action, actionDescr, actionNode );
         javaDialect.addProcess( context );
         javaDialect.compileAll();            
         assertEquals( 0, javaDialect.getResults().size() );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -51,7 +51,8 @@
         final MVELActionBuilder builder = new MVELActionBuilder();
         builder.build( context,
                        action,
-                       actionDescr );
+                       actionDescr,
+                       actionNode );
 
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         ruleBase.addPackage( pkgBuilder.getPackage() );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -52,7 +52,8 @@
         final MVELActionBuilder builder = new MVELActionBuilder();
         builder.build( context,
                        action,
-                       actionDescr );
+                       actionDescr,
+                       actionNode );
 
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         ruleBase.addPackage( pkgBuilder.getPackage() );

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/ContextResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/ContextResolver.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/ContextResolver.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -0,0 +1,7 @@
+package org.drools.process.core;
+
+public interface ContextResolver {
+	
+	Context resolveContext(String contextId, Object param);
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -85,6 +85,6 @@
 	}
 
 	public String getStringType() {
-		return className == null ? "Object" : className;
+		return className == null ? "java.lang.Object" : className;
 	}
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/impl/ProcessImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/impl/ProcessImpl.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/impl/ProcessImpl.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -26,6 +26,7 @@
 import org.drools.io.Resource;
 import org.drools.process.core.Context;
 import org.drools.process.core.ContextContainer;
+import org.drools.process.core.ContextResolver;
 import org.drools.process.core.Process;
 import org.drools.process.core.context.AbstractContext;
 
@@ -34,7 +35,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class ProcessImpl implements Process, Serializable {
+public class ProcessImpl implements Process, Serializable, ContextResolver {
     
     private static final long serialVersionUID = 400L;
 
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2009-02-25 00:21:46 UTC (rev 25411)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2009-02-25 00:45:47 UTC (rev 25412)
@@ -26,6 +26,7 @@
 import org.drools.definition.process.Connection;
 import org.drools.definition.process.NodeContainer;
 import org.drools.process.core.Context;
+import org.drools.process.core.ContextResolver;
 import org.drools.workflow.core.Node;
 
 /**
@@ -33,7 +34,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public abstract class NodeImpl implements Node, Serializable {
+public abstract class NodeImpl implements Node, Serializable, ContextResolver {
 
     private static final long serialVersionUID = 4L;
 




More information about the jboss-svn-commits mailing list