Skip to content

Commit 33c5658

Browse files
authored
Merge pull request #261 from arangodb/feature/refactor-extendedhostresolver
Feature/refactor extendedhostresolver
2 parents b0ccec4 + 6640791 commit 33c5658

18 files changed

+296
-104
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
88

99
### Fixed
1010

11+
- add arangodb.httpCookieSpec
1112
- host handling (issue #241)
1213
- logging extended hostresolver
1314

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<arangodb.velocypack.version>1.4.1</arangodb.velocypack.version>
2828

2929
<!-- provided -->
30-
<httpclient.version>4.5.7</httpclient.version>
30+
<httpclient.version>4.5.8</httpclient.version>
3131

3232
<!-- test -->
3333
<logback-classic.version>1.1.3</logback-classic.version>
@@ -278,7 +278,7 @@
278278
<dependency>
279279
<groupId>commons-codec</groupId>
280280
<artifactId>commons-codec</artifactId>
281-
<version>1.11</version>
281+
<version>1.12</version>
282282
</dependency>
283283
<dependency>
284284
<groupId>commons-logging</groupId>

src/main/java/com/arangodb/ArangoDB.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,11 +611,12 @@ public synchronized ArangoDB build() {
611611
final ConnectionFactory connectionFactory = (protocol == null || Protocol.VST == protocol)
612612
? new VstConnectionFactorySync(host, timeout, connectionTtl, useSsl, sslContext)
613613
: new HttpConnectionFactory(timeout, user, password, useSsl, sslContext, custom, protocol,
614-
connectionTtl);
614+
connectionTtl, httpCookieSpec);
615615

616616
final Collection<Host> hostList = createHostList(max, connectionFactory);
617617
final HostResolver hostResolver = createHostResolver(hostList, max, connectionFactory);
618618
final HostHandler hostHandler = createHostHandler(hostResolver);
619+
619620
return new ArangoDBImpl(
620621
new VstCommunicationSync.Builder(hostHandler).timeout(timeout).user(user).password(password)
621622
.useSsl(useSsl).sslContext(sslContext).chunksize(chunksize).maxConnections(maxConnections)

src/main/java/com/arangodb/internal/ArangoDBImpl.java

Lines changed: 24 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
package com.arangodb.internal;
2222

2323
import java.io.IOException;
24-
import java.util.ArrayList;
2524
import java.util.Collection;
26-
import java.util.Collections;
27-
import java.util.Map;
25+
26+
import org.slf4j.Logger;
27+
import org.slf4j.LoggerFactory;
2828

2929
import com.arangodb.ArangoDB;
3030
import com.arangodb.ArangoDBException;
@@ -42,7 +42,6 @@
4242
import com.arangodb.internal.net.CommunicationProtocol;
4343
import com.arangodb.internal.net.HostHandle;
4444
import com.arangodb.internal.net.HostResolver;
45-
import com.arangodb.internal.net.HostResolver.EndpointResolver;
4645
import com.arangodb.internal.util.ArangoSerializationFactory;
4746
import com.arangodb.internal.util.ArangoSerializationFactory.Serializer;
4847
import com.arangodb.internal.velocystream.VstCommunicationSync;
@@ -52,10 +51,8 @@
5251
import com.arangodb.model.UserUpdateOptions;
5352
import com.arangodb.util.ArangoCursorInitializer;
5453
import com.arangodb.util.ArangoSerialization;
55-
import com.arangodb.velocypack.VPackSlice;
5654
import com.arangodb.velocypack.exception.VPackException;
5755
import com.arangodb.velocystream.Request;
58-
import com.arangodb.velocystream.RequestType;
5956
import com.arangodb.velocystream.Response;
6057

6158
/**
@@ -64,65 +61,41 @@
6461
*
6562
*/
6663
public class ArangoDBImpl extends InternalArangoDB<ArangoExecutorSync> implements ArangoDB {
64+
65+
private static final Logger LOGGER = LoggerFactory.getLogger(ArangoDBImpl.class);
6766

6867
private ArangoCursorInitializer cursorInitializer;
6968
private CommunicationProtocol cp;
7069

7170
public ArangoDBImpl(final VstCommunicationSync.Builder vstBuilder, final HttpCommunication.Builder httpBuilder,
7271
final ArangoSerializationFactory util, final Protocol protocol, final HostResolver hostResolver,
7372
final ArangoContext context) {
74-
super(new ArangoExecutorSync(createProtocol(vstBuilder, httpBuilder, util.get(Serializer.INTERNAL), protocol),
75-
util, new DocumentCache()), util, context);
76-
cp = createProtocol(new VstCommunicationSync.Builder(vstBuilder).maxConnections(1),
77-
new HttpCommunication.Builder(httpBuilder), util.get(Serializer.INTERNAL), protocol);
78-
hostResolver.init(new EndpointResolver() {
79-
@Override
80-
public Collection<String> resolve(final boolean closeConnections) throws ArangoDBException {
81-
Collection<String> response;
82-
try {
83-
response = executor.execute(new Request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_ENDPOINTS),
84-
new ResponseDeserializer<Collection<String>>() {
85-
@Override
86-
public Collection<String> deserialize(final Response response) throws VPackException {
87-
final VPackSlice field = response.getBody().get("endpoints");
88-
Collection<String> endpoints;
89-
if (field.isNone()) {
90-
endpoints = Collections.<String> emptyList();
91-
} else {
92-
final Collection<Map<String, String>> tmp = util().deserialize(field,
93-
Collection.class);
94-
endpoints = new ArrayList<String>();
95-
for (final Map<String, String> map : tmp) {
96-
for (final String value : map.values()) {
97-
endpoints.add(value);
98-
}
99-
}
100-
}
101-
return endpoints;
102-
}
103-
}, null);
104-
} catch (final ArangoDBException e) {
105-
final Integer responseCode = e.getResponseCode();
106-
if (responseCode != null && responseCode == 403) {
107-
response = Collections.<String> emptyList();
108-
} else {
109-
throw e;
110-
}
111-
} finally {
112-
if (closeConnections) {
113-
ArangoDBImpl.this.shutdown();
114-
}
115-
}
116-
return response;
117-
}
118-
});
73+
74+
super(new ArangoExecutorSync(
75+
createProtocol(vstBuilder, httpBuilder, util.get(Serializer.INTERNAL), protocol),
76+
util,
77+
new DocumentCache()),
78+
util,
79+
context);
80+
81+
cp = createProtocol(
82+
new VstCommunicationSync.Builder(vstBuilder).maxConnections(1),
83+
new HttpCommunication.Builder(httpBuilder),
84+
util.get(Serializer.INTERNAL),
85+
protocol);
86+
87+
hostResolver.init(this.executor(), util());
88+
89+
LOGGER.info("ArangoDB Client is ready to use");
90+
11991
}
12092

12193
private static CommunicationProtocol createProtocol(
12294
final VstCommunicationSync.Builder vstBuilder,
12395
final HttpCommunication.Builder httpBuilder,
12496
final ArangoSerialization util,
12597
final Protocol protocol) {
98+
12699
return (protocol == null || Protocol.VST == protocol) ? createVST(vstBuilder, util)
127100
: createHTTP(httpBuilder, util);
128101
}

src/main/java/com/arangodb/internal/ArangoDefaults.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ private ArangoDefaults() {
4949
public static final int MAX_CONNECTIONS_HTTP_DEFAULT = 20;
5050
public static final Protocol DEFAULT_NETWORK_PROTOCOL = Protocol.VST;
5151
public static final boolean DEFAULT_ACQUIRE_HOST_LIST = false;
52+
public static final int DEFAULT_ACQUIRE_HOST_LIST_INTERVAL = 60 * 60 * 1000; // hour
5253
public static final LoadBalancingStrategy DEFAULT_LOAD_BALANCING_STRATEGY = LoadBalancingStrategy.NONE;
5354

5455
}

src/main/java/com/arangodb/internal/InternalArangoDB.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public abstract class InternalArangoDB<E extends ArangoExecutor> extends ArangoE
5454
private static final String PATH_API_ADMIN_LOG = "/_admin/log";
5555
private static final String PATH_API_ADMIN_LOG_LEVEL = "/_admin/log/level";
5656
private static final String PATH_API_ROLE = "/_admin/server/role";
57-
protected static final String PATH_ENDPOINTS = "/_api/cluster/endpoints";
57+
private static final String PATH_ENDPOINTS = "/_api/cluster/endpoints";
5858
private static final String PATH_API_USER = "/_api/user";
5959

6060
protected InternalArangoDB(final E executor, final ArangoSerializationFactory util, final ArangoContext context) {

src/main/java/com/arangodb/internal/InternalArangoDBBuilder.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,14 @@
5555
import com.arangodb.velocypack.VPack;
5656
import com.arangodb.velocypack.VPackParser;
5757

58+
5859
/**
5960
* @author Mark Vollmary
6061
*
6162
*/
6263
public abstract class InternalArangoDBBuilder {
6364

64-
private static final Logger LOGGER = LoggerFactory.getLogger(InternalArangoDBBuilder.class);
65+
private static final Logger LOG = LoggerFactory.getLogger(InternalArangoDBBuilder.class);
6566

6667
private static final String PROPERTY_KEY_HOSTS = "arangodb.hosts";
6768
private static final String PROPERTY_KEY_HOST = "arangodb.host";
@@ -70,10 +71,12 @@ public abstract class InternalArangoDBBuilder {
7071
private static final String PROPERTY_KEY_USER = "arangodb.user";
7172
private static final String PROPERTY_KEY_PASSWORD = "arangodb.password";
7273
private static final String PROPERTY_KEY_USE_SSL = "arangodb.usessl";
74+
private static final String PROPERTY_KEY_COOKIE_SPEC = "arangodb.httpCookieSpec";
7375
private static final String PROPERTY_KEY_V_STREAM_CHUNK_CONTENT_SIZE = "arangodb.chunksize";
7476
private static final String PROPERTY_KEY_MAX_CONNECTIONS = "arangodb.connections.max";
7577
private static final String PROPERTY_KEY_CONNECTION_TTL = "arangodb.connections.ttl";
7678
private static final String PROPERTY_KEY_ACQUIRE_HOST_LIST = "arangodb.acquireHostList";
79+
private static final String PROPERTY_KEY_ACQUIRE_HOST_LIST_INTERVAL = "arangodb.acquireHostList.interval";
7780
private static final String PROPERTY_KEY_LOAD_BALANCING_STRATEGY = "arangodb.loadBalancingStrategy";
7881
private static final String DEFAULT_PROPERTY_FILE = "/arangodb.properties";
7982

@@ -83,6 +86,7 @@ public abstract class InternalArangoDBBuilder {
8386
protected String user;
8487
protected String password;
8588
protected Boolean useSsl;
89+
protected String httpCookieSpec;
8690
protected SSLContext sslContext;
8791
protected Integer chunksize;
8892
protected Integer maxConnections;
@@ -92,9 +96,12 @@ public abstract class InternalArangoDBBuilder {
9296
protected ArangoSerializer serializer;
9397
protected ArangoDeserializer deserializer;
9498
protected Boolean acquireHostList;
99+
protected Integer acquireHostListInterval;
95100
protected LoadBalancingStrategy loadBalancingStrategy;
96101
protected ArangoSerialization customSerializer;
97102

103+
104+
98105
public InternalArangoDBBuilder() {
99106
super();
100107
vpackBuilder = new VPack.Builder();
@@ -129,10 +136,12 @@ protected void loadProperties(final Properties properties) {
129136
user = loadUser(properties, user);
130137
password = loadPassword(properties, password);
131138
useSsl = loadUseSsl(properties, useSsl);
139+
httpCookieSpec = loadhttpCookieSpec(properties, useSsl);
132140
chunksize = loadChunkSize(properties, chunksize);
133141
maxConnections = loadMaxConnections(properties, maxConnections);
134142
connectionTtl = loadConnectionTtl(properties, connectionTtl);
135143
acquireHostList = loadAcquireHostList(properties, acquireHostList);
144+
acquireHostListInterval = loadAcquireHostListInterval(properties, acquireHostListInterval);
136145
loadBalancingStrategy = loadLoadBalancingStrategy(properties, loadBalancingStrategy);
137146
}
138147

@@ -195,17 +204,19 @@ protected void setSerializer(final ArangoSerialization serializer) {
195204
protected HostResolver createHostResolver(final Collection<Host> hosts, final int maxConnections,final ConnectionFactory connectionFactory) {
196205

197206
if(acquireHostList) {
198-
LOGGER.debug("acquireHostList -> Use ExtendedHostResolver");
199-
return new ExtendedHostResolver(new ArrayList<Host>(hosts), maxConnections, connectionFactory);
207+
LOG.debug("acquireHostList -> Use ExtendedHostResolver");
208+
return new ExtendedHostResolver(new ArrayList<Host>(hosts), maxConnections, connectionFactory, acquireHostListInterval);
200209
} else {
201-
LOGGER.debug("Use SimpleHostResolver");
210+
LOG.debug("Use SimpleHostResolver");
202211
return new SimpleHostResolver(new ArrayList<Host>(hosts));
203212
}
204213

205214
}
206215

207216
protected HostHandler createHostHandler(final HostResolver hostResolver) {
217+
208218
final HostHandler hostHandler;
219+
209220
if (loadBalancingStrategy != null) {
210221
switch (loadBalancingStrategy) {
211222
case ONE_RANDOM:
@@ -222,6 +233,9 @@ protected HostHandler createHostHandler(final HostResolver hostResolver) {
222233
} else {
223234
hostHandler = new FallbackHostHandler(hostResolver);
224235
}
236+
237+
LOG.info("HostHandler is " + hostHandler.getClass().getSimpleName());
238+
225239
return new DirtyReadHostHandler(hostHandler, new RoundRobinHostHandler(hostResolver));
226240
}
227241

@@ -273,6 +287,10 @@ private static Boolean loadUseSsl(final Properties properties, final Boolean cur
273287
return Boolean.parseBoolean(
274288
getProperty(properties, PROPERTY_KEY_USE_SSL, currentValue, ArangoDefaults.DEFAULT_USE_SSL));
275289
}
290+
291+
private static String loadhttpCookieSpec(final Properties properties, final Boolean currentValue) {
292+
return getProperty(properties, PROPERTY_KEY_COOKIE_SPEC, currentValue, "");
293+
}
276294

277295
private static Integer loadChunkSize(final Properties properties, final Integer currentValue) {
278296
return Integer.parseInt(getProperty(properties, PROPERTY_KEY_V_STREAM_CHUNK_CONTENT_SIZE, currentValue,
@@ -295,6 +313,11 @@ private static Boolean loadAcquireHostList(final Properties properties, final Bo
295313
ArangoDefaults.DEFAULT_ACQUIRE_HOST_LIST));
296314
}
297315

316+
private static int loadAcquireHostListInterval(final Properties properties, final Integer currentValue) {
317+
return Integer.parseInt(getProperty(properties, PROPERTY_KEY_ACQUIRE_HOST_LIST_INTERVAL, currentValue,
318+
ArangoDefaults.DEFAULT_ACQUIRE_HOST_LIST_INTERVAL));
319+
}
320+
298321
private static LoadBalancingStrategy loadLoadBalancingStrategy(
299322
final Properties properties,
300323
final LoadBalancingStrategy currentValue) {

src/main/java/com/arangodb/internal/http/HttpConnection.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public static class Builder {
101101
private String password;
102102
private ArangoSerialization util;
103103
private Boolean useSsl;
104+
private String httpCookieSpec;
104105
private Protocol contentType;
105106
private HostDescription host;
106107
private Long ttl;
@@ -126,6 +127,11 @@ public Builder useSsl(final Boolean useSsl) {
126127
this.useSsl = useSsl;
127128
return this;
128129
}
130+
131+
public Builder httpCookieSpec(String httpCookieSpec) {
132+
this.httpCookieSpec = httpCookieSpec;
133+
return this;
134+
}
129135

130136
public Builder contentType(final Protocol contentType) {
131137
this.contentType = contentType;
@@ -153,7 +159,7 @@ public Builder timeout(final Integer timeout) {
153159
}
154160

155161
public HttpConnection build() {
156-
return new HttpConnection(host, timeout, user, password, useSsl, sslContext, util, contentType, ttl);
162+
return new HttpConnection(host, timeout, user, password, useSsl, sslContext, util, contentType, ttl, httpCookieSpec);
157163
}
158164
}
159165

@@ -168,7 +174,7 @@ public HttpConnection build() {
168174

169175
private HttpConnection(final HostDescription host, final Integer timeout, final String user, final String password,
170176
final Boolean useSsl, final SSLContext sslContext, final ArangoSerialization util, final Protocol contentType,
171-
final Long ttl) {
177+
final Long ttl, final String httpCookieSpec) {
172178
super();
173179
this.host = host;
174180
this.user = user;
@@ -196,6 +202,11 @@ private HttpConnection(final HostDescription host, final Integer timeout, final
196202
requestConfig.setConnectionRequestTimeout(timeout);
197203
requestConfig.setSocketTimeout(timeout);
198204
}
205+
206+
if (httpCookieSpec != null && httpCookieSpec.length() > 1) {
207+
requestConfig.setCookieSpec(httpCookieSpec);
208+
}
209+
199210
final ConnectionKeepAliveStrategy keepAliveStrategy = new ConnectionKeepAliveStrategy() {
200211
@Override
201212
public long getKeepAliveDuration(final HttpResponse response, final HttpContext context) {

src/main/java/com/arangodb/internal/http/HttpConnectionFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ public class HttpConnectionFactory implements ConnectionFactory {
3838

3939
public HttpConnectionFactory(final Integer timeout, final String user, final String password, final Boolean useSsl,
4040
final SSLContext sslContext, final ArangoSerialization util, final Protocol protocol,
41-
final Long connectionTtl) {
41+
final Long connectionTtl, String httpCookieSpec) {
4242
super();
4343
builder = new HttpConnection.Builder().timeout(timeout).user(user).password(password).useSsl(useSsl)
44-
.sslContext(sslContext).serializationUtil(util).contentType(protocol).ttl(connectionTtl);
44+
.sslContext(sslContext).serializationUtil(util).contentType(protocol).ttl(connectionTtl).httpCookieSpec(httpCookieSpec);
4545

4646
}
4747

0 commit comments

Comments
 (0)