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.portlet;
016    
017    import com.liferay.portal.kernel.model.PortletApp;
018    import com.liferay.portal.kernel.util.InstanceFactory;
019    
020    import java.util.Map;
021    import java.util.concurrent.ConcurrentHashMap;
022    
023    import javax.portlet.PortletContext;
024    import javax.portlet.PortletException;
025    import javax.portlet.UnavailableException;
026    import javax.portlet.filter.FilterConfig;
027    import javax.portlet.filter.PortletFilter;
028    
029    /**
030     * @author Brian Wing Shun Chan
031     */
032    public class PortletFilterFactory {
033    
034            public static PortletFilter create(
035                            com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
036                            PortletContext ctx)
037                    throws PortletException {
038    
039                    return _instance._create(portletFilterModel, ctx);
040            }
041    
042            public static void destroy(
043                    com.liferay.portal.kernel.model.PortletFilter portletFilterModel) {
044    
045                    _instance._destroy(portletFilterModel);
046            }
047    
048            private PortletFilterFactory() {
049                    _portletFilters = new ConcurrentHashMap<>();
050            }
051    
052            private PortletFilter _create(
053                            com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
054                            PortletContext portletContext)
055                    throws PortletException {
056    
057                    PortletApp portletApp = portletFilterModel.getPortletApp();
058    
059                    Map<String, PortletFilter> portletFilters = _portletFilters.get(
060                            portletApp.getServletContextName());
061    
062                    if (portletFilters == null) {
063                            portletFilters = new ConcurrentHashMap<>();
064    
065                            _portletFilters.put(
066                                    portletApp.getServletContextName(), portletFilters);
067                    }
068    
069                    PortletFilter portletFilter = portletFilters.get(
070                            portletFilterModel.getFilterName());
071    
072                    if (portletFilter != null) {
073                            return portletFilter;
074                    }
075    
076                    FilterConfig filterConfig = FilterConfigFactory.create(
077                            portletFilterModel, portletContext);
078    
079                    if (portletApp.isWARFile()) {
080                            PortletContextBag portletContextBag = PortletContextBagPool.get(
081                                    portletApp.getServletContextName());
082    
083                            Map<String, PortletFilter> curPortletFilters =
084                                    portletContextBag.getPortletFilters();
085    
086                            portletFilter = curPortletFilters.get(
087                                    portletFilterModel.getFilterName());
088    
089                            portletFilter = _init(
090                                    portletFilterModel, filterConfig, portletFilter);
091                    }
092                    else {
093                            portletFilter = _init(portletFilterModel, filterConfig);
094                    }
095    
096                    portletFilters.put(portletFilterModel.getFilterName(), portletFilter);
097    
098                    return portletFilter;
099            }
100    
101            private void _destroy(
102                    com.liferay.portal.kernel.model.PortletFilter portletFilterModel) {
103    
104                    PortletApp portletApp = portletFilterModel.getPortletApp();
105    
106                    Map<String, PortletFilter> portletFilters = _portletFilters.get(
107                            portletApp.getServletContextName());
108    
109                    if (portletFilters == null) {
110                            return;
111                    }
112    
113                    PortletFilter portletFilter = portletFilters.get(
114                            portletFilterModel.getFilterName());
115    
116                    if (portletFilter == null) {
117                            return;
118                    }
119    
120                    portletFilter.destroy();
121    
122                    portletFilters.remove(portletFilterModel.getFilterName());
123    
124                    FilterConfigFactory.destroy(portletFilterModel);
125            }
126    
127            private PortletFilter _init(
128                            com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
129                            FilterConfig filterConfig)
130                    throws PortletException {
131    
132                    return _init(portletFilterModel, filterConfig, null);
133            }
134    
135            private PortletFilter _init(
136                            com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
137                            FilterConfig filterConfig, PortletFilter portletFilter)
138                    throws PortletException {
139    
140                    try {
141                            if (portletFilter == null) {
142                                    portletFilter = (PortletFilter)InstanceFactory.newInstance(
143                                            portletFilterModel.getFilterClass());
144                            }
145    
146                            portletFilter.init(filterConfig);
147                    }
148                    catch (PortletException pe) {
149                            throw pe;
150                    }
151                    catch (Exception e) {
152                            throw new UnavailableException(e.getMessage());
153                    }
154    
155                    return portletFilter;
156            }
157    
158            private static final PortletFilterFactory _instance =
159                    new PortletFilterFactory();
160    
161            private final Map<String, Map<String, PortletFilter>> _portletFilters;
162    
163    }