001
014
015 package com.liferay.portlet;
016
017 import com.liferay.portal.kernel.util.InstanceFactory;
018 import com.liferay.portal.model.PortletApp;
019 import com.liferay.portal.model.PortletURLListener;
020
021 import java.util.Map;
022 import java.util.concurrent.ConcurrentHashMap;
023
024 import javax.portlet.PortletException;
025 import javax.portlet.PortletURLGenerationListener;
026 import javax.portlet.UnavailableException;
027
028
031 public class PortletURLListenerFactory {
032
033 public static PortletURLGenerationListener create(
034 PortletURLListener portletURLListener)
035 throws PortletException {
036
037 return _instance._create(portletURLListener);
038 }
039
040 public static void destroy(PortletURLListener portletURLListener) {
041 _instance._destroy(portletURLListener);
042 }
043
044 private PortletURLListenerFactory() {
045 _pool = new ConcurrentHashMap<>();
046 }
047
048 private PortletURLGenerationListener _create(
049 PortletURLListener portletURLListener)
050 throws PortletException {
051
052 PortletApp portletApp = portletURLListener.getPortletApp();
053
054 Map<String, PortletURLGenerationListener>
055 portletURLGenerationListeners = _pool.get(
056 portletApp.getServletContextName());
057
058 if (portletURLGenerationListeners == null) {
059 portletURLGenerationListeners = new ConcurrentHashMap<>();
060
061 _pool.put(
062 portletApp.getServletContextName(),
063 portletURLGenerationListeners);
064 }
065
066 PortletURLGenerationListener portletURLGenerationListener =
067 portletURLGenerationListeners.get(
068 portletURLListener.getListenerClass());
069
070 if (portletURLGenerationListener != null) {
071 return portletURLGenerationListener;
072 }
073
074 if (portletApp.isWARFile()) {
075 PortletContextBag portletContextBag = PortletContextBagPool.get(
076 portletApp.getServletContextName());
077
078 portletURLGenerationListener =
079 portletContextBag.getPortletURLListeners().get(
080 portletURLListener.getListenerClass());
081
082 portletURLGenerationListener = _init(
083 portletURLListener, portletURLGenerationListener);
084 }
085 else {
086 portletURLGenerationListener = _init(portletURLListener);
087 }
088
089 portletURLGenerationListeners.put(
090 portletURLListener.getListenerClass(),
091 portletURLGenerationListener);
092
093 return portletURLGenerationListener;
094 }
095
096 private void _destroy(PortletURLListener portletURLListener) {
097 PortletApp portletApp = portletURLListener.getPortletApp();
098
099 Map<String, PortletURLGenerationListener>
100 portletURLGenerationListeners = _pool.get(
101 portletApp.getServletContextName());
102
103 if (portletURLGenerationListeners == null) {
104 return;
105 }
106
107 PortletURLGenerationListener portletURLGenerationListener =
108 portletURLGenerationListeners.get(
109 portletURLListener.getListenerClass());
110
111 if (portletURLGenerationListener == null) {
112 return;
113 }
114
115 portletURLGenerationListeners.remove(
116 portletURLListener.getListenerClass());
117 }
118
119 private PortletURLGenerationListener _init(
120 PortletURLListener portletURLListener)
121 throws PortletException {
122
123 return _init(portletURLListener, null);
124 }
125
126 private PortletURLGenerationListener _init(
127 PortletURLListener portletURLListener,
128 PortletURLGenerationListener portletURLGenerationListener)
129 throws PortletException {
130
131 try {
132 if (portletURLGenerationListener == null) {
133 portletURLGenerationListener =
134 (PortletURLGenerationListener)InstanceFactory.newInstance(
135 portletURLListener.getListenerClass());
136 }
137 }
138 catch (Exception e) {
139 throw new UnavailableException(e.getMessage());
140 }
141
142 return portletURLGenerationListener;
143 }
144
145 private static final PortletURLListenerFactory _instance =
146 new PortletURLListenerFactory();
147
148 private final Map<String, Map<String, PortletURLGenerationListener>> _pool;
149
150 }