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}