1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /**
   6  * Licensed to the Apache Software Foundation (ASF) under one
   7  * or more contributor license agreements. See the NOTICE file
   8  * distributed with this work for additional information
   9  * regarding copyright ownership. The ASF licenses this file
  10  * to you under the Apache License, Version 2.0 (the
  11  * "License"); you may not use this file except in compliance
  12  * with the License. You may obtain a copy of the License at
  13  *
  14  * http://www.apache.org/licenses/LICENSE-2.0
  15  *
  16  * Unless required by applicable law or agreed to in writing,
  17  * software distributed under the License is distributed on an
  18  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  19  * KIND, either express or implied. See the License for the
  20  * specific language governing permissions and limitations
  21  * under the License.
  22  */
  23 package com.sun.org.apache.xml.internal.security.utils;
  24 
  25 import java.text.MessageFormat;
  26 import java.util.Locale;
  27 import java.util.ResourceBundle;
  28 
  29 /**
  30  * The Internationalization (I18N) pack.
  31  *
  32  * @author Christian Geuer-Pollmann
  33  */
  34 public class I18n {
  35 
  36     /** Field NOT_INITIALIZED_MSG */
  37     public static final String NOT_INITIALIZED_MSG =
  38         "You must initialize the xml-security library correctly before you use it. "
  39         + "Call the static method \"com.sun.org.apache.xml.internal.security.Init.init();\" to do that "
  40         + "before you use any functionality from that library.";
  41 
  42     /** Field resourceBundle */
  43     private static ResourceBundle resourceBundle;
  44 
  45     /** Field alreadyInitialized */
  46     private static boolean alreadyInitialized = false;
  47 
  48     /**
  49      * Constructor I18n
  50      *
  51      */
  52     private I18n() {
  53         // we don't allow instantiation
  54     }
  55 
  56     /**
  57      * Method translate
  58      *
  59      * translates a message ID into an internationalized String, see alse
  60      * <CODE>XMLSecurityException.getExceptionMEssage()</CODE>. The strings are
  61      * stored in the <CODE>ResourceBundle</CODE>, which is identified in
  62      * <CODE>exceptionMessagesResourceBundleBase</CODE>
  63      *
  64      * @param message
  65      * @param args is an <CODE>Object[]</CODE> array of strings which are inserted into 
  66      * the String which is retrieved from the <CODE>ResouceBundle</CODE>
  67      * @return message translated
  68      */
  69     public static String translate(String message, Object[] args) {
  70         return getExceptionMessage(message, args);
  71     }
  72 
  73     /**
  74      * Method translate
  75      *
  76      * translates a message ID into an internationalized String, see also
  77      * <CODE>XMLSecurityException.getExceptionMessage()</CODE>
  78      *
  79      * @param message
  80      * @return message translated
  81      */
  82     public static String translate(String message) {
  83         return getExceptionMessage(message);
  84     }
  85 
  86     /**
  87      * Method getExceptionMessage
  88      *
  89      * @param msgID
  90      * @return message translated
  91      *
  92      */
  93     public static String getExceptionMessage(String msgID) {
  94         try {
  95             return resourceBundle.getString(msgID);
  96         } catch (Throwable t) {
  97             if (com.sun.org.apache.xml.internal.security.Init.isInitialized()) {
  98                 return "No message with ID \"" + msgID
  99                 + "\" found in resource bundle \""
 100                 + Constants.exceptionMessagesResourceBundleBase + "\"";
 101             } 
 102             return I18n.NOT_INITIALIZED_MSG;
 103         }
 104     }
 105 
 106     /**
 107      * Method getExceptionMessage
 108      *
 109      * @param msgID
 110      * @param originalException
 111      * @return message translated
 112      */
 113     public static String getExceptionMessage(String msgID, Exception originalException) {
 114         try {
 115             Object exArgs[] = { originalException.getMessage() };
 116             return MessageFormat.format(resourceBundle.getString(msgID), exArgs);
 117         } catch (Throwable t) {
 118             if (com.sun.org.apache.xml.internal.security.Init.isInitialized()) {
 119                 return "No message with ID \"" + msgID
 120                 + "\" found in resource bundle \""
 121                 + Constants.exceptionMessagesResourceBundleBase
 122                 + "\". Original Exception was a "
 123                 + originalException.getClass().getName() + " and message "
 124                 + originalException.getMessage();
 125             } 
 126             return I18n.NOT_INITIALIZED_MSG;
 127         }
 128     }
 129 
 130     /**
 131      * Method getExceptionMessage
 132      *
 133      * @param msgID
 134      * @param exArgs
 135      * @return message translated
 136      */
 137     public static String getExceptionMessage(String msgID, Object exArgs[]) {
 138         try {
 139             return MessageFormat.format(resourceBundle.getString(msgID), exArgs);
 140         } catch (Throwable t) {
 141             if (com.sun.org.apache.xml.internal.security.Init.isInitialized()) {
 142                 return "No message with ID \"" + msgID
 143                 + "\" found in resource bundle \""
 144                 + Constants.exceptionMessagesResourceBundleBase + "\"";
 145             } 
 146             return I18n.NOT_INITIALIZED_MSG;
 147         }
 148     }
 149     
 150     /**
 151      * Method init
 152      *
 153      * @param languageCode
 154      * @param countryCode
 155      */
 156     public synchronized static void init(String languageCode, String countryCode) {
 157         if (alreadyInitialized) {
 158             return;
 159         }
 160 
 161         I18n.resourceBundle =
 162             ResourceBundle.getBundle(
 163                 Constants.exceptionMessagesResourceBundleBase,
 164                 new Locale(languageCode, countryCode)
 165             );
 166         alreadyInitialized = true;
 167     }
 168 }