1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: AbstractException.java,v 1.1.1.1 2004/05/09 16:57:57 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.util.exception;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.ObjectOutputStream;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.PrintStream;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.PrintWriter;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Based on code published by me in <a href="http://www.fawcette.com/javapro/2002_12/online/exception_vroubtsov_12_16_02/default_pf.asp">JavaPro, 2002</a>.<P>
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This checked exception class is designed as a base/expansion point for the
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * entire hierarchy of checked exceptions in a project.<P>
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * It provides the following features:
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <UL>
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *    <LI> ability to take in compact error codes that map to full text messages
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *    in a resource bundle loaded at this class' instantiation time. This avoids
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *    hardcoding the error messages in product code and allows for easy
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *    localization of such text if required. Additionally, these messages
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *    can be parametrized in the java.text.MessageFormat style;
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *    <LI> exception chaining in J2SE versions prior to 1.4
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </UL>
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * See {@link AbstractRuntimeException} for an unchecked version of the same class.<P>
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * TODO: javadoc
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Each constructor that accepts a String 'message' parameter accepts an error
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * code as well. You are then responsible for ensuring that either the root
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <CODE>com.vladium.exception.exceptions</CODE> resource bundle
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * or your project/exception class-specific resource bundle [see
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <A HREF="#details">below</A> for details] contains a mapping for this error
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * code. When this lookup fails the passed String value itself will be used as
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the error message.<P>
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * All constructors taking an 'arguments' parameter supply parameters to the error
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * message used as a java.text.MessageFormat pattern.<P>
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Example:
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <PRE><CODE>
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  File file = ...
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  try
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  ...
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  catch (Exception e)
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  {
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *      throw new AbstractException ("FILE_NOT_FOUND", new Object[] {file, e}, e);
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  }
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </CODE></PRE>
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *      where <CODE>com.vladium.util.exception.exceptions</CODE> contains:
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <PRE><CODE>
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * FILE_NOT_FOUND: file {0} could not be opened: {1}
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </CODE></PRE>
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * To log exception data use {@link #getMessage} or <CODE>printStackTrace</CODE>
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * family of methods. You should never have to use toString().<P>
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <A NAME="details"> It is also possible to use project- or exception
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * subhierarchy-specific message resource bundles without maintaining all error
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * codes in <CODE>com.vladium.exception.exceptions</CODE>. To do so, create a
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * custom resource bundle and add the following static initializer code to your
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * base exception class:
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <PRE><CODE>
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  static
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  {
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *      addExceptionResource (MyException.class, "my_custom_resource_bundle");
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *  }
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </CODE></PRE>
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The bundle name is relative to MyException package. This step can omitted if
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the bundle name is "exceptions".
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Note that the implementation correctly resolves error code name collisions
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * across independently developed exception families, as long as resource bundles
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * use unique names. Specifically, error codes follow inheritance and hiding rules
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * similar to Java class static methods. See {@link ExceptionCommon#addExceptionResource}
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * for further details.
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2002
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract class AbstractException extends Exception implements ICodedException, IThrowableWrapper
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Constructs an exception with null message and null cause.
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public AbstractException ()
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_cause = null;
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_arguments = null;
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Constructs an exception with given error message/code and null cause.
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param message the detail message [can be null]
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public AbstractException (final String message)
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (message);
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_cause = null;
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_arguments = null;
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Constructs an exception with given error message/code and null cause.
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param message the detail message [can be null]
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param arguments message format parameters [can be null or empty]
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see java.text.MessageFormat
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public AbstractException (final String message, final Object [] arguments)
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (message);
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_cause = null;
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_arguments = arguments == null ? null : (Object []) arguments.clone ();
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Constructs an exception with null error message/code and given cause.
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param cause the cause [nested exception] [can be null]
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public AbstractException (final Throwable cause)
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super ();
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_cause = cause;
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_arguments = null;
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Constructs an exception with given error message/code and given cause.
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param message the detail message [can be null]
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param cause the cause [nested exception] [can be null]
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public AbstractException (final String message, final Throwable cause)
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (message);
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_cause = cause;
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_arguments = null;
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Constructs an exception with given error message/code and given cause.
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param message the detail message [can be null]
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param arguments message format parameters [can be null or empty]
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param cause the cause [nested exception] [can be null]
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see java.text.MessageFormat
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public AbstractException (final String message, final Object [] arguments, final Throwable cause)
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (message);
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_cause = cause;
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_arguments = arguments == null ? null : (Object []) arguments.clone ();
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Overrides base method to support error code lookup and avoid returning nulls.
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Note that this does not recurse into any 'cause' for message lookup, it only
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * uses the data passed into the constructor. Subclasses cannot override.<P>
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Equivalent to {@link #getLocalizedMessage}.
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return String error message provided at construction time or the result
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * of toString() if no/null message was provided [never null].
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getMessage ()
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_message == null) // not synchronized by design
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            String msg;
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String supermsg = super.getMessage ();
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Class _class = getClass ();
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (m_arguments == null)
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                msg = ExceptionCommon.getMessage (_class, supermsg);
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                msg = ExceptionCommon.getMessage (_class, supermsg, m_arguments);
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (msg == null)
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // this is the same as what's done in Throwable.toString() [copied here to be independent of future JDK changes]
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final String className = _class.getName ();
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                msg = (supermsg != null) ? (className + ": " + supermsg) : className;
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_message = msg;
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_message;
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Overrides base method for the sole purpose of making it final.<P>
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Equivalent to {@link #getMessage}.
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getLocalizedMessage ()
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // this is the same as what's done in Throwable
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // [copied here to be independent of future JDK changes]
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return getMessage ();
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Overrides Exception.printStackTrace() to (a) force the output to go
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * to System.out and (b) handle nested exceptions in JDKs prior to 1.4.<P>
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Subclasses cannot override.
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final void printStackTrace ()
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // NOTE: unlike the JDK implementation, force the output to go to System.out:
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ExceptionCommon.printStackTrace (this, System.out);
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Overrides Exception.printStackTrace() to handle nested exceptions in JDKs prior to 1.4.<P>
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Subclasses cannot override.
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final void printStackTrace (final PrintStream s)
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ExceptionCommon.printStackTrace (this, s);
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Overrides Exception.printStackTrace() to handle nested exceptions in JDKs prior to 1.4.<P>
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Subclasses cannot override.
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final void printStackTrace (final PrintWriter s)
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ExceptionCommon.printStackTrace (this, s);
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // ICodedException:
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Returns the String that was passed as 'message' constructor argument.
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Can be null.
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return message code string [can be null]
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getErrorCode ()
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return super.getMessage ();
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IThrowableWrapper:
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * This implements {@link IThrowableWrapper}
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * and also overrides the base method in JDK 1.4+.
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final Throwable getCause ()
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_cause;
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void __printStackTrace (final PrintStream ps)
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super.printStackTrace (ps);
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void __printStackTrace (final PrintWriter pw)
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super.printStackTrace (pw);
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Equivalent to {@link ExceptionCommon#addExceptionResource}, repeated here for
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * convenience. Subclasses should invoke from static initializers <I>only</I>.
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * 'namespace' should be YourException.class.
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static void addExceptionResource (final Class namespace,
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                             final String messageResourceBundleName)
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // note: 'namespace' will be the most derived class; it is possible to
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // auto-detect that in a static method but that requires some security
300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // permissions
301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ExceptionCommon.addExceptionResource (namespace, messageResourceBundleName);
302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /*
312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Ensures that this instance can be serialized even if some message parameters
313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * are not serializable objects.
314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void writeObject (final ObjectOutputStream out)
316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        getMessage (); // transform this instance to serializable form
319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.defaultWriteObject ();
320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private String m_message; // marshalled/cached result of getMessage()
324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private transient final Object [] m_arguments;
325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // note: this field duplicates functionality available in stock Throwable in JRE 1.4+
326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final Throwable m_cause;
327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
330