001package com.box.sdkgen.networking.network;
002
003import com.box.sdkgen.box.errors.BoxSDKError;
004import com.box.sdkgen.internal.logging.DataSanitizer;
005import com.box.sdkgen.networking.baseurls.BaseUrls;
006import com.box.sdkgen.networking.boxnetworkclient.BoxNetworkClient;
007import com.box.sdkgen.networking.interceptors.Interceptor;
008import com.box.sdkgen.networking.networkclient.NetworkClient;
009import com.box.sdkgen.networking.proxyconfig.ProxyConfig;
010import com.box.sdkgen.networking.retries.BoxRetryStrategy;
011import com.box.sdkgen.networking.retries.RetryStrategy;
012import com.box.sdkgen.networking.timeoutconfig.TimeoutConfig;
013import java.util.ArrayList;
014import java.util.HashMap;
015import java.util.List;
016import java.util.Map;
017import java.util.stream.Collectors;
018import java.util.stream.Stream;
019
020public class NetworkSession {
021  protected Map<String, String> additionalHeaders = new HashMap<>();
022
023  protected BaseUrls baseUrls = new BaseUrls();
024
025  protected List<Interceptor> interceptors = new ArrayList<>();
026
027  protected NetworkClient networkClient;
028
029  protected RetryStrategy retryStrategy;
030
031  protected DataSanitizer dataSanitizer;
032
033  protected ProxyConfig proxyConfig;
034
035  protected TimeoutConfig timeoutConfig;
036
037  public NetworkSession() {
038    networkClient = new BoxNetworkClient();
039    retryStrategy = new BoxRetryStrategy();
040    dataSanitizer = new DataSanitizer();
041  }
042
043  protected NetworkSession(Builder builder) {
044    this.additionalHeaders = builder.additionalHeaders;
045    this.baseUrls = builder.baseUrls;
046    this.networkClient = builder.networkClient;
047    this.interceptors = builder.interceptors;
048    this.retryStrategy = builder.retryStrategy;
049    this.dataSanitizer = builder.dataSanitizer;
050    this.proxyConfig = builder.proxyConfig;
051    this.timeoutConfig = builder.timeoutConfig;
052  }
053
054  public NetworkSession withAdditionalHeaders() {
055    return withAdditionalHeaders(new HashMap<>());
056  }
057
058  public NetworkSession withAdditionalHeaders(Map<String, String> additionalHeaders) {
059    Map<String, String> newHeaders = new HashMap<>();
060    newHeaders.putAll(this.additionalHeaders);
061    newHeaders.putAll(additionalHeaders);
062    return new NetworkSession.Builder()
063        .additionalHeaders(newHeaders)
064        .baseUrls(this.baseUrls)
065        .interceptors(this.interceptors)
066        .networkClient(this.networkClient)
067        .retryStrategy(this.retryStrategy)
068        .dataSanitizer(this.dataSanitizer)
069        .proxyConfig(this.proxyConfig)
070        .timeoutConfig(this.timeoutConfig)
071        .build();
072  }
073
074  public NetworkSession withCustomBaseUrls(BaseUrls baseUrls) {
075    return new Builder()
076        .additionalHeaders(this.additionalHeaders)
077        .baseUrls(baseUrls)
078        .interceptors(this.interceptors)
079        .networkClient(this.networkClient)
080        .retryStrategy(this.retryStrategy)
081        .dataSanitizer(this.dataSanitizer)
082        .proxyConfig(this.proxyConfig)
083        .timeoutConfig(this.timeoutConfig)
084        .build();
085  }
086
087  public NetworkSession withInterceptors(List<Interceptor> interceptors) {
088    List<Interceptor> newInterceptors =
089        Stream.concat(this.interceptors.stream(), interceptors.stream())
090            .collect(Collectors.toList());
091    return new Builder()
092        .additionalHeaders(this.additionalHeaders)
093        .baseUrls(this.baseUrls)
094        .interceptors(newInterceptors)
095        .networkClient(this.networkClient)
096        .retryStrategy(this.retryStrategy)
097        .dataSanitizer(this.dataSanitizer)
098        .proxyConfig(this.proxyConfig)
099        .timeoutConfig(this.timeoutConfig)
100        .build();
101  }
102
103  public NetworkSession withNetworkClient(NetworkClient networkClient) {
104    return new Builder()
105        .additionalHeaders(this.additionalHeaders)
106        .baseUrls(this.baseUrls)
107        .interceptors(this.interceptors)
108        .networkClient(networkClient)
109        .retryStrategy(this.retryStrategy)
110        .dataSanitizer(this.dataSanitizer)
111        .proxyConfig(this.proxyConfig)
112        .timeoutConfig(this.timeoutConfig)
113        .build();
114  }
115
116  public NetworkSession withRetryStrategy(RetryStrategy retryStrategy) {
117    return new Builder()
118        .additionalHeaders(this.additionalHeaders)
119        .baseUrls(this.baseUrls)
120        .interceptors(this.interceptors)
121        .networkClient(this.networkClient)
122        .retryStrategy(retryStrategy)
123        .dataSanitizer(this.dataSanitizer)
124        .proxyConfig(this.proxyConfig)
125        .timeoutConfig(this.timeoutConfig)
126        .build();
127  }
128
129  public NetworkSession withDataSanitizer(DataSanitizer dataSanitizer) {
130    return new Builder()
131        .additionalHeaders(this.additionalHeaders)
132        .baseUrls(this.baseUrls)
133        .interceptors(this.interceptors)
134        .networkClient(this.networkClient)
135        .retryStrategy(this.retryStrategy)
136        .dataSanitizer(dataSanitizer)
137        .proxyConfig(this.proxyConfig)
138        .timeoutConfig(this.timeoutConfig)
139        .build();
140  }
141
142  public NetworkSession withProxy(ProxyConfig config) {
143    if (config == null) {
144      throw new IllegalArgumentException("ProxyConfig cannot be null");
145    }
146    if (!(this.networkClient instanceof BoxNetworkClient)) {
147      throw new BoxSDKError("Proxies are only supported for BoxNetworkClient");
148    }
149    BoxNetworkClient newClient = ((BoxNetworkClient) this.networkClient).withProxy(config);
150    return new Builder()
151        .additionalHeaders(this.additionalHeaders)
152        .baseUrls(this.baseUrls)
153        .interceptors(this.interceptors)
154        .networkClient(newClient)
155        .retryStrategy(this.retryStrategy)
156        .dataSanitizer(this.dataSanitizer)
157        .proxyConfig(config)
158        .timeoutConfig(this.timeoutConfig)
159        .build();
160  }
161
162  public NetworkSession withTimeoutConfig(TimeoutConfig timeoutConfig) {
163    if (timeoutConfig == null) {
164      throw new IllegalArgumentException("TimeoutConfig cannot be null");
165    }
166
167    if (!(this.networkClient instanceof BoxNetworkClient)) {
168      throw new BoxSDKError("Timeouts are only supported for BoxNetworkClient");
169    }
170
171    BoxNetworkClient newClient =
172        ((BoxNetworkClient) this.networkClient).withTimeoutConfig(timeoutConfig);
173    return new Builder()
174        .additionalHeaders(this.additionalHeaders)
175        .baseUrls(this.baseUrls)
176        .interceptors(this.interceptors)
177        .networkClient(newClient)
178        .retryStrategy(this.retryStrategy)
179        .dataSanitizer(this.dataSanitizer)
180        .proxyConfig(this.proxyConfig)
181        .timeoutConfig(timeoutConfig)
182        .build();
183  }
184
185  public Map<String, String> getAdditionalHeaders() {
186    return additionalHeaders;
187  }
188
189  public BaseUrls getBaseUrls() {
190    return baseUrls;
191  }
192
193  public NetworkClient getNetworkClient() {
194    return networkClient;
195  }
196
197  public List<Interceptor> getInterceptors() {
198    return interceptors;
199  }
200
201  public RetryStrategy getRetryStrategy() {
202    return retryStrategy;
203  }
204
205  public DataSanitizer getDataSanitizer() {
206    return dataSanitizer;
207  }
208
209  public ProxyConfig getProxyConfig() {
210    return proxyConfig;
211  }
212
213  public TimeoutConfig getTimeoutConfig() {
214    return timeoutConfig;
215  }
216
217  public static class Builder {
218
219    protected Map<String, String> additionalHeaders = new HashMap<>();
220
221    protected BaseUrls baseUrls = new BaseUrls();
222
223    protected NetworkClient networkClient;
224
225    protected List<Interceptor> interceptors = new ArrayList<>();
226
227    protected RetryStrategy retryStrategy;
228
229    protected DataSanitizer dataSanitizer;
230
231    protected ProxyConfig proxyConfig;
232
233    protected TimeoutConfig timeoutConfig;
234
235    public Builder() {
236      networkClient = new BoxNetworkClient();
237      retryStrategy = new BoxRetryStrategy();
238      dataSanitizer = new DataSanitizer();
239    }
240
241    public Builder additionalHeaders(Map<String, String> additionalHeaders) {
242      this.additionalHeaders = additionalHeaders;
243      return this;
244    }
245
246    public Builder baseUrls(BaseUrls baseUrls) {
247      this.baseUrls = baseUrls;
248      return this;
249    }
250
251    public Builder networkClient(NetworkClient networkClient) {
252      this.networkClient = networkClient;
253      return this;
254    }
255
256    public Builder interceptors(List<Interceptor> interceptors) {
257      this.interceptors = interceptors;
258      return this;
259    }
260
261    public Builder retryStrategy(RetryStrategy retryStrategy) {
262      this.retryStrategy = retryStrategy;
263      return this;
264    }
265
266    public Builder dataSanitizer(DataSanitizer dataSanitizer) {
267      this.dataSanitizer = dataSanitizer;
268      return this;
269    }
270
271    public Builder proxyConfig(ProxyConfig proxyConfig) {
272      this.proxyConfig = proxyConfig;
273      return this;
274    }
275
276    public Builder timeoutConfig(TimeoutConfig timeoutConfig) {
277      this.timeoutConfig = timeoutConfig;
278      return this;
279    }
280
281    public NetworkSession build() {
282      return new NetworkSession(this);
283    }
284  }
285}