001
014
015 package com.liferay.portlet;
016
017 import com.liferay.portal.kernel.portlet.PortletBag;
018 import com.liferay.portal.kernel.portlet.PortletBagPool;
019 import com.liferay.portal.kernel.security.pacl.DoPrivileged;
020 import com.liferay.portal.model.Portlet;
021 import com.liferay.portal.model.PortletApp;
022 import com.liferay.portal.model.PortletConstants;
023 import com.liferay.portal.service.PortletLocalServiceUtil;
024 import com.liferay.portal.util.ClassLoaderUtil;
025
026 import java.util.Map;
027 import java.util.concurrent.ConcurrentHashMap;
028
029 import javax.portlet.PortletConfig;
030 import javax.portlet.PortletContext;
031 import javax.portlet.PortletException;
032
033 import javax.servlet.ServletContext;
034
035
039 @DoPrivileged
040 public class PortletInstanceFactoryImpl implements PortletInstanceFactory {
041
042 public PortletInstanceFactoryImpl() {
043 _pool = new ConcurrentHashMap<String, Map<String, InvokerPortlet>>();
044 }
045
046 public void clear(Portlet portlet) {
047 clear(portlet, true);
048 }
049
050 public void clear(Portlet portlet, boolean resetRemotePortletBag) {
051 String rootPortletId = portlet.getRootPortletId();
052
053 Map<String, InvokerPortlet> portletInstances = _pool.remove(
054 rootPortletId);
055
056 if (portletInstances != null) {
057 InvokerPortlet rootInvokerPortletInstance = portletInstances.remove(
058 rootPortletId);
059
060 if (rootInvokerPortletInstance != null) {
061 rootInvokerPortletInstance.destroy();
062 }
063
064 portletInstances.clear();
065 }
066
067 PortletApp portletApp = portlet.getPortletApp();
068
069 if (resetRemotePortletBag && portletApp.isWARFile()) {
070 PortletBagPool.remove(rootPortletId);
071 }
072 }
073
074 public InvokerPortlet create(Portlet portlet, ServletContext servletContext)
075 throws PortletException {
076
077 boolean instanceable = false;
078
079 boolean deployed = !portlet.isUndeployedPortlet();
080
081 if (portlet.isInstanceable() && deployed &&
082 PortletConstants.hasInstanceId(portlet.getPortletId())) {
083
084 instanceable = true;
085 }
086
087 String rootPortletId = portlet.getRootPortletId();
088
089 InvokerPortlet rootInvokerPortletInstance = null;
090
091 Map<String, InvokerPortlet> portletInstances = null;
092
093 if (deployed) {
094 portletInstances = _pool.get(rootPortletId);
095
096 if (portletInstances == null) {
097 portletInstances =
098 new ConcurrentHashMap<String, InvokerPortlet>();
099
100 _pool.put(rootPortletId, portletInstances);
101 }
102 else {
103 if (instanceable) {
104 InvokerPortlet instanceInvokerPortletInstance =
105 portletInstances.get(portlet.getPortletId());
106
107 if (instanceInvokerPortletInstance != null) {
108 return instanceInvokerPortletInstance;
109 }
110 }
111
112 rootInvokerPortletInstance = portletInstances.get(
113 rootPortletId);
114 }
115 }
116
117 if (rootInvokerPortletInstance == null) {
118 PortletBag portletBag = PortletBagPool.get(rootPortletId);
119
120
121
122
123 if (portletBag == null) {
124 PortletBagFactory portletBagFactory = new PortletBagFactory();
125
126 portletBagFactory.setClassLoader(
127 ClassLoaderUtil.getPortalClassLoader());
128 portletBagFactory.setServletContext(servletContext);
129 portletBagFactory.setWARFile(false);
130
131 try {
132 portletBag = portletBagFactory.create(portlet);
133 }
134 catch (Exception e) {
135 throw new PortletException(e);
136 }
137 }
138
139 PortletConfig portletConfig = PortletConfigFactoryUtil.create(
140 portlet, servletContext);
141
142 rootInvokerPortletInstance = init(
143 portlet, portletConfig, portletBag.getPortletInstance());
144
145 if (deployed) {
146 portletInstances.put(rootPortletId, rootInvokerPortletInstance);
147 }
148 }
149
150 if (!instanceable) {
151 return rootInvokerPortletInstance;
152 }
153
154 javax.portlet.Portlet portletInstance =
155 rootInvokerPortletInstance.getPortletInstance();
156
157 PortletConfig portletConfig = PortletConfigFactoryUtil.create(
158 portlet, servletContext);
159
160 PortletContext portletContext = portletConfig.getPortletContext();
161 boolean checkAuthToken = rootInvokerPortletInstance.isCheckAuthToken();
162 boolean facesPortlet = rootInvokerPortletInstance.isFacesPortlet();
163 boolean strutsPortlet = rootInvokerPortletInstance.isStrutsPortlet();
164 boolean strutsBridgePortlet =
165 rootInvokerPortletInstance.isStrutsBridgePortlet();
166
167 InvokerPortlet instanceInvokerPortletInstance =
168 _invokerPortletFactory.create(
169 portlet, portletInstance, portletConfig, portletContext,
170 checkAuthToken, facesPortlet, strutsPortlet,
171 strutsBridgePortlet);
172
173 if (deployed) {
174 portletInstances.put(
175 portlet.getPortletId(), instanceInvokerPortletInstance);
176 }
177
178 return instanceInvokerPortletInstance;
179 }
180
181 public void delete(Portlet portlet) {
182 if (PortletConstants.hasInstanceId(portlet.getPortletId())) {
183 Map<String, InvokerPortlet> portletInstances = _pool.get(
184 portlet.getRootPortletId());
185
186 if (portletInstances != null) {
187 portletInstances.remove(portlet.getPortletId());
188 }
189 }
190 }
191
192 public void destroy() {
193
194
195
196 }
197
198 public void destroy(Portlet portlet) {
199 clear(portlet);
200
201 PortletConfigFactoryUtil.destroy(portlet);
202 PortletContextFactory.destroy(portlet);
203
204 PortletLocalServiceUtil.destroyPortlet(portlet);
205 }
206
207 public void setInvokerPortletFactory(
208 InvokerPortletFactory invokerPortletFactory) {
209
210 _invokerPortletFactory = invokerPortletFactory;
211 }
212
213 protected InvokerPortlet init(
214 Portlet portlet, PortletConfig portletConfig,
215 javax.portlet.Portlet portletInstance)
216 throws PortletException {
217
218 PortletContext portletContext = portletConfig.getPortletContext();
219
220 InvokerPortlet invokerPortlet = _invokerPortletFactory.create(
221 portlet, portletInstance, portletContext);
222
223 invokerPortlet.init(portletConfig);
224
225 return invokerPortlet;
226 }
227
228 private InvokerPortletFactory _invokerPortletFactory;
229 private Map<String, Map<String, InvokerPortlet>> _pool;
230
231 }