1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.util;
24  
25  import com.liferay.portal.kernel.log.Log;
26  import com.liferay.portal.kernel.log.LogFactoryUtil;
27  import com.liferay.portal.kernel.util.LocaleUtil;
28  import com.liferay.portal.kernel.util.StringPool;
29  import com.liferay.portal.kernel.util.StringUtil;
30  import com.liferay.portal.kernel.util.Validator;
31  import com.liferay.util.xml.XMLFormatter;
32  
33  import java.io.StringReader;
34  
35  import java.util.Iterator;
36  
37  import javax.portlet.PortletPreferences;
38  
39  import org.dom4j.Document;
40  import org.dom4j.Element;
41  import org.dom4j.io.SAXReader;
42  
43  /**
44   * <a href="LocalizationUtil.java.html"><b><i>View Source</i></b></a>
45   *
46   * @author Alexander Chow
47   *
48   */
49  public class LocalizationUtil {
50  
51      public static String[] getAvailableLocales(String xml) {
52          String[] availableLocales = new String[0];
53  
54          try {
55              SAXReader reader = new SAXReader();
56  
57              Document doc = reader.read(new StringReader(xml));
58  
59              Element root = doc.getRootElement();
60  
61              availableLocales = StringUtil.split(
62                  root.attributeValue("available-locales"));
63          }
64          catch (Exception e) {
65              if (_log.isWarnEnabled()) {
66                  _log.warn(e);
67              }
68          }
69  
70          return availableLocales;
71      }
72  
73      public static String getDefaultLocale(String xml) {
74          String defaultLanguageId = LocaleUtil.toLanguageId(
75              LocaleUtil.getDefault());
76  
77          try {
78              SAXReader reader = new SAXReader();
79  
80              Document doc = reader.read(new StringReader(xml));
81  
82              Element root = doc.getRootElement();
83  
84              return root.attributeValue("default-locale", defaultLanguageId);
85          }
86          catch (Exception e) {
87              if (_log.isWarnEnabled()) {
88                  _log.warn(e);
89              }
90          }
91  
92          return defaultLanguageId;
93      }
94  
95      public static String getLocalization(
96          String xml, String requestedLanguageId) {
97  
98          return getLocalization(xml, requestedLanguageId, true);
99      }
100 
101     public static String getLocalization(
102         String xml, String requestedLanguageId, boolean useDefault) {
103 
104         String defaultLanguageId = LocaleUtil.toLanguageId(
105             LocaleUtil.getDefault());
106 
107         String value = StringPool.BLANK;
108 
109         String defaultValue = StringPool.BLANK;
110 
111         try {
112             SAXReader reader = new SAXReader();
113 
114             Document doc = reader.read(new StringReader(xml));
115 
116             Element root = doc.getRootElement();
117 
118             Iterator itr = root.elements().iterator();
119 
120             while (itr.hasNext()) {
121                 Element el = (Element)itr.next();
122 
123                 String languageId =
124                     el.attributeValue("language-id", defaultLanguageId);
125 
126                 if (languageId.equals(defaultLanguageId)) {
127                     defaultValue = el.getText();
128                 }
129 
130                 if (languageId.equals(requestedLanguageId)) {
131                     value = el.getText();
132                 }
133             }
134 
135             if (useDefault && Validator.isNull(value)) {
136                 value = defaultValue;
137             }
138         }
139         catch (Exception e) {
140             if (_log.isWarnEnabled()) {
141                 _log.warn(e);
142             }
143         }
144 
145         return value;
146     }
147 
148     public static String getPrefsValue(
149         PortletPreferences prefs, String key, String languageId) {
150 
151         return getPrefsValue(prefs, key, languageId, true);
152     }
153 
154     public static String getPrefsValue(
155         PortletPreferences prefs, String key, String languageId,
156         boolean useDefault) {
157 
158         String localizedKey = _getPrefsKey(key, languageId);
159 
160         String value = prefs.getValue(localizedKey, StringPool.BLANK);
161 
162         if (useDefault && Validator.isNull(value)) {
163             value = prefs.getValue(key, StringPool.BLANK);
164         }
165 
166         return value;
167     }
168 
169     public static String[] getPrefsValues(
170         PortletPreferences prefs, String key, String languageId) {
171 
172         return getPrefsValues(prefs, key, languageId, true);
173     }
174 
175     public static String[] getPrefsValues(
176         PortletPreferences prefs, String key, String languageId,
177         boolean useDefault) {
178 
179         String localizedKey = _getPrefsKey(key, languageId);
180 
181         String[] values = prefs.getValues(localizedKey, new String[0]);
182 
183         if (useDefault && Validator.isNull(values)) {
184             values = prefs.getValues(key, new String[0]);
185         }
186 
187         return values;
188     }
189 
190     public static String removeLocalization(
191         String xml, String key, String requestedLanguageId) {
192 
193         if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
194             xml = "<root />";
195         }
196 
197         String defaultLanguageId =
198             LocaleUtil.toLanguageId(LocaleUtil.getDefault());
199 
200         try {
201             SAXReader reader = new SAXReader();
202 
203             Document doc = reader.read(new StringReader(xml));
204 
205             Element root = doc.getRootElement();
206 
207             String availableLocales = root.attributeValue("available-locales");
208 
209             defaultLanguageId =
210                 root.attributeValue("default-locale", defaultLanguageId);
211 
212             if (availableLocales.indexOf(requestedLanguageId) != -1) {
213                 Iterator itr = root.elements().iterator();
214 
215                 while (itr.hasNext()) {
216                     Element el = (Element) itr.next();
217 
218                     String languageId =
219                         el.attributeValue("language-id", defaultLanguageId);
220 
221                     if (languageId.equals(requestedLanguageId)) {
222                         root.remove(el);
223 
224                         break;
225                     }
226                 }
227 
228                 availableLocales = StringUtil.remove(
229                     availableLocales, requestedLanguageId, StringPool.COMMA);
230 
231                 root.addAttribute("available-locales", availableLocales);
232             }
233 
234             xml = XMLFormatter.toString(doc, "  ");
235         }
236         catch (Exception e) {
237             if (_log.isWarnEnabled()) {
238                 _log.warn(e);
239             }
240         }
241 
242         return xml;
243     }
244 
245     public static void setPrefsValue(
246             PortletPreferences prefs, String key, String languageId,
247             String value)
248         throws Exception {
249 
250         prefs.setValue(_getPrefsKey(key, languageId), value);
251     }
252 
253     public static void setPrefsValues(
254             PortletPreferences prefs, String key, String languageId,
255             String[] values)
256         throws Exception {
257 
258         prefs.setValues(_getPrefsKey(key, languageId), values);
259     }
260 
261     public static String updateLocalization(
262         String xml, String key, String value) {
263 
264         String defaultLanguageId = LocaleUtil.toLanguageId(
265             LocaleUtil.getDefault());
266 
267         return updateLocalization(
268             xml, key, value, defaultLanguageId, defaultLanguageId);
269     }
270 
271     public static String updateLocalization(
272         String xml, String key, String value, String requestedLanguageId) {
273 
274         String defaultLanguageId = LocaleUtil.toLanguageId(
275             LocaleUtil.getDefault());
276 
277         return updateLocalization(
278             xml, key, value, requestedLanguageId, defaultLanguageId);
279     }
280 
281     public static String updateLocalization(
282         String xml, String key, String value, String requestedLanguageId,
283         String defaultLanguageId) {
284 
285         return updateLocalization(
286             xml, key, value, requestedLanguageId, defaultLanguageId, false);
287     }
288 
289     public static String updateLocalization(
290         String xml, String key, String value, String requestedLanguageId,
291         String defaultLanguageId, boolean cdata) {
292 
293         if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
294             xml = "<root />";
295         }
296 
297         String updatedXml = xml;
298 
299         try {
300             SAXReader reader = new SAXReader();
301 
302             Document doc = reader.read(new StringReader(xml));
303 
304             Element root = doc.getRootElement();
305 
306             String availableLocales = root.attributeValue("available-locales");
307 
308             Element localeEl = null;
309 
310             Iterator itr = root.elements().iterator();
311 
312             while (itr.hasNext()) {
313                 Element el = (Element) itr.next();
314 
315                 String languageId =
316                     el.attributeValue("language-id", defaultLanguageId);
317 
318                 if (languageId.equals(requestedLanguageId)) {
319                     localeEl = el;
320 
321                     break;
322                 }
323             }
324 
325             if (localeEl != null) {
326                 localeEl.addAttribute("language-id", requestedLanguageId);
327 
328                 if (cdata) {
329                     localeEl.clearContent();
330                     localeEl.addCDATA(value);
331                 }
332                 else {
333                     localeEl.setText(value);
334                 }
335             }
336             else {
337                 localeEl = root.addElement(key);
338 
339                 localeEl.addAttribute("language-id", requestedLanguageId);
340 
341                 if (cdata) {
342                     localeEl.addCDATA(value);
343                 }
344                 else {
345                     localeEl.setText(value);
346                 }
347 
348                 if (availableLocales == null) {
349                     availableLocales = defaultLanguageId;
350                 }
351 
352                 if (!requestedLanguageId.equals(defaultLanguageId)) {
353                     availableLocales += StringPool.COMMA + requestedLanguageId;
354                 }
355 
356                 root.addAttribute("available-locales", availableLocales);
357             }
358 
359             root.addAttribute("default-locale", defaultLanguageId);
360 
361             updatedXml = XMLFormatter.toString(doc, "  ");
362         }
363         catch (Exception e) {
364             if (_log.isWarnEnabled()) {
365                 _log.warn(e);
366             }
367         }
368 
369         return updatedXml;
370     }
371 
372     private static String _getPrefsKey(String key, String languageId) {
373         String defaultLanguageId = LocaleUtil.toLanguageId(
374             LocaleUtil.getDefault());
375 
376         if (!languageId.equals(defaultLanguageId)) {
377             key += "_" + languageId;
378         }
379 
380         return key;
381     }
382 
383     private static Log _log = LogFactoryUtil.getLog(LocalizationUtil.class);
384 
385 }