* @return the actual attached node that may be the one given as parameter
* or eventually one that was already in the cache if sharing is enabled
*/
public BaseNode attachNode(final BuildContext context,
final BaseNode candidate) {
BaseNode node = null;
RuleBasePartitionId partition = null;
if ( candidate instanceof EntryPointNode ) {
// entry point nodes are always shared
EntryPointNode epn = context.getRuleBase().getRete().getEntryPointNode( ((EntryPointNode) candidate).getEntryPoint() );
if ( epn != null ) {
node = epn;
}
// all EntryPointNodes belong to the main partition
partition = RuleBasePartitionId.MAIN_PARTITION;
} else if ( candidate instanceof ObjectTypeNode ) {
// object type nodes are always shared
ObjectTypeNode otn = (ObjectTypeNode) candidate;
Map<ObjectType, ObjectTypeNode> map = context.getRuleBase().getRete().getObjectTypeNodes( context.getCurrentEntryPoint() );
if ( map != null ) {
otn = map.get( otn.getObjectType() );
if ( otn != null ) {
// adjusting expiration offset
otn.setExpirationOffset( Math.max( otn.getExpirationOffset(),
((ObjectTypeNode) candidate).getExpirationOffset() ) );
node = otn;
}
}
// all ObjectTypeNodes belong to the main partition
partition = RuleBasePartitionId.MAIN_PARTITION;
} else if ( isSharingEnabledForNode( context,
candidate ) ) {
if ( (context.getTupleSource() != null) && (candidate instanceof LeftTupleSink) ) {
node = context.getTupleSource().getSinkPropagator().getMatchingNode( candidate );
} else if ( (context.getObjectSource() != null) && (candidate instanceof ObjectSink) ) {
node = context.getObjectSource().getSinkPropagator().getMatchingNode( candidate );
} else {
throw new RuntimeDroolsException( "This is a bug on node sharing verification. Please report to development team." );
}
if ( node != null ) {
// shared node found
// undo previous id assignment
context.releaseId( candidate.getId() );
}
}
if ( node == null ) {
// only attach() if it is a new node
node = candidate;
// new node, so it must be labeled
if ( partition == null ) {
// if it does not has a predefined label
if ( context.getPartitionId() == null ) {
// if no label in current context, create one
context.setPartitionId( context.getRuleBase().createNewPartitionId() );
}
partition = context.getPartitionId();
}
// set node whit the actual partition label
node.setPartitionId( partition );
if ( context.getWorkingMemories().length == 0 ) {
node.attach();
} else {
node.attach( context.getWorkingMemories() );
}
// adds the node to the context list to track all added nodes
context.getNodes().add( node );
}
return node;