1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
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  /**
28   * <a href="PortletURLListenerFactory.java.html"><b><i>View Source</i></b></a>
29   *
30   * @author Brian Wing Shun Chan
31   */
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 }