fieldNaming) {
+ vpackBuilder.annotationFieldNaming(type, fieldNaming);
+ return this;
+ }
+
+ /**
+ * Register a {@link VPackModule} to be used within the internal serialization process.
+ *
+ *
+ * Attention:can not be used together with {@link #serializer(ArangoSerialization)}
+ *
+ *
+ * @param module module to register
+ * @return {@link ArangoDBAsync.Builder}
+ */
+ public Builder registerModule(final VPackModule module) {
+ vpackBuilder.registerModule(module);
+ return this;
+ }
+
+ /**
+ * Register a list of {@link VPackModule} to be used within the internal serialization process.
+ *
+ *
+ * Attention:can not be used together with {@link #serializer(ArangoSerialization)}
+ *
+ *
+ * @param modules modules to register
+ * @return {@link ArangoDBAsync.Builder}
+ */
+ public Builder registerModules(final VPackModule... modules) {
+ vpackBuilder.registerModules(modules);
+ return this;
+ }
+
+ /**
+ * Register a {@link VPackParserModule} to be used within the internal serialization process.
+ *
+ *
+ * Attention:can not be used together with {@link #serializer(ArangoSerialization)}
+ *
+ *
+ * @param module module to register
+ * @return {@link ArangoDBAsync.Builder}
+ */
+ public Builder registerJsonModule(final VPackParserModule module) {
+ vpackParserBuilder.registerModule(module);
+ return this;
+ }
+
+ /**
+ * Register a list of {@link VPackParserModule} to be used within the internal serialization process.
+ *
+ *
+ * Attention:can not be used together with {@link #serializer(ArangoSerialization)}
+ *
+ *
+ * @param modules modules to register
+ * @return {@link ArangoDBAsync.Builder}
+ */
+ public Builder registerJsonModules(final VPackParserModule... modules) {
+ vpackParserBuilder.registerModules(modules);
+ return this;
+ }
+
+ /**
+ * Replace the built-in serializer with the given serializer.
+ *
+ *
+ * ATTENTION!: Use at your own risk
+ *
+ * @param serializer custom serializer
+ * @return {@link ArangoDBAsync.Builder}
+ * @deprecated use {@link #serializer(ArangoSerialization)} instead
+ */
+ @Deprecated
+ public Builder setSerializer(final ArangoSerializer serializer) {
+ serializer(serializer);
+ return this;
+ }
+
+ /**
+ * Replace the built-in deserializer with the given deserializer.
+ *
+ *
+ * ATTENTION!: Use at your own risk
+ *
+ * @param deserializer custom deserializer
+ * @return {@link ArangoDBAsync.Builder}
+ * @deprecated use {@link #serializer(ArangoSerialization)} instead
+ */
+ @Deprecated
+ public Builder setDeserializer(final ArangoDeserializer deserializer) {
+ deserializer(deserializer);
+ return this;
+ }
+
+ /**
+ * Replace the built-in serializer/deserializer with the given one.
+ *
+ *
+ * ATTENTION!: Any registered custom serializer/deserializer or module will be ignored.
+ *
+ * @param serialization custom serializer/deserializer
+ * @return {@link ArangoDBAsync.Builder}
+ */
+ public Builder serializer(final ArangoSerialization serialization) {
+ setSerializer(serialization);
+ return this;
+ }
+
+ /**
+ * Returns an instance of {@link ArangoDBAsync}.
+ *
+ * @return {@link ArangoDBAsync}
+ */
+ public synchronized ArangoDBAsync build() {
+ if (hosts.isEmpty()) {
+ hosts.add(host);
+ }
+ final VPack vpacker = vpackBuilder.serializeNullValues(false).build();
+ final VPack vpackerNull = vpackBuilder.serializeNullValues(true).build();
+ final VPackParser vpackParser = vpackParserBuilder.build();
+ final ArangoSerializer serializerTemp = serializer != null ? serializer
+ : new ArangoSerializerImpl(vpacker, vpackerNull, vpackParser);
+ final ArangoDeserializer deserializerTemp = deserializer != null ? deserializer
+ : new ArangoDeserializerImpl(vpackerNull, vpackParser);
+ final DefaultArangoSerialization internal = new DefaultArangoSerialization(serializerTemp,
+ deserializerTemp);
+ final ArangoSerialization custom = customSerializer != null ? customSerializer : internal;
+ final ArangoSerializationFactory util = new ArangoSerializationFactory(internal, custom);
+
+ final int max = maxConnections != null ? Math.max(1, maxConnections)
+ : ArangoDefaults.MAX_CONNECTIONS_VST_DEFAULT;
+ final ConnectionFactory connectionFactory = new VstConnectionFactoryAsync(host, timeout, connectionTtl,
+ useSsl, sslContext);
+ final HostResolver hostResolver = createHostResolver(createHostList(max, connectionFactory), max,
+ connectionFactory);
+ final HostHandler hostHandler = createHostHandler(hostResolver);
+ return new ArangoDBAsyncImpl(asyncBuilder(hostHandler), util, syncBuilder(hostHandler), hostResolver,
+ new ArangoContext());
+ }
+
+ private VstCommunicationAsync.Builder asyncBuilder(final HostHandler hostHandler) {
+ return new VstCommunicationAsync.Builder(hostHandler).timeout(timeout).user(user).password(password)
+ .useSsl(useSsl).sslContext(sslContext).chunksize(chunksize).maxConnections(maxConnections)
+ .connectionTtl(connectionTtl);
+ }
+
+ private VstCommunicationSync.Builder syncBuilder(final HostHandler hostHandler) {
+ return new VstCommunicationSync.Builder(hostHandler).timeout(timeout).user(user).password(password)
+ .useSsl(useSsl).sslContext(sslContext).chunksize(chunksize).maxConnections(maxConnections)
+ .connectionTtl(connectionTtl);
+ }
+
+ }
+}
diff --git a/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java b/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java
new file mode 100644
index 000000000..9a6c7a7c3
--- /dev/null
+++ b/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java
@@ -0,0 +1,748 @@
+/*
+ * DISCLAIMER
+ *
+ * Copyright 2016 ArangoDB GmbH, Cologne, Germany
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright holder is ArangoDB GmbH, Cologne, Germany
+ */
+
+package com.arangodb.async;
+
+import com.arangodb.ArangoDBException;
+import com.arangodb.ArangoSerializationAccessor;
+import com.arangodb.entity.*;
+import com.arangodb.entity.arangosearch.AnalyzerEntity;
+import com.arangodb.model.*;
+import com.arangodb.model.arangosearch.AnalyzerDeleteOptions;
+import com.arangodb.model.arangosearch.ArangoSearchCreateOptions;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Interface for operations on ArangoDB database level.
+ *
+ * @author Mark Vollmary
+ * @see Databases API Documentation
+ * @see Query API Documentation
+ */
+@SuppressWarnings("unused")
+public interface ArangoDatabaseAsync extends ArangoSerializationAccessor {
+
+ /**
+ * Return the main entry point for the ArangoDB driver
+ *
+ * @return main entry point
+ */
+ ArangoDBAsync arango();
+
+ /**
+ * Returns the name of the database
+ *
+ * @return database name
+ */
+ String name();
+
+ /**
+ * Returns the server name and version number.
+ *
+ * @return the server version, number
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getVersion();
+
+ /**
+ * Returns the name of the used storage engine.
+ *
+ * @return the storage engine name
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getEngine();
+
+ /**
+ * Checks whether the database exists
+ *
+ * @return true if the database exists, otherwise false
+ */
+ CompletableFuture exists();
+
+ /**
+ * Retrieves a list of all databases the current user can access
+ *
+ * @return a list of all databases the current user can access
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getAccessibleDatabases();
+
+ /**
+ * Returns a handler of the collection by the given name
+ *
+ * @param name Name of the collection
+ * @return collection handler
+ */
+ ArangoCollectionAsync collection(final String name);
+
+ /**
+ * Creates a collection
+ *
+ * @param name The name of the collection
+ * @return information about the collection
+ * @see API
+ * Documentation
+ */
+ CompletableFuture createCollection(final String name);
+
+ /**
+ * Creates a collection
+ *
+ * @param name The name of the collection
+ * @param options Additional options, can be null
+ * @return information about the collection
+ * @see API
+ * Documentation
+ */
+ CompletableFuture createCollection(final String name, final CollectionCreateOptions options);
+
+ /**
+ * Returns all collections
+ *
+ * @return list of information about all collections
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getCollections();
+
+ /**
+ * Returns all collections
+ *
+ * @param options Additional options, can be null
+ * @return list of information about all collections
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getCollections(final CollectionsReadOptions options);
+
+ /**
+ * Returns an index
+ *
+ * @param id The index-handle
+ * @return information about the index
+ * @see API Documentation
+ */
+ CompletableFuture getIndex(final String id);
+
+ /**
+ * Deletes an index
+ *
+ * @param id The index handle
+ * @return the id of the index
+ * @see API Documentation
+ */
+ CompletableFuture deleteIndex(final String id);
+
+ /**
+ * Creates the database
+ *
+ * @return true if the database was created successfully.
+ * @see API
+ * Documentation
+ */
+ CompletableFuture create();
+
+ /**
+ * Drop an existing database
+ *
+ * @return true if the database was dropped successfully
+ * @see API
+ * Documentation
+ */
+ CompletableFuture drop();
+
+ /**
+ * Grants access to the database dbname for user user. You need permission to the _system database in order to
+ * execute this call.
+ *
+ * @param user The name of the user
+ * @param permissions The permissions the user grant
+ * @return void
+ * @see
+ * API Documentation
+ */
+ CompletableFuture grantAccess(final String user, final Permissions permissions);
+
+ /**
+ * Grants access to the database dbname for user user. You need permission to the _system database in order to
+ * execute this call.
+ *
+ * @param user The name of the user
+ * @return void
+ * @see
+ * API Documentation
+ */
+ CompletableFuture grantAccess(final String user);
+
+ /**
+ * Revokes access to the database dbname for user user. You need permission to the _system database in order to
+ * execute this call.
+ *
+ * @param user The name of the user
+ * @return void
+ * @see
+ * API Documentation
+ */
+ CompletableFuture revokeAccess(final String user);
+
+ /**
+ * Clear the database access level, revert back to the default access level.
+ *
+ * @param user The name of the user
+ * @return void
+ * @see
+ * API Documentation
+ * @since ArangoDB 3.2.0
+ */
+ CompletableFuture resetAccess(final String user);
+
+ /**
+ * Sets the default access level for collections within this database for the user user
. You need
+ * permission to the _system database in order to execute this call.
+ *
+ * @param user The name of the user
+ * @param permissions The permissions the user grant
+ * @since ArangoDB 3.2.0
+ */
+ CompletableFuture grantDefaultCollectionAccess(final String user, final Permissions permissions);
+
+ /**
+ * Get specific database access level
+ *
+ * @param user The name of the user
+ * @return permissions of the user
+ * @see API
+ * Documentation
+ * @since ArangoDB 3.2.0
+ */
+ CompletableFuture getPermissions(final String user);
+
+ /**
+ * Performs a database query using the given {@code query} and {@code bindVars}, then returns a new
+ * {@code ArangoCursor} instance for the result list.
+ *
+ * @param query contains the query string to be executed
+ * @param bindVars key/value pairs representing the bind parameters
+ * @param options Additional options, can be null
+ * @param type The type of the result (POJO class, VPackSlice, String for Json, or Collection/List/Map)
+ * @return cursor of the results
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> query(
+ final String query,
+ final Map bindVars,
+ final AqlQueryOptions options,
+ final Class type);
+
+ /**
+ * Performs a database query using the given {@code query}, then returns a new {@code ArangoCursor} instance for the
+ * result list.
+ *
+ * @param query contains the query string to be executed
+ * @param options Additional options, can be null
+ * @param type The type of the result (POJO class, VPackSlice, String for Json, or Collection/List/Map)
+ * @return cursor of the results
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> query(
+ final String query,
+ final AqlQueryOptions options,
+ final Class type);
+
+ /**
+ * Performs a database query using the given {@code query} and {@code bindVars}, then returns a new
+ * {@code ArangoCursor} instance for the result list.
+ *
+ * @param query contains the query string to be executed
+ * @param bindVars key/value pairs representing the bind parameters
+ * @param type The type of the result (POJO class, VPackSlice, String for Json, or Collection/List/Map)
+ * @return cursor of the results
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> query(
+ final String query,
+ final Map bindVars,
+ final Class type);
+
+ /**
+ * Performs a database query using the given {@code query}, then returns a new {@code ArangoCursor} instance for the
+ * result list.
+ *
+ * @param query contains the query string to be executed
+ * @param type The type of the result (POJO class, VPackSlice, String for Json, or Collection/List/Map)
+ * @return cursor of the results
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> query(final String query, final Class type);
+
+ /**
+ * Return an cursor from the given cursor-ID if still existing
+ *
+ * @param cursorId The ID of the cursor
+ * @param type The type of the result (POJO class, VPackSlice, String for Json, or Collection/List/Map)
+ * @return cursor of the results
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> cursor(final String cursorId, final Class type);
+
+ /**
+ * Explain an AQL query and return information about it
+ *
+ * @param query the query which you want explained
+ * @param bindVars key/value pairs representing the bind parameters
+ * @param options Additional options, can be null
+ * @return information about the query
+ * @see API
+ * Documentation
+ */
+ CompletableFuture explainQuery(
+ final String query,
+ final Map bindVars,
+ final AqlQueryExplainOptions options);
+
+ /**
+ * Parse an AQL query and return information about it This method is for query validation only. To actually query
+ * the database, see {@link ArangoDatabaseAsync#query(String, Map, AqlQueryOptions, Class)}
+ *
+ * @param query the query which you want parse
+ * @return imformation about the query
+ * @see API
+ * Documentation
+ */
+ CompletableFuture parseQuery(final String query);
+
+ /**
+ * Clears the AQL query cache
+ *
+ * @return void
+ * @see API
+ * Documentation
+ */
+ CompletableFuture clearQueryCache();
+
+ /**
+ * Returns the global configuration for the AQL query cache
+ *
+ * @return configuration for the AQL query cache
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getQueryCacheProperties();
+
+ /**
+ * Changes the configuration for the AQL query cache. Note: changing the properties may invalidate all results in
+ * the cache.
+ *
+ * @param properties properties to be set
+ * @return current set of properties
+ * @see API
+ * Documentation
+ */
+ CompletableFuture setQueryCacheProperties(final QueryCachePropertiesEntity properties);
+
+ /**
+ * Returns the configuration for the AQL query tracking
+ *
+ * @return configuration for the AQL query tracking
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getQueryTrackingProperties();
+
+ /**
+ * Changes the configuration for the AQL query tracking
+ *
+ * @param properties properties to be set
+ * @return current set of properties
+ * @see API
+ * Documentation
+ */
+ CompletableFuture setQueryTrackingProperties(
+ final QueryTrackingPropertiesEntity properties);
+
+ /**
+ * Returns a list of currently running AQL queries
+ *
+ * @return a list of currently running AQL queries
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getCurrentlyRunningQueries();
+
+ /**
+ * Returns a list of slow running AQL queries
+ *
+ * @return a list of slow running AQL queries
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getSlowQueries();
+
+ /**
+ * Clears the list of slow AQL queries
+ *
+ * @return void
+ * @see API
+ * Documentation
+ */
+ CompletableFuture clearSlowQueries();
+
+ /**
+ * Kills a running query. The query will be terminated at the next cancelation point.
+ *
+ * @param id The id of the query
+ * @return void
+ * @see API
+ * Documentation
+ */
+ CompletableFuture killQuery(final String id);
+
+ /**
+ * Create a new AQL user function
+ *
+ * @param name the fully qualified name of the user functions
+ * @param code a string representation of the function body
+ * @param options Additional options, can be null
+ * @return void
+ * @see API
+ * Documentation
+ */
+ CompletableFuture createAqlFunction(
+ final String name,
+ final String code,
+ final AqlFunctionCreateOptions options);
+
+ /**
+ * Remove an existing AQL user function
+ *
+ * @param name the name of the AQL user function
+ * @param options Additional options, can be null
+ * @return number of deleted functions (since ArangoDB 3.4.0)
+ * @see API
+ * Documentation
+ */
+ CompletableFuture deleteAqlFunction(final String name, final AqlFunctionDeleteOptions options);
+
+ /**
+ * Gets all reqistered AQL user functions
+ *
+ * @param options Additional options, can be null
+ * @return all reqistered AQL user functions
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getAqlFunctions(final AqlFunctionGetOptions options);
+
+ /**
+ * Returns a handler of the graph by the given name
+ *
+ * @param name Name of the graph
+ * @return graph handler
+ */
+ ArangoGraphAsync graph(final String name);
+
+ /**
+ * Create a new graph in the graph module. The creation of a graph requires the name of the graph and a definition
+ * of its edges.
+ *
+ * @param name Name of the graph
+ * @param edgeDefinitions An array of definitions for the edge
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture createGraph(final String name, final Collection edgeDefinitions);
+
+ /**
+ * Create a new graph in the graph module. The creation of a graph requires the name of the graph and a definition
+ * of its edges.
+ *
+ * @param name Name of the graph
+ * @param edgeDefinitions An array of definitions for the edge
+ * @param options Additional options, can be null
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture createGraph(
+ final String name,
+ final Collection edgeDefinitions,
+ final GraphCreateOptions options);
+
+ /**
+ * Lists all graphs known to the graph module
+ *
+ * @return graphs stored in this database
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getGraphs();
+
+ /**
+ * Execute a server-side transaction
+ *
+ * @param action the actual transaction operations to be executed, in the form of stringified JavaScript code
+ * @param type The type of the result (POJO class, VPackSlice or String for Json)
+ * @param options Additional options, can be null
+ * @return the result of the transaction if it succeeded
+ * @see API
+ * Documentation
+ */
+ CompletableFuture transaction(final String action, final Class type, final TransactionOptions options);
+
+ /**
+ * Begins a Stream Transaction.
+ *
+ * @param options Additional options, can be null
+ * @return information about the transaction
+ * @see API
+ * Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture beginStreamTransaction(StreamTransactionOptions options);
+
+ /**
+ * Aborts a Stream Transaction.
+ *
+ * @return information about the transaction
+ * @see API
+ * Documentation
+ */
+ CompletableFuture abortStreamTransaction(String id);
+
+ /**
+ * Gets information about a Stream Transaction.
+ *
+ * @return information about the transaction
+ * @see
+ * API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture getStreamTransaction(String id);
+
+ /**
+ * Gets all the currently running Stream Transactions.
+ *
+ * @return all the currently running Stream Transactions
+ * @see
+ * API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture> getStreamTransactions();
+
+ /**
+ * Commits a Stream Transaction.
+ *
+ * @return information about the transaction
+ * @see
+ * API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture commitStreamTransaction(String id);
+
+ /**
+ * Retrieves information about the current database
+ *
+ * @return information about the current database
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getInfo();
+
+ /**
+ * Execute a server-side traversal
+ *
+ * @param vertexClass The type of the vertex documents (POJO class, VPackSlice or String for Json)
+ * @param edgeClass The type of the edge documents (POJO class, VPackSlice or String for Json)
+ * @param options Additional options
+ * @return Result of the executed traversal
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> executeTraversal(
+ final Class vertexClass,
+ final Class edgeClass,
+ final TraversalOptions options);
+
+ /**
+ * Reads a single document
+ *
+ * @param id The id of the document
+ * @param type The type of the document (POJO class, VPackSlice or String for Json)
+ * @return the document identified by the id
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getDocument(final String id, final Class type) throws ArangoDBException;
+
+ /**
+ * Reads a single document
+ *
+ * @param id The id of the document
+ * @param type The type of the document (POJO class, VPackSlice or String for Json)
+ * @param options Additional options, can be null
+ * @return the document identified by the id
+ * @see API
+ * Documentation
+ */
+ CompletableFuture getDocument(final String id, final Class type, final DocumentReadOptions options)
+ throws ArangoDBException;
+
+ /**
+ * Reload the routing table.
+ *
+ * @return void
+ * @see API
+ * Documentation
+ */
+ CompletableFuture reloadRouting();
+
+ /**
+ * Returns a new {@link ArangoRouteAsync} instance for the given path (relative to the database) that can be used to
+ * perform arbitrary requests.
+ *
+ * @param path The database-relative URL of the route
+ * @return {@link ArangoRouteAsync}
+ */
+ ArangoRouteAsync route(String... path);
+
+ /**
+ * Fetches all views from the database and returns an list of view descriptions.
+ *
+ * @return list of information about all views
+ * @see API Documentation
+ * @since ArangoDB 3.4.0
+ */
+ CompletableFuture> getViews();
+
+ /**
+ * Returns a {@code ArangoViewAsync} instance for the given view name.
+ *
+ * @param name Name of the view
+ * @return view handler
+ * @since ArangoDB 3.4.0
+ */
+ ArangoViewAsync view(String name);
+
+ /**
+ * Returns a {@code ArangoSearchAsync} instance for the given ArangoSearch view name.
+ *
+ * @param name Name of the view
+ * @return ArangoSearch view handler
+ * @since ArangoDB 3.4.0
+ */
+ ArangoSearchAsync arangoSearch(String name);
+
+ /**
+ * Creates a view of the given {@code type}, then returns view information from the server.
+ *
+ * @param name The name of the view
+ * @param type The type of the view
+ * @return information about the view
+ * @since ArangoDB 3.4.0
+ */
+ CompletableFuture createView(String name, ViewType type);
+
+ /**
+ * Creates a ArangoSearch view with the given {@code options}, then returns view information from the server.
+ *
+ * @param name The name of the view
+ * @param options Additional options, can be null
+ * @return information about the view
+ * @see API
+ * Documentation
+ * @since ArangoDB 3.4.0
+ */
+ CompletableFuture createArangoSearch(String name, ArangoSearchCreateOptions options);
+
+ /**
+ * Creates an Analyzer
+ *
+ * @param options AnalyzerEntity
+ * @return the created Analyzer
+ * @see API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture createAnalyzer(AnalyzerEntity options);
+
+ /**
+ * Gets information about an Analyzer
+ *
+ * @param name of the Analyzer without database prefix
+ * @return information about an Analyzer
+ * @see API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture getAnalyzer(String name);
+
+ /**
+ * Retrieves all analyzers definitions.
+ *
+ * @return collection of all analyzers definitions
+ * @see API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture> getAnalyzers();
+
+ /**
+ * Deletes an Analyzer
+ *
+ * @param name of the Analyzer without database prefix
+ * @see API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture deleteAnalyzer(String name);
+
+ /**
+ * Deletes an Analyzer
+ *
+ * @param name of the Analyzer without database prefix
+ * @param options AnalyzerDeleteOptions
+ * @see API Documentation
+ * @since ArangoDB 3.5.0
+ */
+ CompletableFuture deleteAnalyzer(String name, AnalyzerDeleteOptions options);
+
+}
diff --git a/src/main/java/com/arangodb/async/ArangoEdgeCollectionAsync.java b/src/main/java/com/arangodb/async/ArangoEdgeCollectionAsync.java
new file mode 100644
index 000000000..7f7cb4585
--- /dev/null
+++ b/src/main/java/com/arangodb/async/ArangoEdgeCollectionAsync.java
@@ -0,0 +1,160 @@
+/*
+ * DISCLAIMER
+ *
+ * Copyright 2016 ArangoDB GmbH, Cologne, Germany
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright holder is ArangoDB GmbH, Cologne, Germany
+ */
+
+package com.arangodb.async;
+
+import com.arangodb.ArangoSerializationAccessor;
+import com.arangodb.entity.EdgeEntity;
+import com.arangodb.entity.EdgeUpdateEntity;
+import com.arangodb.model.*;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Interface for operations on ArangoDB edge collection level.
+ *
+ * @author Mark Vollmary
+ * @see API Documentation
+ */
+@SuppressWarnings("unused")
+public interface ArangoEdgeCollectionAsync extends ArangoSerializationAccessor {
+
+ /**
+ * The the handler of the named graph the edge collection is within
+ *
+ * @return graph handler
+ */
+ ArangoGraphAsync graph();
+
+ /**
+ * The name of the edge collection
+ *
+ * @return collection name
+ */
+ String name();
+
+ /**
+ * Creates a new edge in the collection
+ *
+ * @param value A representation of a single edge (POJO, VPackSlice or String for Json)
+ * @return information about the edge
+ * @see API Documentation
+ */
+ CompletableFuture insertEdge(final T value);
+
+ /**
+ * Creates a new edge in the collection
+ *
+ * @param value A representation of a single edge (POJO, VPackSlice or String for Json)
+ * @param options Additional options, can be null
+ * @return information about the edge
+ * @see API Documentation
+ */
+ CompletableFuture insertEdge(final T value, final EdgeCreateOptions options);
+
+ /**
+ * Fetches an existing edge
+ *
+ * @param key The key of the edge
+ * @param type The type of the edge-document (POJO class, VPackSlice or String for Json)
+ * @return the edge identified by the key
+ * @see API Documentation
+ */
+ CompletableFuture getEdge(final String key, final Class type);
+
+ /**
+ * Fetches an existing edge
+ *
+ * @param key The key of the edge
+ * @param type The type of the edge-document (POJO class, VPackSlice or String for Json)
+ * @param options Additional options, can be null
+ * @return the edge identified by the key
+ * @see API Documentation
+ */
+ CompletableFuture getEdge(final String key, final Class type, final GraphDocumentReadOptions options);
+
+ /**
+ * Replaces the edge with key with the one in the body, provided there is such a edge and no precondition is
+ * violated
+ *
+ * @param key The key of the edge
+ * @return information about the edge
+ * @see API Documentation
+ */
+ CompletableFuture replaceEdge(final String key, final T value);
+
+ /**
+ * Replaces the edge with key with the one in the body, provided there is such a edge and no precondition is
+ * violated
+ *
+ * @param key The key of the edge
+ * @param options Additional options, can be null
+ * @return information about the edge
+ * @see API Documentation
+ */
+ CompletableFuture replaceEdge(
+ final String key,
+ final T value,
+ final EdgeReplaceOptions options);
+
+ /**
+ * Partially updates the edge identified by document-key. The value must contain a document with the attributes to
+ * patch (the patch document). All attributes from the patch document will be added to the existing document if they
+ * do not yet exist, and overwritten in the existing document if they do exist there.
+ *
+ * @param key The key of the edge
+ * @return information about the edge
+ * @see API Documentation
+ */
+ CompletableFuture updateEdge(final String key, final T value);
+
+ /**
+ * Partially updates the edge identified by document-key. The value must contain a document with the attributes to
+ * patch (the patch document). All attributes from the patch document will be added to the existing document if they
+ * do not yet exist, and overwritten in the existing document if they do exist there.
+ *
+ * @param key The key of the edge
+ * @param options Additional options, can be null
+ * @return information about the edge
+ * @see API Documentation
+ */
+ CompletableFuture updateEdge(
+ final String key,
+ final T value,
+ final EdgeUpdateOptions options);
+
+ /**
+ * Removes a edge
+ *
+ * @param key The key of the edge
+ * @see API Documentation
+ */
+ CompletableFuture deleteEdge(final String key);
+
+ /**
+ * Removes a edge
+ *
+ * @param key The key of the edge
+ * @param options Additional options, can be null
+ * @see API Documentation
+ */
+ CompletableFuture deleteEdge(final String key, final EdgeDeleteOptions options);
+
+}
diff --git a/src/main/java/com/arangodb/async/ArangoGraphAsync.java b/src/main/java/com/arangodb/async/ArangoGraphAsync.java
new file mode 100644
index 000000000..9633f5c40
--- /dev/null
+++ b/src/main/java/com/arangodb/async/ArangoGraphAsync.java
@@ -0,0 +1,190 @@
+/*
+ * DISCLAIMER
+ *
+ * Copyright 2016 ArangoDB GmbH, Cologne, Germany
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright holder is ArangoDB GmbH, Cologne, Germany
+ */
+
+package com.arangodb.async;
+
+import com.arangodb.ArangoSerializationAccessor;
+import com.arangodb.entity.EdgeDefinition;
+import com.arangodb.entity.GraphEntity;
+import com.arangodb.model.GraphCreateOptions;
+
+import java.util.Collection;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Interface for operations on ArangoDB graph level.
+ *
+ * @author Mark Vollmary
+ * @see API Documentation
+ */
+@SuppressWarnings("unused")
+public interface ArangoGraphAsync extends ArangoSerializationAccessor {
+
+ /**
+ * The the handler of the database the named graph is within
+ *
+ * @return database handler
+ */
+ ArangoDatabaseAsync db();
+
+ /**
+ * The name of the collection
+ *
+ * @return collection name
+ */
+ String name();
+
+ /**
+ * Checks whether the graph exists
+ *
+ * @return true if the graph exists, otherwise false
+ */
+ CompletableFuture exists();
+
+ /**
+ * Creates the graph in the graph module. The creation of a graph requires the name of the graph and a definition of
+ * its edges.
+ *
+ * @param edgeDefinitions An array of definitions for the edge
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture create(final Collection edgeDefinitions);
+
+ /**
+ * Creates the graph in the graph module. The creation of a graph requires the name of the graph and a definition of
+ * its edges.
+ *
+ * @param edgeDefinitions An array of definitions for the edge
+ * @param options Additional options, can be null
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture createGraph(
+ final Collection edgeDefinitions,
+ final GraphCreateOptions options);
+
+ /**
+ * Delete an existing graph
+ *
+ * @return void
+ * @see API Documentation
+ */
+ CompletableFuture drop();
+
+ /**
+ * Delete an existing graph including
+ *
+ * @param dropCollections Drop collections of this graph as well. Collections will only be dropped if they are not used in other
+ * graphs.
+ * @return void
+ * @see API Documentation
+ */
+ CompletableFuture drop(boolean dropCollections);
+
+ /**
+ * Get a graph from the graph module
+ *
+ * @return the definition content of this graph
+ * @see API Documentation
+ */
+ CompletableFuture getInfo();
+
+ /**
+ * Lists all vertex collections used in this graph
+ *
+ * @return all vertex collections within this graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getVertexCollections();
+
+ /**
+ * Adds a vertex collection to the set of collections of the graph. If the collection does not exist, it will be
+ * created.
+ *
+ * @param name The name of the collection
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture addVertexCollection(final String name);
+
+ /**
+ * Returns a handler of the vertex collection by the given name
+ *
+ * @param name Name of the vertex collection
+ * @return collection handler
+ */
+ ArangoVertexCollectionAsync vertexCollection(final String name);
+
+ /**
+ * Returns a handler of the edge collection by the given name
+ *
+ * @param name Name of the edge collection
+ * @return collection handler
+ */
+ ArangoEdgeCollectionAsync edgeCollection(final String name);
+
+ /**
+ * Lists all edge collections used in this graph
+ *
+ * @return all edge collections within this graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture> getEdgeDefinitions();
+
+ /**
+ * Add a new edge definition to the graph
+ *
+ * @param definition
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture addEdgeDefinition(final EdgeDefinition definition);
+
+ /**
+ * Change one specific edge definition. This will modify all occurrences of this definition in all graphs known to
+ * your database
+ *
+ * @param definition The edge definition
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture replaceEdgeDefinition(final EdgeDefinition definition);
+
+ /**
+ * Remove one edge definition from the graph. This will only remove the edge collection, the vertex collections
+ * remain untouched and can still be used in your queries
+ *
+ * @param definitionName The name of the edge collection used in the definition
+ * @return information about the graph
+ * @see API
+ * Documentation
+ */
+ CompletableFuture removeEdgeDefinition(final String definitionName);
+
+}
diff --git a/src/main/java/com/arangodb/async/ArangoRouteAsync.java b/src/main/java/com/arangodb/async/ArangoRouteAsync.java
new file mode 100644
index 000000000..e16655e83
--- /dev/null
+++ b/src/main/java/com/arangodb/async/ArangoRouteAsync.java
@@ -0,0 +1,119 @@
+/*
+ * DISCLAIMER
+ *
+ * Copyright 2018 ArangoDB GmbH, Cologne, Germany
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright holder is ArangoDB GmbH, Cologne, Germany
+ */
+
+package com.arangodb.async;
+
+import com.arangodb.ArangoSerializationAccessor;
+import com.arangodb.velocypack.VPackSlice;
+import com.arangodb.velocystream.Response;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Interface for a specific path to be used to perform arbitrary requests.
+ *
+ * @author Mark Vollmary
+ */
+@SuppressWarnings("unused")
+public interface ArangoRouteAsync extends ArangoSerializationAccessor {
+
+ /**
+ * Returns a new {@link ArangoRouteAsync} instance for the given path (relative to the current route) that can be
+ * used to perform arbitrary requests.
+ *
+ * @param path The relative URL of the route
+ * @return {@link ArangoRouteAsync}
+ */
+ ArangoRouteAsync route(String... path);
+
+ /**
+ * Header that should be sent with each request to the route.
+ *
+ * @param key Header key
+ * @param value Header value (the toString()
method will be called for the value}
+ * @return {@link ArangoRouteAsync}
+ */
+ ArangoRouteAsync withHeader(String key, Object value);
+
+ /**
+ * Query parameter that should be sent with each request to the route.
+ *
+ * @param key Query parameter key
+ * @param value Query parameter value (the toString()
method will be called for the value}
+ * @return {@link ArangoRouteAsync}
+ */
+ ArangoRouteAsync withQueryParam(String key, Object value);
+
+ /**
+ * The response body. The body will be serialized to {@link VPackSlice}.
+ *
+ * @param body The response body
+ * @return {@link ArangoRouteAsync}
+ */
+ ArangoRouteAsync withBody(Object body);
+
+ /**
+ * Performs a DELETE request to the given URL and returns the server response.
+ *
+ * @return server response
+ */
+ CompletableFuture delete();
+
+ /**
+ * Performs a GET request to the given URL and returns the server response.
+ *
+ * @return server response
+ */
+
+ CompletableFuture