[jboss-svn-commits] JBL Code SVN: r33208 - in labs/jbossrules/trunk/drools-compiler/src: test/java/org/drools/integrationtests and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun May 30 19:35:11 EDT 2010


Author: mark.proctor at jboss.com
Date: 2010-05-30 19:35:10 -0400 (Sun, 30 May 2010)
New Revision: 33208

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
Log:
JBRULES-2527 NPE for bindings using invalid field names
-Fixed with unit test for regression.

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2010-05-30 16:00:06 UTC (rev 33207)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2010-05-30 23:35:10 UTC (rev 33208)
@@ -596,7 +596,7 @@
                        final PredicateDescr predicateDescr,
                        final AbstractCompositeConstraint container) {
 
-        Map<String, Class< ? >> declarations = getDeclarationsMap( context );
+        Map<String, Class< ? >> declarations = getDeclarationsMap( predicateDescr, context );
         Map<String, Class< ? >> globals = context.getPackageBuilder().getGlobals();
 
         final Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
@@ -660,9 +660,16 @@
 
     }
 
-    private Map<String, Class< ? >> getDeclarationsMap(final RuleBuildContext context) {
+    private Map<String, Class< ? >> getDeclarationsMap(final BaseDescr baseDescr, final RuleBuildContext context) {
         Map<String, Class< ? >> declarations = new HashMap<String, Class< ? >>();
         for ( Map.Entry<String, Declaration> entry : context.getDeclarationResolver().getDeclarations( context.getRule() ).entrySet() ) {
+            if ( entry.getValue().getExtractor() == null ) {
+                context.getErrors().add( new DescrBuildError( context.getParentDescr(),
+                                                              baseDescr,
+                                                              null,
+                                                              "Field Reader does not exist for declaration '" + entry.getKey() + "' in'" + baseDescr + "' in the rule '" + context.getRule().getName() + "'" ) );
+                continue;           
+            }
             declarations.put( entry.getKey(),
                               entry.getValue().getExtractor().getExtractToClass() );
         }
@@ -973,7 +980,7 @@
                                                     final InternalReadAccessor extractor,
                                                     final FieldConstraintDescr fieldConstraintDescr,
                                                     final ReturnValueRestrictionDescr returnValueRestrictionDescr) {
-        Map<String, Class< ? >> declarations = getDeclarationsMap( context );
+        Map<String, Class< ? >> declarations = getDeclarationsMap( returnValueRestrictionDescr, context );
         Map<String, Class< ? >> globals = context.getPackageBuilder().getGlobals();
         Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                   returnValueRestrictionDescr,
@@ -1065,9 +1072,6 @@
                 reader = context.getPkg().getClassFieldAccessorStore().getReader( ((ClassObjectType) objectType).getClassName(),
                                                                                   fieldName,
                                                                                   target );
-                //                extractor = context.getDialect().getClassFieldExtractorCache().getReader( ((ClassObjectType) objectType).getClassType(),
-                //                                                                                          fieldName,
-                //                                                                                          classloader );
             } catch ( final Exception e ) {
                 if ( reportError ) {
                     context.getErrors().add( new DescrBuildError( context.getParentDescr(),

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-05-30 16:00:06 UTC (rev 33207)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-05-30 23:35:10 UTC (rev 33208)
@@ -6181,7 +6181,55 @@
                       jlist.get( 2 ) );
 
     }
+    
+    public void testFieldBindingOnWrongFieldName() {
+        //JBRULES-2527
+        
+        String str = "";
+        str += "package org.drools\n";
+        str += "import org.drools.Person\n";
+        str += "global java.util.List mlist\n";
+        str += "rule rule1 \n";
+        str += "when\n";
+        str += "   Person( $f : invalidFieldName, eval( $f != null ) )\n";
+        str += "then\n";
+        str += "end\n";
 
+        try {
+            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+            kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                          ResourceType.DRL );
+    
+            if ( !kbuilder.hasErrors() ) {
+                fail( "KnowledgeBuilder should have errors" );
+            }
+        } catch ( Exception e ) {
+                fail( "Exception should not be thrown ");
+        }
+        
+        str = "";
+        str += "package org.drools\n";
+        str += "import org.drools.Person\n";
+        str += "global java.util.List mlist\n";
+        str += "rule rule1 \n";
+        str += "when\n";
+        str += "   Person( $f : invalidFieldName, name == ( $f ) )\n";
+        str += "then\n";
+        str += "end\n";
+
+        try {
+            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+            kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                          ResourceType.DRL );
+    
+            if ( !kbuilder.hasErrors() ) {
+                fail( "KnowledgeBuilder should have errors" );
+            }
+        } catch ( Exception e ) {
+                fail( "Exception should not be thrown ");
+        }      
+    }    
+
     public void testDeepNestedConstraints() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DeepNestedConstraints.drl" ) ) );



More information about the jboss-svn-commits mailing list