1 /*
2  * Copyright (c) 1999, 2013, 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 a name-to-object binding found in a context.
30   *<p>
31   * A context consists of name-to-object bindings.
32   * The Binding class represents such a binding.  It consists
33   * of a name and an object. The <code>Context.listBindings()</code>
34   * method returns an enumeration of Binding.
35   *<p>
36   * Use subclassing for naming systems that generate contents of
37   * a binding dynamically.
38   *<p>
39   * A Binding instance is not synchronized against concurrent access by multiple
40   * threads. Threads that need to access a Binding concurrently should
41   * synchronize amongst themselves and provide the necessary locking.
42   *
43   * @author Rosanna Lee
44   * @author Scott Seligman
45   * @since 1.3
46   */
47 
48 public class Binding extends NameClassPair {
49     /**
50      * Contains this binding's object.
51      * It is initialized by the constructor and can be updated using
52      * {@code setObject}.
53      * @serial
54      * @see #getObject
55      * @see #setObject
56      */
57     private Object boundObj;
58 
59     /**
60       * Constructs an instance of a Binding given its name and object.
61       *<p>
62       * {@code getClassName()} will return
63       * the class name of {@code obj} (or null if {@code obj} is null)
64       * unless the class name has been explicitly set using {@code setClassName()}
65       *
66       * @param  name    The non-null name of the object. It is relative
67       *             to the <em>target context</em> (which is
68       * named by the first parameter of the <code>listBindings()</code> method)
69       * @param  obj     The possibly null object bound to name.
70       * @see NameClassPair#setClassName
71       */
Binding(String name, Object obj)72     public Binding(String name, Object obj) {
73         super(name, null);
74         this.boundObj = obj;
75     }
76 
77     /**
78       * Constructs an instance of a Binding given its name, object, and whether
79       * the name is relative.
80       *<p>
81       * {@code getClassName()} will return the class name of {@code obj}
82       * (or null if {@code obj} is null) unless the class name has been
83       * explicitly set using {@code setClassName()}
84       *
85       * @param  name    The non-null string name of the object.
86       * @param  obj     The possibly null object bound to name.
87       * @param isRelative true if <code>name</code> is a name relative
88       *         to the target context (which is named by
89       *         the first parameter of the <code>listBindings()</code> method);
90       *         false if <code>name</code> is a URL string.
91       * @see NameClassPair#isRelative
92       * @see NameClassPair#setRelative
93       * @see NameClassPair#setClassName
94       */
Binding(String name, Object obj, boolean isRelative)95     public Binding(String name, Object obj, boolean isRelative) {
96         super(name, null, isRelative);
97         this.boundObj = obj;
98     }
99 
100     /**
101       * Constructs an instance of a Binding given its name, class name, and object.
102       *
103       * @param  name    The non-null name of the object. It is relative
104       *             to the <em>target context</em> (which is
105       * named by the first parameter of the <code>listBindings()</code> method)
106       * @param  className       The possibly null class name of the object
107       *         bound to {@code name}. If null, the class name of {@code obj} is
108       *         returned by {@code getClassName()}. If {@code obj} is also
109       *         null, {@code getClassName()} will return null.
110       * @param  obj     The possibly null object bound to name.
111       * @see NameClassPair#setClassName
112       */
Binding(String name, String className, Object obj)113     public Binding(String name, String className, Object obj) {
114         super(name, className);
115         this.boundObj = obj;
116     }
117 
118     /**
119       * Constructs an instance of a Binding given its
120       * name, class name, object, and whether the name is relative.
121       *
122       * @param  name    The non-null string name of the object.
123       * @param  className       The possibly null class name of the object
124       *         bound to {@code name}. If null, the class name of {@code obj} is
125       *         returned by {@code getClassName()}. If {@code obj} is also
126       *         null, {@code getClassName()} will return null.
127       * @param  obj     The possibly null object bound to name.
128       * @param isRelative true if <code>name</code> is a name relative
129       *         to the target context (which is named by
130       *         the first parameter of the <code>listBindings()</code> method);
131       *         false if <code>name</code> is a URL string.
132       * @see NameClassPair#isRelative
133       * @see NameClassPair#setRelative
134       * @see NameClassPair#setClassName
135       */
Binding(String name, String className, Object obj, boolean isRelative)136     public Binding(String name, String className, Object obj, boolean isRelative) {
137         super(name, className, isRelative);
138         this.boundObj = obj;
139     }
140 
141     /**
142       * Retrieves the class name of the object bound to the name of this binding.
143       * If the class name has been set explicitly, return it.
144       * Otherwise, if this binding contains a non-null object,
145       * that object's class name is used. Otherwise, null is returned.
146       *
147       * @return A possibly null string containing class name of object bound.
148       */
getClassName()149     public String getClassName() {
150         String cname = super.getClassName();
151         if (cname != null) {
152             return cname;
153         }
154         if (boundObj != null)
155             return boundObj.getClass().getName();
156         else
157             return null;
158     }
159 
160     /**
161       * Retrieves the object bound to the name of this binding.
162       *
163       * @return The object bound; null if this binding does not contain an object.
164       * @see #setObject
165       */
166 
getObject()167     public Object getObject() {
168         return boundObj;
169     }
170 
171     /**
172      * Sets the object associated with this binding.
173      * @param obj The possibly null object to use.
174      * @see #getObject
175      */
setObject(Object obj)176     public void setObject(Object obj) {
177         boundObj = obj;
178     }
179 
180     /**
181       * Generates the string representation of this binding.
182       * The string representation consists of the string representation
183       * of the name/class pair and the string representation of
184       * this binding's object, separated by ':'.
185       * The contents of this string is useful
186       * for debugging and is not meant to be interpreted programmatically.
187       *
188       * @return The non-null string representation of this binding.
189       */
190 
toString()191     public String toString() {
192         return super.toString() + ":" + getObject();
193     }
194 
195     /**
196      * Use serialVersionUID from JNDI 1.1.1 for interoperability
197      */
198     private static final long serialVersionUID = 8839217842691845890L;
199 };
200