1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package javax.websocket;
18 
19 import java.util.Collections;
20 import java.util.List;
21 import java.util.Map;
22 
23 public interface ClientEndpointConfig extends EndpointConfig {
24 
getPreferredSubprotocols()25     List<String> getPreferredSubprotocols();
26 
getExtensions()27     List<Extension> getExtensions();
28 
getConfigurator()29     public Configurator getConfigurator();
30 
31     public final class Builder {
32 
33         private static final Configurator DEFAULT_CONFIGURATOR =
34                 new Configurator() {};
35 
36 
create()37         public static Builder create() {
38             return new Builder();
39         }
40 
41 
Builder()42         private Builder() {
43             // Hide default constructor
44         }
45 
46         private Configurator configurator = DEFAULT_CONFIGURATOR;
47         private List<String> preferredSubprotocols = Collections.emptyList();
48         private List<Extension> extensions = Collections.emptyList();
49         private List<Class<? extends Encoder>> encoders =
50                 Collections.emptyList();
51         private List<Class<? extends Decoder>> decoders =
52                 Collections.emptyList();
53 
54 
build()55         public ClientEndpointConfig build() {
56             return new DefaultClientEndpointConfig(preferredSubprotocols,
57                     extensions, encoders, decoders, configurator);
58         }
59 
60 
configurator(Configurator configurator)61         public Builder configurator(Configurator configurator) {
62             if (configurator == null) {
63                 this.configurator = DEFAULT_CONFIGURATOR;
64             } else {
65                 this.configurator = configurator;
66             }
67             return this;
68         }
69 
70 
preferredSubprotocols( List<String> preferredSubprotocols)71         public Builder preferredSubprotocols(
72                 List<String> preferredSubprotocols) {
73             if (preferredSubprotocols == null ||
74                     preferredSubprotocols.size() == 0) {
75                 this.preferredSubprotocols = Collections.emptyList();
76             } else {
77                 this.preferredSubprotocols =
78                         Collections.unmodifiableList(preferredSubprotocols);
79             }
80             return this;
81         }
82 
83 
extensions( List<Extension> extensions)84         public Builder extensions(
85                 List<Extension> extensions) {
86             if (extensions == null || extensions.size() == 0) {
87                 this.extensions = Collections.emptyList();
88             } else {
89                 this.extensions = Collections.unmodifiableList(extensions);
90             }
91             return this;
92         }
93 
94 
encoders(List<Class<? extends Encoder>> encoders)95         public Builder encoders(List<Class<? extends Encoder>> encoders) {
96             if (encoders == null || encoders.size() == 0) {
97                 this.encoders = Collections.emptyList();
98             } else {
99                 this.encoders = Collections.unmodifiableList(encoders);
100             }
101             return this;
102         }
103 
104 
decoders(List<Class<? extends Decoder>> decoders)105         public Builder decoders(List<Class<? extends Decoder>> decoders) {
106             if (decoders == null || decoders.size() == 0) {
107                 this.decoders = Collections.emptyList();
108             } else {
109                 this.decoders = Collections.unmodifiableList(decoders);
110             }
111             return this;
112         }
113     }
114 
115 
116     public class Configurator {
117 
118         /**
119          * Provides the client with a mechanism to inspect and/or modify the headers
120          * that are sent to the server to start the WebSocket handshake.
121          *
122          * @param headers   The HTTP headers
123          */
beforeRequest(Map<String, List<String>> headers)124         public void beforeRequest(Map<String, List<String>> headers) {
125             // NO-OP
126         }
127 
128         /**
129          * Provides the client with a mechanism to inspect the handshake response
130          * that is returned from the server.
131          *
132          * @param handshakeResponse The response
133          */
afterResponse(HandshakeResponse handshakeResponse)134         public void afterResponse(HandshakeResponse handshakeResponse) {
135             // NO-OP
136         }
137     }
138 }
139