0N/A/*
2362N/A * Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage com.sun.jndi.dns;
0N/A
0N/A
0N/Aimport java.util.Hashtable;
0N/A
0N/A
0N/A/**
0N/A * A NameNode represents a node in the DNS namespace. Each node
0N/A * has a label, which is its name relative to its parent (so the
0N/A * node at Sun.COM has label "Sun"). Each node has a hashtable of
0N/A * children indexed by their labels converted to lower-case.
0N/A *
0N/A * <p> A node may be addressed from another by giving a DnsName
0N/A * consisting of the sequence of labels from one node to the other.
0N/A *
0N/A * <p> Each node also has an <tt>isZoneCut</tt> flag, used to indicate
0N/A * if the node is a zone cut. A zone cut is a node with an NS record
0N/A * that is contained in one zone, but that actually belongs to a child zone.
0N/A *
0N/A * <p> All access is unsynchronized.
0N/A *
0N/A * @author Scott Seligman
0N/A */
0N/A
0N/A
0N/Aclass NameNode {
0N/A
0N/A private String label; // name of this node relative to its
0N/A // parent, or null for root of a tree
0N/A private Hashtable children = null; // child nodes
0N/A private boolean isZoneCut = false; // true if this node is a zone cut
0N/A private int depth = 0; // depth in tree (0 for root)
0N/A
0N/A NameNode(String label) {
0N/A this.label = label;
0N/A }
0N/A
0N/A /*
0N/A * Returns a newly-allocated NameNode. Used to allocate new nodes
0N/A * in a tree. Should be overridden in a subclass to return an object
0N/A * of the subclass's type.
0N/A */
0N/A protected NameNode newNameNode(String label) {
0N/A return new NameNode(label);
0N/A }
0N/A
0N/A /*
0N/A * Returns the name of this node relative to its parent, or null for
0N/A * the root of a tree.
0N/A */
0N/A String getLabel() {
0N/A return label;
0N/A }
0N/A
0N/A /*
0N/A * Returns the depth of this node in the tree. The depth of the root
0N/A * is 0.
0N/A */
0N/A int depth() {
0N/A return depth;
0N/A }
0N/A
0N/A boolean isZoneCut() {
0N/A return isZoneCut;
0N/A }
0N/A
0N/A void setZoneCut(boolean isZoneCut) {
0N/A this.isZoneCut = isZoneCut;
0N/A }
0N/A
0N/A /*
0N/A * Returns the children of this node, or null if there are none.
0N/A * The caller must not modify the Hashtable returned.
0N/A */
0N/A Hashtable getChildren() {
0N/A return children;
0N/A }
0N/A
0N/A /*
0N/A * Returns the child node given the hash key (the down-cased label)
0N/A * for its name relative to this node, or null if there is no such
0N/A * child.
0N/A */
0N/A NameNode get(String key) {
0N/A return (children != null)
0N/A ? (NameNode) children.get(key)
0N/A : null;
0N/A }
0N/A
0N/A /*
0N/A * Returns the node at the end of a path, or null if the
0N/A * node does not exist.
0N/A * The path is specified by the labels of <tt>name</tt>, beginning
0N/A * at index idx.
0N/A */
0N/A NameNode get(DnsName name, int idx) {
0N/A NameNode node = this;
0N/A for (int i = idx; i < name.size() && node != null; i++) {
0N/A node = node.get(name.getKey(i));
0N/A }
0N/A return node;
0N/A }
0N/A
0N/A /*
0N/A * Returns the node at the end of a path, creating it and any
0N/A * intermediate nodes as needed.
0N/A * The path is specified by the labels of <tt>name</tt>, beginning
0N/A * at index idx.
0N/A */
0N/A NameNode add(DnsName name, int idx) {
0N/A NameNode node = this;
0N/A for (int i = idx; i < name.size(); i++) {
0N/A String label = name.get(i);
0N/A String key = name.getKey(i);
0N/A
0N/A NameNode child = null;
0N/A if (node.children == null) {
0N/A node.children = new Hashtable();
0N/A } else {
0N/A child = (NameNode) node.children.get(key);
0N/A }
0N/A if (child == null) {
0N/A child = newNameNode(label);
0N/A child.depth = node.depth + 1;
0N/A node.children.put(key, child);
0N/A }
0N/A node = child;
0N/A }
0N/A return node;
0N/A }
0N/A}