View Javadoc
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 }