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