/**
* 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.servlet.filters.compoundsessionid.CompoundSessionIdHttpSession;
import com.liferay.portal.kernel.servlet.filters.compoundsessionid.CompoundSessionIdSplitterUtil;
import java.util.ArrayList;
import java.util.List;
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;
/**
* <p>
* See https://issues.liferay.com/browse/LEP-2299.
* </p>
*
* @author Olaf Fricke
* @author Brian Wing Shun Chan
* @author Raymond Augé
*/
public class PortletSessionListenerManager
implements HttpSessionActivationListener, HttpSessionAttributeListener,
HttpSessionBindingListener, HttpSessionListener {
public static void addHttpSessionActivationListener(
HttpSessionActivationListener httpSessionActivationListener) {
_httpSessionActivationListeners.add(httpSessionActivationListener);
}
public static void addHttpSessionAttributeListener(
HttpSessionAttributeListener httpSessionAttributeListener) {
_httpSessionAttributeListeners.add(httpSessionAttributeListener);
}
public static void addHttpSessionBindingListener(
HttpSessionBindingListener httpSessionBindingListener) {
_httpSessionBindingListeners.add(httpSessionBindingListener);
}
public static void addHttpSessionListener(
HttpSessionListener httpSessionListener) {
_httpSessionListeners.add(httpSessionListener);
}
public static void removeHttpSessionActivationListener(
HttpSessionActivationListener httpSessionActivationListener) {
_httpSessionActivationListeners.remove(httpSessionActivationListener);
}
public static void removeHttpSessionAttributeListener(
HttpSessionAttributeListener httpSessionAttributeListener) {
_httpSessionAttributeListeners.remove(httpSessionAttributeListener);
}
public static void removeHttpSessionBindingListener(
HttpSessionBindingListener httpSessionBindingListener) {
_httpSessionBindingListeners.remove(httpSessionBindingListener);
}
public static void removeHttpSessionListener(
HttpSessionListener httpSessionListener) {
_httpSessionListeners.remove(httpSessionListener);
}
@Override
public void attributeAdded(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionAttributeListeners.isEmpty()) {
return;
}
httpSessionBindingEvent = getHttpSessionBindingEvent(
httpSessionBindingEvent);
for (HttpSessionAttributeListener httpSessionAttributeListener :
_httpSessionAttributeListeners) {
httpSessionAttributeListener.attributeAdded(
httpSessionBindingEvent);
}
}
@Override
public void attributeRemoved(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionAttributeListeners.isEmpty()) {
return;
}
httpSessionBindingEvent = getHttpSessionBindingEvent(
httpSessionBindingEvent);
for (HttpSessionAttributeListener httpSessionAttributeListener :
_httpSessionAttributeListeners) {
httpSessionAttributeListener.attributeRemoved(
httpSessionBindingEvent);
}
}
@Override
public void attributeReplaced(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionAttributeListeners.isEmpty()) {
return;
}
httpSessionBindingEvent = getHttpSessionBindingEvent(
httpSessionBindingEvent);
for (HttpSessionAttributeListener httpSessionAttributeListener :
_httpSessionAttributeListeners) {
httpSessionAttributeListener.attributeReplaced(
httpSessionBindingEvent);
}
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
if (_httpSessionListeners.isEmpty()) {
return;
}
httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
Thread currentThread = Thread.currentThread();
ClassLoader contextClassLoader = currentThread.getContextClassLoader();
try {
for (HttpSessionListener httpSessionListener :
_httpSessionListeners) {
Class<?> clazz = httpSessionListener.getClass();
ClassLoader classLoader = clazz.getClassLoader();
currentThread.setContextClassLoader(classLoader);
httpSessionListener.sessionCreated(httpSessionEvent);
}
}
finally {
currentThread.setContextClassLoader(contextClassLoader);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
if (_httpSessionListeners.isEmpty()) {
return;
}
httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
httpSessionListener.sessionDestroyed(httpSessionEvent);
}
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
if (_httpSessionActivationListeners.isEmpty()) {
return;
}
httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
for (HttpSessionActivationListener httpSessionActivationListener :
_httpSessionActivationListeners) {
httpSessionActivationListener.sessionDidActivate(httpSessionEvent);
}
}
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
if (_httpSessionActivationListeners.isEmpty()) {
return;
}
httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
for (HttpSessionActivationListener httpSessionActivationListener :
_httpSessionActivationListeners) {
httpSessionActivationListener.sessionWillPassivate(
httpSessionEvent);
}
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionBindingListeners.isEmpty()) {
return;
}
httpSessionBindingEvent = getHttpSessionBindingEvent(
httpSessionBindingEvent);
for (HttpSessionBindingListener httpSessionBindingListener :
_httpSessionBindingListeners) {
httpSessionBindingListener.valueBound(httpSessionBindingEvent);
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
if (_httpSessionBindingListeners.isEmpty()) {
return;
}
httpSessionBindingEvent = getHttpSessionBindingEvent(
httpSessionBindingEvent);
for (HttpSessionBindingListener httpSessionBindingListener :
_httpSessionBindingListeners) {
httpSessionBindingListener.valueUnbound(httpSessionBindingEvent);
}
}
protected HttpSessionBindingEvent getHttpSessionBindingEvent(
HttpSessionBindingEvent httpSessionBindingEvent) {
if (CompoundSessionIdSplitterUtil.hasSessionDelimiter()) {
CompoundSessionIdHttpSession compoundSessionIdHttpSession =
new CompoundSessionIdHttpSession(
httpSessionBindingEvent.getSession());
httpSessionBindingEvent = new HttpSessionBindingEvent(
compoundSessionIdHttpSession, httpSessionBindingEvent.getName(),
httpSessionBindingEvent.getValue());
}
return httpSessionBindingEvent;
}
protected HttpSessionEvent getHttpSessionEvent(
HttpSessionEvent httpSessionEvent) {
if (CompoundSessionIdSplitterUtil.hasSessionDelimiter()) {
CompoundSessionIdHttpSession compoundSessionIdHttpSession =
new CompoundSessionIdHttpSession(httpSessionEvent.getSession());
httpSessionEvent = new HttpSessionEvent(
compoundSessionIdHttpSession);
}
return httpSessionEvent;
}
private static final List<HttpSessionActivationListener>
_httpSessionActivationListeners = new ArrayList<>();
private static final List<HttpSessionAttributeListener>
_httpSessionAttributeListeners = new ArrayList<>();
private static final List<HttpSessionBindingListener>
_httpSessionBindingListeners = new ArrayList<>();
private static final List<HttpSessionListener> _httpSessionListeners =
new ArrayList<>();
}