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

java.lang.ClassCastException: on rule removal for shared LeftInputAdapterNodes

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

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Major
    • 5.1.0.M2
    • 5.0.1.FINAL
    • drools-core
    • None

    Description

      When removing packages from a knowledge base, the following intermittent error is encountered:

      java.lang.ClassCastException: org.drools.reteoo.BetaMemory cannot be cast to org.drools.reteoo.RuleTerminalNode$TerminalNodeMemory
      at org.drools.reteoo.RuleTerminalNode.doRemove(RuleTerminalNode.java:357)
      at org.drools.common.BaseNode.remove(BaseNode.java:95)
      at org.drools.reteoo.ReteooBuilder.removeRule(ReteooBuilder.java:237)
      at org.drools.reteoo.ReteooRuleBase.removeRule(ReteooRuleBase.java:366)
      at org.drools.common.AbstractRuleBase.removeRule(AbstractRuleBase.java:712)
      at org.drools.common.AbstractRuleBase.removePackage(AbstractRuleBase.java:640)
      at org.drools.impl.KnowledgeBaseImpl.removeKnowledgePackage(KnowledgeBaseImpl.java:166)

      The following JUnit code, which reads a dril file, adds packages to a knowledge base and then serialises/deserialises the knowledge packages before removing them, whilst not reproducing the issue, could be a useful starting point.

      It is currently considered that it is some combination of serialise and then add/remove package from a knowledge base that is causing the issue.

      import java.io.BufferedInputStream;
      import java.io.ByteArrayInputStream;
      import java.io.ByteArrayOutputStream;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.net.URL;
      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.Iterator;
      import java.util.List;

      import org.apache.log4j.BasicConfigurator;
      import org.apache.log4j.Logger;
      import org.drools.KnowledgeBase;
      import org.drools.KnowledgeBaseConfiguration;
      import org.drools.KnowledgeBaseFactory;
      import org.drools.builder.KnowledgeBuilder;
      import org.drools.builder.KnowledgeBuilderConfiguration;
      import org.drools.builder.KnowledgeBuilderError;
      import org.drools.builder.KnowledgeBuilderErrors;
      import org.drools.builder.KnowledgeBuilderFactory;
      import org.drools.builder.ResourceType;
      import org.drools.compiler.PackageBuilderConfiguration;
      import org.drools.definition.KnowledgePackage;
      import org.drools.io.Resource;
      import org.drools.io.ResourceFactory;
      import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
      import org.junit.Assert;
      import org.junit.Before;
      import org.junit.BeforeClass;
      import org.junit.Test;

      /**

      • test for a classcastexception issue when removing a knowledge package
        *
        */
        public class DroolsJiraIssues {

      private static String filename = "ENTER DRL FILENAME HERE";

      private static Logger log = Logger.getLogger(DroolsJiraIssues.class);

      private KnowledgeBaseConfiguration knowledgeBaseConfiguration = KnowledgeBaseFactory
      .newKnowledgeBaseConfiguration();

      private KnowledgeBuilderConfiguration knowledgeBuilderConfiguration;

      @BeforeClass
      public static void beforeClass()

      { BasicConfigurator.configure(); }

      @Before
      public void setUp()

      { knowledgeBuilderConfiguration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(); JavaDialectConfiguration conf = (JavaDialectConfiguration) ((PackageBuilderConfiguration)knowledgeBuilderConfiguration).getDialectConfiguration("java"); conf.setCompiler(JavaDialectConfiguration.JANINO); }

      /**

      • remove knowledge packages sometimes throws the following error:
      • java.lang.ClassCastException: org.drools.reteoo.BetaMemory cannot be cast to org.drools.reteoo.RuleTerminalNode$TerminalNodeMemory
      • at org.drools.reteoo.RuleTerminalNode.doRemove(RuleTerminalNode.java:357)
      • at org.drools.common.BaseNode.remove(BaseNode.java:95)
      • at org.drools.reteoo.ReteooBuilder.removeRule(ReteooBuilder.java:237)
      • at org.drools.reteoo.ReteooRuleBase.removeRule(ReteooRuleBase.java:366)
      • at org.drools.common.AbstractRuleBase.removeRule(AbstractRuleBase.java:712)
      • at org.drools.common.AbstractRuleBase.removePackage(AbstractRuleBase.java:640)
      • at org.drools.impl.KnowledgeBaseImpl.removeKnowledgePackage(KnowledgeBaseImpl.java:166)
        *
        */
        @Test
        public void testRemoveKnowledgePackages() throws IOException {
        // create a knowledge base
        KnowledgeBase knowledgeBase = createKnowlegeBase();

      // create knowledge packages from a .drl file
      Collection<KnowledgePackage> packages = readKnowledgePackagesFromFile(filename);
      log.info("packages.size() = " + packages.size());

      // add all knowledge packages
      knowledgeBase.addKnowledgePackages(packages);
      log.info("added knowledge packages");

      // remove all knowledge packages
      try

      { removePackagesForKnowledgeBase(knowledgeBase); } catch (ClassCastException e) { Assert.assertTrue(false); }
      log.info("removed knowledge packages");

      // serialise and deserialise the knowledge packages
      Collection<KnowledgePackage> packages2 = null;
      try { packages2 = serialiseDeserialiseKnowledgePackages(packages); } catch (ClassNotFoundException e) { Assert.assertTrue(false); }
      Assert.assertTrue(packages2.size() == packages.size());
      knowledgeBase.addKnowledgePackages(packages2);
      log.info("added serialised/deserialised knowledge packages");

      // remove all knowledge packages
      try { removePackagesForKnowledgeBase(knowledgeBase); }

      catch (ClassCastException e)

      { Assert.assertTrue(false); }

      }

      private Collection<KnowledgePackage> serialiseDeserialiseKnowledgePackages(Collection<KnowledgePackage> packages) throws ClassNotFoundException, IOException {
      Collection<KnowledgePackage> packages2 = new ArrayList<KnowledgePackage>();

      List<byte[]> serialisedPackageList = new ArrayList<byte[]>();

      // serialize and deserialise knowledge packages by using a bytearrayoutputstream
      for (Iterator<KnowledgePackage> iter = packages.iterator(); iter.hasNext()

      { KnowledgePackage kbPackage = iter.next(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(kbPackage); log.info("wrote package name " + kbPackage.getName()); serialisedPackageList.add(bos.toByteArray()); }

      for (byte[] byteArray : serialisedPackageList)

      { ByteArrayInputStream bis = new ByteArrayInputStream(byteArray); ObjectInputStream ois = new ObjectInputStream(bis); KnowledgePackage kbPackage = (KnowledgePackage) ois.readObject(); log.info("read package name " + kbPackage.getName()); packages2.add(kbPackage); }

      return packages2;
      }

      /**

      • create a new knowledge base
      • @return KnowledgeBase
        */
        private KnowledgeBase createKnowlegeBase() { KnowledgeBase knowledgeBase = KnowledgeBaseFactory .newKnowledgeBase(knowledgeBaseConfiguration); return knowledgeBase; }

      /**

      • remove existing packages from a given knowledge base
      • @param knowledgeBase
        */
        private void removePackagesForKnowledgeBase(KnowledgeBase knowledgeBase) {
        Collection<KnowledgePackage> packages = knowledgeBase
        .getKnowledgePackages();

      for (Iterator<KnowledgePackage> iter = packages.iterator(); iter
      .hasNext()

      { KnowledgePackage kbPackage = iter.next(); String packageName = kbPackage.getName(); knowledgeBase.removeKnowledgePackage(packageName); log.info("removed packageName = " + packageName); }

      }

      private Collection<KnowledgePackage> readKnowledgePackagesFromFile(
      String filename) {

      Collection<KnowledgePackage> knowledgePackageList = new ArrayList<KnowledgePackage>();

      URL fileUrl = TestTopologyServerImpl.class.getResource(filename);
      try {
      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
      .newKnowledgeBuilder();
      Resource resource = ResourceFactory.newUrlResource(fileUrl);
      kbuilder.add(resource, ResourceType.DRL);
      if (kbuilder.hasErrors()) {
      KnowledgeBuilderErrors errors = kbuilder.getErrors();
      Iterator<KnowledgeBuilderError> it = errors.iterator();
      while (it.hasNext())

      { KnowledgeBuilderError error = it.next(); log.error(error.getMessage()); }

      }
      Assert.assertTrue(!kbuilder.hasErrors());
      knowledgePackageList = kbuilder.getKnowledgePackages();
      } catch (Exception e)

      { log.error("error: " + e.getMessage()); }

      return knowledgePackageList;
      }

      /**

      • load a file
      • @param file
      • @return
      • @throws IOException
        */
        protected final String loadFileAsString(final File file) throws IOException { return new String(getFileAsBytes(file)); }

      /**

      • get the bytes of a file
      • @param file
      • @return
      • @throws IOException
        */
        private final byte[] getFileAsBytes(final File file) throws IOException { final BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); final byte[] bytes = new byte[(int) file.length()]; bis.read(bytes); bis.close(); return bytes; }

        }

      Attachments

        Issue Links

          Activity

            People

              etirelli@redhat.com Edson Tirelli
              iamniche_jira nicholas hemley (Inactive)
              Archiver:
              rhn-support-ceverson Clark Everson

              Dates

                Created:
                Updated:
                Resolved:
                Archived:

                PagerDuty