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.servlet.filters.compoundsessionid.CompoundSessionIdHttpSession;
018    import com.liferay.portal.kernel.servlet.filters.compoundsessionid.CompoundSessionIdSplitterUtil;
019    
020    import java.util.ArrayList;
021    import java.util.List;
022    
023    import javax.servlet.http.HttpSessionActivationListener;
024    import javax.servlet.http.HttpSessionAttributeListener;
025    import javax.servlet.http.HttpSessionBindingEvent;
026    import javax.servlet.http.HttpSessionBindingListener;
027    import javax.servlet.http.HttpSessionEvent;
028    import javax.servlet.http.HttpSessionListener;
029    
030    /**
031     * <p>
032     * See http://issues.liferay.com/browse/LEP-2299.
033     * </p>
034     *
035     * @author Olaf Fricke
036     * @author Brian Wing Shun Chan
037     * @author Raymond Aug??
038     */
039    public class PortletSessionListenerManager
040            implements HttpSessionActivationListener, HttpSessionAttributeListener,
041                               HttpSessionBindingListener, HttpSessionListener {
042    
043            public static void addHttpSessionActivationListener(
044                    HttpSessionActivationListener httpSessionActivationListener) {
045    
046                    _httpSessionActivationListeners.add(httpSessionActivationListener);
047            }
048    
049            public static void addHttpSessionAttributeListener(
050                    HttpSessionAttributeListener httpSessionAttributeListener) {
051    
052                    _httpSessionAttributeListeners.add(httpSessionAttributeListener);
053            }
054    
055            public static void addHttpSessionBindingListener(
056                    HttpSessionBindingListener httpSessionBindingListener) {
057    
058                    _httpSessionBindingListeners.add(httpSessionBindingListener);
059            }
060    
061            public static void addHttpSessionListener(
062                    HttpSessionListener httpSessionListener) {
063    
064                    _httpSessionListeners.add(httpSessionListener);
065            }
066    
067            public static void removeHttpSessionActivationListener(
068                    HttpSessionActivationListener httpSessionActivationListener) {
069    
070                    _httpSessionActivationListeners.remove(httpSessionActivationListener);
071            }
072    
073            public static void removeHttpSessionAttributeListener(
074                    HttpSessionAttributeListener httpSessionAttributeListener) {
075    
076                    _httpSessionAttributeListeners.remove(httpSessionAttributeListener);
077            }
078    
079            public static void removeHttpSessionBindingListener(
080                    HttpSessionBindingListener httpSessionBindingListener) {
081    
082                    _httpSessionBindingListeners.remove(httpSessionBindingListener);
083            }
084    
085            public static void removeHttpSessionListener(
086                    HttpSessionListener httpSessionListener) {
087    
088                    _httpSessionListeners.remove(httpSessionListener);
089            }
090    
091            @Override
092            public void attributeAdded(
093                    HttpSessionBindingEvent httpSessionBindingEvent) {
094    
095                    httpSessionBindingEvent = getHttpSessionBindingEvent(
096                            httpSessionBindingEvent);
097    
098                    for (HttpSessionAttributeListener httpSessionAttributeListener :
099                                    _httpSessionAttributeListeners) {
100    
101                            httpSessionAttributeListener.attributeAdded(
102                                    httpSessionBindingEvent);
103                    }
104            }
105    
106            @Override
107            public void attributeRemoved(
108                    HttpSessionBindingEvent httpSessionBindingEvent) {
109    
110                    httpSessionBindingEvent = getHttpSessionBindingEvent(
111                            httpSessionBindingEvent);
112    
113                    for (HttpSessionAttributeListener httpSessionAttributeListener :
114                                    _httpSessionAttributeListeners) {
115    
116                            httpSessionAttributeListener.attributeRemoved(
117                                    httpSessionBindingEvent);
118                    }
119            }
120    
121            @Override
122            public void attributeReplaced(
123                    HttpSessionBindingEvent httpSessionBindingEvent) {
124    
125                    httpSessionBindingEvent = getHttpSessionBindingEvent(
126                            httpSessionBindingEvent);
127    
128                    for (HttpSessionAttributeListener httpSessionAttributeListener :
129                                    _httpSessionAttributeListeners) {
130    
131                            httpSessionAttributeListener.attributeReplaced(
132                                    httpSessionBindingEvent);
133                    }
134            }
135    
136            @Override
137            public void sessionCreated(HttpSessionEvent httpSessionEvent) {
138                    httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
139    
140                    Thread currentThread = Thread.currentThread();
141    
142                    ClassLoader contextClassLoader = currentThread.getContextClassLoader();
143    
144                    try {
145                            for (HttpSessionListener httpSessionListener :
146                                            _httpSessionListeners) {
147    
148                                    Class<?> clazz = httpSessionListener.getClass();
149    
150                                    ClassLoader classLoader = clazz.getClassLoader();
151    
152                                    currentThread.setContextClassLoader(classLoader);
153    
154                                    httpSessionListener.sessionCreated(httpSessionEvent);
155                            }
156                    }
157                    finally {
158                            currentThread.setContextClassLoader(contextClassLoader);
159                    }
160            }
161    
162            @Override
163            public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
164                    httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
165    
166                    for (HttpSessionListener httpSessionListener : _httpSessionListeners) {
167                            httpSessionListener.sessionDestroyed(httpSessionEvent);
168                    }
169            }
170    
171            @Override
172            public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
173                    httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
174    
175                    for (HttpSessionActivationListener httpSessionActivationListener :
176                                    _httpSessionActivationListeners) {
177    
178                            httpSessionActivationListener.sessionDidActivate(httpSessionEvent);
179                    }
180            }
181    
182            @Override
183            public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
184                    httpSessionEvent = getHttpSessionEvent(httpSessionEvent);
185    
186                    for (HttpSessionActivationListener httpSessionActivationListener :
187                                    _httpSessionActivationListeners) {
188    
189                            httpSessionActivationListener.sessionWillPassivate(
190                                    httpSessionEvent);
191                    }
192            }
193    
194            @Override
195            public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
196                    httpSessionBindingEvent = getHttpSessionBindingEvent(
197                            httpSessionBindingEvent);
198    
199                    for (HttpSessionBindingListener httpSessionBindingListener :
200                                    _httpSessionBindingListeners) {
201    
202                            httpSessionBindingListener.valueBound(httpSessionBindingEvent);
203                    }
204            }
205    
206            @Override
207            public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
208                    httpSessionBindingEvent = getHttpSessionBindingEvent(
209                            httpSessionBindingEvent);
210    
211                    for (HttpSessionBindingListener httpSessionBindingListener :
212                                    _httpSessionBindingListeners) {
213    
214                            httpSessionBindingListener.valueUnbound(httpSessionBindingEvent);
215                    }
216            }
217    
218            protected HttpSessionBindingEvent getHttpSessionBindingEvent(
219                    HttpSessionBindingEvent httpSessionBindingEvent) {
220    
221                    if (CompoundSessionIdSplitterUtil.hasSessionDelimiter()) {
222                            CompoundSessionIdHttpSession compoundSessionIdHttpSession =
223                                    new CompoundSessionIdHttpSession(
224                                            httpSessionBindingEvent.getSession());
225    
226                            httpSessionBindingEvent = new HttpSessionBindingEvent(
227                                    compoundSessionIdHttpSession, httpSessionBindingEvent.getName(),
228                                    httpSessionBindingEvent.getValue());
229                    }
230    
231                    return httpSessionBindingEvent;
232            }
233    
234            protected HttpSessionEvent getHttpSessionEvent(
235                    HttpSessionEvent httpSessionEvent) {
236    
237                    if (CompoundSessionIdSplitterUtil.hasSessionDelimiter()) {
238                            CompoundSessionIdHttpSession compoundSessionIdHttpSession =
239                                    new CompoundSessionIdHttpSession(httpSessionEvent.getSession());
240    
241                            httpSessionEvent = new HttpSessionEvent(
242                                    compoundSessionIdHttpSession);
243                    }
244    
245                    return httpSessionEvent;
246            }
247    
248            private static List<HttpSessionActivationListener>
249                    _httpSessionActivationListeners =
250                            new ArrayList<HttpSessionActivationListener>();
251            private static List<HttpSessionAttributeListener>
252                    _httpSessionAttributeListeners =
253                            new ArrayList<HttpSessionAttributeListener>();
254            private static List<HttpSessionBindingListener>
255                    _httpSessionBindingListeners =
256                            new ArrayList<HttpSessionBindingListener>();
257            private static List<HttpSessionListener> _httpSessionListeners =
258                    new ArrayList<HttpSessionListener>();
259    
260    }