Hi,<br><br>Internal type together with a function in one drl file cause ClassCastException when setting properties of a new instance of this type.<br><br>java.lang.ClassCastException: org.drools.generatedbeans.Cheese cannot be cast to org.drools.generatedbeans.Cheese<br>
at org.drools.base.org.drools.generatedbeans.Cheese6778431$setType.setValue(Unknown Source)<br> at org.drools.base.ClassFieldWriter.setValue(ClassFieldWriter.java:195)<br> at org.drools.base.ClassFieldAccessor.setValue(ClassFieldAccessor.java:319)<br>
at org.drools.factmodel.ClassDefinition.set(ClassDefinition.java:207)<br> at org.drools.integrationtests.MiscTest.testGeneratedBeansWithFunction(MiscTest.java:1072)<br> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)<br> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)<br> at java.lang.reflect.Method.invoke(Method.java:616)<br>
at junit.framework.TestCase.runTest(TestCase.java:154)<br> at junit.framework.TestCase.runBare(TestCase.java:127)<br> at junit.framework.TestResult$1.protect(TestResult.java:106)<br> at junit.framework.TestResult.runProtected(TestResult.java:124)<br>
at junit.framework.TestResult.run(TestResult.java:109)<br> at junit.framework.TestCase.run(TestCase.java:118)<br> at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)<br>
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)<br> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)<br> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)<br>
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)<br> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)<br><br><br>Test case to reproduce:<br>
test_GeneratedBeansWithFunction.drl:<br>-------------------------------<br>package org.drools.generatedbeans;<br><br>function void someFunction(String arg) {<br> System.out.println("hello");<br>}<br><br>declare Cheese<br>
type: String<br>end<br>-------------------------------<br><br>test method:<br>public void testGeneratedBeansWithFunction() throws Exception {<br> final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();<br>
kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_GeneratedBeansWithFunction.drl" ) ),<br> ResourceType.DRL );<br> assertFalse( kbuilder.getErrors().toString(),<br>
kbuilder.hasErrors() );<br><br> KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();<br> kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );<br><br> // Retrieve the generated fact type<br>
FactType cheeseFact = kbase.getFactType( "org.drools.generatedbeans",<br> "Cheese" );<br><br> // Create a new Fact instance<br> Object cheese = cheeseFact.newInstance();<br>
<br> cheeseFact.set( cheese,<br> "type",<br> "stilton" );<br> }<br><br>The last line throws the ClassCastException. If we remove the function from the drl file all works fine.<br>
Best Regards,<br>Michal<br>