1 /* 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 3 * @LastModified: Sep 2017 4 */ 5 /* 6 * Licensed to the Apache Software Foundation (ASF) under one or more 7 * contributor license agreements. See the NOTICE file distributed with 8 * this work for additional information regarding copyright ownership. 9 * The ASF licenses this file to You under the Apache License, Version 2.0 10 * (the "License"); you may not use this file except in compliance with 11 * the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 */ 21 22 23 package com.sun.org.apache.xerces.internal.dom; 24 import java.util.Locale; 25 import java.util.MissingResourceException; 26 import java.util.ResourceBundle; 27 import jdk.xml.internal.SecuritySupport; 28 29 /** 30 * Used to format DOM error messages, using the system locale. 31 * 32 * @xerces.internal 33 * 34 * @author Sandy Gao, IBM 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 }