/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at opensso/legal/CDDLv1.0.txt. * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id: AuthLoginException.java,v 1.4 2008/06/25 05:42:06 qcheng Exp $ * */ /* * Portions Copyright 2011-2013 ForgeRock AS */ package com.sun.identity.authentication.spi; import com.sun.identity.shared.locale.AMResourceBundleCache; import com.sun.identity.shared.locale.L10NMessage; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; import javax.security.auth.login.LoginException; /** * This class is for handling message localization in LoginException. * * @supported.api */ public class AuthLoginException extends LoginException implements L10NMessage { private static AMResourceBundleCache amCache = AMResourceBundleCache.getInstance(); private String _bundleName = null; private String _errorCode = null; private Object[] _args = null; private ResourceBundle _bundle = null; /** * Constructs an exception with given message and the nested exception. * * @param message * message of this exception * @param nestedException * Exception caught by the code block throwing this exception */ public AuthLoginException(String message, Throwable nestedException) { super(message); initCause(nestedException); } /** * Constructs an AuthLoginException with given * Throwable. * * @param nestedException * Exception nested in the new exception. * * @supported.api */ public AuthLoginException(Throwable nestedException) { initCause(nestedException); if (nestedException instanceof L10NMessage) { _errorCode = ((L10NMessage) nestedException).getErrorCode(); } } /** * Constructs a new AuthLoginException with the given * message. * * @param message * message for this exception. This message can be later * retrieved by getMessage() method. * * @supported.api */ public AuthLoginException(String message) { super(message); } /** * Constructs an instance of AuthLoginException to pass the * localized error message At this level, the locale of the caller is not * known and it is not possible to throw localized error message at this * level. Instead this constructor provides Resource Bundle name and * errorCode for correctly locating the error message. The * default getMessage() will always return English messages * only. This is consistent with current JRE. * * @param rbName * Resource Bundle Name to be used for getting localized error * message. * @param errorCode * Key to resource bundle. You can use * *
     *  ResourceBundle rb = ResourceBunde.getBundle (rbName,locale);
     *  String localizedStr = rb.getString(errorCode)
     * 
* * @param args * arguments to message. If it is not present pass them as null * @param nestedException * The nested Throwable. * * @supported.api */ public AuthLoginException(String rbName, String errorCode, Object[] args, Throwable nestedException) { initCause(nestedException); _bundleName = rbName; _errorCode = errorCode; _args = args; } /** * Constructs a new AuthLoginException without a nested * Throwable. * * @param rbName * Resource Bundle Name to be used for getting localized error * message. * @param errorCode * Key to resource bundle. You can use * *
     *  ResourceBundle rb = ResourceBunde.getBundle (rbName,locale);
     *  String localizedStr = rb.getString(errorCode)
     * 
* * @param args * arguments to message. If it is not present pass them as null * * @supported.api */ public AuthLoginException(String rbName, String errorCode, Object[] args) { this(rbName, errorCode, args, null); } /** * Returns the localized message of the given locale. * * @param locale * the locale in which the message will be returned. * @return String localized error message. * * @supported.api */ public String getL10NMessage(Locale locale) { String result = super.getMessage(); if (_bundleName != null && locale != null && _errorCode != null) { _bundle = amCache.getResBundle(_bundleName, locale); String mid = _bundle.getString(_errorCode); if (_args == null || _args.length == 0) { result = mid; } else { result = MessageFormat.format(mid, _args); } } String chainedMessage = null; Throwable nestedException = getCause(); if (nestedException != null) { if (nestedException instanceof L10NMessage) { L10NMessage lex = (L10NMessage) nestedException; chainedMessage = lex.getL10NMessage(locale); } else { chainedMessage = nestedException.getMessage(); } } if (result == null) { result = chainedMessage; } else if (chainedMessage != null) { result = result + "\n" + chainedMessage; } return result; } /** * Returns the resource bundle name. * * @return Resource Bundle Name associated with this error message. * @see #getL10NMessage(java.util.Locale). * * @supported.api */ public String getResourceBundleName() { return _bundleName; } /** * Returns the error code. * * @return Error code associated with this error message. * * @supported.api */ public String getErrorCode() { return _errorCode; } /** * Returns the error message arguments. * * @return arguments for formatting this error message. You need to use * MessageFormat class to format the message. It can * be null. * * @supported.api */ public Object[] getMessageArgs() { return _args; } /** * Gets messages of the exceptions including the nested exceptions. * * @return messages of the exceptions including nested exceptions. The * returned string is formed by concatenating messages of all the * exceptions, with a new line separator, starting from this * exception, all the way to the root exception, by following the * nested exceptions. The message returned is always in English * locale. To get localized message, use the getL10NMessage(Locale) * method. * * @supported.api */ public String getMessage() { return getL10NMessage(Locale.ENGLISH); } }