[jboss-jira] [JBoss JIRA] (DROOLS-236) NPE when ksession is serialized with facts logically inserted
Toshiya Kobayashi (JIRA)
jira-events at lists.jboss.org
Fri Aug 23 06:37:26 EDT 2013
Toshiya Kobayashi created DROOLS-236:
----------------------------------------
Summary: NPE when ksession is serialized with facts logically inserted
Key: DROOLS-236
URL: https://issues.jboss.org/browse/DROOLS-236
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Affects Versions: 6.0.0.CR1
Reporter: Toshiya Kobayashi
Assignee: Mark Proctor
Reproduce steps:
Assuming Employee is a subclass of Person...
1. Insert an Employee (say, 'Alice')
2. InsertLogical a Person (say, 'Bob')
3. Serialize and deserialize ksession
4. Insert an Employee (say, 'Claire')
5. Update 'Claire'
It throws an NEP:
{noformat}
Exception executing consequence for rule "Promote" in defaultpkg: java.lang.NullPointerException
at org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1026)
...
Caused by: java.lang.NullPointerException
at org.drools.core.common.NamedEntryPoint.update(NamedEntryPoint.java:434)
at org.drools.core.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:367)
at defaultpkg.Rule_Promote139773612.defaultConsequence(Rule_Promote139773612.java:9)
at defaultpkg.Rule_Promote139773612DefaultConsequenceInvokerGenerated.evaluate(Unknown Source)
at defaultpkg.Rule_Promote139773612DefaultConsequenceInvoker.evaluate(Unknown Source)
at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1016)
... 37 more
{noformat}
In the step 2, ClassObjectTypeConf of Person[Bob] enables TMS. But at that time, Employee[Alice] creates its EqualityKey and put it to TMS.
NamedEntryPoint.java:
{code:java}
private void enableTMS(Object object, ObjectTypeConf conf) {
final Rete source = this.ruleBase.getRete();
final ClassObjectType cot = new ClassObjectType( object.getClass() );
final Map<ObjectType, ObjectTypeNode> map = source.getObjectTypeNodes( EntryPointId.DEFAULT );
final ObjectTypeNode node = map.get( cot );
final ObjectHashSet memory = ((ObjectTypeNodeMemory) this.wm.getNodeMemory( node )).memory;
// All objects of this type that are already there were certainly stated,
// since this method call happens at the first logical insert, for any given type.
org.drools.core.util.Iterator it = memory.iterator();
for ( Object obj = it.next(); obj != null; obj = it.next() ) {
org.drools.core.util.ObjectHashSet.ObjectEntry holder = (org.drools.core.util.ObjectHashSet.ObjectEntry) obj;
InternalFactHandle handle = (InternalFactHandle) holder.getValue();
if ( handle != null) {
EqualityKey key = new EqualityKey( handle );
handle.setEqualityKey( key );
key.setStatus(EqualityKey.STATED);
getTruthMaintenanceSystem().put(key);
}
}
// Enable TMS for this type.
conf.enableTMS();
}
{code}
Then during deserialization, ProtobufInputMarshaller enables TMS for ClassObjectTypeConf of Employee[Alice] and ClassObjectTypeConf of Person[Bob].
ProtobufInputMarshaller.java:
{code:java}
public static void readTruthMaintenanceSystem( MarshallerReaderContext context,
RuleData _session ) throws IOException {
TruthMaintenanceSystem tms = context.wm.getTruthMaintenanceSystem();
ProtobufMessages.TruthMaintenanceSystem _tms = _session.getTms();
for( ProtobufMessages.EqualityKey _key : _tms.getKeyList() ) {
InternalFactHandle handle = (InternalFactHandle) context.handles.get( _key.getHandleId() );
// ObjectTypeConf state is not marshalled, so it needs to be re-determined
ObjectTypeConf typeConf = context.wm.getObjectTypeConfigurationRegistry().getObjectTypeConf( ((NamedEntryPoint)handle.getEntryPoint()).getEntryPoint(),
handle.getObject() );
if (!typeConf.isTMSEnabled()) {
typeConf.enableTMS();
}
{code}
Finally, Employee(Claire) is updated. ClassObjectTypeConf of Employee is under TMS but Claire doesn't have EqualityKey hence NPE is thrown.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list