[jboss-svn-commits] JBL Code SVN: r11385 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/base/evaluators and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 26 18:39:34 EDT 2007


Author: strobhen
Date: 2007-04-26 18:39:34 -0400 (Thu, 26 Apr 2007)
New Revision: 11385

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BaseClassFieldExtractorsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
Log:
Fixed: JBRULES-627 null pointer with number comparison.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -77,7 +77,7 @@
     public ValueType getValueType() {
         return this.valueType;
     }
-
+    
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -147,7 +147,11 @@
     public short getShortValue(final Object object) {
         return this.extractor.getShortValue( object );
     }
-
+    
+    public boolean isNullValue(final Object object) {
+        return this.extractor.isNullValue( object );
+    }
+   
     public Method getNativeReadMethod() {
         return this.extractor.getNativeReadMethod();
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -67,16 +67,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             return extractor.getBooleanValue( object1 ) == object2.getBooleanValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
             return context.declaration.getExtractor().getBooleanValue( left ) == ((BooleanVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object object2) {
+            if ( context.extractor.isNullValue( object2 )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             return context.extractor.getBooleanValue( object2 ) == ((BooleanVariableContextEntry) context).left;
         }
 
@@ -84,6 +102,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             return extractor1.getBooleanValue( object1 ) == extractor2.getBooleanValue( object2 );
         }
 
@@ -108,16 +132,33 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             return extractor.getBooleanValue( object1 ) != object2.getBooleanValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
             return context.declaration.getExtractor().getBooleanValue( left ) != ((BooleanVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object object2) {
+            if ( context.extractor.isNullValue( object2 )) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             return context.extractor.getBooleanValue( object2 ) != ((BooleanVariableContextEntry) context).left;
         }
 
@@ -125,6 +166,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             return extractor1.getBooleanValue( object1 ) != extractor1.getBooleanValue( object2 );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -75,16 +75,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             return extractor.getByteValue( object1 ) == object2.getByteValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
             return context.declaration.getExtractor().getByteValue( left ) == ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( right );
         }
 
@@ -92,6 +110,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             return extractor1.getByteValue( object1 ) == extractor2.getByteValue( object2 );
         }
 
@@ -116,23 +140,47 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             return extractor.getByteValue( object1 ) != object2.getByteValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             return context.declaration.getExtractor().getByteValue( left ) != ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( right );
+                                          final Object object2) {
+            if ( context.extractor.isNullValue( object2 ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( object2 );
         }
 
         public boolean evaluate(final Extractor extractor1,
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             return extractor1.getByteValue( object1 ) != extractor2.getByteValue( object2 );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -75,16 +75,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             return extractor.getCharValue( object1 ) == object2.getCharValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
             return context.declaration.getExtractor().getCharValue( left ) == ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( right );
         }
 
@@ -92,6 +110,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             return extractor1.getCharValue( object1 ) == extractor2.getCharValue( object2 );
         }
 
@@ -115,16 +139,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             return extractor.getCharValue( object1 ) != object2.getCharValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             return context.declaration.getExtractor().getCharValue( left ) != ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( right );
         }
 
@@ -132,6 +174,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             return extractor1.getCharValue( object1 ) != extractor2.getCharValue( object2 );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -75,18 +75,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
             // TODO: we are not handling delta right now... maybe we should
             return extractor.getDoubleValue( object1 ) == object2.getDoubleValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
             // TODO: we are not handling delta right now... maybe we should
             return context.declaration.getExtractor().getDoubleValue( left ) == ((DoubleVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( right );
         }
@@ -95,6 +111,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor1.getDoubleValue( object1 ) == extractor2.getDoubleValue( object2 );
         }
