Skip to content

Commit f21a574

Browse files
author
mpv1989
committed
Add http support
1 parent 228a6cd commit f21a574

24 files changed

+835
-67
lines changed

pom.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>com.arangodb</groupId>
66
<artifactId>arangodb-java-driver</artifactId>
7-
<version>4.1.13-SNAPSHOT</version>
7+
<version>4.2.0-SNAPSHOT</version>
88
<inceptionYear>2016</inceptionYear>
99
<packaging>jar</packaging>
1010

@@ -27,6 +27,7 @@
2727
<logback-classic.version>1.1.3</logback-classic.version>
2828
<hamcrest-all.version>1.3</hamcrest-all.version>
2929
<junit.version>4.12</junit.version>
30+
<httpclient.version>4.5.1</httpclient.version>
3031
<arangodb.velocypack.version>1.0.5</arangodb.velocypack.version>
3132
</properties>
3233

@@ -204,6 +205,11 @@
204205
</build>
205206

206207
<dependencies>
208+
<dependency>
209+
<groupId>org.apache.httpcomponents</groupId>
210+
<artifactId>httpclient</artifactId>
211+
<scope>provided</scope>
212+
</dependency>
207213
<dependency>
208214
<groupId>com.arangodb</groupId>
209215
<artifactId>velocypack</artifactId>
@@ -235,6 +241,11 @@
235241

236242
<dependencyManagement>
237243
<dependencies>
244+
<dependency>
245+
<groupId>org.apache.httpcomponents</groupId>
246+
<artifactId>httpclient</artifactId>
247+
<version>${httpclient.version}</version>
248+
</dependency>
238249
<dependency>
239250
<groupId>com.arangodb</groupId>
240251
<artifactId>velocypack</artifactId>

src/main/java/com/arangodb/ArangoCollection.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import com.arangodb.model.HashIndexOptions;
5151
import com.arangodb.model.PersistentIndexOptions;
5252
import com.arangodb.model.SkiplistIndexOptions;
53+
import com.arangodb.velocypack.VPackSlice;
5354
import com.arangodb.velocystream.Response;
5455

