/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.core.marshalling.impl; import java.util.HashMap; import java.util.Map; import org.drools.core.common.BaseNode; import org.drools.core.impl.InternalKnowledgeBase; import org.drools.core.reteoo.LeftTupleSink; import org.drools.core.reteoo.LeftTupleSource; import org.drools.core.reteoo.ObjectSink; import org.drools.core.reteoo.ObjectSource; import org.drools.core.reteoo.ObjectTypeNode; import org.drools.core.reteoo.PropagationQueuingNode; import org.drools.core.reteoo.QueryTerminalNode; import org.drools.core.reteoo.RuleTerminalNode; import org.drools.core.reteoo.WindowNode; public class RuleBaseNodes { public static Map<Integer, BaseNode> getNodeMap(InternalKnowledgeBase kBase) { Map<Integer, BaseNode> nodes = new HashMap<Integer, BaseNode>(); buildNodeMap( kBase, nodes ); return nodes; } private static void buildNodeMap(InternalKnowledgeBase kBase, Map<Integer, BaseNode> nodes) { for ( ObjectTypeNode sink : kBase.getRete().getObjectTypeNodes() ) { nodes.put( sink.getId(), sink ); addObjectSink( kBase, sink, nodes ); } } private static void addObjectSink(InternalKnowledgeBase kBase, ObjectSink sink, Map<Integer, BaseNode> nodes) { // we don't need to store alpha nodes, as they have no state to serialise if ( sink instanceof PropagationQueuingNode ) { nodes.put( sink.getId(), ((BaseNode)sink) ); } if ( sink instanceof LeftTupleSource ) { LeftTupleSource node = (LeftTupleSource) sink; for ( LeftTupleSink leftTupleSink : node.getSinkPropagator().getSinks() ) { addLeftTupleSink(kBase, leftTupleSink, nodes); } } else if ( sink instanceof WindowNode ) { WindowNode node = (WindowNode) sink; nodes.put( sink.getId(), ((BaseNode)sink) ); for ( ObjectSink objectSink : node.getObjectSinkPropagator().getSinks() ) { addObjectSink(kBase, objectSink, nodes); } } else { ObjectSource node = ( ObjectSource ) sink; for ( ObjectSink objectSink : node.getObjectSinkPropagator().getSinks() ) { addObjectSink( kBase, objectSink, nodes ); } } } private static void addLeftTupleSink(InternalKnowledgeBase kBase, LeftTupleSink sink, Map<Integer, BaseNode> nodes) { if ( sink instanceof LeftTupleSource ) { nodes.put( sink.getId(), (LeftTupleSource) sink ); for ( LeftTupleSink leftTupleSink : ((LeftTupleSource) sink).getSinkPropagator().getSinks() ) { addLeftTupleSink( kBase, leftTupleSink, nodes ); } } else if ( sink instanceof ObjectSource ) { // it may be a RIAN nodes.put( sink.getId(), (ObjectSource) sink ); for ( ObjectSink objectSink : ((ObjectSource)sink).getObjectSinkPropagator().getSinks() ) { addObjectSink( kBase, objectSink, nodes ); } } else if ( sink instanceof RuleTerminalNode ) { nodes.put( sink.getId(), (RuleTerminalNode) sink ); } else if ( sink instanceof QueryTerminalNode ) { nodes.put( sink.getId(), (QueryTerminalNode) sink ); } } }