@@ -119,18 +141,36 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor.getDoubleValue( object1 ) != object2.getDoubleValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return context.declaration.getExtractor().getDoubleValue( left ) != ((DoubleVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( right );
         }
@@ -139,6 +179,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor1.getDoubleValue( object1 ) != extractor2.getDoubleValue( object2 );
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -73,18 +73,36 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor.getFloatValue( object1 ) == object2.getFloatValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return context.declaration.getExtractor().getFloatValue( left ) == ((DoubleVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( right );
         }
@@ -93,6 +111,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor1.getFloatValue( object1 ) == extractor2.getFloatValue( object2 );
         }
@@ -117,18 +141,36 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor.getFloatValue( object1 ) != object2.getFloatValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return context.declaration.getExtractor().getFloatValue( left ) != ((DoubleVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( right );
         }
@@ -137,6 +179,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             // TODO: we are not handling delta right now... maybe we should
             return extractor1.getFloatValue( object1 ) != extractor2.getFloatValue( object2 );
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -75,23 +75,47 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             return extractor.getIntValue( object1 ) == object2.getIntValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
-            return context.declaration.getExtractor().getIntValue( left ) == ((LongVariableContextEntry) context).right;
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getIntValue( left ) == ((LongVariableContextEntry) context).right; 
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object object2) {
+            if ( context.extractor.isNullValue( object2 )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             return context.extractor.getIntValue( object2 ) == ((LongVariableContextEntry) context).left;
         }
 
         public boolean evaluate(final Extractor extractor1,
                                 final Object object1,
                                 final Extractor extractor2,
-                                final Object object2) {
+                                final Object object2) {            
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             return extractor1.getIntValue( object1 ) == extractor2.getIntValue( object2 );
         }
 
@@ -115,17 +139,35 @@
 
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
-                                final FieldValue object2) {
+                                final FieldValue object2) {        	          
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             return extractor.getIntValue( object1 ) != object2.getIntValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             return context.declaration.getExtractor().getIntValue( left ) != ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object object2) {
+            if ( context.extractor.isNullValue( object2 ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             return context.extractor.getIntValue( object2 ) != ((LongVariableContextEntry) context).left;
         }
 
@@ -133,6 +175,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             return extractor1.getIntValue( object1 ) != extractor2.getIntValue( object2 );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -75,16 +75,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             return extractor.getLongValue( object1 ) == object2.getLongValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
             return context.declaration.getExtractor().getLongValue( left ) == ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( right );
         }
 
@@ -92,6 +110,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             return extractor1.getLongValue( object1 ) == extractor2.getLongValue( object2 );
         }
 
@@ -115,16 +139,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             return extractor.getLongValue( object1 ) != object2.getLongValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             return context.declaration.getExtractor().getLongValue( left ) != ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( right );
         }
 
@@ -132,6 +174,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             return extractor1.getLongValue( object1 ) != extractor2.getLongValue( object2 );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -75,16 +75,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
             return extractor.getShortValue( object1 ) == object2.getShortValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
             return context.declaration.getExtractor().getShortValue( left ) == ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
             return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( right );
         }
 
@@ -92,6 +110,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return false;
+            }
+            
             return extractor1.getShortValue( object1 ) == extractor2.getShortValue( object2 );
         }
 
@@ -115,16 +139,34 @@
         public boolean evaluate(final Extractor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
+            if ( extractor.isNullValue( object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
             return extractor.getShortValue( object1 ) != object2.getShortValue();
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
             return context.declaration.getExtractor().getShortValue( left ) != ((LongVariableContextEntry) context).right;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
+            if ( context.extractor.isNullValue( right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
             return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( right );
         }
 
@@ -132,6 +174,12 @@
                                 final Object object1,
                                 final Extractor extractor2,
                                 final Object object2) {
+            if (extractor1.isNullValue( object1 )) {
+                return !extractor2.isNullValue( object2 );
+            } else if (extractor2.isNullValue( object2 )) {
+                return true;
+            }
+            
             return extractor1.getShortValue( object1 ) != extractor2.getShortValue( object2 );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -86,6 +86,10 @@
     public short getShortValue(final Object object) {
         throw new RuntimeDroolsException( "Conversion to short not supported from boolean" );
     }
+    
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
 
     public Method getNativeReadMethod() {
         try {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -87,6 +87,10 @@
         return getByteValue( object );
     }
 
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
+    
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getByteValue",

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -65,6 +65,10 @@
         return (short) getCharValue( object );
     }
 
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
+    
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getCharValue",

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -66,6 +66,10 @@
         return (short) getDoubleValue( object );
     }
 
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
+
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getDoubleValue",

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -66,6 +66,10 @@
         return (short) getFloatValue( object );
     }
 
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
+
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getFloatValue",

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -66,6 +66,10 @@
         return (short) getIntValue( object );
     }
 
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
+
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getIntValue",

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -66,6 +66,10 @@
         return (short) getLongValue( object );
     }
 
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
+
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getLongValue",

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -30,6 +30,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Boolean ) {
             return ((Boolean) value).booleanValue();
         }
