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.server;
20
21 import javax.websocket.OnMessage;
22 import javax.websocket.server.ServerEndpoint;
23 import javax.websocket.server.ServerEndpointConfig;
24
25 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
26 import org.eclipse.jetty.websocket.common.events.EventDriver;
27 import org.eclipse.jetty.websocket.common.events.EventDriverImpl;
28 import org.eclipse.jetty.websocket.jsr356.annotations.JsrEvents;
29 import org.eclipse.jetty.websocket.jsr356.annotations.OnMessageCallable;
30 import org.eclipse.jetty.websocket.jsr356.endpoints.EndpointInstance;
31 import org.eclipse.jetty.websocket.jsr356.endpoints.JsrAnnotatedEventDriver;
32
33
34
35
36 public class JsrServerEndpointImpl implements EventDriverImpl
37 {
38 @Override
39 public EventDriver create(Object websocket, WebSocketPolicy policy) throws Throwable
40 {
41 if (!(websocket instanceof EndpointInstance))
42 {
43 throw new IllegalStateException(String.format("Websocket %s must be an %s",websocket.getClass().getName(),EndpointInstance.class.getName()));
44 }
45
46 EndpointInstance ei = (EndpointInstance)websocket;
47 AnnotatedServerEndpointMetadata metadata = (AnnotatedServerEndpointMetadata)ei.getMetadata();
48 JsrEvents<ServerEndpoint, ServerEndpointConfig> events = new JsrEvents<>(metadata);
49
50
51 int maxBinaryMessage = getMaxMessageSize(policy.getMaxBinaryMessageSize(),metadata.onBinary,metadata.onBinaryStream);
52 int maxTextMessage = getMaxMessageSize(policy.getMaxTextMessageSize(),metadata.onText,metadata.onTextStream);
53
54 policy.setMaxBinaryMessageSize(maxBinaryMessage);
55 policy.setMaxTextMessageSize(maxTextMessage);
56
57 JsrAnnotatedEventDriver driver = new JsrAnnotatedEventDriver(policy,ei,events);
58
59 ServerEndpointConfig config = (ServerEndpointConfig)ei.getConfig();
60 if (config instanceof PathParamServerEndpointConfig)
61 {
62 PathParamServerEndpointConfig ppconfig = (PathParamServerEndpointConfig)config;
63 driver.setPathParameters(ppconfig.getPathParamMap());
64 }
65
66 return driver;
67 }
68
69 @Override
70 public String describeRule()
71 {
72 return "class is annotated with @" + ServerEndpoint.class.getName();
73 }
74
75 private int getMaxMessageSize(int defaultMaxMessageSize, OnMessageCallable... onMessages)
76 {
77 for (OnMessageCallable callable : onMessages)
78 {
79 if (callable == null)
80 {
81 continue;
82 }
83 OnMessage onMsg = callable.getMethod().getAnnotation(OnMessage.class);
84 if (onMsg == null)
85 {
86 continue;
87 }
88 if (onMsg.maxMessageSize() > 0)
89 {
90 return (int)onMsg.maxMessageSize();
91 }
92 }
93 return defaultMaxMessageSize;
94 }
95
96 @Override
97 public boolean supports(Object websocket)
98 {
99 if (!(websocket instanceof EndpointInstance))
100 {
101 return false;
102 }
103
104 EndpointInstance ei = (EndpointInstance)websocket;
105 Object endpoint = ei.getEndpoint();
106
107 ServerEndpoint anno = endpoint.getClass().getAnnotation(ServerEndpoint.class);
108 return (anno != null);
109 }
110 }