001    /**
002     * Copyright (c) 2000-2013 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            @Override
048            public void attributeAdded(
049                    HttpSessionBindingEvent httpSessionBindingEvent) {
050    
051                    if (_httpSessionAttributeListeners == null) {
052                            return;
053                    }
054    
055                    for (HttpSessionAttributeListener httpSessionAttributeListener :
056                                    _httpSessionAttributeListeners) {
057    
058                            httpSessionAttributeListener.attributeAdded(
059                                    httpSessionBindingEvent);
060                    }
061            }
062    
063            @Override
064            public void attributeAdded(
065                    ServletRequestAttributeEvent servletRequestAttributeEvent) {
066    
067                    if (_servletRequestAttributeListeners == null) {
068                            return;
069                    }
070    
071                    for (ServletRequestAttributeListener servletRequestAttributeListener :
072                                    _servletRequestAttributeListeners) {
073    
074                            servletRequestAttributeListener.attributeAdded(
075                                    servletRequestAttributeEvent);
076                    }
077            }
078    
079            @Override
080            public void attributeRemoved(
081                    HttpSessionBindingEvent httpSessionBindingEvent) {
082    
083                    if (_httpSessionAttributeListeners == null) {
084                            return;
085                    }
086    
087                    for (HttpSessionAttributeListener httpSessionAttributeListener :
088                                    _httpSessionAttributeListeners) {
089    
090                            httpSessionAttributeListener.attributeRemoved(
091                                    httpSessionBindingEvent);
092                    }
093            }
094    
095            @Override
096            public void attributeRemoved(
097                    ServletRequestAttributeEvent servletRequestAttributeEvent) {
098    
099                    if (_servletRequestAttributeListeners == null) {
100                            return;
101                    }
102    
103                    for (ServletRequestAttributeListener servletRequestAttributeListener :
104                                    _servletRequestAttributeListeners) {
105    
106                            servletRequestAttributeListener.attributeRemoved(
107                                    servletRequestAttributeEvent);
108                    }
109            }
110    
111            @Override
112            public void attributeReplaced(
113                    HttpSessionBindingEvent httpSessionBindingEvent) {
114    
115                    if (_httpSessionAttributeListeners == null) {
116                            return;
117                    }
118    
119                    for (HttpSessionAttributeListener httpSessionAttributeListener :
120                                    _httpSessionAttributeListeners) {
121    
122                            httpSessionAttributeListener.attributeReplaced(
123                                    httpSessionBindingEvent);
124                    }
125            }
126    
127            @Override
128            public void attributeReplaced(
129                    ServletRequestAttributeEvent servletRequestAttributeEvent) {
130    
131                    if (_servletRequestAttributeListeners == null) {
132                            return;
133                    }
134    
135                    for (ServletRequestAttributeListener servletRequestAttributeListener :
136                                    _servletRequestAttributeListeners) {
137    
138                            servletRequestAttributeListener.attributeReplaced(
139                                    servletRequestAttributeEvent);
140                    }
141            }
142    
143            @Override
144            public void contextInitialized(ServletContextEvent servletContextEvent) {
145                    servletContext = servletContextEvent.getServletContext();
146    
147                    servletContext.setAttribute(
148                            SecurePluginContextListener.class.getName(), this);
149    
150                    super.contextInitialized(servletContextEvent);
151            }
152    
153            public void instantiatingListeners() throws Exception {
154                    if (_servletRequestListeners != null) {
155                            return;
156                    }
157    
158                    String[] listenerClassNames = StringUtil.split(
159                            servletContext.getInitParameter("portalListenerClasses"));
160    
161                    for (String listenerClassName : listenerClassNames) {
162                            instantiatingListener(listenerClassName);
163                    }
164            }
165    
166            @Override
167            public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
168                    if (_servletRequestListeners == null) {
169                            return;
170                    }
171    
172                    for (ServletRequestListener servletRequestListener :
173                                    _servletRequestListeners) {
174    
175                            servletRequestListener.requestDestroyed(servletRequestEvent);
176                    }
177            }
178    
179            @Override
180            public void requestInitialized(ServletRequestEvent servletRequestEvent) {
181                    if (_servletRequestListeners == null) {
182                            return;
183                    }
184    
185                    for (ServletRequestListener servletRequestListener :
186                                    _servletRequestListeners) {
187    
188                            servletRequestListener.requestInitialized(servletRequestEvent);
189                    }
190            }
191    
192            @Override
193            public void sessionCreated(HttpSessionEvent httpSessionEvent) {
194                    if (_httpSessionListeners == null) {
195                            return;
196                    }
197    
198                    for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
199                            httpSessionListener.sessionCreated(httpSessionEvent);
200                    }
201            }
202    
203            @Override
204            public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
205                    if (_httpSessionListeners == null) {
206                            return;
207                    }
208    
209                    for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
210                            httpSessionListener.sessionDestroyed(httpSessionEvent);
211                    }
212            }
213    
214            @Override
215            public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
216                    if (_httpSessionActivationListeners == null) {
217                            return;
218                    }
219    
220                    for (HttpSessionActivationListener httpSessionActivationListener :
221                                    _httpSessionActivationListeners) {
222    
223                            httpSessionActivationListener.sessionDidActivate(httpSessionEvent);
224                    }
225            }
226    
227            @Override
228            public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
229                    if (_httpSessionActivationListeners == null) {
230                            return;
231                    }
232    
233                    for (HttpSessionActivationListener httpSessionActivationListener :
234                                    _httpSessionActivationListeners) {
235    
236                            httpSessionActivationListener.sessionWillPassivate(
237                                    httpSessionEvent);
238                    }
239            }
240    
241            @Override
242            public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
243                    if (_httpSessionBindingListeners == null) {
244                            return;
245                    }
246    
247                    for (HttpSessionBindingListener httpSessionBindingListener :
248                                    _httpSessionBindingListeners) {
249    
250                            httpSessionBindingListener.valueBound(httpSessionBindingEvent);
251                    }
252            }
253    
254            @Override
255            public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
256                    if (_httpSessionBindingListeners == null) {
257                            return;
258                    }
259    
260                    for (HttpSessionBindingListener httpSessionBindingListener :
261                                    _httpSessionBindingListeners) {
262    
263                            httpSessionBindingListener.valueUnbound(httpSessionBindingEvent);
264                    }
265            }
266    
267            @Override
268            protected void fireUndeployEvent() {
269                    if (_servletContextListeners != null) {
270                            ServletContextEvent servletContextEvent = new ServletContextEvent(
271                                    servletContext);
272    
273                            for (ServletContextListener servletContextListener :
274                                            _servletContextListeners) {
275    
276                                    servletContextListener.contextDestroyed(servletContextEvent);
277                            }
278                    }
279    
280                    super.fireUndeployEvent();
281            }
282    
283            protected void instantiatingListener(String listenerClassName)
284                    throws Exception {
285    
286                    if (_log.isDebugEnabled()) {
287                            _log.debug("Instantiating " + listenerClassName);
288                    }
289    
290                    Object listener = InstanceFactory.newInstance(
291                            pluginClassLoader, listenerClassName);
292    
293                    if (listener instanceof HttpSessionActivationListener) {
294                            if (_httpSessionActivationListeners == null) {
295                                    _httpSessionActivationListeners =
296                                            new CopyOnWriteArrayList<HttpSessionActivationListener>();
297                            }
298    
299                            _httpSessionActivationListeners.add(
300                                    (HttpSessionActivationListener)listener);
301                    }
302    
303                    if (listener instanceof HttpSessionAttributeListener) {
304                            if (_httpSessionAttributeListeners == null) {
305                                    _httpSessionAttributeListeners =
306                                            new CopyOnWriteArrayList<HttpSessionAttributeListener>();
307                            }
308    
309                            _httpSessionAttributeListeners.add(
310                                    (HttpSessionAttributeListener)listener);
311                    }
312    
313                    if (listener instanceof HttpSessionBindingListener) {
314                            if (_httpSessionBindingListeners == null) {
315                                    _httpSessionBindingListeners =
316                                            new CopyOnWriteArrayList<HttpSessionBindingListener>();
317                            }
318    
319                            _httpSessionBindingListeners.add(
320                                    (HttpSessionBindingListener)listener);
321                    }
322    
323                    if (listener instanceof HttpSessionListener) {
324                            if (_httpSessionListeners == null) {
325                                    _httpSessionListeners =
326                                            new CopyOnWriteArrayList<HttpSessionListener>();
327                            }
328    
329                            _httpSessionListeners.add((HttpSessionListener)listener);
330                    }
331    
332                    if (listener instanceof ServletContextListener) {
333                            if (_servletContextListeners == null) {
334                                    _servletContextListeners =
335                                            new CopyOnWriteArrayList<ServletContextListener>();
336                            }
337    
338                            ServletContextListener servletContextListener =
339                                    (ServletContextListener)listener;
340    
341                            _servletContextListeners.add(servletContextListener);
342    
343                            ServletContextEvent servletContextEvent = new ServletContextEvent(
344                                    servletContext);
345    
346                            servletContextListener.contextInitialized(servletContextEvent);
347                    }
348    
349                    if (listener instanceof ServletRequestAttributeListener) {
350                            if (_servletRequestAttributeListeners == null) {
351                                    _servletRequestAttributeListeners =
352                                            new CopyOnWriteArrayList<ServletRequestAttributeListener>();
353                            }
354    
355                            _servletRequestAttributeListeners.add(
356                                    (ServletRequestAttributeListener)listener);
357                    }
358    
359                    if (listener instanceof ServletRequestListener) {
360                            if (_servletRequestListeners == null) {
361                                    _servletRequestListeners =
362                                            new CopyOnWriteArrayList<ServletRequestListener>();
363                            }
364    
365                            _servletRequestListeners.add((ServletRequestListener)listener);
366                    }
367            }
368    
369            private static Log _log = LogFactoryUtil.getLog(
370                    SecurePluginContextListener.class);
371    
372            private List<HttpSessionActivationListener> _httpSessionActivationListeners;
373            private List<HttpSessionAttributeListener> _httpSessionAttributeListeners;
374            private List<HttpSessionBindingListener> _httpSessionBindingListeners;
375            private List<HttpSessionListener> _httpSessionListeners;
376            private List<ServletContextListener> _servletContextListeners;
377            private List<ServletRequestAttributeListener>
378                    _servletRequestAttributeListeners;
379            private List<ServletRequestListener> _servletRequestListeners;
380    
381    }