1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jclouds.http;
20
21 import static com.google.common.base.Preconditions.checkNotNull;
22
23 import java.util.concurrent.ExecutionException;
24
25 import javax.annotation.Resource;
26 import javax.inject.Inject;
27
28 import org.jclouds.logging.Logger;
29 import org.jclouds.rest.internal.GeneratedHttpRequest;
30
31 import com.google.common.base.Function;
32 import com.google.common.util.concurrent.ListenableFuture;
33
34
35
36
37
38
39
40
41
42 public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T> {
43
44 protected final TransformingHttpCommandExecutorService executorService;
45 protected final Function<HttpResponse, T> transformer;
46
47 protected volatile HttpRequest request;
48 protected volatile int failureCount;
49 protected volatile int redirectCount;
50 protected volatile Exception exception;
51
52 @Resource
53 protected Logger logger = Logger.NULL;
54
55 @Inject
56 public TransformingHttpCommandImpl(TransformingHttpCommandExecutorService executorService, HttpRequest request,
57 Function<HttpResponse, T> transformer) {
58 this.request = checkNotNull(request, "request");
59 this.executorService = checkNotNull(executorService, "executorService");
60 this.transformer = checkNotNull(transformer, "transformer");
61 this.failureCount = 0;
62 this.redirectCount = 0;
63 }
64
65
66
67
68 @Override
69 public ListenableFuture<T> execute() throws ExecutionException {
70 if (exception != null)
71 throw new ExecutionException(exception);
72 return executorService.submit(this, transformer);
73 }
74
75
76
77
78 @Override
79 public int getFailureCount() {
80 return failureCount;
81 }
82
83
84
85
86 @Override
87 public int incrementFailureCount() {
88 return ++failureCount;
89 }
90
91
92
93
94 @Override
95 public void setException(Exception exception) {
96 this.exception = exception;
97 }
98
99
100
101
102 @Override
103 public Exception getException() {
104 return exception;
105 }
106
107
108
109
110 @Override
111 public int incrementRedirectCount() {
112 return ++redirectCount;
113 }
114
115
116
117
118 @Override
119 public int getRedirectCount() {
120 return redirectCount;
121 }
122
123
124
125
126 @Override
127 public boolean isReplayable() {
128 return (request.getPayload() == null) ? true : request.getPayload().isRepeatable();
129 }
130
131
132
133
134 @Override
135 public HttpRequest getCurrentRequest() {
136 return request;
137 }
138
139
140
141
142 @Override
143 public void setCurrentRequest(HttpRequest request) {
144 this.request = request;
145 }
146
147 @Override
148 public String toString() {
149 if (request instanceof GeneratedHttpRequest<?>)
150 return String.format("[method=%s.%s, request=%s]", GeneratedHttpRequest.class.cast(request).getDeclaring()
151 .getSimpleName(), GeneratedHttpRequest.class.cast(request).getJavaMethod().getName(), request
152 .getRequestLine());
153 else
154 return "[request=" + request.getRequestLine() + "]";
155 }
156
157 }