TreePrinter.java Source code

Java tutorial

Introduction

Here is the source code for TreePrinter.java

Source

/*
 * @(#)TreePrinter.java 1.2 01/08/01 11:02:27
 * 
 * ************************************************************** "Copyright (c)
 * 2001 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * -Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 * 
 * -Redistribution in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * 
 * Neither the name of Sun Microsystems, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 * 
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGES.
 * 
 * You acknowledge that Software is not designed,licensed or intended for use in
 * the design, construction, operation or maintenance of any nuclear facility."
 * 
 * ***************************************************************************
 */

import java.io.PrintStream;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.media.j3d.CapabilityNotSetException;
import javax.media.j3d.Link;
import javax.media.j3d.Locale;
import javax.media.j3d.SceneGraphObject;
import javax.media.j3d.SharedGroup;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;

public class TreePrinter {
    PrintStream printStream;

    String j3dPkg = new String("javax.media.j3d.");

    String v97Pkg = new String("com.sun.j3d.loaders.vrml97.impl.");

    public void print(PrintStream s, Locale l) {
        printStream = s;
        HashSet sharedGroups = new HashSet();
        printTree(l, 0, sharedGroups);
        Iterator iterator = sharedGroups.iterator();
        while (iterator.hasNext()) {
            SharedGroup sg = (SharedGroup) iterator.next();
            print(s, sg);
        }
    }

    public void print(Locale l) {
        print(System.out, l);
    }

    private void printTree(Locale l, int graphDepth, Set sharedGroups) {
        printNode(l, 0, sharedGroups);
        try {
            Enumeration e = l.getAllBranchGraphs();
            while (e.hasMoreElements()) {
                Object o = e.nextElement();
                if (o instanceof Locale)
                    printTree((Locale) o, graphDepth + 1, sharedGroups);
                else if (o instanceof SceneGraphObject)
                    printTree((SceneGraphObject) o, graphDepth + 1, sharedGroups);
                else
                    printStream.println(o + " unknown and in tree");
            }
        } catch (CapabilityNotSetException e) {
            printStream.println("No capability to read children");
        }
    }

    public void print(PrintStream s, SceneGraphObject sgo) {
        printStream = s;
        HashSet sharedGroups = new HashSet();
        if (sgo == null) {
            printStream.println("null");
        } else {
            printTree(sgo, 0, sharedGroups);
            Iterator iterator = sharedGroups.iterator();
            while (iterator.hasNext()) {
                SharedGroup sg = (SharedGroup) iterator.next();
                print(s, sg);
            }
        }
    }

    public void print(SceneGraphObject sgo) {
        print(System.out, sgo);
    }

    private void printTree(SceneGraphObject sgo, int graphDepth, Set sharedGroups) {

        printNode(sgo, graphDepth, sharedGroups);
        if (sgo instanceof javax.media.j3d.Group) {
            try {
                Enumeration e = ((javax.media.j3d.Group) sgo).getAllChildren();
                while (e.hasMoreElements()) {
                    printTree((SceneGraphObject) (e.nextElement()), graphDepth + 1, sharedGroups);
                }
            } catch (CapabilityNotSetException e) {
                // Can't read handled below
            }
        }
    }

    private String nodeString(Object o) {
        String objString = o.toString();
        if (objString.startsWith(j3dPkg)) {
            objString = objString.substring(j3dPkg.length());
        }
        if (objString.startsWith(v97Pkg)) {
            objString = objString.substring(v97Pkg.length());
        }
        return objString;
    }

    private void printNode(Object o, int indent, Set sharedGroups) {
        for (int i = 0; i < indent; i++)
            printStream.print(">");
        printStream.print(nodeString(o) + ": ");
        if (o instanceof SceneGraphObject) {
            SceneGraphObject sgo = (SceneGraphObject) o;
            int capBits = 0;
            // TODO: how to make sure we always check all the valid bits?
            for (int i = 0; i < 64; i++) {
                if (sgo.getCapability(i)) {
                    capBits |= 1 << i;
                }
            }
            printStream.print("capBits:Ox" + Integer.toHexString(capBits));
            if (o instanceof javax.media.j3d.Group) {
                javax.media.j3d.Group g = (javax.media.j3d.Group) o;
                int numChildren = 0;
                try {
                    numChildren = g.numChildren();
                } catch (CapabilityNotSetException e) {
                    //anyone who is using treePrinter, is debugging, so it is
                    //alright to blindly allow read. you should first detach
                    //browser.curScene, print the tree, then add it back to
                    //browser.locale when finished.
                    g.setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_READ);
                    numChildren = g.numChildren();
                    //System.out.println("Can't read children on group");
                    //return;
                }
                printStream.print(" children:" + numChildren);
                if (o instanceof TransformGroup) {
                    Transform3D transform = new Transform3D();
                    Transform3D identity = new Transform3D();
                    TransformGroup t = (TransformGroup) o;
                    t.getTransform(transform);
                    // TODO: use getBestType() when implemented
                    if (transform.equals(identity)) {
                        printStream.print(" xform:IDENTITY ");
                    } else {
                        printStream.print(" xform:NON-IDENTITY ");
                    }
                }
            } else if (o instanceof Link) {
                Link l = (Link) o;
                SharedGroup sg = l.getSharedGroup();
                printStream.print(" sg:" + nodeString(sg));
                sharedGroups.add(sg);
            } else {
                printStream.print(": leaf");
            }
        }
        printStream.println();
    }
}