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(
106 i18nLanguageId, true, false);
107
108 HttpSession session = request.getSession();
109
110 session.setAttribute(Globals.LOCALE_KEY, locale);
111
112 LanguageUtil.updateCookie(request, response, locale);
113
114 ServletContext servletContext = getServletContext();
115
116 RequestDispatcher requestDispatcher =
117 servletContext.getRequestDispatcher(redirect);
118
119 requestDispatcher.forward(request, response);
120 }
121 }
122 catch (Exception e) {
123 _log.error(e, e);
124
125 PortalUtil.sendError(
126 HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e, request,
127 response);
128 }
129 }
130
131 protected String[] getI18nData(HttpServletRequest request) {
132 String path = GetterUtil.getString(request.getPathInfo());
133
134 if (Validator.isNull(path)) {
135 return null;
136 }
137
138 String i18nLanguageId = request.getServletPath();
139
140 int pos = i18nLanguageId.lastIndexOf(CharPool.SLASH);
141
142 i18nLanguageId = i18nLanguageId.substring(pos + 1);
143
144 if (_log.isDebugEnabled()) {
145 _log.debug("Language ID " + i18nLanguageId);
146 }
147
148 if (Validator.isNull(i18nLanguageId)) {
149 return null;
150 }
151
152 String i18nPath = StringPool.SLASH + i18nLanguageId;
153
154 Locale locale = LocaleUtil.fromLanguageId(i18nLanguageId, true, false);
155
156 String i18nLanguageCode = i18nLanguageId;
157
158 if ((locale == null) || Validator.isNull(locale.getCountry())) {
159
160
161
162 locale = LanguageUtil.getLocale(i18nLanguageCode);
163 }
164
165 if (locale != null) {
166 i18nLanguageId = LocaleUtil.toLanguageId(locale);
167 i18nLanguageCode = locale.getLanguage();
168 }
169
170 if (!PropsValues.LOCALE_USE_DEFAULT_IF_NOT_AVAILABLE &&
171 !LanguageUtil.isAvailableLocale(i18nLanguageId)) {
172
173 return null;
174 }
175
176 String redirect = path;
177
178 if (_log.isDebugEnabled()) {
179 _log.debug("Redirect " + redirect);
180 }
181
182 return new String[] {
183 i18nLanguageId, i18nPath, redirect, i18nLanguageCode
184 };
185 }
186
187 private static Log _log = LogFactoryUtil.getLog(I18nServlet.class);
188
189 private static Set<String> _languageIds;
190
191 }