1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.push;
20
21 import org.apache.myfaces.push.cdi.WebsocketApplicationSessionHolder;
22 import java.io.IOException;
23 import java.io.Serializable;
24 import javax.enterprise.inject.spi.BeanManager;
25 import javax.enterprise.inject.spi.CDI;
26 import javax.enterprise.util.AnnotationLiteral;
27 import javax.faces.event.WebsocketEvent;
28 import javax.faces.event.WebsocketEvent.Closed;
29 import javax.faces.event.WebsocketEvent.Opened;
30 import javax.websocket.CloseReason;
31 import javax.websocket.CloseReason.CloseCodes;
32 import javax.websocket.Endpoint;
33 import javax.websocket.EndpointConfig;
34 import javax.websocket.Session;
35
36
37
38
39 public class EndpointImpl extends Endpoint
40 {
41
42 public static final String JAVAX_FACES_PUSH_PATH = "/javax.faces.push/{channel}";
43
44 public static final String PUSH_CHANNEL_PARAMETER = "channel";
45
46 private static final AnnotationLiteral<Opened> OPENED =
47 new AnnotationLiteral<Opened>()
48 {
49 private static final long serialVersionUID = 2789324L;
50 };
51 private static final AnnotationLiteral<Closed> CLOSED =
52 new AnnotationLiteral<Closed>()
53 {
54 private static final long serialVersionUID = 38450203L;
55 };
56
57 @Override
58 public void onOpen(Session session, EndpointConfig config)
59 {
60
61 String channel = session.getPathParameters().get(PUSH_CHANNEL_PARAMETER);
62 String channelToken = session.getQueryString();
63
64
65
66
67
68
69 if (Boolean.TRUE.equals(config.getUserProperties().get(WebsocketConfigurator.WEBSOCKET_VALID)) &&
70 WebsocketApplicationSessionHolder.addOrUpdateSession(channelToken, session))
71 {
72 session.setMaxIdleTimeout((Long) config.getUserProperties().getOrDefault(
73 WebsocketConfigurator.MAX_IDLE_TIMEOUT, 300000L));
74
75 Serializable user = (Serializable) session.getUserProperties().get(WebsocketConfigurator.WEBSOCKET_USER);
76
77 BeanManager beanManager = CDI.current().getBeanManager();
78 beanManager.fireEvent(new WebsocketEvent(channel, user, null), OPENED);
79
80 session.getUserProperties().put(
81 WebsocketSessionClusterSerializedRestore.WEBSOCKET_SESSION_SERIALIZED_RESTORE,
82 new WebsocketSessionClusterSerializedRestore(channelToken));
83 }
84 else
85 {
86 try
87 {
88 session.close(new CloseReason(CloseCodes.UNEXPECTED_CONDITION,
89 "Websocket connection not registered in current session"));
90 }
91 catch (IOException ex)
92 {
93 onError(session, ex);
94 }
95 }
96 }
97
98 @Override
99 public void onClose(Session session, CloseReason closeReason)
100 {
101
102 String channel = session.getPathParameters().get(PUSH_CHANNEL_PARAMETER);
103 String channelToken = session.getQueryString();
104
105 Serializable user = (Serializable) session.getUserProperties().get(WebsocketConfigurator.WEBSOCKET_USER);
106
107
108
109
110 try
111 {
112 BeanManager beanManager = CDI.current().getBeanManager();
113 beanManager.fireEvent(
114 new WebsocketEvent(channel, user, closeReason.getCloseCode()), CLOSED);
115 }
116 catch(Exception e)
117 {
118
119 }
120 finally
121 {
122 WebsocketApplicationSessionHolder.removeSession(channelToken);
123 }
124 }
125
126 @Override
127 public void onError(Session session, Throwable ex)
128 {
129 if (session.isOpen())
130 {
131 session.getUserProperties().put(Throwable.class.getName(), ex);
132 }
133 }
134 }