1 /*
2 * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway
3 * Copyright (C) 2009 Mickael Guessant
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19 package davmail;
20
21 import davmail.exception.DavMailException;
22
23 import java.io.Serializable;
24 import java.text.MessageFormat;
25 import java.util.ArrayList;
26 import java.util.Locale;
27 import java.util.ResourceBundle;
28
29 /**
30 * Internationalization message.
31 */
32 public class BundleMessage implements Serializable {
33 /**
34 * Root locale to get english messages for logging.
35 */
36 public static final Locale ROOT_LOCALE = Locale.ROOT;
37 protected static final String MESSAGE_BUNDLE_NAME = "davmailmessages";
38 protected final String key;
39 private final Object[] arguments;
40
41 /**
42 * Internationalization message.
43 *
44 * @param key message key in resource bundle
45 * @param arguments message values
46 */
47 public BundleMessage(String key, Object... arguments) {
48 this.key = key;
49 this.arguments = arguments;
50 }
51
52
53 /**
54 * Format message with the default locale.
55 *
56 * @return formatted message
57 */
58 public String format() {
59 return format(null);
60 }
61
62 /**
63 * Format message with the given locale.
64 *
65 * @param locale resource bundle locale
66 * @return formatted message
67 */
68 public String format(Locale locale) {
69 return BundleMessage.format(locale, key, arguments);
70 }
71
72 /**
73 * Format message for logging (with the root locale).
74 * Log file should remain in english
75 *
76 * @return log formatted message
77 */
78 public String formatLog() {
79 return format(ROOT_LOCALE);
80 }
81
82 /**
83 * Format message for logging (with the root locale).
84 * Log file should remain in english
85 *
86 * @return log formatted message
87 */
88 @Override
89 public String toString() {
90 return formatLog();
91 }
92
93 /**
94 * Get bundle for the given locale.
95 * Load the properties file for the given locale in a resource bundle
96 *
97 * @param locale resource bundle locale
98 * @return resource bundle
99 */
100 protected static ResourceBundle getBundle(Locale locale) {
101 if (locale == null) {
102 return ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME);
103 } else {
104 return ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME, locale);
105 }
106 }
107
108 /**
109 * Get formatted message for message key and values with the default locale.
110 *
111 * @param key message key in resource bundle
112 * @param arguments message values
113 * @return formatted message
114 */
115 public static String format(String key, Object... arguments) {
116 return format(null, key, arguments);
117 }
118
119 /**
120 * Get formatted message for message key and values with the given locale.
121 *
122 * @param locale resource bundle locale
123 * @param key message key in resource bundle
124 * @param arguments message values
125 * @return formatted message
126 */
127 public static String format(Locale locale, String key, Object... arguments) {
128 Object[] formattedArguments = null;
129 if (arguments != null) {
130 formattedArguments = new Object[arguments.length];
131 for (int i = 0; i < arguments.length; i++) {
132 if (arguments[i] instanceof BundleMessage) {
133 formattedArguments[i] = ((BundleMessage) arguments[i]).format(locale);
134 } else if (arguments[i] instanceof BundleMessageList) {
135 StringBuilder buffer = new StringBuilder();
136 for (BundleMessage bundleMessage : (BundleMessageList) arguments[i]) {
137 buffer.append(bundleMessage.format(locale));
138 }
139 formattedArguments[i] = buffer.toString();
140 } else if (arguments[i] instanceof DavMailException) {
141 formattedArguments[i] = ((DavMailException) arguments[i]).getMessage(locale);
142 } else if (arguments[i] instanceof Throwable) {
143 formattedArguments[i] = ((Throwable) arguments[i]).getMessage();
144 if (formattedArguments[i] == null) {
145 formattedArguments[i] = arguments[i].toString();
146 }
147 } else {
148 formattedArguments[i] = arguments[i];
149 }
150 }
151 }
152 return MessageFormat.format(getBundle(locale).getString(key), formattedArguments);
153 }
154
155 /**
156 * Get formatted log message for message key and values.
157 * Use the root locale
158 *
159 * @param key message key in resource bundle
160 * @param arguments message values
161 * @return formatted message
162 */
163 public static String formatLog(String key, Object... arguments) {
164 return format(ROOT_LOCALE, key, arguments);
165 }
166
167 /**
168 * Get formatted error message for bundle message and exception for logging.
169 * Use the root locale
170 *
171 * @param message bundle message
172 * @param e exception
173 * @return formatted message
174 */
175 public static String getExceptionLogMessage(BundleMessage message, Exception e) {
176 return getExceptionMessage(message, e, ROOT_LOCALE);
177 }
178
179 /**
180 * Get formatted error message for bundle message and exception with default locale.
181 *
182 * @param message bundle message
183 * @param e exception
184 * @return formatted message
185 */
186 public static String getExceptionMessage(BundleMessage message, Exception e) {
187 return getExceptionMessage(message, e, null);
188 }
189
190 /**
191 * Get formatted error message for bundle message and exception with given locale.
192 *
193 * @param message bundle message
194 * @param e exception
195 * @param locale bundle locale
196 * @return formatted message
197 */
198 public static String getExceptionMessage(BundleMessage message, Exception e, Locale locale) {
199 StringBuilder buffer = new StringBuilder();
200 if (message != null) {
201 buffer.append(message.format(locale)).append(' ');
202 }
203 if (e instanceof DavMailException) {
204 buffer.append(((DavMailException) e).getMessage(locale));
205 } else if (e.getMessage() != null) {
206 buffer.append(e.getMessage());
207 } else {
208 buffer.append(e);
209 }
210 return buffer.toString();
211 }
212
213 /**
214 * Typed bundle message collection
215 */
216 public static class BundleMessageList extends ArrayList<BundleMessage> {
217 }
218 }