Uploaded image for project: 'JBRULES'
  1. JBRULES
  2. JBRULES-3224

ClassCastException when comparing class type attributes to null

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

XMLWordPrintable

      Reported by Thomas:
      ============================
      I've just tried upgrading from Drools 5.3.0-CR1 from the beta and I've hit a regression.

      JBoss seems to have been down for most of today so I haven't been able to raise a Jira for it.

      In our model we have Facts which contain fields of java.lang.class, we then have a rule which checks that they aren't null.
      Eg
      Fact

      { Class<Object> classField}

      Rule "xyz"
      When
      Fact(classField != null)
      Then
      ...
      End

      This is giving the following exception

      Caused by: java.lang.ClassCastException: org.drools.base.field.ObjectFieldImpl cannot be cast to org.drools.base.field.ClassFieldImpl
      at org.drools.base.evaluators.EqualityEvaluatorsDefinition$ClassEqualEvaluator.evaluate(EqualityEvaluatorsDefinition.java:1772)
      at org.drools.rule.LiteralRestriction.isAllowed(LiteralRestriction.java:87)
      at org.drools.rule.LiteralConstraint.isAllowed(LiteralConstraint.java:109)
      at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:130)
      at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:451)
      at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:369)
      at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:134)
      at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:451)
      at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:379)
      at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:204)
      at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:244)
      at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:330)
      at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:291)
      at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:882)
      at org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:180)
      ... 149 more

      Wrapping the classField != null within an eval appears to be a work around.

      This is in the suspect method:
      public boolean evaluate(InternalWorkingMemory workingMemory,
      final InternalReadAccessor extractor,
      final Object object1, final FieldValue object2) {
      Object value1 = extractor.getValue( workingMemory, object1 );
      Object value2 = object2.getValue();
      if ( value2 == null )

      { ClassFieldImpl classField = (ClassFieldImpl) object2; value2 = classField.resolve( workingMemory ); }

      return comparator.equals( value1, value2 );
      }

      I think the if statement just needs an instanceof check as well or some other way to track the fact that null may be a valid value to be comparing with!

            etirelli@redhat.com Edson Tirelli
            etirelli@redhat.com Edson Tirelli
            Archiver:
            rhn-support-ceverson Clark Everson

              Created:
              Updated:
              Resolved:
              Archived: