1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.push.cdi;
21
22 import java.io.Serializable;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.concurrent.ConcurrentHashMap;
29 import javax.annotation.PreDestroy;
30 import javax.enterprise.context.SessionScoped;
31
32
33
34
35
36
37
38
39 @SessionScoped
40 public class WebsocketSessionBean implements Serializable
41 {
42
43
44
45
46
47 private Map<String, List<WebsocketChannel> > channelTokenListMap =
48 new ConcurrentHashMap<String, List<WebsocketChannel> >(2);
49
50
51
52
53
54
55 private Map<String, WebsocketChannelMetadata> tokenMap =
56 new ConcurrentHashMap<String, WebsocketChannelMetadata>();
57
58 public WebsocketSessionBean()
59 {
60 }
61
62 public void registerToken(String token, WebsocketChannelMetadata metadata)
63 {
64 tokenMap.put(token, metadata);
65 }
66
67 public void registerWebsocketSession(String token, WebsocketChannelMetadata metadata)
68 {
69 if ("session".equals(metadata.getScope()))
70 {
71 channelTokenListMap.putIfAbsent(metadata.getChannel(), new ArrayList<WebsocketChannel>(1));
72 channelTokenListMap.get(metadata.getChannel()).add(new WebsocketChannel(
73 token, metadata));
74 }
75 }
76
77 public boolean isTokenValid(String token)
78 {
79 return tokenMap.containsKey(token);
80 }
81
82 public Serializable getUserFromChannelToken(String channelToken)
83 {
84 if (tokenMap != null)
85 {
86 WebsocketChannelMetadata metadata = tokenMap.get(channelToken);
87 if (metadata != null)
88 {
89 return metadata.getUser();
90 }
91 }
92 return null;
93 }
94
95
96
97
98
99
100
101
102
103 public boolean isChannelAvailable(String channel)
104 {
105 return channelTokenListMap.containsKey(channel);
106 }
107
108 public List<String> getChannelTokensFor(String channel)
109 {
110 List<WebsocketChannel> list = channelTokenListMap.get(channel);
111 if (list != null && !list.isEmpty())
112 {
113 List<String> value = new ArrayList<String>(list.size());
114 for (WebsocketChannel md : list)
115 {
116 value.add(md.getChannelToken());
117 }
118 return value;
119 }
120 return Collections.emptyList();
121 }
122
123 public <S extends Serializable> List<String> getChannelTokensFor(String channel, S user)
124 {
125 List<WebsocketChannel> list = channelTokenListMap.get(channel);
126 if (list != null && !list.isEmpty())
127 {
128 List<String> value = new ArrayList<String>(list.size());
129 for (WebsocketChannel md : list)
130 {
131 if (user.equals(md.getUser()))
132 {
133 value.add(md.getChannelToken());
134 }
135 }
136 return value;
137 }
138 return null;
139 }
140
141 @PreDestroy
142 public void destroy()
143 {
144
145
146
147 channelTokenListMap.clear();
148 tokenMap.clear();
149 }
150
151 public void destroyChannelToken(String channelToken)
152 {
153 String channel = null;
154 for (Map.Entry<String, List<WebsocketChannel>> entry : channelTokenListMap.entrySet())
155 {
156 for (Iterator<WebsocketChannel> it = entry.getValue().iterator(); it.hasNext();)
157 {
158 WebsocketChannel wschannel = it.next();
159 if (channelToken.equals(wschannel.getChannelToken()))
160 {
161 it.remove();
162 break;
163 }
164 }
165 if (entry.getValue().isEmpty())
166 {
167 channel = entry.getKey();
168 }
169 }
170 if (channel != null)
171 {
172 channelTokenListMap.remove(channel);
173 }
174 tokenMap.remove(channelToken);
175 }
176 }