while ( stream.readShort() == PersisterEnums.RIGHT_TUPLE ) {
LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
int factHandleId = stream.readInt();
RightTupleKey key = new RightTupleKey( factHandleId,
sink );
RightTuple rightTuple = context.rightTuples.get( key );
LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
rightTuple,
childSink,
true );
readLeftTuple( childLeftTuple,
context );
}
break;
}
case NodeTypeEnums.EvalConditionNode : {
final EvalMemory memory = (EvalMemory) context.wm.getNodeMemory( (EvalConditionNode) sink );
memory.tupleMemory.add( parentLeftTuple );
while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
childSink,
true );
readLeftTuple( childLeftTuple,
context );
}
break;
}
case NodeTypeEnums.NotNode : {
BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
int type = stream.readShort();
if ( type == PersisterEnums.LEFT_TUPLE_NOT_BLOCKED ) {
memory.getLeftTupleMemory().add( parentLeftTuple );
while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
childSink,
true );
readLeftTuple( childLeftTuple,
context );
}
} else {
int factHandleId = stream.readInt();
RightTupleKey key = new RightTupleKey( factHandleId,
sink );
RightTuple rightTuple = context.rightTuples.get( key );
parentLeftTuple.setBlocker( rightTuple );
rightTuple.setBlocked( parentLeftTuple );
}
break;
}
case NodeTypeEnums.ExistsNode : {
BetaMemory memory = (BetaMemory) context.wm.getNodeMemory( (BetaNode) sink );
int type = stream.readShort();
if ( type == PersisterEnums.LEFT_TUPLE_NOT_BLOCKED ) {
memory.getLeftTupleMemory().add( parentLeftTuple );
} else {
int factHandleId = stream.readInt();
RightTupleKey key = new RightTupleKey( factHandleId,
sink );
RightTuple rightTuple = context.rightTuples.get( key );
parentLeftTuple.setBlocker( rightTuple );
rightTuple.setBlocked( parentLeftTuple );
while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
childSink,
true );
readLeftTuple( childLeftTuple,
context );
}
}
break;
}
case NodeTypeEnums.AccumulateNode : {
// accumulate nodes generate new facts on-demand and need special procedures when de-serializing from persistent storage
AccumulateMemory memory = (AccumulateMemory) context.wm.getNodeMemory( (BetaNode) sink );
memory.betaMemory.getLeftTupleMemory().add( parentLeftTuple );
AccumulateContext accctx = new AccumulateContext();
memory.betaMemory.getCreatedHandles().put( parentLeftTuple,
accctx,
false );
// first we de-serialize the generated fact handle
InternalFactHandle handle = readFactHandle( context );
accctx.result = new RightTuple( handle,
(RightTupleSink) sink );
// then we de-serialize the associated accumulation context
accctx.context = (Serializable) stream.readObject();
// then we de-serialize the boolean propagated flag
accctx.propagated = stream.readBoolean();
// then we de-serialize all the propagated tuples
short head = -1;
while ( (head = stream.readShort()) != PersisterEnums.END ) {
switch ( head ) {
case PersisterEnums.RIGHT_TUPLE : {
int factHandleId = stream.readInt();
RightTupleKey key = new RightTupleKey( factHandleId,
sink );
RightTuple rightTuple = context.rightTuples.get( key );
// just wiring up the match record
new LeftTuple( parentLeftTuple,
rightTuple,
sink,
true );
break;
}
case PersisterEnums.LEFT_TUPLE : {
LeftTupleSink childSink = (LeftTupleSink) sinks.get( stream.readInt() );
LeftTuple childLeftTuple = new LeftTuple( parentLeftTuple,
accctx.result,
childSink,
true );
readLeftTuple( childLeftTuple,
context );
break;
}
default : {
throw new RuntimeDroolsException( "Marshalling error. This is a bug. Please contact the development team." );
}
}
}
break;
}
case NodeTypeEnums.CollectNode : {
// accumulate nodes generate new facts on-demand and need special procedures when de-serializing from persistent storage
CollectMemory memory = (CollectMemory) context.wm.getNodeMemory( (BetaNode) sink );
memory.betaMemory.getLeftTupleMemory().add( parentLeftTuple );
CollectContext colctx = new CollectContext();
memory.betaMemory.getCreatedHandles().put( parentLeftTuple,
colctx,
false );
// first we de-serialize the generated fact handle
InternalFactHandle handle = readFactHandle( context );
colctx.resultTuple = new RightTuple( handle,
(RightTupleSink) sink );
// then we de-serialize the boolean propagated flag
colctx.propagated = stream.readBoolean();
// then we de-serialize all the propagated tuples
short head = -1;
while ( (head = stream.readShort()) != PersisterEnums.END ) {
switch ( head ) {
case PersisterEnums.RIGHT_TUPLE : {
int factHandleId = stream.readInt();
RightTupleKey key = new RightTupleKey( factHandleId,
sink );
RightTuple rightTuple = context.rightTuples.get( key );
// just wiring up the match record
new LeftTuple( parentLeftTuple,
rightTuple,
sink,
true );