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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 31 09:16:12 EDT 2007


Author: tirelli
Date: 2007-07-31 09:16:11 -0400 (Tue, 31 Jul 2007)
New Revision: 13909

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java
Log:
JBRULES-1030: fixing NPE and adding unit test

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2007-07-31 12:09:47 UTC (rev 13908)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2007-07-31 13:16:11 UTC (rev 13909)
@@ -102,28 +102,33 @@
                 }
                 final Class fieldType = (Class) inspector.getFieldTypes().get( fieldName );
                 final Method getterMethod = (Method) inspector.getGetterMethods().get( fieldName );
-                final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + "$" + getterMethod.getName();
+                if( fieldType != null && getterMethod != null ) {
+                    final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + "$" + getterMethod.getName();
 
-                // generating byte array to create target class
-                final byte[] bytes = dump( clazz,
-                                           className,
-                                           getterMethod,
-                                           fieldType,
-                                           clazz.isInterface() );
-                // use bytes to get a class 
+                    // generating byte array to create target class
+                    final byte[] bytes = dump( clazz,
+                                               className,
+                                               getterMethod,
+                                               fieldType,
+                                               clazz.isInterface() );
+                    // use bytes to get a class 
 
-                final Class newClass = byteArrayClassLoader.defineClass( className.replace( '/',
-                                                                                            '.' ),
-                                                                         bytes,
-                                                                         PROTECTION_DOMAIN );
-                // instantiating target class
-                final Integer index = (Integer) inspector.getFieldNames().get( fieldName );
-                final ValueType valueType = ValueType.determineValueType( fieldType );
-                final Object[] params = {index, fieldType, valueType};
-                return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
+                    final Class newClass = byteArrayClassLoader.defineClass( className.replace( '/',
+                                                                                                '.' ),
+                                                                             bytes,
+                                                                             PROTECTION_DOMAIN );
+                    // instantiating target class
+                    final Integer index = (Integer) inspector.getFieldNames().get( fieldName );
+                    final ValueType valueType = ValueType.determineValueType( fieldType );
+                    final Object[] params = {index, fieldType, valueType};
+                    return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
+                } else {
+                    throw new RuntimeDroolsException("Field/method '"+fieldName+"' not found for class '"+clazz.getName()+"'" );
+                }
             }
+        } catch ( final RuntimeDroolsException e ) {
+            throw e;
         } catch ( final Exception e ) {
-            //e.printStackTrace();
             throw new RuntimeDroolsException( e );
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java	2007-07-31 12:09:47 UTC (rev 13908)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java	2007-07-31 13:16:11 UTC (rev 13909)
@@ -18,6 +18,7 @@
 
 import junit.framework.TestCase;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.util.asm.BeanInherit;
 import org.drools.util.asm.InterfaceChild;
 import org.drools.util.asm.TestAbstract;
@@ -107,4 +108,26 @@
                       ((Number) ext.getValue( null, bean )).longValue() );
     }
 
+    public void testNonExistentField() throws Exception {
+        final Object[] objArray = new Object[1];
+
+        final TestBean obj = new TestBean();
+        obj.setBlah( false );
+        obj.setSomething( "no" );
+        obj.setObjArray( objArray );
+
+        try {
+            final ClassFieldExtractor ext = ClassFieldExtractorCache.getExtractor( TestBean.class,
+                                                                                   "xyz",
+                                                                                   getClass().getClassLoader() );
+            fail( "A RuntimeDroolsException should have been raised");
+        } catch ( RuntimeDroolsException e ) {
+            e.printStackTrace();
+            // everything is fine, since field does not exist
+        } catch ( Exception e ) {
+            fail( "A RuntimeDroolsException should have been raised");
+        }
+
+    }
+
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list