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.util;
  22 
  23 import java.util.Locale;
  24 import java.util.MissingResourceException;
  25 import java.util.ResourceBundle;
  26 import jdk.xml.internal.SecuritySupport;
  27 
  28 /**
  29  * <p>Used to format JAXP 1.3 Datatype API error messages using a specified locale.</p>
  30  *
  31  * @author  Neeraj Bajaj, Sun Microsystems
  32  * @LastModified: Sep 2017
  33  */
  34 public class DatatypeMessageFormatter {
  35 
  36     private static final String BASE_NAME = "com.sun.org.apache.xerces.internal.impl.msg.DatatypeMessages";
  37 
  38     /**
  39      * Formats a message with the specified arguments using the given
  40      * locale information.
  41      *
  42      * @param locale    The locale of the message.
  43      * @param key       The message key.
  44      * @param arguments The message replacement text arguments. The order
  45      *                  of the arguments must match that of the placeholders
  46      *                  in the actual message.
  47      *
  48      * @return          the formatted message.
  49      *
  50      * @throws MissingResourceException Thrown if the message with the
  51      *                                  specified key cannot be found.
  52      */
  53     public static String formatMessage(Locale locale,
  54         String key, Object[] arguments)
  55         throws MissingResourceException {
  56 
  57         ResourceBundle resourceBundle = null;
  58         if (locale != null) {
  59             resourceBundle =
  60                 SecuritySupport.getResourceBundle(BASE_NAME, locale);
  61         }
  62         else {
  63             resourceBundle =
  64                 SecuritySupport.getResourceBundle(BASE_NAME);
  65         }
  66 
  67         // format message
  68         String msg;
  69         try {
  70             msg = resourceBundle.getString(key);
  71             if (arguments != null) {
  72                 try {
  73                     msg = java.text.MessageFormat.format(msg, arguments);
  74                 }
  75                 catch (Exception e) {
  76                     msg = resourceBundle.getString("FormatFailed");
  77                     msg += " " + resourceBundle.getString(key);
  78                 }
  79             }
  80         }
  81 
  82         // error
  83         catch (MissingResourceException e) {
  84             msg = resourceBundle.getString("BadMessageKey");
  85             throw new MissingResourceException(key, msg, key);
  86         }
  87 
  88         // no message
  89         if (msg == null) {
  90             msg = key;
  91             if (arguments.length > 0) {
  92                 StringBuffer str = new StringBuffer(msg);
  93                 str.append('?');
  94                 for (int i = 0; i < arguments.length; i++) {
  95                     if (i > 0) {
  96                         str.append('&');
  97                     }
  98                     str.append(String.valueOf(arguments[i]));
  99                 }
 100             }
 101         }
 102         return msg;
 103     }
 104 }