1
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
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 }