1 /*
2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * Licensed to the Apache Software Foundation (ASF) under one or more
6  * contributor license agreements.  See the NOTICE file distributed with
7  * this work for additional information regarding copyright ownership.
8  * The ASF licenses this file to You under the Apache License, Version 2.0
9  * (the "License"); you may not use this file except in compliance with
10  * the License.  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 java.util.Locale;
25 import java.util.MissingResourceException;
26 import java.util.ResourceBundle;
27 import jdk.xml.internal.SecuritySupport;
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  *
37  * @LastModified: Sep 2017
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      */
formatMessage(Locale locale, String key, Object[] arguments)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 }
122