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}