@@ -40,6 +41,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Number ) {
             return ((Number) value).byteValue();
         }
@@ -50,6 +52,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Character ) {
             return ((Character) value).charValue();
         }
@@ -60,6 +63,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Number ) {
             return ((Number) value).doubleValue();
         }
@@ -70,6 +74,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Number ) {
             return ((Number) value).floatValue();
         }
@@ -80,6 +85,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Number ) {
             return ((Number) value).intValue();
         }
@@ -90,6 +96,7 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+        
         if ( value instanceof Number ) {
             return ((Number) value).longValue();
         }
@@ -100,11 +107,20 @@
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
         final Object value = getValue( object );
+
         if ( value instanceof Number ) {
             return ((Number) value).shortValue();
         }
         throw new RuntimeDroolsException( "Conversion to short not supported from " + value.getClass().getName() );
     }
+    
+    public boolean isNullValue(final Object object) {
+        if (object == null) {
+            return true;
+        } else {
+            return getValue( object ) == null;
+        }
+    }
 
     public Method getNativeReadMethod() {
         try {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -65,6 +65,10 @@
     }
 
     public abstract short getShortValue(Object object);
+    
+    public boolean isNullValue(final Object object) {
+        return false;
+    }
 
     public Method getNativeReadMethod() {
         try {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -37,6 +37,9 @@
 
     public Object getValue(final Object object) {
         return (object instanceof ShadowProxy) ? ((ShadowProxy) object).getShadowedObject() : object;
+    }   
+    
+    public boolean isNullValue(final Object object) {
+        return getValue( object ) == null;
     }
-
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -28,7 +28,7 @@
     FieldValue {
 
     private static final long serialVersionUID = 320;
-    private boolean           value;
+    private final boolean     value;
 
     public BooleanFieldImpl(final boolean value) {
         this.value = value;
@@ -89,6 +89,10 @@
     public int hashCode() {
         return this.value ? 1 : 0;
     }
+    
+    public boolean isNull() {
+        return false;
+    }
 
     public boolean isBooleanField() {
         return true;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -8,7 +8,7 @@
     FieldValue {
 
     private static final long serialVersionUID = 320;
-    private double            value;
+    private final double      value;
 
     public DoubleFieldImpl(final double value) {
         this.value = value;
@@ -69,6 +69,10 @@
     public int hashCode() {
         return (int) this.value;
     }
+    
+    public boolean isNull() {
+        return false;
+    }
 
     public boolean isBooleanField() {
         return false;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -8,7 +8,7 @@
     FieldValue {
 
     private static final long serialVersionUID = 320;
-    private long              value;
+    private final long        value;
 
     public LongFieldImpl(final long value) {
         this.value = value;
@@ -69,6 +69,10 @@
     public int hashCode() {
         return (int) this.value;
     }
+    
+    public boolean isNull() {
+        return false;
+    }
 
     public boolean isBooleanField() {
         return false;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -24,7 +24,7 @@
     FieldValue {
 
     private static final long serialVersionUID = 320;
-    private Object            value;
+    private final Object      value;
 
     public ObjectFieldImpl(final Object value) {
         this.value = value;
@@ -113,6 +113,10 @@
             return 0;
         }
     }
+    
+    public boolean isNull() {
+        return value == null;
+    }
 
     public boolean isBooleanField() {
         return false;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -81,4 +81,8 @@
     public int getHashCode(final Object object) {
         return getValue( object ).hashCode();
     }
+
+    public boolean isNullValue(Object object) {
+        return ((Fact) object).getFieldValue( this.fieldIndex ) == null;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -137,6 +137,8 @@
         public Declaration    declaration;
         public ReteTuple      reteTuple;
         public ContextEntry   entry;
+        public boolean     leftNull;
+        public boolean     rightNull;
 
         public VariableContextEntry(final FieldExtractor extractor,
                                     final Declaration declaration) {
@@ -167,7 +169,14 @@
         public Declaration getVariableDeclaration() {
             return this.declaration;
         }
-
+        
+        public boolean isLeftNull() {
+            return this.leftNull;
+        }
+        
+        public boolean isRightNull() {
+            return this.rightNull;
+        }
     }
 
     public static class ObjectVariableContextEntry extends VariableContextEntry {
@@ -185,12 +194,14 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
+            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
             this.left = this.declaration.getExtractor().getValue( tuple.get( this.declaration ).getObject() );
         }
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
+            this.rightNull = this.extractor.isNullValue( handle.getObject() );
             this.right = this.extractor.getValue( handle.getObject() );
         }
     }
@@ -211,13 +222,25 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.left = this.declaration.getExtractor().getLongValue( tuple.get( this.declaration ).getObject() );
+            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
+            
+            if (!leftNull) {
+                this.left = this.declaration.getExtractor().getLongValue( tuple.get( this.declaration ).getObject() );
+            } else {
+                this.left = 0;
+            }
         }
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.right = this.extractor.getLongValue( handle.getObject() );
+            this.rightNull = this.extractor.isNullValue( handle.getObject() );
+            
+            if ( !rightNull ) { // avoid a NullPointerException
+                this.right = this.extractor.getLongValue( handle.getObject() );
+            } else {
+                this.right = 0;
+            }
         }
     }
 
@@ -237,13 +260,25 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.left = this.declaration.getExtractor().getDoubleValue( tuple.get( this.declaration ).getObject() );
+            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
+            
+            if (!leftNull) {
+                this.left = this.declaration.getExtractor().getDoubleValue( tuple.get( this.declaration ).getObject() );
+            } else {
+                this.left = 0;
+            }
         }
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.right = this.extractor.getDoubleValue( handle.getObject() );
+            this.rightNull = this.extractor.isNullValue( handle.getObject() );
+            
+            if ( !rightNull ) { // avoid a NullPointerException
+                this.right = this.extractor.getDoubleValue( handle.getObject() );
+            } else {
+                this.right = 0;
+            }
         }
     }
 
@@ -262,14 +297,25 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.left = this.declaration.getExtractor().getBooleanValue( tuple.get( this.declaration ).getObject() );
+            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
+            
+            if ( !leftNull ) {
+                this.left = this.declaration.getExtractor().getBooleanValue( tuple.get( this.declaration ).getObject() );
+            } else {
+                this.left = false;
+            }
         }
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.right = this.extractor.getBooleanValue( handle.getObject() );
+            this.rightNull = this.extractor.isNullValue( handle.getObject() );
+            
+            if ( !rightNull ) { // avoid a NullPointerException
+                this.right = this.extractor.getBooleanValue( handle.getObject() );
+            } else {
+                this.right = false;
+            }
         }
     }
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -42,6 +42,8 @@
     public double getDoubleValue(Object object);
 
     public boolean getBooleanValue(Object object);
+    
+    public boolean isNullValue(Object object);
 
     public ValueType getValueType();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -39,6 +39,8 @@
     public double getDoubleValue();
 
     public boolean getBooleanValue();
+    
+    public boolean isNull();
 
     public boolean isBooleanField();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -114,4 +114,8 @@
         return ( key == null ? other.key == null : key.equals( other.key ) ) &&
                ( this.objectType == null ? other.objectType == null : this.objectType.equals( other.objectType ));
     }
+
+    public boolean isNullValue(Object object) {
+        throw new UnsupportedOperationException("Operation not supported for globals");
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -127,6 +127,10 @@
         }
     }
 
+    public boolean isNullValue(final Object object) {
+        return getValue( object ) == null;
+    }
+
     public int getHashCode(final Object object) {
         return getValue( object ).hashCode();
     }
@@ -145,4 +149,4 @@
         final PatternExtractor other = (PatternExtractor) obj;
         return this.objectType.equals( other.objectType );
     }
