[jboss-jira] [JBoss JIRA] Commented: (JBRULES-2312) java.lang.ClassCastException: org.drools.reteoo.BetaMemory cannot be cast to org.drools.reteoo.RuleTerminalNode$TerminalNodeMemory
nicholas hemley (JIRA)
jira-events at lists.jboss.org
Tue Oct 27 08:47:05 EDT 2009
[ https://jira.jboss.org/jira/browse/JBRULES-2312?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12491645#action_12491645 ]
nicholas hemley commented on JBRULES-2312:
------------------------------------------
I have also come across this (related?) error when updating an object in a stateful knowledge session:
java.lang.ClassCastException: org.drools.reteoo.AlphaNode$AlphaMemory cannot be cast to org.drools.reteoo.BetaMemory
at org.drools.reteoo.JoinNode.retractLeftTuple(JoinNode.java:228)
at org.drools.reteoo.ObjectTypeNode.retractObject(ObjectTypeNode.java:239)
at org.drools.reteoo.EntryPointNode.retractObject(EntryPointNode.java:195)
at org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1416)
at org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1350)
at org.drools.impl.StatefulKnowledgeSessionImpl.update(StatefulKnowledgeSessionImpl.java:231)
> java.lang.ClassCastException: org.drools.reteoo.BetaMemory cannot be cast to org.drools.reteoo.RuleTerminalNode$TerminalNodeMemory
> ----------------------------------------------------------------------------------------------------------------------------------
>
> Key: JBRULES-2312
> URL: https://jira.jboss.org/jira/browse/JBRULES-2312
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: drools-core
> Affects Versions: 5.0.1.FINAL
> Environment: Linux 64-bit
> Reporter: nicholas hemley
> Assignee: Mark Proctor
>
> 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;
> }
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list