All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.rules.rulesystem.rete.nodes.AbstractNode Maven / Gradle / Ivy

package jadex.rules.rulesystem.rete.nodes;

import java.util.HashMap;

import jadex.commons.SReflect;
import jadex.commons.collection.SCollection;

/**
 *  Abstract super class for all kinds of nodes.
 */
public abstract class AbstractNode implements INode
{	
	//-------- attributes --------
	
	/** The node id. */
	protected int nodeid;
	
	//-------- constructors --------

	/**
	 *  Create a new node.
	 */
	public AbstractNode(int nodeid)
	{
		this.nodeid = nodeid;
	}
	
	//-------- methods --------
	
	/**
	 *  Get the nodeid.
	 *  @return The nodeid.
	 */
	public int getNodeId()
	{
		return nodeid;
	}

	/**
	 *  Get the hashcode.
	 *  @return The hash code.
	 */
	public int hashCode()
	{
		return nodeid;
	}

	/**
	 *  Test for equality.
	 *  @return True, if equal.
	 */
	public boolean equals(Object obj)
	{
		return (obj instanceof INode) && ((INode)obj).getNodeId()==nodeid;
	}

	/**
	 *  Get the string representation.
	 *  @return The string representation. 
	 */
	public String toString()
	{
		return toString("");
	}
	
	/**
	 *  Customizable string representation.
	 *  The given string will be inserted.
	 */
	protected String	toString(String insert)
	{
		return SReflect.getInnerClassName(this.getClass())
			+ "(id="+nodeid
			+ insert
//			+ ", relevants="+getRelevantAttributes()
			+ ")";
	}

	//-------- cloneable --------
	
	/** The thread local. */
	protected static final ThreadLocal clones = new ThreadLocal();
	
	/**
	 *  Clone this object.
	 *  @return A clone of this object.
	 */
	public Object clone()
	{
		Object ret = null;
	
		boolean creator = false;
		HashMap cls = (HashMap)clones.get();
		if(cls==null)
		{
			cls = SCollection.createHashMap();
			clones.set(cls);
			creator = true;
		}
		else
		{
			ret = cls.get(this);
		}
	
		if(ret==null)
		{
			try
			{
				ret = super.clone();
			}
			catch(CloneNotSupportedException exception)
			{
				throw new RuntimeException("Cloning not supported: "+this);
			}
	
			// Save the clone immediately to make it accessible for other elements.
			cls.put(this, ret);
	
			doClone(ret);
		}

		// Delete clones hashmap if element was creator.
		if(creator)
			clones.set(null);
	
		return ret;
	}
	
	/**
	 *  Do clone makes a deep clone without regarding cycles.
	 *  Method is overridden by subclasses to actually incorporate their attributes.
	 *  @param theclone The clone.
	 */
	protected abstract void doClone(Object theclone);

	//-------- debugging --------

	/**
	 *  Check the consistency of the node.
	 */
	public boolean	checkNodeConsistency(ReteMemory mem)
	{
		// Mark node as checked (for debugging).
		Object	node	= this;
		while(!(node instanceof ReteNode))
		{
			if(node instanceof IObjectConsumerNode)
			{
				node	= ((IObjectConsumerNode)node).getObjectSource();
			}
			else if(node instanceof ITupleConsumerNode)
			{
				node	= ((ITupleConsumerNode)node).getTupleSource();
			}
			else
			{
				throw new RuntimeException("Unhandled node type: "+node);
			}
		}
		((ReteNode)node).checked.add(this);

		// Empty default implementation.
		return true;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy