[jboss-jira] [JBoss JIRA] Closed: (JBRULES-2312) java.lang.ClassCastException: on rule removal for shared LeftInputAdapterNodes

Edson Tirelli (JIRA) jira-events at lists.jboss.org
Thu Apr 15 23:43:31 EDT 2010


     [ https://jira.jboss.org/jira/browse/JBRULES-2312?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Edson Tirelli closed JBRULES-2312.
----------------------------------

    Resolution: Done


This is fixed. Thank you for reporting and providing test case.

> java.lang.ClassCastException: on rule removal for shared LeftInputAdapterNodes
> ------------------------------------------------------------------------------
>
>                 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: Edson Tirelli
>             Fix For: 5.1.0.M2
>
>
> 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