1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jclouds;
20
21 import static org.jclouds.Constants.PROPERTY_API_VERSION;
22 import static org.jclouds.Constants.PROPERTY_CONNECTION_TIMEOUT;
23 import static org.jclouds.Constants.PROPERTY_CREDENTIAL;
24 import static org.jclouds.Constants.PROPERTY_ENDPOINT;
25 import static org.jclouds.Constants.PROPERTY_IDENTITY;
26 import static org.jclouds.Constants.PROPERTY_IO_WORKER_THREADS;
27 import static org.jclouds.Constants.PROPERTY_ISO3166_CODES;
28 import static org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_CONTEXT;
29 import static org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_HOST;
30 import static org.jclouds.Constants.PROPERTY_MAX_CONNECTION_REUSE;
31 import static org.jclouds.Constants.PROPERTY_MAX_REDIRECTS;
32 import static org.jclouds.Constants.PROPERTY_MAX_RETRIES;
33 import static org.jclouds.Constants.PROPERTY_MAX_SESSION_FAILURES;
34 import static org.jclouds.Constants.PROPERTY_PROVIDER;
35 import static org.jclouds.Constants.PROPERTY_PROXY_HOST;
36 import static org.jclouds.Constants.PROPERTY_PROXY_PASSWORD;
37 import static org.jclouds.Constants.PROPERTY_PROXY_PORT;
38 import static org.jclouds.Constants.PROPERTY_PROXY_SYSTEM;
39 import static org.jclouds.Constants.PROPERTY_PROXY_USER;
40 import static org.jclouds.Constants.PROPERTY_RELAX_HOSTNAME;
41 import static org.jclouds.Constants.PROPERTY_RETRY_DELAY_START;
42 import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
43 import static org.jclouds.Constants.PROPERTY_SO_TIMEOUT;
44 import static org.jclouds.Constants.PROPERTY_TRUST_ALL_CERTS;
45 import static org.jclouds.Constants.PROPERTY_USER_THREADS;
46
47 import java.util.Properties;
48
49 import org.jclouds.javax.annotation.Nullable;
50
51 import com.google.common.annotations.VisibleForTesting;
52 import com.google.common.base.Joiner;
53
54
55
56
57
58
59 public class PropertiesBuilder {
60
61
62
63
64 public PropertiesBuilder relaxSSLHostname(boolean relax) {
65 properties.setProperty(PROPERTY_RELAX_HOSTNAME, relax + "");
66 return this;
67 }
68
69
70
71
72 public PropertiesBuilder trustAllCerts(boolean trust) {
73 properties.setProperty(PROPERTY_TRUST_ALL_CERTS, trust + "");
74 return this;
75 }
76
77
78
79
80 public PropertiesBuilder useSystemProxies(boolean useSystemProxies) {
81 properties.setProperty(PROPERTY_PROXY_SYSTEM, useSystemProxies + "");
82 return this;
83 }
84
85
86
87
88 public PropertiesBuilder withProxyHost(String proxyHost) {
89 properties.setProperty(PROPERTY_PROXY_HOST, proxyHost);
90 return this;
91 }
92
93
94
95
96 public PropertiesBuilder withProxyPort(int proxyPort) {
97 properties.setProperty(PROPERTY_PROXY_PORT, Integer.toString(proxyPort));
98 return this;
99 }
100
101
102
103
104 public PropertiesBuilder withProxyUser(String proxyUser) {
105 properties.setProperty(PROPERTY_PROXY_USER, proxyUser);
106 return this;
107 }
108
109
110
111
112 public PropertiesBuilder withProxyPassword(String proxyPassword) {
113 properties.setProperty(PROPERTY_PROXY_PASSWORD, proxyPassword);
114 return this;
115 }
116
117
118
119
120 public PropertiesBuilder withSOTimeout(long soTimeout) {
121 properties.setProperty(PROPERTY_SO_TIMEOUT, Long.toString(soTimeout));
122 return this;
123 }
124
125
126
127
128 public PropertiesBuilder withConnectionTimeout(long connectionTimeout) {
129 properties.setProperty(PROPERTY_CONNECTION_TIMEOUT, Long.toString(connectionTimeout));
130 return this;
131 }
132
133
134
135
136 public PropertiesBuilder withMaxRetries(int httpMaxRetries) {
137 properties.setProperty(PROPERTY_MAX_RETRIES, Integer.toString(httpMaxRetries));
138 return this;
139 }
140
141
142
143
144 public PropertiesBuilder withRetriesDelayStart(long delayStart) {
145 properties.setProperty(PROPERTY_RETRY_DELAY_START, Long.toString(delayStart));
146 return this;
147 }
148
149
150
151
152 public PropertiesBuilder withMaxRedirects(int httpMaxRedirects) {
153 properties.setProperty(PROPERTY_MAX_REDIRECTS, Integer.toString(httpMaxRedirects));
154 return this;
155 }
156
157
158
159
160 public PropertiesBuilder withMaxClientReuse(int poolMaxClientReuse) {
161 properties.setProperty(PROPERTY_MAX_CONNECTION_REUSE, Integer.toString(poolMaxClientReuse));
162 return this;
163 }
164
165
166
167
168 public PropertiesBuilder withMaxSessionFailures(int poolMaxSessionFailures) {
169 properties.setProperty(PROPERTY_MAX_SESSION_FAILURES, Integer.toString(poolMaxSessionFailures));
170 return this;
171
172 }
173
174
175
176
177 public PropertiesBuilder limitIoWorkerThreadsTo(int poolIoWorkerThreads) {
178 properties.setProperty(PROPERTY_IO_WORKER_THREADS, Integer.toString(poolIoWorkerThreads));
179 return this;
180 }
181
182
183
184
185 public PropertiesBuilder limitUserThreadsTo(int poolIoWorkerThreads) {
186 properties.setProperty(PROPERTY_USER_THREADS, Integer.toString(poolIoWorkerThreads));
187 return this;
188 }
189
190
191
192
193 public PropertiesBuilder limitConnectionsTo(int connectionLimit) {
194 properties.setProperty(PROPERTY_MAX_CONNECTIONS_PER_CONTEXT, Integer.toString(connectionLimit));
195 return this;
196 }
197
198
199
200
201 public PropertiesBuilder limitConnectionsPerHostTo(int connectionLimit) {
202 properties.setProperty(PROPERTY_MAX_CONNECTIONS_PER_HOST, Integer.toString(connectionLimit));
203 return this;
204 }
205
206 protected final Properties properties;
207
208 public PropertiesBuilder() {
209 this.properties = defaultProperties();
210 }
211
212 protected Properties defaultProperties() {
213 Properties props = new Properties();
214 props.setProperty(PROPERTY_ISO3166_CODES, "");
215 props.setProperty(PROPERTY_MAX_CONNECTIONS_PER_CONTEXT, 20 + "");
216 props.setProperty(PROPERTY_MAX_CONNECTIONS_PER_HOST, 0 + "");
217 props.setProperty(PROPERTY_SO_TIMEOUT, 60000 + "");
218 props.setProperty(PROPERTY_CONNECTION_TIMEOUT, 60000 + "");
219 props.setProperty(PROPERTY_IO_WORKER_THREADS, 20 + "");
220 props.setProperty(PROPERTY_USER_THREADS, 0 + "");
221 props.setProperty(PROPERTY_MAX_CONNECTION_REUSE, 75 + "");
222 props.setProperty(PROPERTY_MAX_SESSION_FAILURES, 2 + "");
223 props.setProperty(PROPERTY_SESSION_INTERVAL, 60 + "");
224 return props;
225 }
226
227 public PropertiesBuilder(Properties properties) {
228 this();
229 this.properties.putAll(properties);
230 }
231
232 public PropertiesBuilder provider(String providerName) {
233 properties.setProperty(PROPERTY_PROVIDER, providerName);
234 return this;
235 }
236
237 public PropertiesBuilder endpoint(String endpoint) {
238 properties.setProperty(PROPERTY_ENDPOINT, endpoint);
239 return this;
240 }
241
242 public PropertiesBuilder iso3166Codes(Iterable<String> codes) {
243 properties.setProperty(PROPERTY_ISO3166_CODES, Joiner.on(',').join(codes));
244 return this;
245 }
246
247 public PropertiesBuilder apiVersion(String apiVersion) {
248 properties.setProperty(PROPERTY_API_VERSION, apiVersion);
249 return this;
250 }
251
252 public PropertiesBuilder credentials(String identity, @Nullable String credential) {
253 properties.setProperty(PROPERTY_IDENTITY, identity);
254 if (credential != null)
255 properties.setProperty(PROPERTY_CREDENTIAL, credential);
256 return this;
257 }
258
259 public PropertiesBuilder sessionInterval(long seconds) {
260 properties.setProperty(PROPERTY_SESSION_INTERVAL, seconds + "");
261 return this;
262 }
263
264 @VisibleForTesting
265 public Properties build() {
266 return properties;
267 }
268 }