1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.servlet;
16  
17  import com.liferay.portal.NoSuchLayoutException;
18  import com.liferay.portal.kernel.language.LanguageUtil;
19  import com.liferay.portal.kernel.log.Log;
20  import com.liferay.portal.kernel.log.LogFactoryUtil;
21  import com.liferay.portal.kernel.util.GetterUtil;
22  import com.liferay.portal.kernel.util.LocaleUtil;
23  import com.liferay.portal.kernel.util.StringPool;
24  import com.liferay.portal.kernel.util.Validator;
25  import com.liferay.portal.kernel.xml.Element;
26  import com.liferay.portal.util.PortalUtil;
27  import com.liferay.portal.util.WebKeys;
28  
29  import java.io.IOException;
30  
31  import java.util.Collections;
32  import java.util.HashSet;
33  import java.util.Iterator;
34  import java.util.Locale;
35  import java.util.Set;
36  
37  import javax.servlet.RequestDispatcher;
38  import javax.servlet.ServletContext;
39  import javax.servlet.ServletException;
40  import javax.servlet.http.HttpServlet;
41  import javax.servlet.http.HttpServletRequest;
42  import javax.servlet.http.HttpServletResponse;
43  
44  /**
45   * <a href="I18nServlet.java.html"><b><i>View Source</i></b></a>
46   *
47   * @author Brian Wing Shun Chan
48   */
49  public class I18nServlet extends HttpServlet {
50  
51      public static Set<String> getLanguageIds() {
52          return _languageIds;
53      }
54  
55      public static void setLanguageIds(Element root) {
56          Iterator<Element> itr = root.elements("servlet-mapping").iterator();
57  
58          while (itr.hasNext()) {
59              Element el = itr.next();
60  
61              String servletName = el.elementText("servlet-name");
62  
63              if (servletName.equals("I18n Servlet")) {
64                  String urlPattern = el.elementText("url-pattern");
65  
66                  String languageId = urlPattern.substring(
67                      0, urlPattern.lastIndexOf(StringPool.SLASH));
68  
69                  _languageIds.add(languageId);
70              }
71          }
72  
73          _languageIds = Collections.unmodifiableSet(_languageIds);
74      }
75  
76      public void service(
77              HttpServletRequest request, HttpServletResponse response)
78          throws IOException, ServletException {
79  
80          try {
81              String[] i18nData = getI18nData(request);
82  
83              if (i18nData == null) {
84                  PortalUtil.sendError(
85                      HttpServletResponse.SC_NOT_FOUND,
86                      new NoSuchLayoutException(), request, response);
87              }
88              else {
89                  String i18nLanguageId = i18nData[0];
90                  String i18nPath = i18nData[1];
91                  String redirect = i18nData[2];
92  
93                  request.setAttribute(WebKeys.I18N_LANGUAGE_ID, i18nLanguageId);
94                  request.setAttribute(WebKeys.I18N_PATH, i18nPath);
95  
96                  ServletContext servletContext = getServletContext();
97  
98                  RequestDispatcher requestDispatcher =
99                      servletContext.getRequestDispatcher(redirect);
100 
101                 requestDispatcher.forward(request, response);
102             }
103         }
104         catch (Exception e) {
105             _log.error(e, e);
106 
107             PortalUtil.sendError(
108                 HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e, request,
109                 response);
110         }
111     }
112 
113     protected String[] getI18nData(HttpServletRequest request) {
114         String path = GetterUtil.getString(request.getPathInfo());
115 
116         if (Validator.isNull(path)) {
117             return null;
118         }
119 
120         String i18nLanguageId = request.getServletPath();
121 
122         int pos = i18nLanguageId.lastIndexOf(StringPool.SLASH);
123 
124         i18nLanguageId = i18nLanguageId.substring(pos + 1);
125 
126         if (_log.isDebugEnabled()) {
127             _log.debug("Language ID " + i18nLanguageId);
128         }
129 
130         if (Validator.isNull(i18nLanguageId)) {
131             return null;
132         }
133 
134         String i18nPath = StringPool.SLASH + i18nLanguageId;
135 
136         Locale locale = LocaleUtil.fromLanguageId(i18nLanguageId);
137 
138         if (Validator.isNull(locale.getCountry())) {
139 
140             // Locales must contain the country code
141 
142             locale = LanguageUtil.getLocale(locale.getLanguage());
143 
144             i18nLanguageId = LocaleUtil.toLanguageId(locale);
145         }
146 
147         String redirect = path;
148 
149         if (_log.isDebugEnabled()) {
150             _log.debug("Redirect " + redirect);
151         }
152 
153         return new String[] {i18nLanguageId, i18nPath, redirect};
154     }
155 
156     private static Log _log = LogFactoryUtil.getLog(I18nServlet.class);
157 
158     private static Set<String> _languageIds = new HashSet<String>();
159 
160 }