/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2006 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: L10NMessageImpl.java,v 1.2 2008/06/25 05:53:04 qcheng Exp $ * * Portions Copyrighted 2011-2014 ForgeRock AS. */ package com.sun.identity.shared.locale; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; /** * Convenient implementation of L10NMessage Interface. Extends * java.lang.Exception an provides mechanism to provide resource * bundle for error messages */ public class L10NMessageImpl extends Exception implements L10NMessage { private static final long serialVersionUID = -4690604178832156822L; private AMResourceBundleCache amCache = AMResourceBundleCache.getInstance(); private String message; private String bundleName; private String errorCode; private Object[] args; private ResourceBundle bundle; public L10NMessageImpl(String msg) { super(msg); } public L10NMessageImpl(String message, Throwable cause) { super(message, cause); } /** * This constructor is used 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 messsage. The default getMessage() will always return English * messages only. This is in consistent with current JRE * * @param rbName ResourceBundle 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 the as null. */ public L10NMessageImpl(String rbName, String errorCode, Object args[]) { this.bundleName = rbName; this.errorCode = errorCode; this.args = args; this.message = getL10NMessage(Locale.ENGLISH); } /** * This constructor is used to extract localized error message from * throwable. * * @param ex if the exception message is instance of L10NMessage, the * bundleName,errorCode and args are extracted from throwable */ public L10NMessageImpl(Throwable ex) { super(ex); this.message = ex.getMessage(); if (ex instanceof L10NMessage) { L10NMessage lex = (L10NMessage) ex; this.bundleName = lex.getResourceBundleName(); this.errorCode = lex.getErrorCode(); this.args = lex.getMessageArgs(); } } /** * Returns localized error message. * * @param locale Locale of the error message. * @return localized error message. * @see #L10NMessageImpl(String, String, Object[]) */ public String getL10NMessage(Locale locale) { if (errorCode == null) { return getMessage(); } String result = message; if (bundleName != null && locale != 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); } } return result; } /** * Returns resource bundle name associated with this error message. * * @return resource bundle name associated with this error message. * @see #L10NMessageImpl(String, String, Object[]) */ public String getResourceBundleName() { return bundleName; } /** * Returns error code associated with this error message. * * @return error code associated with this error message. * @see #L10NMessageImpl(String, String, Object[]) */ public String getErrorCode() { return errorCode; } /** * Returns arguments for formatting this error message. You need to use * MessageFormat class to format the message It can be null. * * @return arguments for formatting this error message. * @see #L10NMessageImpl(String, String, Object[]) */ public Object[] getMessageArgs() { return args; } /** * Returns message of the exception. * * @return Message of the exception. */ public String getMessage() { if (message != null) { // message is set only if l10n resource bundle is specified return message; } return super.getMessage(); } }