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