-}
\ No newline at end of file
+}

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -89,7 +89,8 @@
 
         final Object[][] data = {{new Integer( 42 ), "==", new Integer( 42 ), Boolean.TRUE}, {new Integer( 42 ), "<", new Integer( 43 ), Boolean.TRUE}, {new Integer( 42 ), ">=", new Integer( 41 ), Boolean.TRUE},
                 {new Integer( 42 ), "!=", new Integer( 41 ), Boolean.TRUE}, {new Integer( 42 ), ">", new Integer( 41 ), Boolean.TRUE}, {new Integer( 42 ), "<=", new Integer( 42 ), Boolean.TRUE},
-                {new Integer( 42 ), ">", new Integer( 100 ), Boolean.FALSE}};
+                {new Integer( 42 ), ">", new Integer( 100 ), Boolean.FALSE}, {new Integer( 42 ), "!=", null, Boolean.TRUE}, {new Integer( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, 
+                {null, "!=", null, Boolean.FALSE}, {null, "!=", new Integer( 42 ), Boolean.TRUE}, {null, "==", new Integer( 42 ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PINTEGER_TYPE );
@@ -132,7 +133,8 @@
 
         //Test data: Obj1, Operand, Obj2
         final Object[][] data = {{new Short( (short) 42 ), "==", new Short( (short) 42 ), Boolean.TRUE}, {new Short( (short) 42 ), "<", new Short( (short) 43 ), Boolean.TRUE}, {new Short( (short) 42 ), ">=", new Short( (short) 41 ), Boolean.TRUE},
-                {new Short( (short) 42 ), "!=", new Short( (short) 41 ), Boolean.TRUE}};
+                {new Short( (short) 42 ), "!=", new Short( (short) 41 ), Boolean.TRUE}, {new Short( (short) 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, 
+                {null, "!=", new Short( (short) 42 ), Boolean.TRUE}, {null, "==", new Short( (short) 42 ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PSHORT_TYPE );
@@ -142,7 +144,8 @@
 
         //Test data: Obj1, Operand, Obj2
         final Object[][] data = {{new Boolean( true ), "==", new Boolean( true ), Boolean.TRUE}, {new Boolean( false ), "!=", new Boolean( true ), Boolean.TRUE}, {new Boolean( true ), "==", new Boolean( false ), Boolean.FALSE},
-                {new Boolean( true ), "!=", new Boolean( false ), Boolean.TRUE}};
+                {new Boolean( true ), "!=", new Boolean( false ), Boolean.TRUE}, {new Boolean( true ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, 
+                {null, "!=", new Boolean( true ), Boolean.TRUE}, {null, "==", new Boolean( true ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PBOOLEAN_TYPE );
@@ -151,7 +154,8 @@
     public void testDouble() {
         final Object[][] data = {{new Double( 42 ), "==", new Double( 42 ), Boolean.TRUE}, {new Double( 42 ), "<", new Double( 43 ), Boolean.TRUE}, {new Double( 42 ), ">=", new Double( 41 ), Boolean.TRUE},
                 {new Double( 42 ), "!=", new Double( 41 ), Boolean.TRUE}, {new Double( 42 ), ">", new Double( 41 ), Boolean.TRUE}, {new Double( 42 ), ">=", new Double( 41 ), Boolean.TRUE}, {new Double( 42 ), ">=", new Double( 42 ), Boolean.TRUE},
-                {new Double( 42 ), ">=", new Double( 100 ), Boolean.FALSE}, {new Double( 42 ), "<", new Double( 1 ), Boolean.FALSE}};
+                {new Double( 42 ), ">=", new Double( 100 ), Boolean.FALSE}, {new Double( 42 ), "<", new Double( 1 ), Boolean.FALSE}, {new Double( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, 
+                {null, "!=", new Double( 42 ), Boolean.TRUE}, {null, "==", new Double( 42 ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PDOUBLE_TYPE );
@@ -160,7 +164,8 @@
     public void testFloat() {
         final Object[][] data = {{new Float( 42 ), "==", new Float( 42 ), Boolean.TRUE}, {new Float( 42 ), "<", new Float( 43 ), Boolean.TRUE}, {new Float( 42 ), ">=", new Float( 41 ), Boolean.TRUE},
                 {new Float( 42 ), "!=", new Float( 41 ), Boolean.TRUE}, {new Float( 42 ), ">", new Float( 41 ), Boolean.TRUE}, {new Float( 42 ), ">=", new Float( 41 ), Boolean.TRUE}, {new Float( 42 ), ">=", new Float( 42 ), Boolean.TRUE},
-                {new Float( 42 ), ">=", new Float( 100 ), Boolean.FALSE}, {new Float( 42 ), "<", new Float( 1 ), Boolean.FALSE}};
+                {new Float( 42 ), ">=", new Float( 100 ), Boolean.FALSE}, {new Float( 42 ), "<", new Float( 1 ), Boolean.FALSE}, {new Float( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, 
+                {null, "!=", new Float( 42 ), Boolean.TRUE}, {null, "==", new Float( 42 ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PFLOAT_TYPE );
@@ -169,7 +174,8 @@
     public void testLong() {
         final Object[][] data = {{new Long( 42 ), "==", new Long( 42 ), Boolean.TRUE}, {new Long( 42 ), "<", new Long( 43 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 41 ), Boolean.TRUE}, {new Long( 42 ), "!=", new Long( 41 ), Boolean.TRUE},
                 {new Long( 42 ), ">", new Long( 41 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 41 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 42 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 100 ), Boolean.FALSE},
-                {new Long( 42 ), "<", new Long( 1 ), Boolean.FALSE}};
+                {new Long( 42 ), "<", new Long( 1 ), Boolean.FALSE}, {new Long( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {null, "!=", new Long( 42 ), Boolean.TRUE}, 
+                {null, "==", new Long( 42 ), Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PLONG_TYPE );
@@ -178,7 +184,8 @@
     public void testCharacter() {
         final Object[][] data = {{new Character( 'a' ), "==", new Character( 'a' ), Boolean.TRUE}, {new Character( 'a' ), "<", new Character( 'b' ), Boolean.TRUE}, {new Character( 'a' ), ">=", new Character( 'a' ), Boolean.TRUE},
                 {new Character( 'a' ), "!=", new Character( 'Z' ), Boolean.TRUE}, {new Character( 'z' ), ">", new Character( 'a' ), Boolean.TRUE}, {new Character( 'z' ), ">=", new Character( 'z' ), Boolean.TRUE},
-                {new Character( 'z' ), ">=", new Character( 'a' ), Boolean.TRUE}, {new Character( 'a' ), ">=", new Character( 'z' ), Boolean.FALSE}, {new Character( 'z' ), "<", new Character( 'a' ), Boolean.FALSE}};
+                {new Character( 'z' ), ">=", new Character( 'a' ), Boolean.TRUE}, {new Character( 'a' ), ">=", new Character( 'z' ), Boolean.FALSE}, {new Character( 'z' ), "<", new Character( 'a' ), Boolean.FALSE},
+                {new Character( 'z' ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {null, "!=", new Character( 'z' ), Boolean.TRUE}, {null, "==", new Character( 'z' ), Boolean.FALSE}};
         runEvaluatorTest( data,
                           ValueType.PCHAR_TYPE );
     }
@@ -200,7 +207,8 @@
 
     public void testByte() {
         final Object[][] data = {{new Byte( "1" ), "==", new Byte( "1" ), Boolean.TRUE}, {new Byte( "1" ), "==", new Byte( "2" ), Boolean.FALSE}, {new Byte( "1" ), "!=", new Byte( "2" ), Boolean.TRUE},
-                {new Byte( "1" ), "!=", new Byte( "1" ), Boolean.FALSE}, {new Byte( "1" ), "<=", new Byte( "1" ), Boolean.TRUE}};
+                {new Byte( "1" ), "!=", new Byte( "1" ), Boolean.FALSE}, {new Byte( "1" ), "<=", new Byte( "1" ), Boolean.TRUE}, {new Byte( "1" ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, 
+                {null, "!=", null, Boolean.FALSE}, {null, "!=", new Byte( "1" ), Boolean.TRUE}, {null, "==", new Byte( "1" ), Boolean.FALSE}};
         runEvaluatorTest( data,
                           ValueType.PBYTE_TYPE );
 
@@ -352,31 +360,78 @@
         if ( valueType.isIntegerNumber() || valueType.isChar() ) {
             final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
                                                                              declaration );
-            if ( row[2] instanceof Character ) {
-                context.left = ((Character) row[2]).charValue();
-                context.right = ((Character) row[0]).charValue();
+            
+            if ( valueType.isChar() ) {
+                if (row[2] == null) {
+                    context.leftNull = true;
+                } else {
+                    context.left = ((Character) row[2]).charValue();
+                }
+                
+                if (row[0] == null) {
+                    context.rightNull = true;
+                } else {
+                    context.right = ((Character) row[0]).charValue();
+                }
             } else {
-                context.left = ((Number) row[2]).longValue();
-                context.right = ((Number) row[0]).longValue();
+                if (row[2] == null) {
+                    context.leftNull = true;
+                } else {
+                    context.left = ((Number) row[2]).longValue();
+                }
+                
+                if (row[0] == null) {
+                    context.rightNull = true;
+                } else {
+                    context.right = ((Number) row[0]).longValue();
+                }
             }
             return context;
         } else if ( valueType.isBoolean() ) {
             final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
                                                                                    declaration );
-            context.left = ((Boolean) row[2]).booleanValue();
-            context.right = ((Boolean) row[0]).booleanValue();
+            
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Boolean) row[2]).booleanValue();
+            }
+            
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Boolean) row[0]).booleanValue();
+            }
             return context;
         } else if ( valueType.isFloatNumber() ) {
             final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
                                                                                  declaration );
-            context.left = ((Number) row[2]).doubleValue();
-            context.right = ((Number) row[0]).doubleValue();
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Number) row[2]).doubleValue();
+            }
+            
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Number) row[0]).doubleValue();
+            }
             return context;
         } else {
             final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
                                                                                  declaration );
-            context.left = row[2];
-            context.right = row[0];
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = row[2];
+            }
+            
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = row[0];
+            }
             return context;
         }
     }
@@ -434,6 +489,10 @@
         public Object getValue(final Object object) {
             return object;
         }
+        
+        public boolean isNullValue(final Object object) {
+            return object == null;
+        }
 
         public ValueType getValueType() {
             // TODO Auto-generated method stub

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -32,6 +32,7 @@
     private final float        floatAttr   = 6.0f;
     private final double       doubleAttr  = 7.0;
     private final List         listAttr    = Collections.EMPTY_LIST;
+    private final Object       nullAttr    = null;
 
     public String getName() {
         return this.name;
@@ -77,4 +78,7 @@
         return this.shortAttr;
     }
 
+    public Object getNullAttr() {
+        return this.nullAttr;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BaseClassFieldExtractorsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BaseClassFieldExtractorsTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BaseClassFieldExtractorsTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -21,5 +21,7 @@
     public abstract void testGetDoubleValue();
 
     public abstract void testGetValue();
+    
+    public abstract void testIsNullValue();
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -95,4 +95,11 @@
         }
     }
 
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -97,5 +97,12 @@
             fail( "Should not throw an exception" );
         }
     }
-
+    
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -95,4 +95,12 @@
             fail( "Should not throw an exception" );
         }
     }
+    
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -100,4 +100,12 @@
             fail( "Should not throw an exception" );
         }
     }
