package com.vladium.utils; import java.io.PrintWriter; import java.io.StringWriter; import java.util.LinkedList; // ---------------------------------------------------------------------------- /** * Abstract base class for all node implementations in this package. * * @author (C) <a href="http://www.javaworld.com/columns/jw-qna-index.shtml">Vlad Roubtsov</a>, 2003 */ abstract class AbstractProfileNode implements IObjectProfileNode, Comparable { // public: ................................................................ // IObjectProfileNode: public final int size () { return m_size; } public final IObjectProfileNode parent () { return m_parent; } public final IObjectProfileNode [] path () { IObjectProfileNode [] path = m_path; if (path != null) return path; else { final LinkedList /* IObjectProfileNode */ _path = new LinkedList (); for (IObjectProfileNode node = this; node != null; node = node.parent ()) _path.addFirst (node); path = new IObjectProfileNode [_path.size ()]; _path.toArray (path); m_path = path; return path; } } public final IObjectProfileNode root () { IObjectProfileNode node = this; for (IObjectProfileNode parent = parent (); parent != null; node = parent, parent = parent.parent ()); return node; } public final int pathlength () { final IObjectProfileNode [] path = m_path; if (path != null) return path.length; else { int result = 0; for (IObjectProfileNode node = this; node != null; node = node.parent ()) ++ result; return result; } } public final String dump () { final StringWriter sw = new StringWriter (); final PrintWriter out = new PrintWriter (sw); final INodeVisitor visitor = ObjectProfileVisitors.newDefaultNodePrinter (out, null, null, ObjectProfiler.SHORT_TYPE_NAMES); traverse (null, visitor); out.flush (); return sw.toString (); } // Comparable: public final int compareTo (final Object obj) { return ((AbstractProfileNode) obj).m_size - m_size; } public String toString () { return super.toString () + ": name = " + name () + ", size = " + size (); } // protected: ............................................................. // package: ............................................................... AbstractProfileNode (final IObjectProfileNode parent) { m_parent = parent; } int m_size; static final IObjectProfileNode [] EMPTY_OBJECTPROFILENODE_ARRAY = new IObjectProfileNode [0]; // private: ............................................................... private final IObjectProfileNode m_parent; private transient IObjectProfileNode [] m_path; } // end of class // ----------------------------------------------------------------------------