1
22
23 package com.liferay.portlet;
24
25 import com.liferay.portal.model.Portlet;
26 import com.liferay.portal.servlet.PortletContextPool;
27 import com.liferay.portal.servlet.PortletContextWrapper;
28 import com.liferay.portal.velocity.VelocityContextPool;
29 import com.liferay.util.CollectionFactory;
30
31 import java.util.Iterator;
32 import java.util.Map;
33
34 import javax.portlet.PortletContext;
35
36 import javax.servlet.ServletContext;
37
38
44 public class PortletContextFactory {
45
46 public static PortletContext create(Portlet portlet, ServletContext ctx) {
47 return _instance._create(portlet, ctx);
48 }
49
50 public static void destroy(Portlet portlet) {
51 _instance._destroy(portlet);
52 }
53
54 private PortletContextFactory() {
55 _pool = CollectionFactory.getSyncHashMap();
56 }
57
58 private PortletContext _create(Portlet portlet, ServletContext ctx) {
59 Map portletContexts = (Map)_pool.get(portlet.getRootPortletId());
60
61 if (portletContexts == null) {
62 portletContexts = CollectionFactory.getSyncHashMap();
63
64 _pool.put(portlet.getRootPortletId(), portletContexts);
65 }
66
67 PortletContext portletContext =
68 (PortletContext)portletContexts.get(portlet.getPortletId());
69
70 if (portletContext == null) {
71 if (portlet.isWARFile()) {
72 PortletContextWrapper pcw =
73 PortletContextPool.get(portlet.getRootPortletId());
74
75
77 ctx = pcw.getServletContext();
78
79
82 }
84
85 portletContext = new PortletContextImpl(portlet, ctx);
86
87 VelocityContextPool.put(
88 portletContext.getPortletContextName(), ctx);
89
90 portletContexts.put(portlet.getPortletId(), portletContext);
91 }
92
93 return portletContext;
94 }
95
96 private void _destroy(Portlet portlet) {
97 Map portletContexts = (Map)_pool.remove(portlet.getRootPortletId());
98
99 if (portletContexts == null) {
100 return;
101 }
102
103 Iterator itr = portletContexts.entrySet().iterator();
104
105 if (itr.hasNext()) {
106 Map.Entry entry = (Map.Entry)itr.next();
107
108 PortletContext portletContext = (PortletContext)entry.getValue();
109
110 VelocityContextPool.remove(portletContext.getPortletContextName());
111 }
112 }
113
114 private static PortletContextFactory _instance =
115 new PortletContextFactory();
116
117 private Map _pool;
118
119 }