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 
  22 package com.sun.org.apache.xerces.internal.dom;
  23 import java.util.Locale;
  24 import java.util.MissingResourceException;
  25 import java.util.ResourceBundle;
  26 import jdk.xml.internal.SecuritySupport;
  27 
  28 /**
  29  * Used to format DOM error messages, using the system locale.
  30  *
  31  * @xerces.internal
  32  *
  33  * @author Sandy Gao, IBM
  34  * @LastModified: Sep 2017
  35  */
  36 public class DOMMessageFormatter {
  37     public static final String DOM_DOMAIN = "http://www.w3.org/dom/DOMTR";
  38     public static final String XML_DOMAIN = "http://www.w3.org/TR/1998/REC-xml-19980210";
  39     public static final String SERIALIZER_DOMAIN = "http://apache.org/xml/serializer";
  40 
  41     private static ResourceBundle domResourceBundle = null;
  42     private static ResourceBundle xmlResourceBundle = null;
  43     private static ResourceBundle serResourceBundle = null;
  44     private static Locale locale = null;
  45 
  46 
  47     DOMMessageFormatter(){
  48         locale = Locale.getDefault();
  49     }
  50     /**
  51      * Formats a message with the specified arguments using the given
  52      * locale information.
  53      *
  54      * @param domain    domain from which error string is to come.
  55      * @param key       The message key.
  56      * @param arguments The message replacement text arguments. The order
  57      *                  of the arguments must match that of the placeholders
  58      *                  in the actual message.
  59      *
  60      * @return          the formatted message.
  61      *
  62      * @throws MissingResourceException Thrown if the message with the
  63      *                                  specified key cannot be found.
  64      */
  65     public static String formatMessage(String domain,
  66     String key, Object[] arguments)
  67     throws MissingResourceException {
  68         ResourceBundle resourceBundle = getResourceBundle(domain);
  69         if(resourceBundle == null){
  70             init();
  71             resourceBundle = getResourceBundle(domain);
  72             if(resourceBundle == null)
  73                 throw new MissingResourceException("Unknown domain" + domain, null, key);
  74         }
  75         // format message
  76         String msg;
  77         try {
  78             msg = key + ": " + resourceBundle.getString(key);
  79             if (arguments != null) {
  80                 try {
  81                     msg = java.text.MessageFormat.format(msg, arguments);
  82                 }
  83                 catch (Exception e) {
  84                     msg = resourceBundle.getString("FormatFailed");
  85                     msg += " " + resourceBundle.getString(key);
  86                 }
  87             }
  88         } // error
  89         catch (MissingResourceException e) {
  90             msg = resourceBundle.getString("BadMessageKey");
  91             throw new MissingResourceException(key, msg, key);
  92         }
  93 
  94         // no message
  95         if (msg == null) {
  96             msg = key;
  97             if (arguments.length > 0) {
  98                 StringBuffer str = new StringBuffer(msg);
  99                 str.append('?');
 100                 for (int i = 0; i < arguments.length; i++) {
 101                     if (i > 0) {
 102                         str.append('&');
 103                     }
 104                     str.append(String.valueOf(arguments[i]));
 105                 }
 106             }
 107         }
 108 
 109         return msg;
 110     }
 111 
 112     static ResourceBundle getResourceBundle(String domain){
 113         if(domain == DOM_DOMAIN || domain.equals(DOM_DOMAIN))
 114             return domResourceBundle;
 115         else if( domain == XML_DOMAIN || domain.equals(XML_DOMAIN))
 116             return xmlResourceBundle;
 117         else if(domain == SERIALIZER_DOMAIN || domain.equals(SERIALIZER_DOMAIN))
 118             return serResourceBundle;
 119         return null;
 120     }
 121     /**
 122      * Initialize Message Formatter.
 123      */
 124     public static void init(){
 125         if (locale != null) {
 126             domResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages", locale);
 127             serResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages", locale);
 128             xmlResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
 129         }else{
 130             domResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages");
 131             serResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages");
 132             xmlResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
 133         }
 134     }
 135 
 136     /**
 137      * setLocale to be used by the formatter.
 138      * @param locale
 139      */
 140     public static void setLocale(Locale dlocale){
 141         locale = dlocale;
 142     }
 143 }
--- EOF ---