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.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         FilterConfigFactory.destroy(portletFilterModel);
127     }
128 
129     private PortletFilter _init(
130             com.liferay.portal.model.PortletFilter portletFilterModel,
131             FilterConfig filterConfig)
132         throws PortletException {
133 
134         return _init(portletFilterModel, filterConfig, null);
135     }
136 
137     private PortletFilter _init(
138             com.liferay.portal.model.PortletFilter portletFilterModel,
139             FilterConfig filterConfig, PortletFilter portletFilter)
140         throws PortletException {
141 
142         try {
143             if (portletFilter == null) {
144                 portletFilter = (PortletFilter)InstanceFactory.newInstance(
145                     portletFilterModel.getFilterClass());
146             }
147 
148             portletFilter.init(filterConfig);
149         }
150         catch (PortletException pe) {
151             throw pe;
152         }
153         catch (Exception e) {
154             throw new UnavailableException(e.getMessage());
155         }
156 
157         return portletFilter;
158     }
159 
160     private static PortletFilterFactory _instance = new PortletFilterFactory();
161 
162     private Map<String, Map<String, PortletFilter>> _portletFilters;
163 
164 }