001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.servlet;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.util.InstanceFactory;
020    import com.liferay.portal.kernel.util.StringUtil;
021    
022    import java.util.List;
023    import java.util.concurrent.CopyOnWriteArrayList;
024    
025    import javax.servlet.ServletContextEvent;
026    import javax.servlet.ServletContextListener;
027    import javax.servlet.ServletRequestAttributeEvent;
028    import javax.servlet.ServletRequestAttributeListener;
029    import javax.servlet.ServletRequestEvent;
030    import javax.servlet.ServletRequestListener;
031    import javax.servlet.http.HttpSessionActivationListener;
032    import javax.servlet.http.HttpSessionAttributeListener;
033    import javax.servlet.http.HttpSessionBindingEvent;
034    import javax.servlet.http.HttpSessionBindingListener;
035    import javax.servlet.http.HttpSessionEvent;
036    import javax.servlet.http.HttpSessionListener;
037    
038    /**
039     * @author Brian Wing Shun Chan
040     */
041    public class SecurePluginContextListener
042            extends PluginContextListener
043            implements HttpSessionActivationListener, HttpSessionAttributeListener,
044                               HttpSessionBindingListener, HttpSessionListener,
045                               ServletRequestAttributeListener, ServletRequestListener {
046    
047            public void attributeAdded(
048                    HttpSessionBindingEvent httpSessionBindingEvent) {
049    
050                    if (_httpSessionAttributeListeners == null) {
051                            return;
052                    }
053    
054                    for (HttpSessionAttributeListener httpSessionAttributeListener :
055                                    _httpSessionAttributeListeners) {
056    
057                            httpSessionAttributeListener.attributeAdded(
058                                    httpSessionBindingEvent);
059                    }
060            }
061    
062            public void attributeAdded(
063                    ServletRequestAttributeEvent servletRequestAttributeEvent) {
064    
065                    if (_servletRequestAttributeListeners == null) {
066                            return;
067                    }
068    
069                    for (ServletRequestAttributeListener servletRequestAttributeListener :
070                                    _servletRequestAttributeListeners) {
071    
072                            servletRequestAttributeListener.attributeAdded(
073                                    servletRequestAttributeEvent);
074                    }
075            }
076    
077            public void attributeRemoved(
078                    HttpSessionBindingEvent httpSessionBindingEvent) {
079    
080                    if (_httpSessionAttributeListeners == null) {
081                            return;
082                    }
083    
084                    for (HttpSessionAttributeListener httpSessionAttributeListener :
085                                    _httpSessionAttributeListeners) {
086    
087                            httpSessionAttributeListener.attributeRemoved(
088                                    httpSessionBindingEvent);
089                    }
090    
091            }
092    
093            public void attributeRemoved(
094                    ServletRequestAttributeEvent servletRequestAttributeEvent) {
095    
096                    if (_servletRequestAttributeListeners == null) {
097                            return;
098                    }
099    
100                    for (ServletRequestAttributeListener servletRequestAttributeListener :
101                                    _servletRequestAttributeListeners) {
102    
103                            servletRequestAttributeListener.attributeRemoved(
104                                    servletRequestAttributeEvent);
105                    }
106            }
107    
108            public void attributeReplaced(
109                    HttpSessionBindingEvent httpSessionBindingEvent) {
110    
111                    if (_httpSessionAttributeListeners == null) {
112                            return;
113                    }
114    
115                    for (HttpSessionAttributeListener httpSessionAttributeListener :
116                                    _httpSessionAttributeListeners) {
117    
118                            httpSessionAttributeListener.attributeReplaced(
119                                    httpSessionBindingEvent);
120                    }
121            }
122    
123            public void attributeReplaced(
124                    ServletRequestAttributeEvent servletRequestAttributeEvent) {
125    
126                    if (_servletRequestAttributeListeners == null) {
127                            return;
128                    }
129    
130                    for (ServletRequestAttributeListener servletRequestAttributeListener :
131                                    _servletRequestAttributeListeners) {
132    
133                            servletRequestAttributeListener.attributeReplaced(
134                                    servletRequestAttributeEvent);
135                    }
136            }
137    
138            @Override
139            public void contextInitialized(ServletContextEvent servletContextEvent) {
140                    servletContext = servletContextEvent.getServletContext();
141    
142                    servletContext.setAttribute(
143                            SecurePluginContextListener.class.getName(), this);
144    
145                    super.contextInitialized(servletContextEvent);
146            }
147    
148            public void instantiatingListeners() throws Exception {
149                    if (_servletRequestListeners != null) {
150                            return;
151                    }
152    
153                    String[] listenerClassNames = StringUtil.split(
154                            servletContext.getInitParameter("portalListenerClasses"));
155    
156                    for (String listenerClassName : listenerClassNames) {
157                            instantiatingListener(listenerClassName);
158                    }
159            }
160    
161            public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
162                    if (_servletRequestListeners == null) {
163                            return;
164                    }
165    
166                    for (ServletRequestListener servletRequestListener :
167                                    _servletRequestListeners) {
168    
169                            servletRequestListener.requestDestroyed(servletRequestEvent);
170                    }
171            }
172    
173            public void requestInitialized(ServletRequestEvent servletRequestEvent) {
174                    if (_servletRequestListeners == null) {
175                            return;
176                    }
177    
178                    for (ServletRequestListener servletRequestListener :
179                                    _servletRequestListeners) {
180    
181                            servletRequestListener.requestInitialized(servletRequestEvent);
182                    }
183            }
184    
185            public void sessionCreated(HttpSessionEvent httpSessionEvent) {
186                    if (_httpSessionListeners == null) {
187                            return;
188                    }
189    
190                    for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
191                            httpSessionListener.sessionCreated(httpSessionEvent);
192                    }
193            }
194    
195            public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
196                    if (_httpSessionListeners == null) {
197                            return;
198                    }
199    
200                    for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
201                            httpSessionListener.sessionDestroyed(httpSessionEvent);
202                    }
203            }
204    
205            public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
206                    if (_httpSessionActivationListeners == null) {
207                            return;
208                    }
209    
210                    for (HttpSessionActivationListener httpSessionActivationListener :
211                                    _httpSessionActivationListeners) {
212    
213                            httpSessionActivationListener.sessionDidActivate(httpSessionEvent);
214                    }
215            }
216    
217            public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
218                    if (_httpSessionActivationListeners == null) {
219                            return;
220                    }
221    
222                    for (HttpSessionActivationListener httpSessionActivationListener :
223                                    _httpSessionActivationListeners) {
224    
225                            httpSessionActivationListener.sessionWillPassivate(
226                                    httpSessionEvent);
227                    }
228            }
229    
230            public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
231                    if (_httpSessionBindingListeners == null) {
232                            return;
233                    }
234    
235                    for (HttpSessionBindingListener httpSessionBindingListener :
236                                    _httpSessionBindingListeners) {
237    
238                            httpSessionBindingListener.valueBound(httpSessionBindingEvent);
239                    }
240            }
241    
242            public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
243                    if (_httpSessionBindingListeners == null) {
244                            return;
245                    }
246    
247                    for (HttpSessionBindingListener httpSessionBindingListener :
248                                    _httpSessionBindingListeners) {
249    
250                            httpSessionBindingListener.valueUnbound(httpSessionBindingEvent);
251                    }
252            }
253    
254            @Override
255            protected void fireUndeployEvent() {
256                    if (_servletContextListeners != null) {
257                            ServletContextEvent servletContextEvent = new ServletContextEvent(
258                                    servletContext);
259    
260                            for (ServletContextListener servletContextListener :
261                                            _servletContextListeners) {
262    
263                                    servletContextListener.contextDestroyed(servletContextEvent);
264                            }
265                    }
266    
267                    super.fireUndeployEvent();
268            }
269    
270            protected void instantiatingListener(String listenerClassName)
271                    throws Exception {
272    
273                    if (_log.isDebugEnabled()) {
274                            _log.debug("Instantiating " + listenerClassName);
275                    }
276    
277                    Object listener = InstanceFactory.newInstance(
278                            pluginClassLoader, listenerClassName);
279    
280                    if (listener instanceof HttpSessionActivationListener) {
281                            if (_httpSessionActivationListeners == null) {
282                                    _httpSessionActivationListeners =
283                                            new CopyOnWriteArrayList<HttpSessionActivationListener>();
284                            }
285    
286                            _httpSessionActivationListeners.add(
287                                    (HttpSessionActivationListener)listener);
288                    }
289    
290                    if (listener instanceof HttpSessionAttributeListener) {
291                            if (_httpSessionAttributeListeners == null) {
292                                    _httpSessionAttributeListeners =
293                                            new CopyOnWriteArrayList<HttpSessionAttributeListener>();
294                            }
295    
296                            _httpSessionAttributeListeners.add(
297                                    (HttpSessionAttributeListener)listener);
298                    }
299    
300                    if (listener instanceof HttpSessionBindingListener) {
301                            if (_httpSessionBindingListeners == null) {
302                                    _httpSessionBindingListeners =
303                                            new CopyOnWriteArrayList<HttpSessionBindingListener>();
304                            }
305    
306                            _httpSessionBindingListeners.add(
307                                    (HttpSessionBindingListener)listener);
308                    }
309    
310                    if (listener instanceof HttpSessionListener) {
311                            if (_httpSessionListeners == null) {
312                                    _httpSessionListeners =
313                                            new CopyOnWriteArrayList<HttpSessionListener>();
314                            }
315    
316                            _httpSessionListeners.add((HttpSessionListener)listener);
317                    }
318    
319                    if (listener instanceof ServletContextListener) {
320                            if (_servletContextListeners == null) {
321                                    _servletContextListeners =
322                                            new CopyOnWriteArrayList<ServletContextListener>();
323                            }
324    
325                            ServletContextListener servletContextListener =
326                                    (ServletContextListener)listener;
327    
328                            _servletContextListeners.add(servletContextListener);
329    
330                            ServletContextEvent servletContextEvent = new ServletContextEvent(
331                                    servletContext);
332    
333                            servletContextListener.contextInitialized(servletContextEvent);
334                    }
335    
336                    if (listener instanceof ServletRequestAttributeListener) {
337                            if (_servletRequestAttributeListeners == null) {
338                                    _servletRequestAttributeListeners =
339                                            new CopyOnWriteArrayList<ServletRequestAttributeListener>();
340                            }
341    
342                            _servletRequestAttributeListeners.add(
343                                    (ServletRequestAttributeListener)listener);
344                    }
345    
346                    if (listener instanceof ServletRequestListener) {
347                            if (_servletRequestListeners == null) {
348                                    _servletRequestListeners =
349                                            new CopyOnWriteArrayList<ServletRequestListener>();
350                            }
351    
352                            _servletRequestListeners.add((ServletRequestListener)listener);
353                    }
354            }
355    
356            private static Log _log = LogFactoryUtil.getLog(
357                    SecurePluginContextListener.class);
358    
359            private List<HttpSessionActivationListener> _httpSessionActivationListeners;
360            private List<HttpSessionAttributeListener> _httpSessionAttributeListeners;
361            private List<HttpSessionBindingListener> _httpSessionBindingListeners;
362            private List<HttpSessionListener> _httpSessionListeners;
363            private List<ServletContextListener> _servletContextListeners;
364            private List<ServletRequestAttributeListener>
365                    _servletRequestAttributeListeners;
366            private List<ServletRequestListener> _servletRequestListeners;
367    
368    }