View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   /*
6    * Copyright 1999-2004 The Apache Software Foundation.
7    *
8    * Licensed under the Apache License, Version 2.0 (the "License");
9    * you may not use this file except in compliance with the License.
10   * You may obtain a copy of the License at
11   *
12   *      http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package com.sun.org.apache.xerces.internal.impl.msg;
22  
23  import com.sun.org.apache.xerces.internal.util.MessageFormatter;
24  import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
25  import java.util.Locale;
26  import java.util.MissingResourceException;
27  import java.util.ResourceBundle;
28  
29  /**
30   * XMLMessageFormatter provides error messages for the XML 1.0 Recommendation and for
31   * the Namespaces Recommendation
32   *
33   * @xerces.internal
34   *
35   * @author Eric Ye, IBM
36   * @version $Id: XMLMessageFormatter.java 3094 2012-03-21 05:50:01Z joehw $
37   *
38   */
39  public class XMLMessageFormatter implements MessageFormatter {
40      /**
41       * The domain of messages concerning the XML 1.0 specification.
42       */
43      public static final String XML_DOMAIN = "http://www.w3.org/TR/1998/REC-xml-19980210";
44      public static final String XMLNS_DOMAIN = "http://www.w3.org/TR/1999/REC-xml-names-19990114";
45  
46      // private objects to cache the locale and resource bundle
47      private Locale fLocale = null;
48      private ResourceBundle fResourceBundle = null;
49  
50      //
51      // MessageFormatter methods
52      //
53  
54      /**
55       * Formats a message with the specified arguments using the given
56       * locale information.
57       *
58       * @param locale    The locale of the message.
59       * @param key       The message key.
60       * @param arguments The message replacement text arguments. The order
61       *                  of the arguments must match that of the placeholders
62       *                  in the actual message.
63       *
64       * @return Returns the formatted message.
65       *
66       * @throws MissingResourceException Thrown if the message with the
67       *                                  specified key cannot be found.
68       */
69      public String formatMessage(Locale locale, String key, Object[] arguments)
70          throws MissingResourceException {
71  
72          if (fResourceBundle == null || locale != fLocale) {
73              if (locale != null) {
74                  fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
75                  // memorize the most-recent locale
76                  fLocale = locale;
77              }
78              if (fResourceBundle == null)
79                  fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
80          }
81  
82          // format message
83          String msg;
84          try {
85              msg = fResourceBundle.getString(key);
86              if (arguments != null) {
87                  try {
88                      msg = java.text.MessageFormat.format(msg, arguments);
89                  }
90                  catch (Exception e) {
91                      msg = fResourceBundle.getString("FormatFailed");
92                      msg += " " + fResourceBundle.getString(key);
93                  }
94              }
95          }
96  
97          // error
98          catch (MissingResourceException e) {
99              msg = fResourceBundle.getString("BadMessageKey");
100             throw new MissingResourceException(key, msg, key);
101         }
102 
103         // no message
104         if (msg == null) {
105             msg = key;
106             if (arguments.length > 0) {
107                 StringBuffer str = new StringBuffer(msg);
108                 str.append('?');
109                 for (int i = 0; i < arguments.length; i++) {
110                     if (i > 0) {
111                         str.append('&');
112                     }
113                     str.append(String.valueOf(arguments[i]));
114                 }
115             }
116         }
117 
118         return msg;
119     }
120 
121 }