1
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
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
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 }