Bug 1318532 - ClassCastException on classes with the same FQCN after incremental build
Summary: ClassCastException on classes with the same FQCN after incremental build
Keywords:
Status: CLOSED EOL
Alias: None
Product: JBoss BRMS Platform 6
Classification: Retired
Component: BRE
Version: 6.2.0
Hardware: Unspecified
OS: Unspecified
unspecified
high
Target Milestone: ER2
: 6.3.0
Assignee: Mario Fusco
QA Contact: Tibor Zimanyi
URL:
Whiteboard:
Depends On:
Blocks: 1318855
TreeView+ depends on / blocked
 
Reported: 2016-03-17 07:26 UTC by Toshiya Kobayashi
Modified: 2020-03-27 19:09 UTC (History)
1 user (show)

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
: 1318855 (view as bug list)
Environment:
Last Closed: 2020-03-27 19:09:39 UTC
Type: Bug


Attachments (Terms of Use)
ClassFieldReaderRuleRepo.zip (139.13 KB, application/zip)
2016-03-17 07:28 UTC, Toshiya Kobayashi
no flags Details

Description Toshiya Kobayashi 2016-03-17 07:26:19 UTC
Description of problem:

Assuming you have a rule which uses ClassFieldReader, for example a rule like this:

===
when
  $p : Person ($types : types)
  $type : String() from $types
===
("types" is a List field.)

Incremental Build overwrites existing ClassFieldReader.reader. So later runtime execution results in ClassCastException on classes with the same FQCN.

=========
16:07:09,011 WARN  [org.drools.persistence.SingleSessionCommandService] (http-localhost.localdomain/127.0.0.1:8080-1) Could not commit session: java.lang.ClassCastException: org.kie.example.project1.Person cannot be cast to org.kie.example.project1.Person
	at org.drools.base.org.kie.example.project1.Person1340276313$getTypes.getValue(Unknown Source)
	at org.drools.core.base.ClassFieldReader.getValue(ClassFieldReader.java:91) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.rule.Declaration.getValue(Declaration.java:253) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.base.mvel.MVELCompilationUnit.updateFactory(MVELCompilationUnit.java:366) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.base.mvel.MVELCompilationUnit.getFactory(MVELCompilationUnit.java:297) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.base.dataproviders.MVELDataProvider.getResults(MVELDataProvider.java:117) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.PhreakFromNode.doLeftInserts(PhreakFromNode.java:105) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.PhreakFromNode.doNode(PhreakFromNode.java:67) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:386) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:332) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:166) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:123) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:194) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:73) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:978) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1292) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1294) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1281) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1260) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.runtime.rule.FireAllRulesCommand.execute(FireAllRulesCommand.java:111) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.runtime.rule.FireAllRulesCommand.execute(FireAllRulesCommand.java:36) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.SingleSessionCommandService$TransactionInterceptor.execute(SingleSessionCommandService.java:584) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.jpa.OptimisticLockRetryInterceptor.execute(OptimisticLockRetryInterceptor.java:82) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.jta.TransactionLockInterceptor.execute(TransactionLockInterceptor.java:73) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:377) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession.fireAllRules(CommandBasedStatefulKnowledgeSession.java:268) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.process.instance.event.listeners.TriggerRulesEventListener.afterRuleFlowGroupActivated(TriggerRulesEventListener.java:83) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.event.AgendaEventSupport.fireAfterRuleFlowGroupActivated(AgendaEventSupport.java:152) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.common.DefaultAgenda.activateRuleFlowGroup(DefaultAgenda.java:703) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.common.DefaultAgenda.activateRuleFlowGroup(DefaultAgenda.java:691) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.node.RuleSetNodeInstance.internalTrigger(RuleSetNodeInstance.java:87) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:366) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:325) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.node.ActionNodeInstance.triggerCompleted(ActionNodeInstance.java:61) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:57) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:366) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:325) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:73) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:44) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:236) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:439) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:208) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:217) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:225) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:1812) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.runtime.process.StartCorrelatedProcessCommand.execute(StartCorrelatedProcessCommand.java:146) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.runtime.process.StartCorrelatedProcessCommand.execute(StartCorrelatedProcessCommand.java:44) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.SingleSessionCommandService$TransactionInterceptor.execute(SingleSessionCommandService.java:584) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.jpa.OptimisticLockRetryInterceptor.execute(OptimisticLockRetryInterceptor.java:82) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.jta.TransactionLockInterceptor.execute(TransactionLockInterceptor.java:73) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:377) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:529) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.kie.services.impl.ProcessServiceImpl.startProcess(ProcessServiceImpl.java:126) [jbpm-kie-services-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.services.cdi.impl.ProcessServiceCDIImpl$Proxy$_$$_WeldClientProxy.startProcess(ProcessServiceCDIImpl$Proxy$_$$_WeldClientProxy.java) [jbpm-services-cdi-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at org.jbpm.console.ng.bd.backend.server.KieSessionEntryPointImpl.startProcess(KieSessionEntryPointImpl.java:78) [jbpm-console-ng-business-domain-backend-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5]
	at 
...
===============

Steps to Reproduce:
1. Start BPMS 6.2.0
2. Access business-central. 
3. Clone the attached repository (ClassFieldReaderRuleRepo.zip) to business-central
4. Click [Build&Deploy]
 -> the project is deployed
5. Open 'drl1' under org/kie/example/project1
6. Edit 'drl1' and Save (e.g. add a white-space)
 -> Incremental Build done
7. Go to [Process Management] -> [Process Definitions]
8. Press [Start] for 'process1'
9. Press [Submit] on the pop-up

* This is not a concurrency issue. You can reproduce this step-by-step.

Actual results:

java.lang.ClassCastException: org.kie.example.project1.Person cannot be cast to org.kie.example.project1.Person

is thrown.

Expected results:

Execute the process without Exception.

Additional info:

This reproduce step requires BPMS but I filed this BZ for BRMS because the issue seems to belong to drools build process.

Reproduced in BPMS 6.1.3 / 6.2.0 / 6.2.1

Comment 1 Toshiya Kobayashi 2016-03-17 07:28:50 UTC
Created attachment 1137321 [details]
ClassFieldReaderRuleRepo.zip

Comment 2 Toshiya Kobayashi 2016-03-17 09:50:25 UTC
Analysis:

With a debugger, I observed that the ClassFieldReader.reader is overwritten because FieldLookupEntry is shared between the existing ksession's ClassFieldAccessorStore and incremental build's ClassFieldAccessorStore.

========
Thread [EJB default - 1] (Suspended (breakpoint at line 70 in ClassFieldReader))	
	owns: ClassFieldAccessorStore  (id=214)	
	owns: KieFileSystemImpl  (id=215)	
	ClassFieldReader.setReadAccessor(InternalReadAccessor) line: 70	
	ClassFieldAccessorStore.wire(InternalReadAccessor) line: 293	
	ClassFieldAccessorStore.getReader(String, String, AcceptsReadAccessor, AccessorKey$AccessorType) line: 112	
	ClassFieldAccessorStore.getReader(String, String, AcceptsReadAccessor) line: 90	
	PatternBuilder.getFieldReadAccessor(RuleBuildContext, BaseDescr, Pattern, ObjectType, String, AcceptsReadAccessor, boolean) line: 1761	
	PatternBuilder.getFieldReadAccessor(RuleBuildContext, BaseDescr, Pattern, String, AcceptsReadAccessor, boolean) line: 1720	
	PatternBuilder.buildRuleBindings(RuleBuildContext, PatternDescr, Pattern, BindingDescr) line: 1352	
	PatternBuilder.buildCcdDescr(RuleBuildContext, PatternDescr, Pattern, BaseDescr, ConstraintConnectiveDescr, MVELDumper$MVELDumperContext) line: 850	
	PatternBuilder.build(RuleBuildContext, PatternDescr, Pattern, ConstraintConnectiveDescr, MVELDumperContext) line: 715	
	PatternBuilder.processConstraintsAndBinds(RuleBuildContext, PatternDescr, Pattern) line: 580	
	PatternBuilder.build(RuleBuildContext, PatternDescr, Pattern) line: 182	
	PatternBuilder.build(RuleBuildContext, PatternDescr) line: 146	
	PatternBuilder.build(RuleBuildContext, BaseDescr) line: 127	
	GroupElementBuilder.build(RuleBuildContext, BaseDescr, Pattern) line: 63	
	RuleBuilder.build(RuleBuildContext) line: 97	
	KnowledgeBuilderImpl.addRule(RuleBuildContext) line: 1820	
	KnowledgeBuilderImpl.compileRules(PackageDescr, PackageRegistry) line: 1111	
	KnowledgeBuilderImpl.compileAllRules(PackageDescr, PackageRegistry) line: 989	
	CompositeKnowledgeBuilderImpl.buildRules(Collection<CompositePackageDescr>) line: 257	
	CompositeKnowledgeBuilderImpl.buildPackages() line: 121	
	CompositeKnowledgeBuilderImpl.build() line: 105	
	KieBuilderSetImpl.buildChanges(Collection<String>) line: 140	
	KieBuilderSetImpl.build() line: 92	
	Builder.buildIncrementally(IncrementalBuildResults, String...) line: 474	
	Builder.addResource(Path) line: 310	
	Builder.updateResource(Path) line: 347	
	BuildServiceImpl.updatePackageResource(Path) line: 244

Comment 3 Toshiya Kobayashi 2016-03-17 09:51:35 UTC
Sent a PR test case:
https://github.com/droolsjbpm/drools/pull/693

I'm not 100% sure if this unit test simulates the reproduce step in business-central correctly. Please take this as a hint. Anyway, this reproduces the ClassCastException.

Comment 4 Mario Fusco 2016-03-17 17:28:25 UTC
Fixed by https://github.com/droolsjbpm/drools/commit/464aad2fd

Comment 5 Tibor Zimanyi 2016-04-01 10:59:23 UTC
Verified by going through the "Steps to reproduce" and by running new test from Mario's PR.


Note You need to log in before you can comment on or make changes to this bug.