001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.servlet.filters.language;
016    
017    import com.liferay.portal.kernel.language.LanguageUtil;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
021    import com.liferay.portal.kernel.servlet.PortletServlet;
022    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
023    import com.liferay.portal.kernel.util.AggregateResourceBundle;
024    import com.liferay.portal.kernel.util.HttpUtil;
025    import com.liferay.portal.kernel.util.LocaleUtil;
026    import com.liferay.portal.language.LanguageResources;
027    import com.liferay.portal.model.Portlet;
028    import com.liferay.portal.model.PortletApp;
029    import com.liferay.portal.servlet.filters.BasePortalFilter;
030    import com.liferay.portlet.PortletConfigFactoryUtil;
031    
032    import java.util.List;
033    import java.util.Locale;
034    import java.util.ResourceBundle;
035    
036    import javax.portlet.PortletConfig;
037    
038    import javax.servlet.FilterChain;
039    import javax.servlet.FilterConfig;
040    import javax.servlet.ServletContext;
041    import javax.servlet.http.HttpServletRequest;
042    import javax.servlet.http.HttpServletResponse;
043    
044    /**
045     * @author Eduardo Lundgren
046     * @author Shuyang Zhou
047     */
048    public class LanguageFilter extends BasePortalFilter {
049    
050            @Override
051            public void init(FilterConfig filterConfig) {
052                    super.init(filterConfig);
053    
054                    ServletContext servletContext = filterConfig.getServletContext();
055    
056                    PortletApp portletApp = (PortletApp)servletContext.getAttribute(
057                            PortletServlet.PORTLET_APP);
058    
059                    if ((portletApp == null) || !portletApp.isWARFile()) {
060                            return;
061                    }
062    
063                    List<Portlet> portlets = portletApp.getPortlets();
064    
065                    if (portlets.size() <= 0) {
066                            return;
067                    }
068    
069                    _portletConfig = PortletConfigFactoryUtil.create(
070                            portlets.get(0), filterConfig.getServletContext());
071            }
072    
073            @Override
074            protected void processFilter(
075                            HttpServletRequest request, HttpServletResponse response,
076                            FilterChain filterChain)
077                    throws Exception {
078    
079                    BufferCacheServletResponse bufferCacheServletResponse =
080                            new BufferCacheServletResponse(response);
081    
082                    processFilter(
083                            LanguageFilter.class.getName(), request, bufferCacheServletResponse,
084                            filterChain);
085    
086                    if (_log.isDebugEnabled()) {
087                            String completeURL = HttpUtil.getCompleteURL(request);
088    
089                            _log.debug("Translating response " + completeURL);
090                    }
091    
092                    String content = bufferCacheServletResponse.getString();
093    
094                    content = translateResponse(request, content);
095    
096                    ServletResponseUtil.write(response, content);
097            }
098    
099            protected String translateResponse(
100                    HttpServletRequest request, String content) {
101    
102                    String languageId = LanguageUtil.getLanguageId(request);
103                    Locale locale = LocaleUtil.fromLanguageId(languageId);
104    
105                    ResourceBundle resourceBundle = LanguageResources.getResourceBundle(
106                            locale);
107    
108                    if (_portletConfig != null) {
109                            resourceBundle = new AggregateResourceBundle(
110                                    _portletConfig.getResourceBundle(locale), resourceBundle);
111                    }
112    
113                    return LanguageUtil.process(resourceBundle, locale, content);
114            }
115    
116            private static final Log _log = LogFactoryUtil.getLog(LanguageFilter.class);
117    
118            private PortletConfig _portletConfig;
119    
120    }