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