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.portlet.PortletBag;
18  import com.liferay.portal.kernel.portlet.PortletBagPool;
19  import com.liferay.portal.model.Portlet;
20  import com.liferay.portal.model.PortletApp;
21  import com.liferay.portal.model.PortletConstants;
22  import com.liferay.portal.service.PortletLocalServiceUtil;
23  
24  import java.util.Iterator;
25  import java.util.Map;
26  import java.util.concurrent.ConcurrentHashMap;
27  
28  import javax.portlet.PortletConfig;
29  import javax.portlet.PortletContext;
30  import javax.portlet.PortletException;
31  
32  import javax.servlet.ServletContext;
33  
34  /**
35   * <a href="PortletInstanceFactoryImpl.java.html"><b><i>View Source</i></b></a>
36   *
37   * @author Brian Wing Shun Chan
38   */
39  public class PortletInstanceFactoryImpl implements PortletInstanceFactory {
40  
41      public PortletInstanceFactoryImpl() {
42          _pool = new ConcurrentHashMap<String, Map<String, InvokerPortlet>>();
43      }
44  
45      public void clear(Portlet portlet) {
46          Map<String, InvokerPortlet> portletInstances = _pool.get(
47              portlet.getRootPortletId());
48  
49          if (portletInstances != null) {
50              Iterator<Map.Entry<String, InvokerPortlet>> itr =
51                  portletInstances.entrySet().iterator();
52  
53              while (itr.hasNext()) {
54                  Map.Entry<String, InvokerPortlet> entry = itr.next();
55  
56                  String portletId = entry.getKey();
57                  InvokerPortlet invokerPortletInstance = entry.getValue();
58  
59                  if (PortletConstants.getInstanceId(portletId) == null) {
60                      invokerPortletInstance.destroy();
61  
62                      break;
63                  }
64              }
65          }
66  
67          _pool.remove(portlet.getRootPortletId());
68  
69          PortletApp portletApp = portlet.getPortletApp();
70  
71          if (portletApp.isWARFile()) {
72              PortletBag portletBag = PortletBagPool.get(
73                  portlet.getRootPortletId());
74  
75              if (portletBag != null) {
76                  portletBag.setPortletInstance(null);
77              }
78          }
79      }
80  
81      public InvokerPortlet create(Portlet portlet, ServletContext servletContext)
82          throws PortletException {
83  
84          boolean instanceable = false;
85  
86          if ((portlet.isInstanceable()) &&
87              (PortletConstants.getInstanceId(portlet.getPortletId()) != null)) {
88  
89              instanceable = true;
90          }
91  
92          Map<String, InvokerPortlet> portletInstances = _pool.get(
93              portlet.getRootPortletId());
94  
95          if (portletInstances == null) {
96              portletInstances = new ConcurrentHashMap<String, InvokerPortlet>();
97  
98              _pool.put(portlet.getRootPortletId(), portletInstances);
99          }
100 
101         InvokerPortlet instanceInvokerPortletInstance = null;
102 
103         if (instanceable) {
104             instanceInvokerPortletInstance = portletInstances.get(
105                 portlet.getPortletId());
106         }
107 
108         InvokerPortlet rootInvokerPortletInstance = null;
109 
110         if (instanceInvokerPortletInstance == null) {
111             rootInvokerPortletInstance = portletInstances.get(
112                 portlet.getRootPortletId());
113 
114             if (rootInvokerPortletInstance == null) {
115                 PortletBag portletBag = PortletBagPool.get(
116                     portlet.getRootPortletId());
117 
118                 PortletConfig portletConfig = PortletConfigFactory.create(
119                     portlet, servletContext);
120 
121                 rootInvokerPortletInstance = init(
122                     portlet, portletConfig, portletBag.getPortletInstance());
123 
124                 portletInstances.put(
125                     portlet.getRootPortletId(), rootInvokerPortletInstance);
126             }
127         }
128 
129         if (instanceable) {
130             if (instanceInvokerPortletInstance == null) {
131                 javax.portlet.Portlet portletInstance =
132                     rootInvokerPortletInstance.getPortletInstance();
133 
134                 PortletConfig portletConfig =
135                     PortletConfigFactory.create(portlet, servletContext);
136 
137                 PortletContext portletContext =
138                     portletConfig.getPortletContext();
139                 boolean checkAuthToken =
140                     rootInvokerPortletInstance.isCheckAuthToken();
141                 boolean facesPortlet =
142                     rootInvokerPortletInstance.isFacesPortlet();
143                 boolean strutsPortlet =
144                     rootInvokerPortletInstance.isStrutsPortlet();
145                 boolean strutsBridgePortlet =
146                     rootInvokerPortletInstance.isStrutsBridgePortlet();
147 
148                 instanceInvokerPortletInstance =
149                     _internalInvokerPortletPrototype.create(
150                         portlet, portletInstance, portletConfig, portletContext,
151                         checkAuthToken, facesPortlet, strutsPortlet,
152                         strutsBridgePortlet);
153 
154                 portletInstances.put(
155                     portlet.getPortletId(), instanceInvokerPortletInstance);
156             }
157         }
158         else {
159             if (rootInvokerPortletInstance != null) {
160                 instanceInvokerPortletInstance = rootInvokerPortletInstance;
161             }
162         }
163 
164         return instanceInvokerPortletInstance;
165     }
166 
167     public void destroy(Portlet portlet) {
168         clear(portlet);
169 
170         PortletConfigFactory.destroy(portlet);
171         PortletContextFactory.destroy(portlet);
172 
173         PortletLocalServiceUtil.destroyPortlet(portlet);
174     }
175 
176     public void setInternalInvokerPortletPrototype(
177         InvokerPortlet internalInvokerPortletPrototype) {
178 
179         _internalInvokerPortletPrototype = internalInvokerPortletPrototype;
180     }
181 
182     protected InvokerPortlet init(
183             Portlet portlet, PortletConfig portletConfig,
184             javax.portlet.Portlet portletInstance)
185         throws PortletException {
186 
187         PortletContext portletContext = portletConfig.getPortletContext();
188 
189         InvokerPortlet invokerPortlet = _internalInvokerPortletPrototype.create(
190             portlet, portletInstance, portletContext);
191 
192         invokerPortlet.init(portletConfig);
193 
194         return invokerPortlet;
195     }
196 
197     private InvokerPortlet _internalInvokerPortletPrototype;
198     private Map<String, Map<String, InvokerPortlet>> _pool;
199 
200 }