1   /**
2    * Copyright (c) 2000-2007 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          String defaultLanguageId =
99              LocaleUtil.toLanguageId(LocaleUtil.getDefault());
100 
101         return getLocalization(xml, requestedLanguageId, defaultLanguageId);
102     }
103 
104     public static String getLocalization(
105         String xml, String requestedLanguageId, String defaultLanguageId) {
106 
107         String value = StringPool.BLANK;
108 
109         try {
110             SAXReader reader = new SAXReader();
111 
112             Document doc = reader.read(new StringReader(xml));
113 
114             Element root = doc.getRootElement();
115 
116             Iterator itr = root.elements().iterator();
117 
118             while (itr.hasNext()) {
119                 Element el = (Element)itr.next();
120 
121                 String languageId =
122                     el.attributeValue("language-id", defaultLanguageId);
123 
124                 if (languageId.equals(defaultLanguageId)) {
125                     value = el.getText();
126                 }
127 
128                 if (languageId.equals(requestedLanguageId)) {
129                     value = el.getText();
130 
131                     break;
132                 }
133             }
134         }
135         catch (Exception e) {
136             if (_log.isWarnEnabled()) {
137                 _log.warn(e);
138             }
139         }
140 
141         return value;
142     }
143 
144     public static String getPrefsValue(
145         PortletPreferences prefs, String key, String languageId) {
146 
147         String localizedKey = _getPrefsKey(key, languageId);
148 
149         String value = prefs.getValue(localizedKey, StringPool.BLANK);
150 
151         if (Validator.isNull(value)) {
152             value = prefs.getValue(key, StringPool.BLANK);
153         }
154 
155         return value;
156     }
157 
158     public static String[] getPrefsValues(
159         PortletPreferences prefs, String key, String languageId) {
160 
161         String localizedKey = _getPrefsKey(key, languageId);
162 
163         String[] values = prefs.getValues(localizedKey, new String[0]);
164 
165         if (Validator.isNull(values)) {
166             values = prefs.getValues(key, new String[0]);
167         }
168 
169         return values;
170     }
171 
172     public static String removeLocalization(
173         String xml, String key, String requestedLanguageId) {
174 
175         if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
176             xml = "<root />";
177         }
178 
179         String defaultLanguageId =
180             LocaleUtil.toLanguageId(LocaleUtil.getDefault());
181 
182         try {
183             SAXReader reader = new SAXReader();
184 
185             Document doc = reader.read(new StringReader(xml));
186 
187             Element root = doc.getRootElement();
188 
189             String availableLocales = root.attributeValue("available-locales");
190 
191             defaultLanguageId =
192                 root.attributeValue("default-locale", defaultLanguageId);
193 
194             if (availableLocales.indexOf(requestedLanguageId) != -1) {
195                 Iterator itr = root.elements().iterator();
196 
197                 while (itr.hasNext()) {
198                     Element el = (Element) itr.next();
199 
200                     String languageId =
201                         el.attributeValue("language-id", defaultLanguageId);
202 
203                     if (languageId.equals(requestedLanguageId)) {
204                         root.remove(el);
205 
206                         break;
207                     }
208                 }
209 
210                 availableLocales = StringUtil.remove(
211                     availableLocales, requestedLanguageId, StringPool.COMMA);
212 
213                 root.addAttribute("available-locales", availableLocales);
214             }
215 
216             xml = XMLFormatter.toString(doc, "  ");
217         }
218         catch (Exception e) {
219             if (_log.isWarnEnabled()) {
220                 _log.warn(e);
221             }
222         }
223 
224         return xml;
225     }
226 
227     public static void setPrefsValue(
228             PortletPreferences prefs, String key, String languageId,
229             String value)
230         throws Exception {
231 
232         prefs.setValue(_getPrefsKey(key, languageId), value);
233     }
234 
235     public static void setPrefsValues(
236             PortletPreferences prefs, String key, String languageId,
237             String[] values)
238         throws Exception {
239 
240         prefs.setValues(_getPrefsKey(key, languageId), values);
241     }
242 
243     public static String updateLocalization(
244         String xml, String key, String value) {
245 
246         String defaultLanguageId = LocaleUtil.toLanguageId(
247             LocaleUtil.getDefault());
248 
249         return updateLocalization(
250             xml, key, value, defaultLanguageId, defaultLanguageId);
251     }
252 
253     public static String updateLocalization(
254         String xml, String key, String value, String requestedLanguageId) {
255 
256         String defaultLanguageId = LocaleUtil.toLanguageId(
257             LocaleUtil.getDefault());
258 
259         return updateLocalization(
260             xml, key, value, requestedLanguageId, defaultLanguageId);
261     }
262 
263     public static String updateLocalization(
264         String xml, String key, String value, String requestedLanguageId,
265         String defaultLanguageId) {
266 
267         return updateLocalization(
268             xml, key, value, requestedLanguageId, defaultLanguageId, false);
269     }
270 
271     public static String updateLocalization(
272         String xml, String key, String value, String requestedLanguageId,
273         String defaultLanguageId, boolean cdata) {
274 
275         if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
276             xml = "<root />";
277         }
278 
279         String updatedXml = xml;
280 
281         try {
282             SAXReader reader = new SAXReader();
283 
284             Document doc = reader.read(new StringReader(xml));
285 
286             Element root = doc.getRootElement();
287 
288             String availableLocales = root.attributeValue("available-locales");
289 
290             Element localeEl = null;
291 
292             Iterator itr = root.elements().iterator();
293 
294             while (itr.hasNext()) {
295                 Element el = (Element) itr.next();
296 
297                 String languageId =
298                     el.attributeValue("language-id", defaultLanguageId);
299 
300                 if (languageId.equals(requestedLanguageId)) {
301                     localeEl = el;
302 
303                     break;
304                 }
305             }
306 
307             if (localeEl != null) {
308                 localeEl.addAttribute("language-id", requestedLanguageId);
309 
310                 if (cdata) {
311                     localeEl.clearContent();
312                     localeEl.addCDATA(value);
313                 }
314                 else {
315                     localeEl.setText(value);
316                 }
317             }
318             else {
319                 localeEl = root.addElement(key);
320 
321                 localeEl.addAttribute("language-id", requestedLanguageId);
322 
323                 if (cdata) {
324                     localeEl.addCDATA(value);
325                 }
326                 else {
327                     localeEl.setText(value);
328                 }
329 
330                 if (availableLocales == null) {
331                     availableLocales = defaultLanguageId;
332                 }
333 
334                 if (!requestedLanguageId.equals(defaultLanguageId)) {
335                     availableLocales += StringPool.COMMA + requestedLanguageId;
336                 }
337 
338                 root.addAttribute("available-locales", availableLocales);
339             }
340 
341             root.addAttribute("default-locale", defaultLanguageId);
342 
343             updatedXml = XMLFormatter.toString(doc, "  ");
344         }
345         catch (Exception e) {
346             if (_log.isWarnEnabled()) {
347                 _log.warn(e);
348             }
349         }
350 
351         return updatedXml;
352     }
353 
354     private static String _getPrefsKey(String key, String languageId) {
355         String defaultLanguageId = LocaleUtil.toLanguageId(
356             LocaleUtil.getDefault());
357 
358         if (!languageId.equals(defaultLanguageId)) {
359             key += "_" + languageId;
360         }
361 
362         return key;
363     }
364 
365     private static Log _log = LogFactoryUtil.getLog(LocalizationUtil.class);
366 
367 }