+    
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -100,4 +100,12 @@
             fail( "Should not throw an exception" );
         }
     }
+    
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -100,4 +100,11 @@
         }
     }
 
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -100,4 +100,12 @@
             fail( "Should not throw an exception" );
         }
     }
+    
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -99,4 +99,16 @@
             fail( "Should not throw an exception" );
         }
     }
+    
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            
+            Extractor nullExtractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class,
+                                                                                         "nullAttr" );
+            Assert.assertTrue( nullExtractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -99,4 +99,12 @@
             fail( "Should not throw an exception" );
         }
     }
+
+    public void testIsNullValue() {
+        try {
+            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+        } catch ( final Exception e ) {
+            fail( "Should not throw an exception" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -39,6 +39,14 @@
         assertEquals( new Integer( 200 ),
                       extractPrice.getValue( stilton ) );
 
+        assertFalse( extractName.isNullValue( stilton ) );
+        
+        stilton.setFieldValue( "name",
+                               null );
+        
+        assertTrue( extractName.isNullValue( stilton ) );
+        assertFalse( extractPrice.isNullValue( stilton ) );
+        
         final Fact brie = cheese.createFact( 12 );
         brie.setFieldValue( "name",
                             "brie" );
@@ -50,6 +58,14 @@
 
         assertEquals( new Integer( 55 ),
                       extractPrice.getValue( brie ) );
+        
+        assertFalse( extractName.isNullValue( brie ) );
+        
+        brie.setFieldValue( "name",
+                            null );
+        
+        assertTrue( extractName.isNullValue( brie ) );
+        assertFalse( extractPrice.isNullValue( stilton ) );
     }
 
     public void testDeclaration() {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2007-04-26 22:08:08 UTC (rev 11384)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2007-04-26 22:39:34 UTC (rev 11385)
@@ -266,6 +266,10 @@
             //  Auto-generated method stub
             return null;
         }
+        
+        public boolean isNullValue(final Object object) {
+            return false;
+        }
 
         public ValueType getValueType() {
             //  Auto-generated method stub




More information about the jboss-svn-commits mailing list