Details
-
Bug
-
Resolution: Done
-
Major
-
5.0.1.FINAL
-
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()
@Before
public void setUp()
/**
- 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
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()
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()
}
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())
}
Assert.assertTrue(!kbuilder.hasErrors());
knowledgePackageList = kbuilder.getKnowledgePackages();
} catch (Exception e)
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
- is incorporated by
-
JBRULES-2465 Corruption of Rete when removing complex NotNodes
- Closed