001
014
015 package com.liferay.portal.servlet;
016
017 import com.liferay.portal.NoSuchLayoutException;
018 import com.liferay.portal.kernel.language.LanguageUtil;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.util.CharPool;
022 import com.liferay.portal.kernel.util.GetterUtil;
023 import com.liferay.portal.kernel.util.LocaleUtil;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.Validator;
026 import com.liferay.portal.kernel.xml.Element;
027 import com.liferay.portal.util.PortalUtil;
028 import com.liferay.portal.util.PropsValues;
029 import com.liferay.portal.util.WebKeys;
030
031 import java.io.IOException;
032
033 import java.util.Collections;
034 import java.util.HashSet;
035 import java.util.List;
036 import java.util.Locale;
037 import java.util.Set;
038
039 import javax.servlet.RequestDispatcher;
040 import javax.servlet.ServletContext;
041 import javax.servlet.ServletException;
042 import javax.servlet.http.HttpServlet;
043 import javax.servlet.http.HttpServletRequest;
044 import javax.servlet.http.HttpServletResponse;
045 import javax.servlet.http.HttpSession;
046
047 import org.apache.struts.Globals;
048
049
052 public class I18nServlet extends HttpServlet {
053
054 public static Set<String> getLanguageIds() {
055 return _languageIds;
056 }
057
058 public static void setLanguageIds(Element root) {
059 _languageIds = new HashSet<String>();
060
061 List<Element> rootElements = root.elements("servlet-mapping");
062
063 for (Element element : rootElements) {
064 String servletName = element.elementText("servlet-name");
065
066 if (servletName.equals("I18n Servlet")) {
067 String urlPattern = element.elementText("url-pattern");
068
069 String languageId = urlPattern.substring(
070 0, urlPattern.lastIndexOf(CharPool.SLASH));
071
072 _languageIds.add(languageId);
073 }
074 }
075
076 _languageIds = Collections.unmodifiableSet(_languageIds);
077 }
078
079 @Override
080 public void service(
081 HttpServletRequest request, HttpServletResponse response)
082 throws IOException, ServletException {
083
084 try {
085 String[] i18nData = getI18nData(request);
086
087 if ((i18nData == null) ||
088 !PortalUtil.isValidResourceId(i18nData[2])) {
089
090 PortalUtil.sendError(
091 HttpServletResponse.SC_NOT_FOUND,
092 new NoSuchLayoutException(), request, response);
093 }
094 else {
095 String i18nLanguageId = i18nData[0];
096 String i18nPath = i18nData[1];
097 String redirect = i18nData[2];
098 String i18nLanguageCode = i18nData[3];
099
100 request.setAttribute(
101 WebKeys.I18N_LANGUAGE_CODE, i18nLanguageCode);
102 request.setAttribute(WebKeys.I18N_LANGUAGE_ID, i18nLanguageId);
103 request.setAttribute(WebKeys.I18N_PATH, i18nPath);
104
105 Locale locale = LocaleUtil.fromLanguageId(i18nLanguageId);
106
107 HttpSession session = request.getSession();
108
109 session.setAttribute(Globals.LOCALE_KEY, locale);
110
111 LanguageUtil.updateCookie(request, response, locale);
112
113 ServletContext servletContext = getServletContext();
114
115 RequestDispatcher requestDispatcher =
116 servletContext.getRequestDispatcher(redirect);
117
118 requestDispatcher.forward(request, response);
119 }
120 }
121 catch (Exception e) {
122 _log.error(e, e);
123
124 PortalUtil.sendError(
125 HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e, request,
126 response);
127 }
128 }
129
130 protected String[] getI18nData(HttpServletRequest request) {
131 String path = GetterUtil.getString(request.getPathInfo());
132
133 if (Validator.isNull(path)) {
134 return null;
135 }
136
137 String i18nLanguageId = request.getServletPath();
138
139 int pos = i18nLanguageId.lastIndexOf(CharPool.SLASH);
140
141 i18nLanguageId = i18nLanguageId.substring(pos + 1);
142
143 if (_log.isDebugEnabled()) {
144 _log.debug("Language ID " + i18nLanguageId);
145 }
146
147 if (Validator.isNull(i18nLanguageId)) {
148 return null;
149 }
150
151 Locale locale = LocaleUtil.fromLanguageId(i18nLanguageId);
152
153 String i18nLanguageCode = locale.getLanguage();
154
155 if (Validator.isNull(locale.getCountry())) {
156
157
158
159 locale = LanguageUtil.getLocale(i18nLanguageCode);
160
161 i18nLanguageId = LocaleUtil.toLanguageId(locale);
162 }
163
164 if (!PropsValues.LOCALE_USE_DEFAULT_IF_NOT_AVAILABLE &&
165 !LanguageUtil.isAvailableLocale(i18nLanguageId)) {
166
167 return null;
168 }
169
170 String redirect = path;
171
172 if (_log.isDebugEnabled()) {
173 _log.debug("Redirect " + redirect);
174 }
175
176 String i18nPath = StringPool.SLASH + i18nLanguageId;
177
178 return new String[] {
179 i18nLanguageId, i18nPath, redirect, i18nLanguageCode
180 };
181 }
182
183 private static Log _log = LogFactoryUtil.getLog(I18nServlet.class);
184
185 private static Set<String> _languageIds;
186
187 }