/* * 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 org.apache.harmony.jndi.internal.nls.Messages; /** * A <code>NamingException</code> is the basic exception thrown by the naming * classes. There are numerous subclasses of it which are used to further * describe the type of error encountered. * <p> * A <code>NamingException</code> can hold information relating to an error * encountered when trying to resolve a <code>Name</code>. It holds the two * parts of the original name, firstly the part of the name which was * successfully resolved, secondly the part of the name which could not be * resolved. * </p> * <p> * For example:<br /> * ------------<br /> * The resolved name could be something like http://www.apache.org where jndi * has successfully resolved the DNS name. The part of the name which could not * be resolved could be something like java/classes.index.html where jndi could * not resolve the file name. * </p> * <p> * It can also refer to the object that is associated with the resolved name. * </p> * <p> * Additionally it can refer to another exception, which may be the root cause * of this exception. * </p> * <p> * Multithreaded access to a <code>NamingException</code> instance is only * safe when client code locks the object first. * </p> */ public class NamingException extends Exception { /* * This constant is used during deserialization to check the version which * created the serialized object. */ private static final long serialVersionUID = -1299181962103167177L; /** * The resolved name. This may be null. */ protected Name resolvedName = null; /** * The remaining name. This may be null. */ protected Name remainingName = null; /** * The resolved object. This may be null. */ protected Object resolvedObj = null; /** * The exception that caused this NamingException to be raised. This may be * null. */ protected Throwable rootException = null; /** * Constructs a <code>NamingException</code> instance with all data * initialized to null. */ public NamingException() { super(); } /** * Constructs a <code>NamingException</code> instance with the specified * message. All other fields are initialized to null. * * @param s * The detail message for the exception. It may be null. */ public NamingException(String s) { super(s); } /** * Returns the message passed in as a param to the constructor. This may be * null. * * @return the message passed in as a param to the constructor. */ public String getExplanation() { return super.getMessage(); } /** * Appends the supplied string to the <code>Name</code> held as the * remaining name. The string may be null. * * @param s * the string to append to the remaining Name. * @throws IllegalArgumentException * if appending the supplied String s causes the name to become * invalid. */ public void appendRemainingComponent(String s) { if (null != s) { try { if (null == remainingName) { remainingName = new CompositeName(""); //$NON-NLS-1$ } remainingName = remainingName.add(s); } catch (InvalidNameException e) { // jndi.10=Found invalid name, reason: {0} throw new IllegalArgumentException(Messages.getString( "jndi.10", e)); //$NON-NLS-1$ } } } /** * Returns the remaining name. This may be null. * * @return the remaining name. This may be null. */ public Name getRemainingName() { return remainingName; } /** * Returns the resolved name. This may be null. * * @return the resolved name. This may be null. */ public Name getResolvedName() { return resolvedName; } /** * Returns the resolved object. This may be null. * * @return the resolved object. This may be null. */ public Object getResolvedObj() { return resolvedObj; } /** * Sets the resolved name to the specified name. This may be null. The * resolved name details must not change even if the original * <code>Name</code> itself changes. * * @param name * the resolved name to set. */ public void setResolvedName(Name name) { resolvedName = null == name ? null : (Name) name.clone(); } /** * Sets the remaining name to the specified n. This may be null. The * remaining name details must not change even if the original * <code>Name</code> itself changes. * * @param name * the remaining name to set. */ public void setRemainingName(Name name) { remainingName = null == name ? null : (Name) name.clone(); } /** * Sets the resolved object to the specified o. This may be null. * * @param o * the resolved object to set. */ public void setResolvedObj(Object o) { resolvedObj = o; } /** * Appends the elements of the supplied <code>Name</code> n to the * <code>Name</code> held as the remaining name. The <code>Name</code> n * may be null or may be empty. * * @param n * the name to append to the remaining name. * @throws IllegalArgumentException * if appending the supplied <code>Name</code> n causes the * name to become invalid. */ public void appendRemainingName(Name n) { if (null != n) { try { if (null == remainingName) { remainingName = new CompositeName(""); //$NON-NLS-1$ } remainingName = remainingName.addAll(n); } catch (InvalidNameException e) { // jndi.10=Found invalid name, reason: {0} throw new IllegalArgumentException(Messages.getString( "jndi.10", e)); //$NON-NLS-1$ } } } /** * Returns the exception which caused this <code>NamingException</code> * which may be null. * * @return the exception which caused this <code>NamingException</code> * which may be null. */ public Throwable getRootCause() { return rootException; } /** * Sets the exception that caused this <code>NamingException</code>. It * may be null. Ignore the supplied parameter if it is actually this * exception. * * @param t * the exception that caused this <code>NamingException</code>. */ public void setRootCause(Throwable t) { if (t != this) { rootException = t; } } /** * Returns the same details as the <code>toString()</code> method except * that, if the <code>flag</code> is set to true, then details of the * resolved object are also appended to the string. The actual format can be * decided by the implementor. * * @param flag * Indicates if the resolved object need to be returned. * * @return the string representation of this <code>NamingException</code>. */ public String toString(boolean flag) { return toStringImpl(flag); } /* * (non-Javadoc) * * @see java.lang.Throwable#getCause() */ @Override public Throwable getCause() { return getRootCause(); } /* * (non-Javadoc) * * @see java.lang.Throwable#initCause(Throwable) */ @Override public Throwable initCause(Throwable cause) { super.initCause(cause); rootException = cause; return this; } /** * Returns the string representation of this <code>NamingException</code>. * The string contains the string representation of this exception together * with details of the exception which caused this and any remaining portion * of the <code>Name</code>. * <p> * The actual format can be decided by the implementor. * </p> * * @return the string */ @Override public String toString() { return this.toStringImpl(false); } @SuppressWarnings("nls") private String toStringImpl(boolean flag) { StringBuilder sb = new StringBuilder(); sb.append(super.toString()); if (null != rootException) { sb.append(" [Root exception is ").append(rootException.toString()) .append("]"); } if (null != remainingName) { sb.append("; Remaining name: '").append(remainingName.toString()) .append("'"); } if (flag && null != resolvedObj) { sb.append("; Resolved object: '").append(resolvedObj.toString()) .append("'"); } return sb.toString(); } }