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