[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