/**
* Copyright 2010 JBoss Inc
*
* 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.reteoo.compiled;
import org.drools.common.NetworkNode;
import org.drools.common.RuleBasePartitionId;
import org.drools.reteoo.*;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
/**
* This is the base type for all generated classes that that represent a "compiled" portion of the RETE network.
* By compiled we mean IF statements, switch statements, etc. as opposed to nodes, propagators, etc.
*
* @author <a href="mailto:stampy88@yahoo.com">dave sinclair</a>
*/
public abstract class CompiledNetwork implements ObjectSink {
private ObjectTypeNode objectTypeNode;
/**
* Returns the unique id that represents the node in the Rete network
*
* @return unique int value
*/
public int getId() {
return objectTypeNode.getId();
}
/**
* Returns the partition ID to which this node belongs to
*
* @return partition id
*/
public RuleBasePartitionId getPartitionId() {
return objectTypeNode.getPartitionId();
}
/**
* The object implements the writeExternal method to save its contents
* by calling the methods of DataOutput for its primitive values or
* calling the writeObject method of ObjectOutput for objects, strings,
* and arrays.
*
* @param out the stream to write the object to
* @throws java.io.IOException Includes any I/O exceptions that may occur
* @serialData Overriding methods should use this tag to describe
* the data layout of this Externalizable object.
* List the sequence of element types and, if possible,
* relate the element to a public/protected field and/or
* method of this Externalizable class.
*/
public void writeExternal(ObjectOutput out) throws IOException {
// todo is this needed??
}
/**
* The object implements the readExternal method to restore its
* contents by calling the methods of DataInput for primitive
* types and readObject for objects, strings and arrays. The
* readExternal method must read the values in the same sequence
* and with the same types as were written by writeExternal.
*
* @param in the stream to read data from in order to restore the object
* @throws java.io.IOException if I/O errors occur
* @throws ClassNotFoundException If the class for an object being
* restored cannot be found.
*/
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// todo is this needed??
}
/**
* Sets the OTN for this network. Calling this method will set all variables in the generated subclasses
* by walking the {@link org.drools.reteoo.ObjectTypeNode} using a {@link ObjectTypeNodeParser}.
* @param objectTypeNode node for whom this network was created
*/
public final void setObjectTypeNode(final ObjectTypeNode objectTypeNode) {
this.objectTypeNode = objectTypeNode;
NodeReferenceSetter setter= new NodeReferenceSetter();
ObjectTypeNodeParser parser = new ObjectTypeNodeParser(objectTypeNode);
parser.accept(setter);
}
/**
* Generated subclasses need to implement this method to set member variables based on the specified
* NetworkNode.
*
* @param networkNode node to set to set
*/
protected abstract void setNetworkNodeReference(NetworkNode networkNode);
/**
* Handler implementation to call {@link CompiledNetwork#setNetworkNodeReference} for each node
* encountered in the network.
*/
private class NodeReferenceSetter extends NetworkHandlerAdaptor {
public void startNonHashedAlphaNode(AlphaNode alphaNode) {
setNetworkNodeReference(alphaNode);
}
public void startBetaNode(BetaNode betaNode) {
setNetworkNodeReference(betaNode);
}
public void startLeftInputAdapterNode(LeftInputAdapterNode leftInputAdapterNode) {
setNetworkNodeReference(leftInputAdapterNode);
}
public void startHashedAlphaNode(AlphaNode hashedAlpha, Object hashedValue) {
setNetworkNodeReference(hashedAlpha);
}
}
}