View Javadoc
1   package org.kuali.common.httplib.api.model;
2   
3   import static com.google.common.base.Charsets.UTF_8;
4   import static com.google.common.base.Optional.absent;
5   import static com.google.common.collect.Lists.newArrayList;
6   import static com.google.common.io.ByteSource.wrap;
7   import static com.google.common.io.Files.asByteSource;
8   import static org.kuali.common.httplib.api.model.HttpMethod.DELETE;
9   import static org.kuali.common.httplib.api.model.HttpMethod.POST;
10  import static org.kuali.common.httplib.api.model.HttpMethod.PUT;
11  import static org.kuali.common.httplib.api.model.HttpStatusCodeType.SERVER_ERROR;
12  import static org.kuali.common.jute.base.Precondition.checkMin;
13  import static org.kuali.common.jute.reflect.Reflection.checkNoNulls;
14  
15  import java.io.File;
16  import java.nio.charset.Charset;
17  import java.util.List;
18  
19  import com.fasterxml.jackson.annotation.JsonSetter;
20  import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
21  import com.google.common.base.Optional;
22  import com.google.common.collect.ImmutableList;
23  import com.google.common.collect.Range;
24  import com.google.common.io.ByteSource;
25  
26  @JsonDeserialize(builder = HttpOptions.Builder.class)
27  public final class HttpOptions {
28  
29      private final Optional<Long> maxBytes;
30      private final Optional<Integer> maxTimeMillis;
31      private final Optional<Integer> connectTimeoutMillis;
32      private final Optional<Integer> retryCount;
33      private final Optional<Integer> retryDelayMillis;
34      private final Optional<ByteSource> upload;
35      private final Optional<File> outputFile;
36      private final boolean cacheResponseInMemory;
37      private final boolean printResponseToStdout;
38      private final boolean followRedirects;
39      private final HttpMethod requestMethod;
40      private final Charset charset;
41      private final boolean ignoreSecurity;
42      private final boolean silent;
43      private final ImmutableList<NameValue> data;
44      private final Range<Integer> keepTryingRange;
45      private final Optional<SecurityContext> security;
46      private final ImmutableList<HeaderPair> headers;
47      private final Optional<String> contentType;
48  
49      private HttpOptions(Builder builder) {
50          this.contentType = builder.contentType;
51          this.cacheResponseInMemory = builder.cacheResponseInMemory;
52          this.printResponseToStdout = builder.printResponseToStdout;
53          this.maxTimeMillis = builder.maxTimeMillis;
54          this.connectTimeoutMillis = builder.connectTimeoutMillis;
55          this.retryCount = builder.retryCount;
56          this.retryDelayMillis = builder.retryDelayMillis;
57          this.upload = builder.upload;
58          this.followRedirects = builder.followRedirects;
59          this.requestMethod = builder.requestMethod;
60          this.outputFile = builder.outputFile;
61          this.charset = builder.charset;
62          this.maxBytes = builder.maxBytes;
63          this.ignoreSecurity = builder.ignoreSecurity;
64          this.silent = builder.silent;
65          this.data = ImmutableList.copyOf(builder.data);
66          this.headers = ImmutableList.copyOf(builder.headers);
67          this.keepTryingRange = builder.keepTryingRange;
68          this.security = builder.security;
69      }
70  
71      public static HttpOptions build() {
72          return builder().build();
73      }
74  
75      public static Builder builder() {
76          return new Builder();
77      }
78  
79      public static class Builder implements org.apache.commons.lang3.builder.Builder<HttpOptions> {
80  
81          private Optional<Long> maxBytes = absent();
82          private Optional<Integer> maxTimeMillis = absent();
83          private Optional<Integer> connectTimeoutMillis = absent();
84          private Optional<Integer> retryCount = absent();
85          private Optional<Integer> retryDelayMillis = absent();
86          private Optional<ByteSource> upload = absent();
87          private boolean followRedirects = true;
88          private HttpMethod requestMethod = HttpMethod.GET;
89          private Optional<File> outputFile = absent();
90          private Charset charset = UTF_8;
91          private boolean ignoreSecurity = false;
92          private boolean silent = true;
93          private List<NameValue> data = newArrayList();
94          private Range<Integer> keepTryingRange = SERVER_ERROR.getRange();
95          private Optional<SecurityContext> security = absent();
96          private boolean cacheResponseInMemory = true;
97          private boolean printResponseToStdout = false;
98          private List<HeaderPair> headers = newArrayList();
99          private Optional<String> contentType = absent();
100 
101         private static HttpOptions validate(HttpOptions instance) {
102             checkNoNulls(instance);
103             checkMin(instance.maxBytes, 0, "maxBytes");
104             checkMin(instance.maxTimeMillis, 0, "maxTimeMillis");
105             checkMin(instance.connectTimeoutMillis, 0, "connectTimeoutMillis");
106             checkMin(instance.retryCount, 0, "retryCount");
107             checkMin(instance.retryDelayMillis, 0, "retryDelayMillis");
108             return instance;
109         }
110 
111         public Builder withContentType(Optional<String> contentType) {
112             this.contentType = contentType;
113             return this;
114         }
115 
116         public Builder withContentType(String contentType) {
117             return withContentType(Optional.of(contentType));
118         }
119 
120         public Builder withHeaders(List<HeaderPair> headers) {
121             this.headers = headers;
122             return this;
123         }
124 
125         @JsonSetter
126         public Builder withSecurity(Optional<SecurityContext> security) {
127             this.security = security;
128             return this;
129         }
130 
131         public Builder withSecurity(SecurityContext security) {
132             return withSecurity(Optional.of(security));
133         }
134 
135         public Builder withCacheResponseInMemory(boolean cacheResponseInMemory) {
136             this.cacheResponseInMemory = cacheResponseInMemory;
137             return this;
138         }
139 
140         public Builder cacheResponseInMemory() {
141             return withCacheResponseInMemory(true);
142         }
143 
144         public Builder withPrintResponseToStdout(boolean printResponseToStdout) {
145             this.printResponseToStdout = printResponseToStdout;
146             return this;
147         }
148 
149         public Builder printResponseToStdout() {
150             return withPrintResponseToStdout(true);
151         }
152 
153         @JsonSetter
154         public Builder withOutputFile(Optional<File> outputFile) {
155             this.outputFile = outputFile;
156             return this;
157         }
158 
159         public Builder withOutputFile(File outputFile) {
160             return withOutputFile(Optional.of(outputFile));
161         }
162 
163         public Builder withKeepTryingRange(Range<Integer> keepTryingRange) {
164             this.keepTryingRange = keepTryingRange;
165             return this;
166         }
167 
168         public Builder withData(List<NameValue> data) {
169             this.data = data;
170             return this;
171         }
172 
173         public Builder withSilent(boolean silent) {
174             this.silent = silent;
175             return this;
176         }
177 
178         public Builder ignoreSecurity() {
179             return withIgnoreSecurity(true);
180         }
181 
182         public Builder withIgnoreSecurity(boolean ignoreSecurity) {
183             this.ignoreSecurity = ignoreSecurity;
184             return this;
185         }
186 
187         @JsonSetter
188         public Builder withMaxBytes(Optional<Long> maxBytes) {
189             this.maxBytes = maxBytes;
190             return this;
191         }
192 
193         public Builder withMaxBytes(long maxBytes) {
194             return withMaxBytes(Optional.of(maxBytes));
195         }
196 
197         public Builder withCharset(Charset charset) {
198             this.charset = charset;
199             return this;
200         }
201 
202         public Builder withEncoding(String encoding) {
203             return withCharset(Charset.forName(encoding));
204         }
205 
206         public Builder post() {
207             return withRequestMethod(POST);
208         }
209 
210         public Builder delete() {
211             return withRequestMethod(DELETE);
212         }
213 
214         public Builder put() {
215             return withRequestMethod(PUT);
216         }
217 
218         public Builder withRequestMethod(HttpMethod requestMethod) {
219             this.requestMethod = requestMethod;
220             return this;
221         }
222 
223         @JsonSetter
224         public Builder withRetryCount(Optional<Integer> retries) {
225             this.retryCount = retries;
226             return this;
227         }
228 
229         public Builder withRetryCount(int retries) {
230             return withRetryCount(Optional.of(retries));
231         }
232 
233         public Builder withFollowRedirects(boolean followRedirects) {
234             this.followRedirects = followRedirects;
235             return this;
236         }
237 
238         public Builder followRedirects() {
239             return withFollowRedirects(true);
240         }
241 
242         @JsonSetter
243         public Builder withConnectTimeoutMillis(Optional<Integer> connectTimeoutMillis) {
244             this.connectTimeoutMillis = connectTimeoutMillis;
245             return this;
246         }
247 
248         public Builder withConnectTimeoutMillis(int connectTimeoutMillis) {
249             return withConnectTimeoutMillis(Optional.of(connectTimeoutMillis));
250         }
251 
252         @JsonSetter
253         public Builder withMaxTimeMillis(Optional<Integer> maxTimeMillis) {
254             this.maxTimeMillis = maxTimeMillis;
255             return this;
256         }
257 
258         public Builder withMaxTimeMillis(int maxTimeMillis) {
259             return withMaxTimeMillis(Optional.of(maxTimeMillis));
260         }
261 
262         @JsonSetter
263         public Builder withRetryDelayMillis(Optional<Integer> retryDelayMillis) {
264             this.retryDelayMillis = retryDelayMillis;
265             return this;
266         }
267 
268         public Builder withRetryDelayMillis(int retryDelayMillis) {
269             return withRetryDelayMillis(Optional.of(retryDelayMillis));
270         }
271 
272         @JsonSetter
273         public Builder withUpload(Optional<ByteSource> upload) {
274             this.upload = upload;
275             return this;
276         }
277 
278         public Builder withUpload(ByteSource upload) {
279             return withUpload(Optional.of(upload));
280         }
281 
282         public Builder upload(File file) {
283             return withUpload(asByteSource(file));
284         }
285 
286         public Builder upload(String content, Charset charset) {
287             return withUpload(wrap(content.getBytes(charset)));
288         }
289 
290         @Override
291         public HttpOptions build() {
292             return validate(new HttpOptions(this));
293         }
294 
295     }
296 
297     public Optional<Integer> getMaxTimeMillis() {
298         return maxTimeMillis;
299     }
300 
301     public Optional<Integer> getConnectTimeoutMillis() {
302         return connectTimeoutMillis;
303     }
304 
305     public Optional<Integer> getRetries() {
306         return retryCount;
307     }
308 
309     public Optional<Integer> getRetryDelayMillis() {
310         return retryDelayMillis;
311     }
312 
313     public Optional<ByteSource> getUpload() {
314         return upload;
315     }
316 
317     public boolean isFollowRedirects() {
318         return followRedirects;
319     }
320 
321     public HttpMethod getMethod() {
322         return requestMethod;
323     }
324 
325     public Optional<Integer> getRetryCount() {
326         return retryCount;
327     }
328 
329     public HttpMethod getRequestMethod() {
330         return requestMethod;
331     }
332 
333     public Optional<Long> getMaxBytes() {
334         return maxBytes;
335     }
336 
337     public boolean isIgnoreSecurity() {
338         return ignoreSecurity;
339     }
340 
341     public boolean isSilent() {
342         return silent;
343     }
344 
345     public List<NameValue> getData() {
346         return data;
347     }
348 
349     public Charset getCharset() {
350         return charset;
351     }
352 
353     public Range<Integer> getKeepTryingRange() {
354         return keepTryingRange;
355     }
356 
357     public Optional<File> getOutputFile() {
358         return outputFile;
359     }
360 
361     public boolean isCacheResponseInMemory() {
362         return cacheResponseInMemory;
363     }
364 
365     public Optional<SecurityContext> getSecurity() {
366         return security;
367     }
368 
369     public boolean isPrintResponseToStdout() {
370         return printResponseToStdout;
371     }
372 
373     public List<HeaderPair> getHeaders() {
374         return headers;
375     }
376 
377     public Optional<String> getContentType() {
378         return contentType;
379     }
380 
381 }