1
22
23 package com.liferay.portlet;
24
25 import com.liferay.portal.kernel.util.StringMaker;
26 import com.liferay.portal.kernel.util.StringPool;
27 import com.liferay.portal.model.Portlet;
28 import com.liferay.portal.servlet.PortletContextPool;
29 import com.liferay.portal.servlet.PortletContextWrapper;
30 import com.liferay.util.CollectionFactory;
31
32 import java.util.Iterator;
33 import java.util.Map;
34
35 import javax.portlet.PortletConfig;
36 import javax.portlet.PortletException;
37 import javax.portlet.UnavailableException;
38
39 import javax.servlet.ServletContext;
40
41
47 public class PortletInstanceFactory {
48
49 public static CachePortlet create(Portlet portlet, ServletContext ctx)
50 throws PortletException {
51
52 return _instance._create(portlet, ctx);
53 }
54
55 public static void destroy(Portlet portlet) {
56 _instance._destroy(portlet);
57 }
58
59 private PortletInstanceFactory() {
60 _pool = CollectionFactory.getSyncHashMap();
61 }
62
63 private CachePortlet _create(Portlet portlet, ServletContext ctx)
64 throws PortletException {
65
66 String poolId = PortletInstanceFactory.class.getName();
67
68 if (!portlet.isWARFile()) {
69 StringMaker sm = new StringMaker();
70
71 sm.append(poolId);
72 sm.append(StringPool.PERIOD);
73 sm.append(portlet.getCompanyId());
74
75 poolId = sm.toString();
76 }
77
78 Map map = (Map)_pool.get(poolId);
79
80 if (map == null) {
81 map = CollectionFactory.getSyncHashMap();
82
83 _pool.put(poolId, map);
84 }
85
86 Map portletInstances = (Map)map.get(portlet.getRootPortletId());
87
88 if (portletInstances == null) {
89 portletInstances = CollectionFactory.getSyncHashMap();
90
91 map.put(portlet.getRootPortletId(), portletInstances);
92 }
93
94 CachePortlet portletInstance =
95 (CachePortlet)portletInstances.get(portlet.getPortletId());
96
97 if (portletInstance == null) {
98 PortletConfig portletConfig =
99 PortletConfigFactory.create(portlet, ctx);
100
101 if (portlet.isWARFile()) {
102 PortletContextWrapper pcw =
103 PortletContextPool.get(portlet.getRootPortletId());
104
105 portletInstance = _init(
106 portlet, portletConfig, pcw.getPortletInstance());
107 }
108 else {
109 portletInstance = _init(portlet, portletConfig);
110 }
111
112 portletInstances.put(portlet.getPortletId(), portletInstance);
113 }
114
115 return portletInstance;
116 }
117
118 private void _destroy(Portlet portlet) {
119 String poolId = PortletInstanceFactory.class.getName();
120
121 if (!portlet.isWARFile()) {
122 StringMaker sm = new StringMaker();
123
124 sm.append(poolId);
125 sm.append(StringPool.PERIOD);
126 sm.append(portlet.getCompanyId());
127
128 poolId = sm.toString();
129 }
130
131 Map map = (Map)_pool.get(poolId);
132
133 if (map == null) {
134 return;
135 }
136
137 Map portletInstances = (Map)map.get(portlet.getRootPortletId());
138
139 if (portletInstances == null) {
140 return;
141 }
142
143 Iterator itr = portletInstances.entrySet().iterator();
144
145 while (itr.hasNext()) {
146 Map.Entry entry = (Map.Entry)itr.next();
147
148 CachePortlet portletInstance = (CachePortlet)entry.getValue();
149
150 portletInstance.destroy();
151 }
152
153 map.remove(portlet.getRootPortletId());
154
155 if (portlet.isWARFile()) {
156 PortletContextWrapper pcw =
157 (PortletContextWrapper)PortletContextPool.get(
158 portlet.getRootPortletId());
159
160 pcw.removePortletInstance();
161 }
162
163 PortletConfigFactory.destroy(portlet);
164 PortletContextFactory.destroy(portlet);
165 }
166
167 private CachePortlet _init(Portlet portlet, PortletConfig portletConfig)
168 throws PortletException {
169
170 return _init(portlet, portletConfig, null);
171 }
172
173 private synchronized CachePortlet _init(
174 Portlet portlet, PortletConfig portletConfig,
175 javax.portlet.Portlet portletInstance)
176 throws PortletException {
177
178 CachePortlet cachePortlet = null;
179
180 try {
181 if (portletInstance == null) {
182 portletInstance = (javax.portlet.Portlet)
183 Class.forName(portlet.getPortletClass()).newInstance();
184 }
185
186 cachePortlet = new CachePortlet(
187 portletInstance, portletConfig.getPortletContext(),
188 portlet.getExpCache());
189
190 cachePortlet.init(portletConfig);
191 }
192 catch (ClassNotFoundException cnofe) {
193 throw new UnavailableException(cnofe.getMessage());
194 }
195 catch (InstantiationException ie) {
196 throw new UnavailableException(ie.getMessage());
197 }
198 catch (IllegalAccessException iae) {
199 throw new UnavailableException(iae.getMessage());
200 }
201
202 return cachePortlet;
203 }
204
205 private static PortletInstanceFactory _instance =
206 new PortletInstanceFactory();
207
208 private Map _pool;
209
210 }