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.model.PortletApp;
18  
19  import java.util.Map;
20  import java.util.concurrent.ConcurrentHashMap;
21  
22  import javax.portlet.PortletContext;
23  import javax.portlet.PortletException;
24  import javax.portlet.UnavailableException;
25  import javax.portlet.filter.FilterConfig;
26  import javax.portlet.filter.PortletFilter;
27  
28  /**
29   * <a href="PortletFilterFactory.java.html"><b><i>View Source</i></b></a>
30   *
31   * @author Brian Wing Shun Chan
32   */
33  public class PortletFilterFactory {
34  
35      public static PortletFilter create(
36              com.liferay.portal.model.PortletFilter portletFilterModel,
37              PortletContext ctx)
38          throws PortletException {
39  
40          return _instance._create(portletFilterModel, ctx);
41      }
42  
43      public static void destroy(
44          com.liferay.portal.model.PortletFilter portletFilterModel) {
45  
46          _instance._destroy(portletFilterModel);
47      }
48  
49      private PortletFilterFactory() {
50          _pool = new ConcurrentHashMap<String, Map<String, PortletFilter>>();
51      }
52  
53      private PortletFilter _create(
54              com.liferay.portal.model.PortletFilter portletFilterModel,
55              PortletContext ctx)
56          throws PortletException {
57  
58          PortletApp portletApp = portletFilterModel.getPortletApp();
59  
60          Map<String, PortletFilter> portletFilters = _pool.get(
61              portletApp.getServletContextName());
62  
63          if (portletFilters == null) {
64              portletFilters = new ConcurrentHashMap<String, PortletFilter>();
65  
66              _pool.put(portletApp.getServletContextName(), portletFilters);
67          }
68  
69          PortletFilter portletFilter = portletFilters.get(
70              portletFilterModel.getFilterName());
71  
72          if (portletFilter == null) {
73              FilterConfig filterConfig =
74                  FilterConfigFactory.create(portletFilterModel, ctx);
75  
76              if (portletApp.isWARFile()) {
77                  PortletContextBag portletContextBag = PortletContextBagPool.get(
78                      portletApp.getServletContextName());
79  
80                  portletFilter = portletContextBag.getPortletFilters().get(
81                      portletFilterModel.getFilterName());
82  
83                  portletFilter = _init(
84                      portletFilterModel, filterConfig, portletFilter);
85              }
86              else {
87                  portletFilter = _init(portletFilterModel, filterConfig);
88              }
89  
90              portletFilters.put(
91                  portletFilterModel.getFilterName(), portletFilter);
92          }
93  
94          return portletFilter;
95      }
96  
97      private void _destroy(
98          com.liferay.portal.model.PortletFilter portletFilterModel) {
99  
100         PortletApp portletApp = portletFilterModel.getPortletApp();
101 
102         Map<String, PortletFilter> portletFilters = _pool.get(
103             portletApp.getServletContextName());
104 
105         if (portletFilters == null) {
106             return;
107         }
108 
109         PortletFilter portletFilter = portletFilters.get(
110             portletFilterModel.getFilterName());
111 
112         if (portletFilter == null) {
113             return;
114         }
115 
116         portletFilter.destroy();
117 
118         portletFilters.remove(portletFilterModel.getFilterName());
119     }
120 
121     private PortletFilter _init(
122             com.liferay.portal.model.PortletFilter portletFilterModel,
123             FilterConfig filterConfig)
124         throws PortletException {
125 
126         return _init(portletFilterModel, filterConfig, null);
127     }
128 
129     private PortletFilter _init(
130             com.liferay.portal.model.PortletFilter portletFilterModel,
131             FilterConfig filterConfig, PortletFilter portletFilter)
132         throws PortletException {
133 
134         try {
135             if (portletFilter == null) {
136                 portletFilter = (PortletFilter)Class.forName(
137                     portletFilterModel.getFilterClass()).newInstance();
138             }
139 
140             portletFilter.init(filterConfig);
141         }
142         catch (ClassNotFoundException cnofe) {
143             throw new UnavailableException(cnofe.getMessage());
144         }
145         catch (InstantiationException ie) {
146             throw new UnavailableException(ie.getMessage());
147         }
148         catch (IllegalAccessException iae) {
149             throw new UnavailableException(iae.getMessage());
150         }
151 
152         return portletFilter;
153     }
154 
155     private static PortletFilterFactory _instance = new PortletFilterFactory();
156 
157     private Map<String, Map<String, PortletFilter>> _pool;
158 
159 }