1 /* 2 * Copyright (c) 1999, 2011, 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 import java.util.Vector; 29 import java.util.Enumeration; 30 31 /** 32 * This class represents a reference to an object that is found outside of 33 * the naming/directory system. 34 *<p> 35 * Reference provides a way of recording address information about 36 * objects which themselves are not directly bound to the naming/directory system. 37 *<p> 38 * A Reference consists of an ordered list of addresses and class information 39 * about the object being referenced. 40 * Each address in the list identifies a communications endpoint 41 * for the same conceptual object. The "communications endpoint" 42 * is information that indicates how to contact the object. It could 43 * be, for example, a network address, a location in memory on the 44 * local machine, another process on the same machine, etc. 45 * The order of the addresses in the list may be of significance 46 * to object factories that interpret the reference. 47 *<p> 48 * Multiple addresses may arise for 49 * various reasons, such as replication or the object offering interfaces 50 * over more than one communication mechanism. The addresses are indexed 51 * starting with zero. 52 *<p> 53 * A Reference also contains information to assist in creating an instance 54 * of the object to which this Reference refers. It contains the class name 55 * of that object, and the class name and location of the factory to be used 56 * to create the object. 57 * The class factory location is a space-separated list of URLs representing 58 * the class path used to load the factory. When the factory class (or 59 * any class or resource upon which it depends) needs to be loaded, 60 * each URL is used (in order) to attempt to load the class. 61 *<p> 62 * A Reference instance is not synchronized against concurrent access by multiple 63 * threads. Threads that need to access a single Reference concurrently should 64 * synchronize amongst themselves and provide the necessary locking. 65 * 66 * @author Rosanna Lee 67 * @author Scott Seligman 68 * 69 * @see RefAddr 70 * @see StringRefAddr 71 * @see BinaryRefAddr 72 * @since 1.3 73 */ 74 75 /*<p> 76 * The serialized form of a Reference object consists of the class 77 * name of the object being referenced (a String), a Vector of the 78 * addresses (each a RefAddr), the name of the class factory (a 79 * String), and the location of the class factory (a String). 80 */ 81 82 83 public class Reference implements Cloneable, java.io.Serializable { 84 /** 85 * Contains the fully-qualified name of the class of the object to which 86 * this Reference refers. 87 * @serial 88 * @see java.lang.Class#getName 89 */ 90 protected String className; 91 /** 92 * Contains the addresses contained in this Reference. 93 * Initialized by constructor. 94 * @serial 95 */ 96 protected Vector<RefAddr> addrs = null; 97 98 /** 99 * Contains the name of the factory class for creating 100 * an instance of the object to which this Reference refers. 101 * Initialized to null. 102 * @serial 103 */ 104 protected String classFactory = null; 105 106 /** 107 * Contains the location of the factory class. 108 * Initialized to null. 109 * @serial 110 */ 111 protected String classFactoryLocation = null; 112 113 /** 114 * Constructs a new reference for an object with class name 'className'. 115 * Class factory and class factory location are set to null. 116 * The newly created reference contains zero addresses. 117 * 118 * @param className The non-null class name of the object to which 119 * this reference refers. 120 */ 121 public Reference(String className) { 122 this.className = className; 123 addrs = new Vector<>(); 124 } 125 126 /** 127 * Constructs a new reference for an object with class name 'className' and 128 * an address. 129 * Class factory and class factory location are set to null. 130 * 131 * @param className The non-null class name of the object to 132 * which this reference refers. 133 * @param addr The non-null address of the object. 134 */ 135 public Reference(String className, RefAddr addr) { 136 this.className = className; 137 addrs = new Vector<>(); 138 addrs.addElement(addr); 139 } 140 141 /** 142 * Constructs a new reference for an object with class name 'className', 143 * and the class name and location of the object's factory. 144 * 145 * @param className The non-null class name of the object to which 146 * this reference refers. 147 * @param factory The possibly null class name of the object's factory. 148 * @param factoryLocation 149 * The possibly null location from which to load 150 * the factory (e.g. URL) 151 * @see javax.naming.spi.ObjectFactory 152 * @see javax.naming.spi.NamingManager#getObjectInstance 153 */ 154 public Reference(String className, String factory, String factoryLocation) { 155 this(className); 156 classFactory = factory; 157 classFactoryLocation = factoryLocation; 158 } 159 160 /** 161 * Constructs a new reference for an object with class name 'className', 162 * the class name and location of the object's factory, and the address for 163 * the object. 164 * 165 * @param className The non-null class name of the object to 166 * which this reference refers. 167 * @param factory The possibly null class name of the object's factory. 168 * @param factoryLocation The possibly null location from which 169 * to load the factory (e.g. URL) 170 * @param addr The non-null address of the object. 171 * @see javax.naming.spi.ObjectFactory 172 * @see javax.naming.spi.NamingManager#getObjectInstance 173 */ 174 public Reference(String className, RefAddr addr, 175 String factory, String factoryLocation) { 176 this(className, addr); 177 classFactory = factory; 178 classFactoryLocation = factoryLocation; 179 } 180 181 /** 182 * Retrieves the class name of the object to which this reference refers. 183 * 184 * @return The non-null fully-qualified class name of the object. 185 * (e.g. "java.lang.String") 186 */ 187 public String getClassName() { 188 return className; 189 } 190 191 /** 192 * Retrieves the class name of the factory of the object 193 * to which this reference refers. 194 * 195 * @return The possibly null fully-qualified class name of the factory. 196 * (e.g. "java.lang.String") 197 */ 198 public String getFactoryClassName() { 199 return classFactory; 200 } 201 202 /** 203 * Retrieves the location of the factory of the object 204 * to which this reference refers. 205 * If it is a codebase, then it is an ordered list of URLs, 206 * separated by spaces, listing locations from where the factory 207 * class definition should be loaded. 208 * 209 * @return The possibly null string containing the 210 * location for loading in the factory's class. 211 */ 212 public String getFactoryClassLocation() { 213 return classFactoryLocation; 214 } 215 216 /** 217 * Retrieves the first address that has the address type 'addrType'. 218 * String.compareTo() is used to test the equality of the address types. 219 * 220 * @param addrType The non-null address type for which to find the address. 221 * @return The address in this reference with address type 'addrType'; 222 * null if no such address exists. 223 */ 224 public RefAddr get(String addrType) { 225 int len = addrs.size(); 226 RefAddr addr; 227 for (int i = 0; i < len; i++) { 228 addr = addrs.elementAt(i); 229 if (addr.getType().compareTo(addrType) == 0) 230 return addr; 231 } 232 return null; 233 } 234 235 /** 236 * Retrieves the address at index posn. 237 * @param posn The index of the address to retrieve. 238 * @return The address at the 0-based index posn. It must be in the 239 * range [0,getAddressCount()). 240 * @exception ArrayIndexOutOfBoundsException If posn not in the specified 241 * range. 242 */ 243 public RefAddr get(int posn) { 244 return addrs.elementAt(posn); 245 } 246 247 /** 248 * Retrieves an enumeration of the addresses in this reference. 249 * When addresses are added, changed or removed from this reference, 250 * its effects on this enumeration are undefined. 251 * 252 * @return An non-null enumeration of the addresses 253 * ({@code RefAddr}) in this reference. 254 * If this reference has zero addresses, an enumeration with 255 * zero elements is returned. 256 */ 257 public Enumeration<RefAddr> getAll() { 258 return addrs.elements(); 259 } 260 261 /** 262 * Retrieves the number of addresses in this reference. 263 * 264 * @return The nonnegative number of addresses in this reference. 265 */ 266 public int size() { 267 return addrs.size(); 268 } 269 270 /** 271 * Adds an address to the end of the list of addresses. 272 * 273 * @param addr The non-null address to add. 274 */ 275 public void add(RefAddr addr) { 276 addrs.addElement(addr); 277 } 278 279 /** 280 * Adds an address to the list of addresses at index posn. 281 * All addresses at index posn or greater are shifted up 282 * the list by one (away from index 0). 283 * 284 * @param posn The 0-based index of the list to insert addr. 285 * @param addr The non-null address to add. 286 * @exception ArrayIndexOutOfBoundsException If posn not in the specified 287 * range. 288 */ 289 public void add(int posn, RefAddr addr) { 290 addrs.insertElementAt(addr, posn); 291 } 292 293 /** 294 * Deletes the address at index posn from the list of addresses. 295 * All addresses at index greater than posn are shifted down 296 * the list by one (towards index 0). 297 * 298 * @param posn The 0-based index of in address to delete. 299 * @return The address removed. 300 * @exception ArrayIndexOutOfBoundsException If posn not in the specified 301 * range. 302 */ 303 public Object remove(int posn) { 304 Object r = addrs.elementAt(posn); 305 addrs.removeElementAt(posn); 306 return r; 307 } 308 309 /** 310 * Deletes all addresses from this reference. 311 */ 312 public void clear() { 313 addrs.setSize(0); 314 } 315 316 /** 317 * Determines whether obj is a reference with the same addresses 318 * (in same order) as this reference. 319 * The addresses are checked using RefAddr.equals(). 320 * In addition to having the same addresses, the Reference also needs to 321 * have the same class name as this reference. 322 * The class factory and class factory location are not checked. 323 * If obj is null or not an instance of Reference, null is returned. 324 * 325 * @param obj The possibly null object to check. 326 * @return true if obj is equal to this reference; false otherwise. 327 */ 328 public boolean equals(Object obj) { 329 if ((obj != null) && (obj instanceof Reference)) { 330 Reference target = (Reference)obj; 331 // ignore factory information 332 if (target.className.equals(this.className) && 333 target.size() == this.size()) { 334 Enumeration<RefAddr> mycomps = getAll(); 335 Enumeration<RefAddr> comps = target.getAll(); 336 while (mycomps.hasMoreElements()) 337 if (!(mycomps.nextElement().equals(comps.nextElement()))) 338 return false; 339 return true; 340 } 341 } 342 return false; 343 } 344 345 /** 346 * Computes the hash code of this reference. 347 * The hash code is the sum of the hash code of its addresses. 348 * 349 * @return A hash code of this reference as an int. 350 */ 351 public int hashCode() { 352 int hash = className.hashCode(); 353 for (Enumeration<RefAddr> e = getAll(); e.hasMoreElements();) 354 hash += e.nextElement().hashCode(); 355 return hash; 356 } 357 358 /** 359 * Generates the string representation of this reference. 360 * The string consists of the class name to which this reference refers, 361 * and the string representation of each of its addresses. 362 * This representation is intended for display only and not to be parsed. 363 * 364 * @return The non-null string representation of this reference. 365 */ 366 public String toString() { 367 StringBuilder sb = new StringBuilder("Reference Class Name: " + 368 className + "\n"); 369 int len = addrs.size(); 370 for (int i = 0; i < len; i++) 371 sb.append(get(i).toString()); 372 373 return sb.toString(); 374 } 375 376 /** 377 * Makes a copy of this reference using its class name 378 * list of addresses, class factory name and class factory location. 379 * Changes to the newly created copy does not affect this Reference 380 * and vice versa. 381 */ 382 public Object clone() { 383 Reference r = new Reference(className, classFactory, classFactoryLocation); 384 Enumeration<RefAddr> a = getAll(); 385 r.addrs = new Vector<>(); 386 387 while (a.hasMoreElements()) 388 r.addrs.addElement(a.nextElement()); 389 return r; 390 } 391 /** 392 * Use serialVersionUID from JNDI 1.1.1 for interoperability 393 */ 394 private static final long serialVersionUID = -1673475790065791735L; 395 };