1
14
15 package com.liferay.portlet;
16
17 import com.liferay.portal.model.PortletApp;
18 import com.liferay.portal.model.PortletURLListener;
19
20 import java.util.Map;
21 import java.util.concurrent.ConcurrentHashMap;
22
23 import javax.portlet.PortletException;
24 import javax.portlet.PortletURLGenerationListener;
25 import javax.portlet.UnavailableException;
26
27
32 public class PortletURLListenerFactory {
33
34 public static PortletURLGenerationListener create(
35 PortletURLListener portletURLListener)
36 throws PortletException {
37
38 return _instance._create(portletURLListener);
39 }
40
41 public static void destroy(PortletURLListener portletURLListener) {
42 _instance._destroy(portletURLListener);
43 }
44
45 private PortletURLListenerFactory() {
46 _pool = new ConcurrentHashMap
47 <String, Map<String, PortletURLGenerationListener>>();
48 }
49
50 private PortletURLGenerationListener _create(
51 PortletURLListener portletURLListener)
52 throws PortletException {
53
54 PortletApp portletApp = portletURLListener.getPortletApp();
55
56 Map<String, PortletURLGenerationListener>
57 portletURLGenerationListeners = _pool.get(
58 portletApp.getServletContextName());
59
60 if (portletURLGenerationListeners == null) {
61 portletURLGenerationListeners =
62 new ConcurrentHashMap<String, PortletURLGenerationListener>();
63
64 _pool.put(
65 portletApp.getServletContextName(),
66 portletURLGenerationListeners);
67 }
68
69 PortletURLGenerationListener portletURLGenerationListener =
70 portletURLGenerationListeners.get(
71 portletURLListener.getListenerClass());
72
73 if (portletURLGenerationListener == null) {
74 if (portletApp.isWARFile()) {
75 PortletContextBag portletContextBag = PortletContextBagPool.get(
76 portletApp.getServletContextName());
77
78 portletURLGenerationListener =
79 portletContextBag.getPortletURLListeners().get(
80 portletURLListener.getListenerClass());
81
82 portletURLGenerationListener = _init(
83 portletURLListener, portletURLGenerationListener);
84 }
85 else {
86 portletURLGenerationListener = _init(portletURLListener);
87 }
88
89 portletURLGenerationListeners.put(
90 portletURLListener.getListenerClass(),
91 portletURLGenerationListener);
92 }
93
94 return portletURLGenerationListener;
95 }
96
97 private void _destroy(PortletURLListener portletURLListener) {
98 PortletApp portletApp = portletURLListener.getPortletApp();
99
100 Map<String, PortletURLGenerationListener>
101 portletURLGenerationListeners = _pool.get(
102 portletApp.getServletContextName());
103
104 if (portletURLGenerationListeners == null) {
105 return;
106 }
107
108 PortletURLGenerationListener portletURLGenerationListener =
109 portletURLGenerationListeners.get(
110 portletURLListener.getListenerClass());
111
112 if (portletURLGenerationListener == null) {
113 return;
114 }
115
116 portletURLGenerationListeners.remove(
117 portletURLListener.getListenerClass());
118 }
119
120 private PortletURLGenerationListener _init(
121 PortletURLListener portletURLListener)
122 throws PortletException {
123
124 return _init(portletURLListener, null);
125 }
126
127 private PortletURLGenerationListener _init(
128 PortletURLListener portletURLListener,
129 PortletURLGenerationListener portletURLGenerationListener)
130 throws PortletException {
131
132 try {
133 if (portletURLGenerationListener == null) {
134 portletURLGenerationListener =
135 (PortletURLGenerationListener)Class.forName(
136 portletURLListener.getListenerClass()).newInstance();
137 }
138 }
139 catch (ClassNotFoundException cnofe) {
140 throw new UnavailableException(cnofe.getMessage());
141 }
142 catch (InstantiationException ie) {
143 throw new UnavailableException(ie.getMessage());
144 }
145 catch (IllegalAccessException iae) {
146 throw new UnavailableException(iae.getMessage());
147 }
148
149 return portletURLGenerationListener;
150 }
151
152 private static PortletURLListenerFactory _instance =
153 new PortletURLListenerFactory();
154
155 private Map<String, Map<String, PortletURLGenerationListener>> _pool;
156
157 }