/* * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. * */ package javax.media.j3d; import java.util.Hashtable; /** * The NodeReferenceTable object is used by a leaf node's * updateNodeReferences method called by the * cloneTree method. * The NodeReferenceTable maps nodes from the original subgraph * to the new nodes in the cloned subgraph. This information * can then be used to update any cloned leaf node references * to reference nodes in the cloned subgraph. *

* During a cloneTree call, after all nodes have been duplicated, * each SceneGraphObject's updateNodeReferences method is called. * This method takes a NodeReferenceTable object as a parameter. The * SceneGraphObject's updateNodeReferences method can then use the * getNewObjectReference method from this object to get updated * references to objects that have been duplicated in the new cloneTree * sub-graph. If a match is found, a * reference to the corresponding SceneGraphObject in the newly cloned sub-graph * is returned. If no corresponding reference is found, either a * DanglingReferenceException is thrown by the cloneTree * method or a reference to the original * SceneGraphObject is returned depending on the value of the * allowDanglingReferences parameter passed in the * cloneTree call. * @see SceneGraphObject#updateNodeReferences * @see Node#cloneTree * @see DanglingReferenceException */ public class NodeReferenceTable extends Object { Hashtable objectHashtable; boolean allowDanglingReferences; /** * Constructs an empty NodeReferenceTable. * @since Java 3D 1.2 */ public NodeReferenceTable() { } // Constructor - this is NOT public! NodeReferenceTable(boolean allowDanglingReferences, Hashtable objectHashtable) { set(allowDanglingReferences, objectHashtable); } void set(boolean allowDanglingReferences, Hashtable objectHashtable) { this.objectHashtable = objectHashtable; this.allowDanglingReferences = allowDanglingReferences; } /** * This method is used in conjunction with the cloneTree * method. It can be used by the updateNodeReferences * method to see if a SceneGraphObject that is being referenced has been duplicated * in the new cloneTree sub-graph. *

* A SceneGraphObject's updateNodeReferences method would use this * method by calling it with the reference to the old (existed before * the cloneTree operation) object. If the object has been duplicated * in the cloneTree sub-graph, the corresponding object in the cloned * sub-graph is returned. If no corresponding reference is found, either * a DanglingReferenceException is thrown or a reference to the original * SceneGraphObject is returned depending on the value of the * allowDanglingReferences parameter passed in the * cloneTree call. * * @param oldReference the reference to the object in * the original sub-graph. * * @return A reference to the corresponding object in the cloned * sub-graph. If no corresponding object exists, either a * DanglingReferenceException will be generated by the * cloneTree method or a reference to the original object * is returned depending on the value of the * allowDanglingReferences parameter passed in the * cloneTree call. * * @see SceneGraphObject#updateNodeReferences * @see Node#cloneTree * @see DanglingReferenceException */ public final SceneGraphObject getNewObjectReference(SceneGraphObject oldReference) { // look up original SceneGraphObject in hash table SceneGraphObject newObject = (SceneGraphObject)objectHashtable.get(oldReference); if (newObject != null) { // found new reference return newObject; } // dangling reference found! if (allowDanglingReferences == true) { return oldReference; } // dangling references not allowed throw new DanglingReferenceException(); } }