1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet;
16  
17  import com.liferay.portal.kernel.util.InstanceFactory;
18  import com.liferay.portal.model.PortletApp;
19  
20  import java.util.Map;
21  import java.util.concurrent.ConcurrentHashMap;
22  
23  import javax.portlet.PortletContext;
24  import javax.portlet.PortletException;
25  import javax.portlet.UnavailableException;
26  import javax.portlet.filter.FilterConfig;
27  import javax.portlet.filter.PortletFilter;
28  
29  /**
30   * <a href="PortletFilterFactory.java.html"><b><i>View Source</i></b></a>
31   *
32   * @author Brian Wing Shun Chan
33   */
34  public class PortletFilterFactory {
35  
36      public static PortletFilter create(
37              com.liferay.portal.model.PortletFilter portletFilterModel,
38              PortletContext ctx)
39          throws PortletException {
40  
41          return _instance._create(portletFilterModel, ctx);
42      }
43  
44      public static void destroy(
45          com.liferay.portal.model.PortletFilter portletFilterModel) {
46  
47          _instance._destroy(portletFilterModel);
48      }
49  
50      private PortletFilterFactory() {
51          _portletFilters =
52              new ConcurrentHashMap<String, Map<String, PortletFilter>>();
53      }
54  
55      private PortletFilter _create(
56              com.liferay.portal.model.PortletFilter portletFilterModel,
57              PortletContext portletContext)
58          throws PortletException {
59  
60          PortletApp portletApp = portletFilterModel.getPortletApp();
61  
62          Map<String, PortletFilter> portletFilters = _portletFilters.get(
63              portletApp.getServletContextName());
64  
65          if (portletFilters == null) {
66              portletFilters = new ConcurrentHashMap<String, PortletFilter>();
67  
68              _portletFilters.put(
69                  portletApp.getServletContextName(), portletFilters);
70          }
71  
72          PortletFilter portletFilter = portletFilters.get(
73              portletFilterModel.getFilterName());
74  
75          if (portletFilter == null) {
76              FilterConfig filterConfig = FilterConfigFactory.create(
77                  portletFilterModel, portletContext);
78  
79              if (portletApp.isWARFile()) {
80                  PortletContextBag portletContextBag = PortletContextBagPool.get(
81                      portletApp.getServletContextName());
82  
83                  Map<String, PortletFilter> curPortletFilters =
84                      portletContextBag.getPortletFilters();
85  
86                  portletFilter = curPortletFilters.get(
87                      portletFilterModel.getFilterName());
88  
89                  portletFilter = _init(
90                      portletFilterModel, filterConfig, portletFilter);
91              }
92              else {
93                  portletFilter = _init(portletFilterModel, filterConfig);
94              }
95  
96              portletFilters.put(
97                  portletFilterModel.getFilterName(), portletFilter);
98          }
99  
100         return portletFilter;
101     }
102 
103     private void _destroy(
104         com.liferay.portal.model.PortletFilter portletFilterModel) {
105 
106         PortletApp portletApp = portletFilterModel.getPortletApp();
107 
108         Map<String, PortletFilter> portletFilters = _portletFilters.get(
109             portletApp.getServletContextName());
110 
111         if (portletFilters == null) {
112             return;
113         }
114 
115         PortletFilter portletFilter = portletFilters.get(
116             portletFilterModel.getFilterName());
117 
118         if (portletFilter == null) {
119             return;
120         }
121 
122         portletFilter.destroy();
123 
124         portletFilters.remove(portletFilterModel.getFilterName());
125     }
126 
127     private PortletFilter _init(
128             com.liferay.portal.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.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 PortletFilterFactory _instance = new PortletFilterFactory();
159 
160     private Map<String, Map<String, PortletFilter>> _portletFilters;
161 
162 }