1 /*
   2  * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javax.naming;
  27 
  28 /**
  29  * This class represents the object name and class name pair of a binding
  30  * found in a context.
  31  *<p>
  32  * A context consists of name-to-object bindings.
  33  * The NameClassPair class represents the name and the
  34  * class of the bound object. It consists
  35  * of a name and a string representing the
  36  * package-qualified class name.
  37  *<p>
  38  * Use subclassing for naming systems that generate contents of
  39  * a name/class pair dynamically.
  40  *<p>
  41  * A NameClassPair instance is not synchronized against concurrent
  42  * access by multiple threads. Threads that need to access a NameClassPair
  43  * concurrently should synchronize amongst themselves and provide
  44  * the necessary locking.
  45  *
  46  * @author Rosanna Lee
  47  * @author Scott Seligman
  48  *
  49  * @see Context#list
  50  * @since 1.3
  51  */
  52 
  53  /*
  54   * <p>
  55   * The serialized form of a NameClassPair object consists of the name (a
  56   * String), class name (a String), and isRelative flag (a boolean).
  57   */
  58 
  59 public class NameClassPair implements java.io.Serializable {
  60     /**
  61      * Contains the name of this NameClassPair.
  62      * It is initialized by the constructor and can be updated using
  63      * {@code setName()}.
  64      * @serial
  65      * @see #getName
  66      * @see #setName
  67      */
  68     private String name;
  69 
  70     /**
  71      *Contains the class name contained in this NameClassPair.
  72      * It is initialized by the constructor and can be updated using
  73      * {@code setClassName()}.
  74      * @serial
  75      * @see #getClassName
  76      * @see #setClassName
  77      */
  78     private String className;
  79 
  80     /**
  81      * Contains the full name of this NameClassPair within its
  82      * own namespace.
  83      * It is initialized using {@code setNameInNamespace()}
  84      * @serial
  85      * @see #getNameInNamespace
  86      * @see #setNameInNamespace
  87      */
  88     private String fullName = null;
  89 
  90 
  91     /**
  92      * Records whether the name of this {@code NameClassPair}
  93      * is relative to the target context.
  94      * It is initialized by the constructor and can be updated using
  95      * {@code setRelative()}.
  96      * @serial
  97      * @see #isRelative
  98      * @see #setRelative
  99      * @see #getName
 100      * @see #setName
 101      */
 102     private boolean isRel = true;
 103 
 104     /**
 105      * Constructs an instance of a NameClassPair given its
 106      * name and class name.
 107      *
 108      * @param   name    The non-null name of the object. It is relative
 109      *                  to the <em>target context</em> (which is
 110      * named by the first parameter of the <code>list()</code> method)
 111      * @param   className       The possibly null class name of the object
 112      *          bound to name. It is null if the object bound is null.
 113      * @see #getClassName
 114      * @see #setClassName
 115      * @see #getName
 116      * @see #setName
 117      */
 118     public NameClassPair(String name, String className) {
 119         this.name = name;
 120         this.className = className;
 121     }
 122 
 123     /**
 124      * Constructs an instance of a NameClassPair given its
 125      * name, class name, and whether it is relative to the listing context.
 126      *
 127      * @param   name    The non-null name of the object.
 128      * @param   className       The possibly null class name of the object
 129      *  bound to name.  It is null if the object bound is null.
 130      * @param isRelative true if <code>name</code> is a name relative
 131      *          to the target context (which is named by the first parameter
 132      *          of the <code>list()</code> method); false if <code>name</code>
 133      *          is a URL string.
 134      * @see #getClassName
 135      * @see #setClassName
 136      * @see #getName
 137      * @see #setName
 138      * @see #isRelative
 139      * @see #setRelative
 140      */
 141     public NameClassPair(String name, String className, boolean isRelative) {
 142         this.name = name;
 143         this.className = className;
 144         this.isRel = isRelative;
 145     }
 146 
 147     /**
 148      * Retrieves the class name of the object bound to the name of this binding.
 149      * If a reference or some other indirect information is bound,
 150      * retrieves the class name of the eventual object that
 151      * will be returned by {@code Binding.getObject()}.
 152      *
 153      * @return  The possibly null class name of object bound.
 154      *          It is null if the object bound is null.
 155      * @see Binding#getObject
 156      * @see Binding#getClassName
 157      * @see #setClassName
 158      */
 159     public String getClassName() {
 160         return className;
 161     }
 162 
 163     /**
 164      * Retrieves the name of this binding.
 165      * If {@code isRelative()} is true, this name is relative to the
 166      * target context (which is named by the first parameter of the
 167      * {@code list()}).
 168      * If {@code isRelative()} is false, this name is a URL string.
 169      *
 170      * @return  The non-null name of this binding.
 171      * @see #isRelative
 172      * @see #setName
 173      */
 174     public String getName() {
 175         return name;
 176     }
 177 
 178     /**
 179      * Sets the name of this binding.
 180      *
 181      * @param   name the non-null string to use as the name.
 182      * @see #getName
 183      * @see #setRelative
 184      */
 185     public void setName(String name) {
 186         this.name = name;
 187     }
 188 
 189     /**
 190      * Sets the class name of this binding.
 191      *
 192      * @param   name the possibly null string to use as the class name.
 193      * If null, {@code Binding.getClassName()} will return
 194      * the actual class name of the object in the binding.
 195      * The class name will be null if the object bound is null.
 196      * @see #getClassName
 197      * @see Binding#getClassName
 198      */
 199     public void setClassName(String name) {
 200         this.className = name;
 201     }
 202 
 203     /**
 204      * Determines whether the name of this binding is
 205      * relative to the target context (which is named by
 206      * the first parameter of the <code>list()</code> method).
 207      *
 208      * @return true if the name of this binding is relative to the
 209      *          target context;
 210      *          false if the name of this binding is a URL string.
 211      * @see #setRelative
 212      * @see #getName
 213      */
 214     public boolean isRelative() {
 215         return isRel;
 216     }
 217 
 218     /**
 219      * Sets whether the name of this binding is relative to the target
 220      * context (which is named by the first parameter of the <code>list()</code>
 221      * method).
 222      *
 223      * @param r If true, the name of binding is relative to the target context;
 224      *          if false, the name of binding is a URL string.
 225      * @see #isRelative
 226      * @see #setName
 227      */
 228     public void setRelative(boolean r) {
 229         isRel = r;
 230     }
 231 
 232     /**
 233      * Retrieves the full name of this binding.
 234      * The full name is the absolute name of this binding within
 235      * its own namespace. See {@link Context#getNameInNamespace()}.
 236      * <p>
 237      *
 238      * In naming systems for which the notion of full name does not
 239      * apply to this binding an {@code UnsupportedOperationException}
 240      * is thrown.
 241      * This exception is also thrown when a service provider written before
 242      * the introduction of the method is in use.
 243      * <p>
 244      * The string returned by this method is not a JNDI composite name and
 245      * should not be passed directly to context methods.
 246      *
 247      * @return The full name of this binding.
 248      * @throws UnsupportedOperationException if the notion of full name
 249      *         does not apply to this binding in the naming system.
 250      * @since 1.5
 251      * @see #setNameInNamespace
 252      * @see #getName
 253      */
 254     public String getNameInNamespace() {
 255         if (fullName == null) {
 256             throw new UnsupportedOperationException();
 257         }
 258         return fullName;
 259     }
 260 
 261     /**
 262      * Sets the full name of this binding.
 263      * This method must be called to set the full name whenever a
 264      * {@code NameClassPair} is created and a full name is
 265      * applicable to this binding.
 266      * <p>
 267      * Setting the full name to null, or not setting it at all, will
 268      * cause {@code getNameInNamespace()} to throw an exception.
 269      *
 270      * @param fullName The full name to use.
 271      * @since 1.5
 272      * @see #getNameInNamespace
 273      * @see #setName
 274      */
 275     public void setNameInNamespace(String fullName) {
 276         this.fullName = fullName;
 277     }
 278 
 279     /**
 280      * Generates the string representation of this name/class pair.
 281      * The string representation consists of the name and class name separated
 282      * by a colon (':').
 283      * The contents of this string is useful
 284      * for debugging and is not meant to be interpreted programmatically.
 285      *
 286      * @return The string representation of this name/class pair.
 287      */
 288     public String toString() {
 289         return (isRelative() ? "" : "(not relative)") + getName() + ": " +
 290                 getClassName();
 291     }
 292 
 293 
 294     /**
 295      * Use serialVersionUID from JNDI 1.1.1 for interoperability
 296      */
 297     private static final long serialVersionUID = 5620776610160863339L;
 298 }