1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.websocket.jsr356.client;
20
21 import javax.websocket.ClientEndpoint;
22 import javax.websocket.ClientEndpointConfig;
23 import javax.websocket.DeploymentException;
24 import javax.websocket.OnMessage;
25
26 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
27 import org.eclipse.jetty.websocket.common.events.EventDriver;
28 import org.eclipse.jetty.websocket.common.events.EventDriverImpl;
29 import org.eclipse.jetty.websocket.jsr356.annotations.JsrEvents;
30 import org.eclipse.jetty.websocket.jsr356.annotations.OnMessageCallable;
31 import org.eclipse.jetty.websocket.jsr356.endpoints.EndpointInstance;
32 import org.eclipse.jetty.websocket.jsr356.endpoints.JsrAnnotatedEventDriver;
33
34
35
36
37 public class JsrClientEndpointImpl implements EventDriverImpl
38 {
39 @Override
40 public EventDriver create(Object websocket, WebSocketPolicy policy) throws DeploymentException
41 {
42 if (!(websocket instanceof EndpointInstance))
43 {
44 throw new IllegalStateException(String.format("Websocket %s must be an %s",websocket.getClass().getName(),EndpointInstance.class.getName()));
45 }
46
47 EndpointInstance ei = (EndpointInstance)websocket;
48 AnnotatedClientEndpointMetadata metadata = (AnnotatedClientEndpointMetadata)ei.getMetadata();
49 JsrEvents<ClientEndpoint, ClientEndpointConfig> events = new JsrEvents<>(metadata);
50
51
52 int maxBinaryMessage = getMaxMessageSize(policy.getMaxBinaryMessageSize(),metadata.onBinary,metadata.onBinaryStream);
53 int maxTextMessage = getMaxMessageSize(policy.getMaxTextMessageSize(),metadata.onText,metadata.onTextStream);
54
55 policy.setMaxBinaryMessageSize(maxBinaryMessage);
56 policy.setMaxTextMessageSize(maxTextMessage);
57
58 return new JsrAnnotatedEventDriver(policy,ei,events);
59 }
60
61 @Override
62 public String describeRule()
63 {
64 return "class is annotated with @" + ClientEndpoint.class.getName();
65 }
66
67 private int getMaxMessageSize(int defaultMaxMessageSize, OnMessageCallable... onMessages)
68 {
69 for (OnMessageCallable callable : onMessages)
70 {
71 if (callable == null)
72 {
73 continue;
74 }
75 OnMessage onMsg = callable.getMethod().getAnnotation(OnMessage.class);
76 if (onMsg == null)
77 {
78 continue;
79 }
80 if (onMsg.maxMessageSize() > 0)
81 {
82 return (int)onMsg.maxMessageSize();
83 }
84 }
85 return defaultMaxMessageSize;
86 }
87
88 @Override
89 public boolean supports(Object websocket)
90 {
91 if (!(websocket instanceof EndpointInstance))
92 {
93 return false;
94 }
95
96 EndpointInstance ei = (EndpointInstance)websocket;
97 Object endpoint = ei.getEndpoint();
98
99 ClientEndpoint anno = endpoint.getClass().getAnnotation(ClientEndpoint.class);
100 return (anno != null);
101 }
102 }