1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portal.servlet.filters.language;
16  
17  import com.liferay.portal.kernel.language.LanguageUtil;
18  import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
19  import com.liferay.portal.kernel.servlet.PortletServlet;
20  import com.liferay.portal.kernel.util.LocaleUtil;
21  import com.liferay.portal.kernel.util.StringPool;
22  import com.liferay.portal.model.Portlet;
23  import com.liferay.portal.model.PortletApp;
24  import com.liferay.portal.servlet.filters.BasePortalFilter;
25  import com.liferay.portlet.PortletConfigFactory;
26  import com.liferay.util.servlet.filters.CacheResponse;
27  import com.liferay.util.servlet.filters.CacheResponseData;
28  import com.liferay.util.servlet.filters.CacheResponseUtil;
29  
30  import java.util.List;
31  import java.util.Locale;
32  import java.util.regex.Matcher;
33  import java.util.regex.Pattern;
34  
35  import javax.portlet.PortletConfig;
36  
37  import javax.servlet.FilterChain;
38  import javax.servlet.FilterConfig;
39  import javax.servlet.ServletContext;
40  import javax.servlet.http.HttpServletRequest;
41  import javax.servlet.http.HttpServletResponse;
42  
43  /**
44   * <a href="LanguageFilter.java.html"><b><i>View Source</i></b></a>
45   *
46   * @author Eduardo Lundgren
47   */
48  public class LanguageFilter extends BasePortalFilter {
49  
50      public void init(FilterConfig filterConfig) {
51          super.init(filterConfig);
52  
53          ServletContext servletContext = filterConfig.getServletContext();
54  
55          PortletApp portletApp = (PortletApp)servletContext.getAttribute(
56              PortletServlet.PORTLET_APP);
57  
58          if ((portletApp == null) || !portletApp.isWARFile()) {
59              return;
60          }
61  
62          List<Portlet> portlets = portletApp.getPortlets();
63  
64          if (portlets.size() <= 0) {
65              return;
66          }
67  
68          _portletConfig = PortletConfigFactory.create(
69              portlets.get(0), filterConfig.getServletContext());
70      }
71  
72      protected void processFilter(
73              HttpServletRequest request, HttpServletResponse response,
74              FilterChain filterChain)
75          throws Exception {
76  
77          CacheResponse cacheResponse = new CacheResponse(
78              response, StringPool.UTF8);
79  
80          processFilter(
81              LanguageFilter.class, request, cacheResponse, filterChain);
82  
83          byte[] bytes = translateResponse(
84              request, cacheResponse, cacheResponse.unsafeGetData(),
85              cacheResponse.getContentLength());
86  
87          CacheResponseData cacheResponseData = new CacheResponseData(
88              bytes, bytes.length, cacheResponse.getContentType(),
89              cacheResponse.getHeaders());
90  
91          CacheResponseUtil.write(response, cacheResponseData);
92      }
93  
94      protected byte[] translateResponse(
95          HttpServletRequest request, HttpServletResponse response,
96          byte[] bytes, int length) {
97  
98          String languageId = LanguageUtil.getLanguageId(request);
99          Locale locale = LocaleUtil.fromLanguageId(languageId);
100 
101         String content = new String(bytes, 0 ,length);
102 
103         Matcher matcher = _pattern.matcher(content);
104 
105         while (matcher.find()) {
106             String match = matcher.group(0);
107             String key = matcher.group(1);
108 
109             StringBuffer sb = new StringBuffer();
110 
111             sb.append(StringPool.APOSTROPHE);
112 
113             String value = null;
114 
115             if (_portletConfig != null) {
116                 value = UnicodeLanguageUtil.get(_portletConfig, locale, key);
117             }
118             else {
119                 value = UnicodeLanguageUtil.get(locale, key);
120             }
121 
122             sb.append(value);
123             sb.append(StringPool.APOSTROPHE);
124 
125             content = content.replace(match, sb.toString());
126         }
127 
128         return content.getBytes();
129     }
130 
131     private static Pattern _pattern = Pattern.compile(
132         "Liferay\\.Language\\.get\\([\"']([^)]+)[\"']\\)");
133 
134     private PortletConfig _portletConfig;
135 
136 }