1 /*
2  * JBoss, Home of Professional Open Source.
3  * Copyright 2014 Red Hat, Inc., and individual contributors
4  * as indicated by the @author tags.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */

18
19 package io.undertow.server.session;
20
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.ListIterator;
24 import java.util.concurrent.CopyOnWriteArrayList;
25
26 import io.undertow.server.HttpServerExchange;
27
28 /**
29  * Utility class that maintains the session listeners.
30  *
31  *
32  * @author Stuart Douglas
33  */

34 public class SessionListeners {
35
36     private final List<SessionListener> sessionListeners = new CopyOnWriteArrayList<>();
37
38     public void addSessionListener(final SessionListener listener) {
39         this.sessionListeners.add(listener);
40     }
41
42     public boolean removeSessionListener(final SessionListener listener) {
43         return this.sessionListeners.remove(listener);
44     }
45
46     public void clear() {
47         this.sessionListeners.clear();
48     }
49
50     public void sessionCreated(final Session session, final HttpServerExchange exchange) {
51         for (SessionListener listener : sessionListeners) {
52             listener.sessionCreated(session, exchange);
53         }
54     }
55
56     public void sessionDestroyed(final Session session, final HttpServerExchange exchange, SessionListener.SessionDestroyedReason reason) {
57         // We need to create our own snapshot to safely iterate over a concurrent list in reverse
58         List<SessionListener> listeners = new ArrayList<>(sessionListeners);
59         ListIterator<SessionListener> iterator = listeners.listIterator(listeners.size());
60         while (iterator.hasPrevious()) {
61             iterator.previous().sessionDestroyed(session, exchange, reason);
62         }
63     }
64
65     public void attributeAdded(final Session session, final String name, final Object value) {
66         for (SessionListener listener : sessionListeners) {
67             listener.attributeAdded(session, name, value);
68         }
69
70     }
71
72     public void attributeUpdated(final Session session, final String name, final Object newValue, final Object oldValue) {
73         for (SessionListener listener : sessionListeners) {
74             listener.attributeUpdated(session, name, newValue, oldValue);
75         }
76
77     }
78
79     public void attributeRemoved(final Session session, final String name, final Object oldValue) {
80         for (SessionListener listener : sessionListeners) {
81             listener.attributeRemoved(session, name, oldValue);
82         }
83     }
84
85     public void sessionIdChanged(final Session session, final String oldSessionId) {
86         for (SessionListener listener : sessionListeners) {
87             listener.sessionIdChanged(session, oldSessionId);
88         }
89     }
90
91 }
92