5556
/**
@@ -522,7 +523,7 @@ public Boolean documentExists(final String key) {
522523
*/
523524
public Boolean documentExists(final String key, final DocumentExistsOptions options) {
524525
try {
525-
executor.communication().execute(documentExistsRequest(key, options));
526+
executor.execute(documentExistsRequest(key, options), VPackSlice.class);
526527
return true;
527528
} catch (final ArangoDBException e) {
528529
return false;

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

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,27 @@
4040
import com.arangodb.internal.ArangoExecutorSync;
4141
import com.arangodb.internal.CollectionCache;
4242
import com.arangodb.internal.CollectionCache.DBAccess;
43+
import com.arangodb.internal.CommunicationProtocol;
4344
import com.arangodb.internal.DocumentCache;
4445
import com.arangodb.internal.InternalArangoDB;
46+
import com.arangodb.internal.http.HttpCommunication;
47+
import com.arangodb.internal.http.HttpProtocol;
4548
import com.arangodb.internal.util.ArangoDeserializerImpl;
4649
import com.arangodb.internal.util.ArangoSerializerImpl;
4750
import com.arangodb.internal.util.ArangoUtilImpl;
4851
import com.arangodb.internal.velocypack.VPackDocumentModule;
4952
import com.arangodb.internal.velocypack.VPackDriverModule;
50-
import com.arangodb.internal.velocystream.Communication;
5153
import com.arangodb.internal.velocystream.CommunicationSync;
5254
import com.arangodb.internal.velocystream.ConnectionSync;
5355
import com.arangodb.internal.velocystream.DefaultHostHandler;
5456
import com.arangodb.internal.velocystream.Host;
57+
import com.arangodb.internal.velocystream.VelocyStreamProtocol;
5558
import com.arangodb.model.LogOptions;
5659
import com.arangodb.model.UserCreateOptions;
5760
import com.arangodb.model.UserUpdateOptions;
5861
import com.arangodb.util.ArangoDeserializer;
59-
import com.arangodb.util.ArangoSerializer;
6062
import com.arangodb.util.ArangoSerialization;
63+
import com.arangodb.util.ArangoSerializer;
6164
import com.arangodb.velocypack.VPack;
6265
import com.arangodb.velocypack.VPackAnnotationFieldFilter;
6366
import com.arangodb.velocypack.VPackAnnotationFieldNaming;
@@ -95,6 +98,7 @@ public static class Builder {
9598
private final VPackParser.Builder vpackParserBuilder;
9699
private ArangoSerializer serializer;
97100
private ArangoDeserializer deserializer;
101+
private Protocol protocol;
98102

99103
public Builder() {
100104
super();
@@ -202,6 +206,11 @@ public Builder maxConnections(final Integer maxConnections) {
202206
return this;
203207
}
204208

209+
public Builder useProtocol(final Protocol protocol) {
210+
this.protocol = protocol;
211+
return this;
212+
}
213+
205214
public <T> Builder registerSerializer(final Class<T> clazz, final VPackSerializer<T> serializer) {
206215
vpackBuilder.registerSerializer(clazz, serializer);
207216
return this;
@@ -340,31 +349,56 @@ public synchronized ArangoDB build() {
340349
new CommunicationSync.Builder(new DefaultHostHandler(new ArrayList<Host>(hosts))).timeout(timeout)
341350
.user(user).password(password).useSsl(useSsl).sslContext(sslContext).chunksize(chunksize)
342351
.maxConnections(maxConnections),
343-
new ArangoUtilImpl(serializerTemp, deserializerTemp), collectionCache);
352+
new HttpCommunication.Builder(new DefaultHostHandler(new ArrayList<Host>(hosts))).timeout(timeout)
353+
.user(user).password(password).useSsl(useSsl).sslContext(sslContext),
354+
new ArangoUtilImpl(serializerTemp, deserializerTemp), collectionCache, protocol);
344355
}
345356

346357
}
347358

348-
public ArangoDB(final CommunicationSync.Builder commBuilder, final ArangoSerialization util,
349-
final CollectionCache collectionCache) {
350-
super(new ArangoExecutorSync(commBuilder.build(util, collectionCache), util, new DocumentCache(),
351-
collectionCache), util);
352-
final Communication<Response, ConnectionSync> cacheCom = commBuilder.build(util, collectionCache);
359+
public ArangoDB(final CommunicationSync.Builder vstBuilder, final HttpCommunication.Builder httpBuilder,
360+
final ArangoSerialization util, final CollectionCache collectionCache, final Protocol protocol) {
361+
super(new ArangoExecutorSync(createProtocol(vstBuilder, httpBuilder, util, collectionCache, protocol), util,
362+
new DocumentCache()), util);
363+
final CommunicationProtocol cp = createProtocol(vstBuilder, httpBuilder, util, collectionCache, protocol);
353364
collectionCache.init(new DBAccess() {
354365
@Override
355366
public ArangoDatabase db(final String name) {
356-
return new ArangoDatabase(cacheCom, util, executor.documentCache(), null, name);
367+
return new ArangoDatabase(cp, util, executor.documentCache(), name);
357368
}
358369
});
359370
}
360371

372+
private static CommunicationProtocol createProtocol(
373+
final CommunicationSync.Builder vstBuilder,
374+
final HttpCommunication.Builder httpBuilder,
375+
final ArangoSerialization util,
376+
final CollectionCache collectionCache,
377+
final Protocol protocol) {
378+
return (protocol == null || Protocol.VST == protocol) ? createVST(vstBuilder, util, collectionCache)
379+
: createHTTP(httpBuilder, util);
380+
}
381+
382+
private static CommunicationProtocol createVST(
383+
final CommunicationSync.Builder builder,
384+
final ArangoSerialization util,
385+
final CollectionCache collectionCache) {
386+
return new VelocyStreamProtocol(builder.build(util, collectionCache));
387+
}
388+
389+
private static CommunicationProtocol createHTTP(
390+
final HttpCommunication.Builder builder,
391+
final ArangoSerialization util) {
392+
return new HttpProtocol(builder.build(util));
393+
}
394+
361395
@Override
362396
protected ArangoExecutorSync executor() {
363397
return executor;
364398
}
365399

366400
public void shutdown() {
367-
executor.communication().disconnect();
401+
executor.disconnect();
368402
}
369403

370404
/**

src/main/java/com/arangodb/ArangoDatabase.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,9 @@
3939
import com.arangodb.entity.TraversalEntity;
4040
import com.arangodb.internal.ArangoCursorExecute;
4141
import com.arangodb.internal.ArangoExecutorSync;
42-
import com.arangodb.internal.CollectionCache;
42+
import com.arangodb.internal.CommunicationProtocol;
4343
import com.arangodb.internal.DocumentCache;
4444
import com.arangodb.internal.InternalArangoDatabase;
45-
import com.arangodb.internal.velocystream.Communication;
4645
import com.arangodb.internal.velocystream.ConnectionSync;
4746
import com.arangodb.model.AqlFunctionCreateOptions;
4847
import com.arangodb.model.AqlFunctionDeleteOptions;
@@ -70,9 +69,9 @@ protected ArangoDatabase(final ArangoDB arangoDB, final String name) {
7069
super(arangoDB, arangoDB.executor(), arangoDB.util(), name);
7170
}
7271

73-
protected ArangoDatabase(final Communication<Response, ConnectionSync> communication, final ArangoSerialization util,
74-
final DocumentCache documentCache, final CollectionCache collectionCache, final String name) {
75-
super(null, new ArangoExecutorSync(communication, util, documentCache, collectionCache), util, name);
72+
protected ArangoDatabase(final CommunicationProtocol protocol, final ArangoSerialization util,
73+
final DocumentCache documentCache, final String name) {
74+
super(null, new ArangoExecutorSync(protocol, util, documentCache), util, name);
7675
}
7776

7877
/**
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* DISCLAIMER
3+
*
4+
* Copyright 2016 ArangoDB GmbH, Cologne, Germany
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*
18+
* Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
*/
20+
21+
package com.arangodb;
22+
23+
/**
24+
* @author Mark - mark at arangodb.com
25+
*
26+
*/
27+
public enum Protocol {
28+
VST, HTTP
29+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* @author Mark - mark at arangodb.com
2828
*
2929
*/
30-
public abstract class ArangoExecuteable<E extends ArangoExecutor<R, C>, R, C extends Connection> {
30+
public abstract class ArangoExecuteable<E extends ArangoExecutor, R, C extends Connection> {
3131

3232
protected final E executor;
3333
private final ArangoSerialization util;

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

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,13 @@
2222

2323
import java.io.UnsupportedEncodingException;
2424
import java.lang.reflect.Type;
25-
import java.net.URLEncoder;
2625
import java.util.Map;
2726
import java.util.regex.Pattern;
2827

2928
import com.arangodb.ArangoDBException;
30-
import com.arangodb.internal.velocystream.Communication;
31-
import com.arangodb.internal.velocystream.Connection;
32-
import com.arangodb.util.ArangoSerializer;
29+
import com.arangodb.internal.util.EncodeUtils;
3330
import com.arangodb.util.ArangoSerialization;
31+
import com.arangodb.util.ArangoSerializer;
3432
import com.arangodb.velocypack.VPackSlice;
3533
import com.arangodb.velocypack.exception.VPackException;
3634
import com.arangodb.velocystream.Response;
@@ -39,7 +37,7 @@
3937
* @author Mark - mark at arangodb.com
4038
*
4139
*/
42-
public abstract class ArangoExecutor<R, C extends Connection> {
40+
public abstract class ArangoExecutor {
4341

4442
private static final String SLASH = "/";
4543

@@ -50,32 +48,19 @@ public static interface ResponseDeserializer<T> {
5048
protected static final String REGEX_KEY = "[^/]+";
5149
protected static final String REGEX_ID = "[^/]+/[^/]+";
5250

53-
private final Communication<R, C> communication;
5451
private final DocumentCache documentCache;
55-
private final CollectionCache collectionCache;
5652
private final ArangoSerialization util;
5753

58-
protected ArangoExecutor(final Communication<R, C> communication, final ArangoSerialization util,
59-
final DocumentCache documentCache, final CollectionCache collectionCache) {
54+
protected ArangoExecutor(final ArangoSerialization util, final DocumentCache documentCache) {
6055
super();
61-
this.communication = communication;
6256
this.documentCache = documentCache;
63-
this.collectionCache = collectionCache;
6457
this.util = util;
6558
}
6659

67-
public Communication<R, C> communication() {
68-
return communication;
69-
}
70-
7160
public DocumentCache documentCache() {
7261
return documentCache;
7362
}
7463

75-
protected CollectionCache collectionCache() {
76-
return collectionCache;
77-
}
78-
7964
protected ArangoSerialization util() {
8065
return util;
8166
}
@@ -91,7 +76,7 @@ protected String createPath(final String... params) {
9176
if (params[i].contains(SLASH)) {
9277
param = createPath(params[i].split(SLASH));
9378
} else {
94-
param = encode(params[i]);
79+
param = EncodeUtils.encodeURL(params[i]);
9580
}
9681
sb.append(param);
9782
} catch (final UnsupportedEncodingException e) {
@@ -101,11 +86,6 @@ protected String createPath(final String... params) {
10186
return sb.toString();
10287
}
10388

104-
private String encode(final String value) throws UnsupportedEncodingException {
105-
return URLEncoder.encode(value, "UTF-8").replaceAll("\\+", "%20").replaceAll("\\%21", "!")
106-
.replaceAll("\\%27", "'").replaceAll("\\%28", "(").replaceAll("\\%29", ")").replaceAll("\\%7E", "~");
107-
}
108-
10989
public void validateIndexId(final String id) {
11090
validateName("index id", REGEX_ID, id);
11191
}

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020

2121
package com.arangodb.internal;
2222

23+
import java.io.IOException;
2324
import java.lang.reflect.Type;
2425

2526
import com.arangodb.ArangoDBException;
26-
import com.arangodb.internal.velocystream.Communication;
27-
import com.arangodb.internal.velocystream.ConnectionSync;
2827
import com.arangodb.util.ArangoSerialization;
2928
import com.arangodb.velocypack.exception.VPackException;
3029
import com.arangodb.velocystream.Request;
@@ -34,11 +33,14 @@
3433
* @author Mark - mark at arangodb.com
3534
*
3635
*/
37-
public class ArangoExecutorSync extends ArangoExecutor<Response, ConnectionSync> {
36+
public class ArangoExecutorSync extends ArangoExecutor {
3837

39-
public ArangoExecutorSync(final Communication<Response, ConnectionSync> communication, final ArangoSerialization util,
40-
final DocumentCache documentCache, final CollectionCache collectionCache) {
41-
super(communication, util, documentCache, collectionCache);
38+
private final CommunicationProtocol protocol;
39+
40+
public ArangoExecutorSync(final CommunicationProtocol protocol, final ArangoSerialization util,
41+
final DocumentCache documentCache) {
42+
super(util, documentCache);
43+
this.protocol = protocol;
4244
}
4345

4446
public <T> T execute(final Request request, final Type type) throws ArangoDBException {
@@ -53,10 +55,18 @@ public T deserialize(final Response response) throws VPackException {
5355
public <T> T execute(final Request request, final ResponseDeserializer<T> responseDeserializer)
5456
throws ArangoDBException {
5557
try {
56-
final Response response = communication().execute(request);
58+
final Response response = protocol.execute(request);
5759
return responseDeserializer.deserialize(response);
5860
} catch (final VPackException e) {
5961
throw new ArangoDBException(e);
6062
}
6163
}
64+
65+
public void disconnect() {
66+
try {
67+
protocol.close();
68+
} catch (final IOException e) {
69+
throw new ArangoDBException(e);
70+
}
71+
}
6272
}

0 commit comments

Comments
 (0)