| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package javax.naming; |
| |
| import java.io.Serializable; |
| import java.util.Enumeration; |
| import java.util.Vector; |
| |
| import org.apache.harmony.jndi.internal.nls.Messages; |
| |
| /** |
| * A <code>Reference</code> contains the class of the object which is |
| * referenced together with a list of all the addresses at which this object may |
| * be found. Additionally the <code>Reference</code> has the location of a |
| * factory which can create this object together with the classname used to |
| * create the object. |
| * <p> |
| * The <code>Reference</code> class relates to objects which are not bound in |
| * a naming service but which need to be accessed via javax.naming. |
| * <code>Reference</code>, <code>RefAddr</code> and their subclasses |
| * provide a way to access objects other than those in naming and directory |
| * systems. |
| * </p> |
| */ |
| public class Reference implements Cloneable, Serializable { |
| |
| private static final long serialVersionUID = -1673475790065791735L; |
| |
| /** |
| * The class of the object which is referenced. |
| * |
| * @serial |
| */ |
| protected String className; |
| |
| /** |
| * A list of the addresses provided for this object. The default is null. |
| * |
| * @serial |
| */ |
| protected Vector<RefAddr> addrs; |
| |
| /** |
| * The class in a factory which is used to create an object of the type |
| * which is referenced. The default is null. |
| * |
| * @serial |
| */ |
| protected String classFactory; |
| |
| /** |
| * The location of class <code>classFactory</code>. To find class files |
| * the URL of the classfile is given. If there is more than one URL for the |
| * class then a list of URLs appears in the string using a space as a |
| * separator. The default is null. |
| * |
| * @serial |
| */ |
| protected String classFactoryLocation; |
| |
| /** |
| * Constructs a <code>Reference</code> instance with an empty list of |
| * addresses using the supplied class name. |
| * |
| * @param className |
| * the class of the object which is referenced. It cannot be |
| * null. |
| */ |
| public Reference(String className) { |
| this(className, null, null); |
| } |
| |
| /** |
| * Constructs a <code>Reference</code> instance with one entry of address. |
| * |
| * @param className |
| * the class of the object which is referenced. It cannot be |
| * null. |
| * @param addr |
| * the object's address. It cannot be null. |
| */ |
| public Reference(String className, RefAddr addr) { |
| this(className, addr, null, null); |
| } |
| |
| /** |
| * Constructs a <code>Reference</code> instance with an empty list of |
| * addresses using the supplied class name, factory class and factory |
| * location. |
| * |
| * @param className |
| * the class of the object which is referenced. It cannot be |
| * null. |
| * @param classFactory |
| * the class in a factory which is used to create an object of |
| * the type which is referenced. It may be null. |
| * @param classFactoryLocation |
| * the location of the class file. It may be null. |
| */ |
| public Reference(String className, String classFactory, |
| String classFactoryLocation) { |
| super(); |
| this.className = className; |
| this.classFactory = classFactory; |
| this.classFactoryLocation = classFactoryLocation; |
| this.addrs = new Vector<RefAddr>(); |
| } |
| |
| /** |
| * Constructs a <code>Reference</code> instance with one entry of address |
| * using the supplied class name, factory class and factory location. |
| * |
| * @param className |
| * the class of the object which is referenced. It cannot be |
| * null. |
| * @param addr |
| * the object's address. It cannot be null. |
| * @param classFactory |
| * the class in a factory which is used to create an object of |
| * the type which is referenced. It may be null. |
| * @param classFactoryLocation |
| * the location of the class file. It may be null. |
| */ |
| public Reference(String className, RefAddr addr, String classFactory, |
| String classFactoryLocation) { |
| this(className, classFactory, classFactoryLocation); |
| this.addrs.add(addr); |
| } |
| |
| /** |
| * Gets the class of the object which is referenced. The result cannot be |
| * null. |
| * |
| * @return the class of the object which is referenced |
| */ |
| public String getClassName() { |
| return this.className; |
| } |
| |
| /** |
| * Gets the class in a factory which is used to create an object of the type |
| * which is referenced. The result may be null. |
| * |
| * @return the class in a factory which is used to create the referenced |
| * object |
| */ |
| public String getFactoryClassName() { |
| return this.classFactory; |
| } |
| |
| /** |
| * Gets the location of the factory class. The result may be null. |
| * |
| * @return the location of the factory class |
| */ |
| public String getFactoryClassLocation() { |
| return this.classFactoryLocation; |
| } |
| |
| /** |
| * Gets all the addresses. |
| * |
| * @return an enumeration of all the addresses |
| */ |
| public Enumeration<RefAddr> getAll() { |
| return addrs.elements(); |
| } |
| |
| /** |
| * Gets an address where the address type matches the specified string. |
| * There may be more than one entry in the list with the same address type |
| * but this method returns the first one found in the list. |
| * |
| * @param type |
| * the address type to look for |
| * @return the first address whose type matches the string |
| */ |
| public RefAddr get(String type) { |
| Enumeration<RefAddr> elements = addrs.elements(); |
| RefAddr refAddr = null; |
| |
| while (elements.hasMoreElements()) { |
| refAddr = elements.nextElement(); |
| if (type.equals(refAddr.getType())) { |
| return refAddr; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Gets the address held at the specified index in the address list. |
| * |
| * @param index |
| * the index of the required address. It must be greater than or |
| * equal to 0 and less than the number of entries in the list. |
| * @return the address held at the specified index |
| * @throws ArrayIndexOutOfBoundsException |
| * If the index is invalid. |
| */ |
| public RefAddr get(int index) { |
| return addrs.get(index); |
| } |
| |
| /** |
| * Appends an address to the list. |
| * |
| * @param addr |
| * the address to append. It cannot be null. |
| */ |
| public void add(RefAddr addr) { |
| addrs.add(addr); |
| } |
| |
| /** |
| * Inserts an address within the list at the specified index. |
| * |
| * @param addr |
| * the address to insert into the list. It cannot be null. |
| * @param index |
| * the index where to insert the address. It must be greater than |
| * or equal to 0 and less than or equal to the number of entries |
| * in the list(size()). |
| * @throws ArrayIndexOutOfBoundsException |
| * If the index is invalid. |
| */ |
| public void add(int index, RefAddr addr) { |
| addrs.add(index, addr); |
| } |
| |
| /** |
| * Removes an address from the address list. |
| * |
| * @param index |
| * the index of the address to remove. It must be greater than or |
| * equal to 0 and less than size(). |
| * @return the removed address |
| * @throws ArrayIndexOutOfBoundsException |
| * If the index is invalid. |
| */ |
| public Object remove(int index) { |
| return addrs.remove(index); |
| } |
| |
| /** |
| * Gets the number of addresses in the address list. |
| * |
| * @return the size of the list |
| */ |
| public int size() { |
| return addrs.size(); |
| } |
| |
| /** |
| * Deletes all the addresses from the address list. |
| */ |
| public void clear() { |
| addrs.clear(); |
| } |
| |
| /** |
| * Returns a deep clone of this <code>Reference</code> instance. |
| * |
| * @return a deep clone of this object |
| */ |
| @SuppressWarnings("unchecked") |
| @Override |
| public Object clone() { |
| try { |
| Reference reference = (Reference) super.clone(); |
| reference.addrs = (Vector<RefAddr>) this.addrs.clone(); |
| return reference; |
| } catch (CloneNotSupportedException e) { |
| // jndi.03=Failed to clone object of Reference class. |
| throw new AssertionError(Messages.getString("jndi.03")); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Returns true if this <code>Reference</code> instance is equal to the |
| * supplied object <code>o</code>. They are considered equal if their |
| * class name and list of addresses are equivalent (including the order of |
| * the addresses in the list). The factory class and location are ignored |
| * for the purposes of this comparison. |
| * |
| * @param o |
| * the object to compare with |
| * @return true if this object is equal to <code>o</code>, otherwise |
| * false |
| */ |
| @Override |
| public boolean equals(Object o) { |
| if (o == this) { |
| return true; |
| } |
| if (!(o instanceof Reference)) { |
| return false; |
| } |
| Reference ref = (Reference) o; |
| return ref.className.equals(this.className) |
| && ref.addrs.size() == this.addrs.size() |
| && ref.addrs.equals(this.addrs); |
| } |
| |
| /** |
| * Returns the hashcode for this <code>Reference</code> instance. The |
| * result is calculated by summing the hashcode of the class name and the |
| * hash codes of each of the addresses in the address list. |
| * |
| * @return the hashcode of this <code>Reference</code> instance |
| */ |
| @Override |
| public int hashCode() { |
| int hashCode = this.className.hashCode(); |
| Enumeration<RefAddr> e = this.addrs.elements(); |
| while (e.hasMoreElements()) { |
| hashCode += e.nextElement().hashCode(); |
| } |
| return hashCode; |
| } |
| |
| /** |
| * Returns the string representation of the class name together with the |
| * list of addresses. |
| * |
| * @return the string representation of this object |
| */ |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder("Reference Class Name: "); //$NON-NLS-1$ |
| sb.append(this.className).append('\n'); |
| if (addrs.size() > 0) { |
| Enumeration<RefAddr> elements = this.addrs.elements(); |
| while (elements.hasMoreElements()) { |
| sb.append(elements.nextElement().toString()); |
| } |
| } |
| return sb.toString(); |
| } |
| } |