[jboss-jira] [JBoss JIRA] Created: (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
Wed Oct 21 04:52:06 EDT 2009
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