/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.servlet;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.ClassUtil;
import com.liferay.portal.kernel.util.InstanceFactory;
import com.liferay.portal.kernel.util.StringUtil;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author Brian Wing Shun Chan
*/
public class SecurePluginContextListener
extends PluginContextListener
implements HttpSessionActivationListener, HttpSessionAttributeListener,
HttpSessionBindingListener, HttpSessionListener,
ServletRequestAttributeListener, ServletRequestListener {
@Override
public void attributeAdded(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionAttributeListeners == null) {
return;
}
for (HttpSessionAttributeListener httpSessionAttributeListener :
_httpSessionAttributeListeners) {
httpSessionAttributeListener.attributeAdded(
httpSessionBindingEvent);
}
}
@Override
public void attributeAdded(
ServletRequestAttributeEvent servletRequestAttributeEvent) {
if (_servletRequestAttributeListeners == null) {
return;
}
for (ServletRequestAttributeListener servletRequestAttributeListener :
_servletRequestAttributeListeners) {
servletRequestAttributeListener.attributeAdded(
servletRequestAttributeEvent);
}
}
@Override
public void attributeRemoved(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionAttributeListeners == null) {
return;
}
for (HttpSessionAttributeListener httpSessionAttributeListener :
_httpSessionAttributeListeners) {
httpSessionAttributeListener.attributeRemoved(
httpSessionBindingEvent);
}
}
@Override
public void attributeRemoved(
ServletRequestAttributeEvent servletRequestAttributeEvent) {
if (_servletRequestAttributeListeners == null) {
return;
}
for (ServletRequestAttributeListener servletRequestAttributeListener :
_servletRequestAttributeListeners) {
servletRequestAttributeListener.attributeRemoved(
servletRequestAttributeEvent);
}
}
@Override
public void attributeReplaced(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionAttributeListeners == null) {
return;
}
for (HttpSessionAttributeListener httpSessionAttributeListener :
_httpSessionAttributeListeners) {
httpSessionAttributeListener.attributeReplaced(
httpSessionBindingEvent);
}
}
@Override
public void attributeReplaced(
ServletRequestAttributeEvent servletRequestAttributeEvent) {
if (_servletRequestAttributeListeners == null) {
return;
}
for (ServletRequestAttributeListener servletRequestAttributeListener :
_servletRequestAttributeListeners) {
servletRequestAttributeListener.attributeReplaced(
servletRequestAttributeEvent);
}
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute(
SecurePluginContextListener.class.getName(), this);
super.contextInitialized(servletContextEvent);
}
public void instantiatingListeners() throws Exception {
if (_servletRequestListeners != null) {
return;
}
String[] listenerClassNames = StringUtil.split(
servletContext.getInitParameter("portalListenerClasses"));
for (String listenerClassName : listenerClassNames) {
instantiatingListener(listenerClassName);
}
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
if (_servletRequestListeners == null) {
return;
}
for (ServletRequestListener servletRequestListener :
_servletRequestListeners) {
servletRequestListener.requestDestroyed(servletRequestEvent);
}
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
if (_servletRequestListeners == null) {
return;
}
for (ServletRequestListener servletRequestListener :
_servletRequestListeners) {
servletRequestListener.requestInitialized(servletRequestEvent);
}
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
if (_httpSessionListeners == null) {
return;
}
for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
httpSessionListener.sessionCreated(httpSessionEvent);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
if (_httpSessionListeners == null) {
return;
}
for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
httpSessionListener.sessionDestroyed(httpSessionEvent);
}
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
if (_httpSessionActivationListeners == null) {
return;
}
for (HttpSessionActivationListener httpSessionActivationListener :
_httpSessionActivationListeners) {
httpSessionActivationListener.sessionDidActivate(httpSessionEvent);
}
}
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
if (_httpSessionActivationListeners == null) {
return;
}
for (HttpSessionActivationListener httpSessionActivationListener :
_httpSessionActivationListeners) {
httpSessionActivationListener.sessionWillPassivate(
httpSessionEvent);
}
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionBindingListeners == null) {
return;
}
for (HttpSessionBindingListener httpSessionBindingListener :
_httpSessionBindingListeners) {
httpSessionBindingListener.valueBound(httpSessionBindingEvent);
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionBindingListeners == null) {
return;
}
for (HttpSessionBindingListener httpSessionBindingListener :
_httpSessionBindingListeners) {
httpSessionBindingListener.valueUnbound(httpSessionBindingEvent);
}
}
@Override
protected void fireUndeployEvent() {
if (_servletContextListeners != null) {
ServletContextEvent servletContextEvent = new ServletContextEvent(
servletContext);
for (ServletContextListener servletContextListener :
_servletContextListeners) {
try {
servletContextListener.contextDestroyed(
servletContextEvent);
}
catch (Throwable t) {
String className = ClassUtil.getClassName(
servletContextListener.getClass());
_log.error(
className + " is unable to process a context " +
"destroyed event for " +
servletContext.getServletContextName(),
t);
}
}
}
super.fireUndeployEvent();
}
protected void instantiatingListener(String listenerClassName)
throws Exception {
if (_log.isDebugEnabled()) {
_log.debug("Instantiating " + listenerClassName);
}
Object listener = InstanceFactory.newInstance(
pluginClassLoader, listenerClassName);
if (listener instanceof HttpSessionActivationListener) {
if (_httpSessionActivationListeners == null) {
_httpSessionActivationListeners = new CopyOnWriteArrayList<>();
}
_httpSessionActivationListeners.add(
(HttpSessionActivationListener)listener);
}
if (listener instanceof HttpSessionAttributeListener) {
if (_httpSessionAttributeListeners == null) {
_httpSessionAttributeListeners = new CopyOnWriteArrayList<>();
}
_httpSessionAttributeListeners.add(
(HttpSessionAttributeListener)listener);
}
if (listener instanceof HttpSessionBindingListener) {
if (_httpSessionBindingListeners == null) {
_httpSessionBindingListeners = new CopyOnWriteArrayList<>();
}
_httpSessionBindingListeners.add(
(HttpSessionBindingListener)listener);
}
if (listener instanceof HttpSessionListener) {
if (_httpSessionListeners == null) {
_httpSessionListeners = new CopyOnWriteArrayList<>();
}
_httpSessionListeners.add((HttpSessionListener)listener);
}
if (listener instanceof ServletContextListener) {
if (_servletContextListeners == null) {
_servletContextListeners = new CopyOnWriteArrayList<>();
}
ServletContextListener servletContextListener =
(ServletContextListener)listener;
_servletContextListeners.add(servletContextListener);
ServletContextEvent servletContextEvent = new ServletContextEvent(
servletContext);
servletContextListener.contextInitialized(servletContextEvent);
}
if (listener instanceof ServletRequestAttributeListener) {
if (_servletRequestAttributeListeners == null) {
_servletRequestAttributeListeners =
new CopyOnWriteArrayList<>();
}
_servletRequestAttributeListeners.add(
(ServletRequestAttributeListener)listener);
}
if (listener instanceof ServletRequestListener) {
if (_servletRequestListeners == null) {
_servletRequestListeners = new CopyOnWriteArrayList<>();
}
_servletRequestListeners.add((ServletRequestListener)listener);
}
}
private static final Log _log = LogFactoryUtil.getLog(
SecurePluginContextListener.class);
private List<HttpSessionActivationListener> _httpSessionActivationListeners;
private List<HttpSessionAttributeListener> _httpSessionAttributeListeners;
private List<HttpSessionBindingListener> _httpSessionBindingListeners;
private List<HttpSessionListener> _httpSessionListeners;
private List<ServletContextListener> _servletContextListeners;
private List<ServletRequestAttributeListener>
_servletRequestAttributeListeners;
private List<ServletRequestListener> _servletRequestListeners;
}