diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 06244724e..c0f4a7835 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -19,12 +19,12 @@ jobs:
fail-fast: false
matrix:
docker-img:
- - docker.io/arangodb/arangodb:3.7.15
+ - docker.io/arangodb/arangodb:3.7.16
- docker.io/arangodb/arangodb:3.8.4
- - docker.io/arangodb/arangodb-preview:3.9.0-alpha.1
- - docker.io/arangodb/enterprise:3.7.15
+ - docker.io/arangodb/arangodb-preview:3.9.0-beta.1
+ - docker.io/arangodb/enterprise:3.7.16
- docker.io/arangodb/enterprise:3.8.4
- - docker.io/arangodb/enterprise-preview:3.9.0-alpha.1
+ - docker.io/arangodb/enterprise-preview:3.9.0-beta.1
topology:
- single
- cluster
@@ -35,6 +35,17 @@ jobs:
- 8
user-language:
- en
+ include:
+ - docker-img: docker.io/arangodb/arangodb-preview:3.9.0-beta.1
+ topology: single
+ db-ext-names: true
+ java-version: 11
+ user-language: tr
+ - docker-img: docker.io/arangodb/enterprise-preview:3.9.0-beta.1
+ topology: cluster
+ db-ext-names: true
+ java-version: 17
+ user-language: tr
steps:
- uses: actions/checkout@v2
@@ -75,6 +86,21 @@ jobs:
name: logs.tgz
path: ./logs.tgz
+ # test encodeURIComponent() and normalize('NFC') comparing to Javascript behavior
+ test-graalvm:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: graalvm/setup-graalvm@v1
+ with:
+ version: 'latest'
+ java-version: '11'
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ - name: Info
+ run: mvn -version
+ - name: Test
+ run: mvn -e --no-transfer-progress test -Dtest=com.arangodb.util.UnicodeUtilsTest
+
test-jwt:
timeout-minutes: 20
runs-on: ubuntu-latest
diff --git a/ChangeLog.md b/ChangeLog.md
index c9cff7e92..2eec5cb69 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
## [Unreleased]
+- added `DbName` class to represent database names in public API parameters, to ease unicode names normalization (#405)
+
## [6.15.0] - 2021-12-29
- JWT authentication (#421)
diff --git a/pom.xml b/pom.xml
index b73368b7c..6611f4400 100644
--- a/pom.xml
+++ b/pom.xml
@@ -219,6 +219,12 @@
0.9.12
test
+
+ org.graalvm.sdk
+ graal-sdk
+ 21.2.0
+ test
+
diff --git a/src/main/java/com/arangodb/ArangoDB.java b/src/main/java/com/arangodb/ArangoDB.java
index 8cfa37e31..027750d4a 100644
--- a/src/main/java/com/arangodb/ArangoDB.java
+++ b/src/main/java/com/arangodb/ArangoDB.java
@@ -20,15 +20,7 @@
package com.arangodb;
-import com.arangodb.entity.ArangoDBEngine;
-import com.arangodb.entity.ArangoDBVersion;
-import com.arangodb.entity.LoadBalancingStrategy;
-import com.arangodb.entity.LogEntity;
-import com.arangodb.entity.LogEntriesEntity;
-import com.arangodb.entity.LogLevelEntity;
-import com.arangodb.entity.Permissions;
-import com.arangodb.entity.ServerRole;
-import com.arangodb.entity.UserEntity;
+import com.arangodb.entity.*;
import com.arangodb.internal.ArangoContext;
import com.arangodb.internal.ArangoDBImpl;
import com.arangodb.internal.ArangoDefaults;
@@ -50,10 +42,7 @@
import com.arangodb.model.LogOptions;
import com.arangodb.model.UserCreateOptions;
import com.arangodb.model.UserUpdateOptions;
-import com.arangodb.util.ArangoCursorInitializer;
-import com.arangodb.util.ArangoDeserializer;
-import com.arangodb.util.ArangoSerialization;
-import com.arangodb.util.ArangoSerializer;
+import com.arangodb.util.*;
import com.arangodb.velocypack.VPack;
import com.arangodb.velocypack.VPackAnnotationFieldFilter;
import com.arangodb.velocypack.VPackAnnotationFieldNaming;
@@ -701,8 +690,20 @@ public synchronized ArangoDB build() {
*
* @param name Name of the database
* @return database handler
+ * @deprecated Use {@link #db(DbName)} instead
*/
- ArangoDatabase db(String name);
+ @Deprecated
+ default ArangoDatabase db(String name) {
+ return db(DbName.of(name));
+ }
+
+ /**
+ * Returns a {@code ArangoDatabase} instance for the given database name.
+ *
+ * @param dbName Name of the database
+ * @return database handler
+ */
+ ArangoDatabase db(DbName dbName);
/**
* Creates a new database with the given name.
@@ -712,8 +713,23 @@ public synchronized ArangoDB build() {
* @throws ArangoDBException
* @see API
* Documentation
+ * @deprecated Use {@link #createDatabase(DbName)} instead
+ */
+ @Deprecated
+ default Boolean createDatabase(String name) throws ArangoDBException {
+ return createDatabase(DbName.of(name));
+ }
+
+ /**
+ * Creates a new database with the given name.
+ *
+ * @param dbName Name of the database to create
+ * @return true if the database was created successfully.
+ * @throws ArangoDBException
+ * @see API
+ * Documentation
*/
- Boolean createDatabase(String name) throws ArangoDBException;
+ Boolean createDatabase(DbName dbName) throws ArangoDBException;
/**
* Creates a new database with the given name.
diff --git a/src/main/java/com/arangodb/ArangoDatabase.java b/src/main/java/com/arangodb/ArangoDatabase.java
index a8d9bab9c..f0cfede5f 100644
--- a/src/main/java/com/arangodb/ArangoDatabase.java
+++ b/src/main/java/com/arangodb/ArangoDatabase.java
@@ -52,8 +52,19 @@ public interface ArangoDatabase extends ArangoSerializationAccessor {
* Returns the name of the database
*
* @return database name
+ * @deprecated Use {@link #dbName()} instead
*/
- String name();
+ @Deprecated
+ default String name() {
+ return dbName().get();
+ }
+
+ /**
+ * Returns the name of the database
+ *
+ * @return database name
+ */
+ DbName dbName();
/**
* Returns the server name and version number.
diff --git a/src/main/java/com/arangodb/DbName.java b/src/main/java/com/arangodb/DbName.java
new file mode 100644
index 000000000..7ef66ba36
--- /dev/null
+++ b/src/main/java/com/arangodb/DbName.java
@@ -0,0 +1,82 @@
+package com.arangodb;
+
+import com.arangodb.internal.ArangoRequestParam;
+import com.arangodb.util.UnicodeUtils;
+
+import java.util.Objects;
+import java.util.function.Supplier;
+
+/**
+ * Class to represent a NFC-normalized database name (as required by ArangoDB extended naming convention).
+ * To instantiate use {@link DbName#of(String)} or {@link DbName#normalize(String)}.
+ *
+ * @see
+ * API Documentation
+ */
+public final class DbName implements Supplier {
+
+ /**
+ * DbName of the "_system" database.
+ */
+ public static final DbName SYSTEM = DbName.of(ArangoRequestParam.SYSTEM);
+
+ private final String value;
+
+ /**
+ * Creates a new {@link DbName} instance with the provided value. If the provided value is not
+ * NFC-normalized, throws
+ * {@link IllegalArgumentException}. No transformation is applied to the provided value.
+ * Use {@link #normalize(String)} to create a DbName from a non-NFC-normalized value.
+ *
+ * @param value desired db name
+ * @return the created {@link DbName} instance
+ * @see NFC normalization
+ * @see
+ * API Documentation
+ */
+ public static DbName of(final String value) {
+ UnicodeUtils.checkNormalized(value);
+ return new DbName(value);
+ }
+
+ /**
+ * Creates a new {@link DbName} instance with the NFC normal form of the provided value.
+ * Note that the created {@link DbName} will hold a value potentially different from the provided one.
+ *
+ * @param value desired db name
+ * @return the created {@link DbName} instance
+ * @see NFC normalization
+ * @see
+ * API Documentation
+ */
+ public static DbName normalize(final String value) {
+ return new DbName(UnicodeUtils.normalize(value));
+ }
+
+ private DbName(final String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String get() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ DbName dbName = (DbName) o;
+ return Objects.equals(value, dbName.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public String toString() {
+ return get();
+ }
+}
diff --git a/src/main/java/com/arangodb/async/ArangoDBAsync.java b/src/main/java/com/arangodb/async/ArangoDBAsync.java
index 762427810..99e3cbe37 100644
--- a/src/main/java/com/arangodb/async/ArangoDBAsync.java
+++ b/src/main/java/com/arangodb/async/ArangoDBAsync.java
@@ -22,6 +22,7 @@
import com.arangodb.ArangoDBException;
import com.arangodb.ArangoSerializationAccessor;
+import com.arangodb.DbName;
import com.arangodb.Protocol;
import com.arangodb.async.internal.ArangoDBAsyncImpl;
import com.arangodb.async.internal.velocystream.VstCommunicationAsync;
@@ -94,8 +95,20 @@ public interface ArangoDBAsync extends ArangoSerializationAccessor {
*
* @param name Name of the database
* @return database handler
+ * @deprecated Use {@link #db(DbName)} instead
*/
- ArangoDatabaseAsync db(final String name);
+ @Deprecated
+ default ArangoDatabaseAsync db(final String name) {
+ return db(DbName.of(name));
+ }
+
+ /**
+ * Returns a handler of the database by the given name
+ *
+ * @param dbName Name of the database
+ * @return database handler
+ */
+ ArangoDatabaseAsync db(final DbName dbName);
/**
* Creates a new database
@@ -104,8 +117,22 @@ public interface ArangoDBAsync extends ArangoSerializationAccessor {
* @return true if the database was created successfully.
* @see API
* Documentation
+ * @deprecated Use {@link #createDatabase(DbName)} instead
+ */
+ @Deprecated
+ default CompletableFuture createDatabase(final String name) {
+ return createDatabase(DbName.of(name));
+ }
+
+ /**
+ * Creates a new database
+ *
+ * @param dbName database name
+ * @return true if the database was created successfully.
+ * @see API
+ * Documentation
*/
- CompletableFuture createDatabase(final String name);
+ CompletableFuture createDatabase(final DbName dbName);
/**
* Creates a new database
diff --git a/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java b/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java
index c98ba1dd6..420034655 100644
--- a/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java
+++ b/src/main/java/com/arangodb/async/ArangoDatabaseAsync.java
@@ -22,6 +22,7 @@
import com.arangodb.ArangoDBException;
import com.arangodb.ArangoSerializationAccessor;
+import com.arangodb.DbName;
import com.arangodb.entity.*;
import com.arangodb.entity.arangosearch.AnalyzerEntity;
import com.arangodb.entity.arangosearch.analyzer.SearchAnalyzer;
@@ -54,8 +55,19 @@ public interface ArangoDatabaseAsync extends ArangoSerializationAccessor {
* Returns the name of the database
*
* @return database name
+ * @deprecated Use {@link #dbName()} instead
*/
- String name();
+ @Deprecated
+ default String name() {
+ return dbName().get();
+ }
+
+ /**
+ * Returns the name of the database
+ *
+ * @return database name
+ */
+ DbName dbName();
/**
* Returns the server name and version number.
diff --git a/src/main/java/com/arangodb/async/internal/ArangoDBAsyncImpl.java b/src/main/java/com/arangodb/async/internal/ArangoDBAsyncImpl.java
index 93c58df91..15a4acd5a 100644
--- a/src/main/java/com/arangodb/async/internal/ArangoDBAsyncImpl.java
+++ b/src/main/java/com/arangodb/async/internal/ArangoDBAsyncImpl.java
@@ -21,6 +21,7 @@
package com.arangodb.async.internal;
import com.arangodb.ArangoDBException;
+import com.arangodb.DbName;
import com.arangodb.async.ArangoDBAsync;
import com.arangodb.async.ArangoDatabaseAsync;
import com.arangodb.async.internal.velocystream.VstCommunicationAsync;
@@ -112,16 +113,16 @@ public void updateJwt(String jwt) {
@Override
public ArangoDatabaseAsync db() {
- return db(ArangoRequestParam.SYSTEM);
+ return db(DbName.SYSTEM);
}
@Override
- public ArangoDatabaseAsync db(final String name) {
+ public ArangoDatabaseAsync db(final DbName name) {
return new ArangoDatabaseAsyncImpl(this, name);
}
@Override
- public CompletableFuture createDatabase(final String name) {
+ public CompletableFuture createDatabase(final DbName name) {
return createDatabase(new DBCreateOptions().name(name));
}
@@ -132,7 +133,7 @@ public CompletableFuture createDatabase(DBCreateOptions options) {
@Override
public CompletableFuture> getDatabases() {
- return executor.execute(getDatabasesRequest(db().name()), getDatabaseResponseDeserializer());
+ return executor.execute(getDatabasesRequest(db().dbName()), getDatabaseResponseDeserializer());
}
@Override
@@ -142,7 +143,7 @@ public CompletableFuture> getAccessibleDatabases() {
@Override
public CompletableFuture> getAccessibleDatabasesFor(final String user) {
- return executor.execute(getAccessibleDatabasesForRequest(db().name(), user),
+ return executor.execute(getAccessibleDatabasesForRequest(db().dbName(), user),
getAccessibleDatabasesForResponseDeserializer());
}
@@ -158,7 +159,7 @@ public CompletableFuture getRole() {
@Override
public CompletableFuture createUser(final String user, final String passwd) {
- return executor.execute(createUserRequest(db().name(), user, passwd, new UserCreateOptions()),
+ return executor.execute(createUserRequest(db().dbName(), user, passwd, new UserCreateOptions()),
UserEntity.class);
}
@@ -167,32 +168,32 @@ public CompletableFuture createUser(
final String user,
final String passwd,
final UserCreateOptions options) {
- return executor.execute(createUserRequest(db().name(), user, passwd, options), UserEntity.class);
+ return executor.execute(createUserRequest(db().dbName(), user, passwd, options), UserEntity.class);
}
@Override
public CompletableFuture deleteUser(final String user) {
- return executor.execute(deleteUserRequest(db().name(), user), Void.class);
+ return executor.execute(deleteUserRequest(db().dbName(), user), Void.class);
}
@Override
public CompletableFuture getUser(final String user) {
- return executor.execute(getUserRequest(db().name(), user), UserEntity.class);
+ return executor.execute(getUserRequest(db().dbName(), user), UserEntity.class);
}
@Override
public CompletableFuture> getUsers() {
- return executor.execute(getUsersRequest(db().name()), getUsersResponseDeserializer());
+ return executor.execute(getUsersRequest(db().dbName()), getUsersResponseDeserializer());
}
@Override
public CompletableFuture updateUser(final String user, final UserUpdateOptions options) {
- return executor.execute(updateUserRequest(db().name(), user, options), UserEntity.class);
+ return executor.execute(updateUserRequest(db().dbName(), user, options), UserEntity.class);
}
@Override
public CompletableFuture replaceUser(final String user, final UserUpdateOptions options) {
- return executor.execute(replaceUserRequest(db().name(), user, options), UserEntity.class);
+ return executor.execute(replaceUserRequest(db().dbName(), user, options), UserEntity.class);
}
@Override
diff --git a/src/main/java/com/arangodb/async/internal/ArangoDatabaseAsyncImpl.java b/src/main/java/com/arangodb/async/internal/ArangoDatabaseAsyncImpl.java
index 4c89ccd22..61fed58d9 100644
--- a/src/main/java/com/arangodb/async/internal/ArangoDatabaseAsyncImpl.java
+++ b/src/main/java/com/arangodb/async/internal/ArangoDatabaseAsyncImpl.java
@@ -21,6 +21,7 @@
package com.arangodb.async.internal;
import com.arangodb.ArangoDBException;
+import com.arangodb.DbName;
import com.arangodb.async.ArangoCollectionAsync;
import com.arangodb.async.ArangoCursorAsync;
import com.arangodb.async.ArangoDatabaseAsync;
@@ -28,26 +29,7 @@
import com.arangodb.async.ArangoRouteAsync;
import com.arangodb.async.ArangoSearchAsync;
import com.arangodb.async.ArangoViewAsync;
-import com.arangodb.entity.AqlExecutionExplainEntity;
-import com.arangodb.entity.AqlFunctionEntity;
-import com.arangodb.entity.AqlParseEntity;
-import com.arangodb.entity.ArangoDBEngine;
-import com.arangodb.entity.ArangoDBVersion;
-import com.arangodb.entity.CollectionEntity;
-import com.arangodb.entity.CursorEntity;
-import com.arangodb.entity.DatabaseEntity;
-import com.arangodb.entity.EdgeDefinition;
-import com.arangodb.entity.GraphEntity;
-import com.arangodb.entity.IndexEntity;
-import com.arangodb.entity.Permissions;
-import com.arangodb.entity.QueryCachePropertiesEntity;
-import com.arangodb.entity.QueryEntity;
-import com.arangodb.entity.QueryTrackingPropertiesEntity;
-import com.arangodb.entity.StreamTransactionEntity;
-import com.arangodb.entity.TransactionEntity;
-import com.arangodb.entity.TraversalEntity;
-import com.arangodb.entity.ViewEntity;
-import com.arangodb.entity.ViewType;
+import com.arangodb.entity.*;
import com.arangodb.entity.arangosearch.AnalyzerEntity;
import com.arangodb.entity.arangosearch.analyzer.SearchAnalyzer;
import com.arangodb.internal.ArangoCursorExecute;
@@ -86,7 +68,7 @@
public class ArangoDatabaseAsyncImpl extends InternalArangoDatabase
implements ArangoDatabaseAsync {
- ArangoDatabaseAsyncImpl(final ArangoDBAsyncImpl arangoDB, final String name) {
+ ArangoDatabaseAsyncImpl(final ArangoDBAsyncImpl arangoDB, final DbName name) {
super(arangoDB, name);
}
@@ -168,7 +150,7 @@ public CompletableFuture deleteIndex(final String id) {
@Override
public CompletableFuture create() {
- return arango().createDatabase(name());
+ return arango().createDatabase(dbName());
}
@Override
diff --git a/src/main/java/com/arangodb/internal/ArangoDBImpl.java b/src/main/java/com/arangodb/internal/ArangoDBImpl.java
index 3ced2d2b7..b297f9c43 100644
--- a/src/main/java/com/arangodb/internal/ArangoDBImpl.java
+++ b/src/main/java/com/arangodb/internal/ArangoDBImpl.java
@@ -20,10 +20,7 @@
package com.arangodb.internal;
-import com.arangodb.ArangoDB;
-import com.arangodb.ArangoDBException;
-import com.arangodb.ArangoDatabase;
-import com.arangodb.Protocol;
+import com.arangodb.*;
import com.arangodb.entity.*;
import com.arangodb.internal.http.HttpCommunication;
import com.arangodb.internal.http.HttpProtocol;
@@ -135,17 +132,17 @@ public void updateJwt(String jwt) {
@Override
public ArangoDatabase db() {
- return db(ArangoRequestParam.SYSTEM);
+ return db(DbName.SYSTEM);
}
@Override
- public ArangoDatabase db(final String name) {
- return new ArangoDatabaseImpl(this, name).setCursorInitializer(cursorInitializer);
+ public ArangoDatabase db(final DbName dbName) {
+ return new ArangoDatabaseImpl(this, dbName).setCursorInitializer(cursorInitializer);
}
@Override
- public Boolean createDatabase(final String name) throws ArangoDBException {
- return createDatabase(new DBCreateOptions().name(name));
+ public Boolean createDatabase(final DbName dbName) throws ArangoDBException {
+ return createDatabase(new DBCreateOptions().name(dbName));
}
@Override
@@ -155,7 +152,7 @@ public Boolean createDatabase(DBCreateOptions options) throws ArangoDBException
@Override
public Collection getDatabases() throws ArangoDBException {
- return executor.execute(getDatabasesRequest(db().name()), getDatabaseResponseDeserializer());
+ return executor.execute(getDatabasesRequest(db().dbName()), getDatabaseResponseDeserializer());
}
@Override
@@ -165,7 +162,7 @@ public Collection getAccessibleDatabases() throws ArangoDBException {
@Override
public Collection getAccessibleDatabasesFor(final String user) throws ArangoDBException {
- return executor.execute(getAccessibleDatabasesForRequest(db().name(), user),
+ return executor.execute(getAccessibleDatabasesForRequest(db().dbName(), user),
getAccessibleDatabasesForResponseDeserializer());
}
@@ -191,39 +188,39 @@ public String getServerId() throws ArangoDBException {
@Override
public UserEntity createUser(final String user, final String passwd) throws ArangoDBException {
- return executor.execute(createUserRequest(db().name(), user, passwd, new UserCreateOptions()),
+ return executor.execute(createUserRequest(db().dbName(), user, passwd, new UserCreateOptions()),
UserEntity.class);
}
@Override
public UserEntity createUser(final String user, final String passwd, final UserCreateOptions options)
throws ArangoDBException {
- return executor.execute(createUserRequest(db().name(), user, passwd, options), UserEntity.class);
+ return executor.execute(createUserRequest(db().dbName(), user, passwd, options), UserEntity.class);
}
@Override
public void deleteUser(final String user) throws ArangoDBException {
- executor.execute(deleteUserRequest(db().name(), user), Void.class);
+ executor.execute(deleteUserRequest(db().dbName(), user), Void.class);
}
@Override
public UserEntity getUser(final String user) throws ArangoDBException {
- return executor.execute(getUserRequest(db().name(), user), UserEntity.class);
+ return executor.execute(getUserRequest(db().dbName(), user), UserEntity.class);
}
@Override
public Collection getUsers() throws ArangoDBException {
- return executor.execute(getUsersRequest(db().name()), getUsersResponseDeserializer());
+ return executor.execute(getUsersRequest(db().dbName()), getUsersResponseDeserializer());
}
@Override
public UserEntity updateUser(final String user, final UserUpdateOptions options) throws ArangoDBException {
- return executor.execute(updateUserRequest(db().name(), user, options), UserEntity.class);
+ return executor.execute(updateUserRequest(db().dbName(), user, options), UserEntity.class);
}
@Override
public UserEntity replaceUser(final String user, final UserUpdateOptions options) throws ArangoDBException {
- return executor.execute(replaceUserRequest(db().name(), user, options), UserEntity.class);
+ return executor.execute(replaceUserRequest(db().dbName(), user, options), UserEntity.class);
}
@Override
diff --git a/src/main/java/com/arangodb/internal/ArangoDatabaseImpl.java b/src/main/java/com/arangodb/internal/ArangoDatabaseImpl.java
index bac59b876..6b38136ac 100644
--- a/src/main/java/com/arangodb/internal/ArangoDatabaseImpl.java
+++ b/src/main/java/com/arangodb/internal/ArangoDatabaseImpl.java
@@ -47,7 +47,7 @@ public class ArangoDatabaseImpl extends InternalArangoDatabase header : context.getHeaderParam().entrySet()) {
request.putHeaderParam(header.getKey(), header.getValue());
}
@@ -75,17 +74,13 @@ protected static String createPath(final String... params) {
if (i > 0) {
sb.append(SLASH);
}
- try {
- final String param;
- if (params[i].contains(SLASH)) {
- param = createPath(params[i].split(SLASH));
- } else {
- param = EncodeUtils.encodeURL(params[i]);
- }
- sb.append(param);
- } catch (final UnsupportedEncodingException e) {
- throw new ArangoDBException(e);
+ final String param;
+ if (params[i].contains(SLASH)) {
+ param = createPath(params[i].split(SLASH));
+ } else {
+ param = EncodeUtils.encodeURIComponent(params[i]);
}
+ sb.append(param);
}
return sb.toString();
}
diff --git a/src/main/java/com/arangodb/internal/InternalArangoCollection.java b/src/main/java/com/arangodb/internal/InternalArangoCollection.java
index 40b0cb974..7b40925dd 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoCollection.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoCollection.java
@@ -21,6 +21,7 @@
package com.arangodb.internal;
import com.arangodb.ArangoDBException;
+import com.arangodb.DbName;
import com.arangodb.entity.*;
import com.arangodb.internal.ArangoExecutor.ResponseDeserializer;
import com.arangodb.internal.util.ArangoSerializationFactory.Serializer;
@@ -80,7 +81,7 @@ public String name() {
}
protected Request insertDocumentRequest(final T value, final DocumentCreateOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_DOCUMENT, name);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_DOCUMENT, name);
final DocumentCreateOptions params = (options != null ? options : new DocumentCreateOptions());
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
request.putQueryParam(RETURN_NEW, params.getReturnNew());
@@ -121,7 +122,7 @@ protected ResponseDeserializer> insertDocumentRespon
}
protected Request insertDocumentsRequest(final Collection values, final DocumentCreateOptions params) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_DOCUMENT, name);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_DOCUMENT, name);
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
request.putQueryParam(RETURN_NEW, params.getReturnNew());
request.putQueryParam(RETURN_OLD, params.getReturnOld());
@@ -191,7 +192,7 @@ protected Request importDocumentsRequest(final Collection> values, final Docum
protected Request importDocumentsRequest(final DocumentImportOptions options) {
final DocumentImportOptions params = options != null ? options : new DocumentImportOptions();
- return request(db.name(), RequestType.POST, PATH_API_IMPORT).putQueryParam(COLLECTION, name)
+ return request(db.dbName(), RequestType.POST, PATH_API_IMPORT).putQueryParam(COLLECTION, name)
.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync())
.putQueryParam("fromPrefix", params.getFromPrefix()).putQueryParam("toPrefix", params.getToPrefix())
.putQueryParam(OVERWRITE, params.getOverwrite()).putQueryParam("onDuplicate", params.getOnDuplicate())
@@ -199,7 +200,7 @@ protected Request importDocumentsRequest(final DocumentImportOptions options) {
}
protected Request getDocumentRequest(final String key, final DocumentReadOptions options) {
- final Request request = request(db.name(), RequestType.GET, PATH_API_DOCUMENT,
+ final Request request = request(db.dbName(), RequestType.GET, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentReadOptions params = (options != null ? options : new DocumentReadOptions());
request.putHeaderParam(ArangoRequestParam.IF_NONE_MATCH, params.getIfNoneMatch());
@@ -213,7 +214,7 @@ protected Request getDocumentRequest(final String key, final DocumentReadOptions
protected Request getDocumentsRequest(final Collection keys, final DocumentReadOptions options) {
final DocumentReadOptions params = (options != null ? options : new DocumentReadOptions());
- final Request request = request(db.name(), RequestType.PUT, PATH_API_DOCUMENT, name)
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_DOCUMENT, name)
.putQueryParam("onlyget", true)
.putHeaderParam(ArangoRequestParam.IF_NONE_MATCH, params.getIfNoneMatch())
.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch()).setBody(util().serialize(keys))
@@ -253,7 +254,7 @@ protected ResponseDeserializer> getDocumentsResponseD
protected Request replaceDocumentRequest(
final String key, final T value, final DocumentReplaceOptions options) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_DOCUMENT,
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentReplaceOptions params = (options != null ? options : new DocumentReplaceOptions());
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
@@ -290,7 +291,7 @@ protected ResponseDeserializer> replaceDocumentRespo
}
protected Request replaceDocumentsRequest(final Collection values, final DocumentReplaceOptions params) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_DOCUMENT, name);
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_DOCUMENT, name);
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
@@ -348,7 +349,7 @@ protected ResponseDeserializer>>
}
protected Request updateDocumentRequest(final String key, final T value, final DocumentUpdateOptions options) {
- final Request request = request(db.name(), RequestType.PATCH, PATH_API_DOCUMENT,
+ final Request request = request(db.dbName(), RequestType.PATCH, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentUpdateOptions params = (options != null ? options : new DocumentUpdateOptions());
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
@@ -388,7 +389,7 @@ protected ResponseDeserializer> updateDocumentRes
}
protected Request updateDocumentsRequest(final Collection values, final DocumentUpdateOptions params) {
- final Request request = request(db.name(), RequestType.PATCH, PATH_API_DOCUMENT, name);
+ final Request request = request(db.dbName(), RequestType.PATCH, PATH_API_DOCUMENT, name);
final Boolean keepNull = params.getKeepNull();
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -444,7 +445,7 @@ protected ResponseDeserializer>>
}
protected Request deleteDocumentRequest(final String key, final DocumentDeleteOptions options) {
- final Request request = request(db.name(), RequestType.DELETE, PATH_API_DOCUMENT,
+ final Request request = request(db.dbName(), RequestType.DELETE, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentDeleteOptions params = (options != null ? options : new DocumentDeleteOptions());
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
@@ -469,7 +470,7 @@ protected ResponseDeserializer> deleteDocumentRespon
}
protected Request deleteDocumentsRequest(final Collection keys, final DocumentDeleteOptions options) {
- final Request request = request(db.name(), RequestType.DELETE, PATH_API_DOCUMENT, name);
+ final Request request = request(db.dbName(), RequestType.DELETE, PATH_API_DOCUMENT, name);
final DocumentDeleteOptions params = (options != null ? options : new DocumentDeleteOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
@@ -513,7 +514,7 @@ protected ResponseDeserializer>>
}
protected Request documentExistsRequest(final String key, final DocumentExistsOptions options) {
- final Request request = request(db.name(), RequestType.HEAD, PATH_API_DOCUMENT,
+ final Request request = request(db.dbName(), RequestType.HEAD, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentExistsOptions params = (options != null ? options : new DocumentExistsOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -523,11 +524,11 @@ protected Request documentExistsRequest(final String key, final DocumentExistsOp
}
protected Request getIndexRequest(final String id) {
- return request(db.name(), RequestType.GET, PATH_API_INDEX, createIndexId(id));
+ return request(db.dbName(), RequestType.GET, PATH_API_INDEX, createIndexId(id));
}
protected Request deleteIndexRequest(final String id) {
- return request(db.name(), RequestType.DELETE, PATH_API_INDEX, createIndexId(id));
+ return request(db.dbName(), RequestType.DELETE, PATH_API_INDEX, createIndexId(id));
}
protected ResponseDeserializer deleteIndexResponseDeserializer() {
@@ -547,7 +548,7 @@ private String createIndexId(final String id) {
}
protected Request createHashIndexRequest(final Iterable fields, final HashIndexOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new HashIndexOptions(), fields)));
@@ -555,7 +556,7 @@ protected Request createHashIndexRequest(final Iterable fields, final Ha
}
protected Request createSkiplistIndexRequest(final Iterable fields, final SkiplistIndexOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new SkiplistIndexOptions(), fields)));
@@ -564,7 +565,7 @@ protected Request createSkiplistIndexRequest(final Iterable fields, fina
protected Request createPersistentIndexRequest(
final Iterable fields, final PersistentIndexOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(util().serialize(
OptionsBuilder.build(options != null ? options : new PersistentIndexOptions(), fields)));
@@ -572,7 +573,7 @@ protected Request createPersistentIndexRequest(
}
protected Request createGeoIndexRequest(final Iterable fields, final GeoIndexOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new GeoIndexOptions(), fields)));
@@ -580,7 +581,7 @@ protected Request createGeoIndexRequest(final Iterable fields, final Geo
}
protected Request createFulltextIndexRequest(final Iterable fields, final FulltextIndexOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new FulltextIndexOptions(), fields)));
@@ -588,7 +589,7 @@ protected Request createFulltextIndexRequest(final Iterable fields, fina
}
protected Request createTtlIndexRequest(final Iterable fields, final TtlIndexOptions options) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new TtlIndexOptions(), fields)));
@@ -596,7 +597,7 @@ protected Request createTtlIndexRequest(final Iterable fields, final Ttl
}
protected Request getIndexesRequest() {
- final Request request = request(db.name(), RequestType.GET, PATH_API_INDEX);
+ final Request request = request(db.dbName(), RequestType.GET, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
return request;
}
@@ -607,74 +608,74 @@ protected ResponseDeserializer> getIndexesResponseDeseri
}
protected Request truncateRequest(final CollectionTruncateOptions options) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_COLLECTION, name, "truncate");
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_COLLECTION, name, "truncate");
final CollectionTruncateOptions params = (options != null ? options : new CollectionTruncateOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
return request;
}
protected Request countRequest(final CollectionCountOptions options) {
- final Request request = request(db.name(), RequestType.GET, PATH_API_COLLECTION, name, "count");
+ final Request request = request(db.dbName(), RequestType.GET, PATH_API_COLLECTION, name, "count");
final CollectionCountOptions params = (options != null ? options : new CollectionCountOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
return request;
}
protected Request dropRequest(final Boolean isSystem) {
- return request(db.name(), RequestType.DELETE, PATH_API_COLLECTION, name).putQueryParam("isSystem", isSystem);
+ return request(db.dbName(), RequestType.DELETE, PATH_API_COLLECTION, name).putQueryParam("isSystem", isSystem);
}
protected Request loadRequest() {
- return request(db.name(), RequestType.PUT, PATH_API_COLLECTION, name, "load");
+ return request(db.dbName(), RequestType.PUT, PATH_API_COLLECTION, name, "load");
}
protected Request unloadRequest() {
- return request(db.name(), RequestType.PUT, PATH_API_COLLECTION, name, "unload");
+ return request(db.dbName(), RequestType.PUT, PATH_API_COLLECTION, name, "unload");
}
protected Request getInfoRequest() {
- return request(db.name(), RequestType.GET, PATH_API_COLLECTION, name);
+ return request(db.dbName(), RequestType.GET, PATH_API_COLLECTION, name);
}
protected Request getPropertiesRequest() {
- return request(db.name(), RequestType.GET, PATH_API_COLLECTION, name, "properties");
+ return request(db.dbName(), RequestType.GET, PATH_API_COLLECTION, name, "properties");
}
protected Request changePropertiesRequest(final CollectionPropertiesOptions options) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_COLLECTION, name, "properties");
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_COLLECTION, name, "properties");
request.setBody(util().serialize(options != null ? options : new CollectionPropertiesOptions()));
return request;
}
protected Request renameRequest(final String newName) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_COLLECTION, name, "rename");
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_COLLECTION, name, "rename");
request.setBody(util().serialize(OptionsBuilder.build(new CollectionRenameOptions(), newName)));
return request;
}
protected Request responsibleShardRequest(final T value) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_COLLECTION, name, "responsibleShard");
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_COLLECTION, name, "responsibleShard");
request.setBody(util(Serializer.CUSTOM).serialize(value));
return request;
}
protected Request getRevisionRequest() {
- return request(db.name(), RequestType.GET, PATH_API_COLLECTION, name, "revision");
+ return request(db.dbName(), RequestType.GET, PATH_API_COLLECTION, name, "revision");
}
protected Request grantAccessRequest(final String user, final Permissions permissions) {
- return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- db.name(), name).setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
+ return request(DbName.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ db.dbName().get(), name).setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
}
protected Request resetAccessRequest(final String user) {
- return request(ArangoRequestParam.SYSTEM, RequestType.DELETE, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- db.name(), name);
+ return request(DbName.SYSTEM, RequestType.DELETE, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ db.dbName().get(), name);
}
protected Request getPermissionsRequest(final String user) {
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- db.name(), name);
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ db.dbName().get(), name);
}
protected ResponseDeserializer getPermissionsResponseDeserialzer() {
diff --git a/src/main/java/com/arangodb/internal/InternalArangoDB.java b/src/main/java/com/arangodb/internal/InternalArangoDB.java
index 73c7807a5..017ddab6b 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoDB.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoDB.java
@@ -20,10 +20,8 @@
package com.arangodb.internal;
-import com.arangodb.entity.LogLevelEntity;
-import com.arangodb.entity.Permissions;
-import com.arangodb.entity.ServerRole;
-import com.arangodb.entity.UserEntity;
+import com.arangodb.DbName;
+import com.arangodb.entity.*;
import com.arangodb.internal.ArangoExecutor.ResponseDeserializer;
import com.arangodb.internal.util.ArangoSerializationFactory;
import com.arangodb.model.*;
@@ -56,11 +54,11 @@ protected InternalArangoDB(final E executor, final ArangoSerializationFactory ut
}
protected Request getRoleRequest() {
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_ROLE);
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_ROLE);
}
protected Request getServerIdRequest() {
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_SERVER_ID);
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_SERVER_ID);
}
protected ResponseDeserializer getRoleResponseDeserializer() {
@@ -72,7 +70,7 @@ protected ResponseDeserializer getServerIdResponseDeserializer() {
}
protected Request createDatabaseRequest(final DBCreateOptions options) {
- final Request request = request(ArangoRequestParam.SYSTEM, RequestType.POST,
+ final Request request = request(DbName.SYSTEM, RequestType.POST,
InternalArangoDatabase.PATH_API_DATABASE);
request.setBody(util().serialize(options));
return request;
@@ -82,8 +80,8 @@ protected ResponseDeserializer createDatabaseResponseDeserializer() {
return response -> response.getBody().get(ArangoResponseField.RESULT).getAsBoolean();
}
- protected Request getDatabasesRequest(final String database) {
- return request(database, RequestType.GET, InternalArangoDatabase.PATH_API_DATABASE);
+ protected Request getDatabasesRequest(final DbName dbName) {
+ return request(dbName, RequestType.GET, InternalArangoDatabase.PATH_API_DATABASE);
}
protected ResponseDeserializer> getDatabaseResponseDeserializer() {
@@ -94,8 +92,8 @@ protected ResponseDeserializer> getDatabaseResponseDeserializ
};
}
- protected Request getAccessibleDatabasesForRequest(final String database, final String user) {
- return request(database, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE);
+ protected Request getAccessibleDatabasesForRequest(final DbName dbName, final String user) {
+ return request(dbName, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE);
}
protected ResponseDeserializer> getAccessibleDatabasesForResponseDeserializer() {
@@ -111,27 +109,27 @@ protected ResponseDeserializer> getAccessibleDatabasesForResp
}
protected Request createUserRequest(
- final String database,
+ final DbName dbName,
final String user,
final String passwd,
final UserCreateOptions options) {
final Request request;
- request = request(database, RequestType.POST, PATH_API_USER);
+ request = request(dbName, RequestType.POST, PATH_API_USER);
request.setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new UserCreateOptions(), user, passwd)));
return request;
}
- protected Request deleteUserRequest(final String database, final String user) {
- return request(database, RequestType.DELETE, PATH_API_USER, user);
+ protected Request deleteUserRequest(final DbName dbName, final String user) {
+ return request(dbName, RequestType.DELETE, PATH_API_USER, user);
}
- protected Request getUsersRequest(final String database) {
- return request(database, RequestType.GET, PATH_API_USER);
+ protected Request getUsersRequest(final DbName dbName) {
+ return request(dbName, RequestType.GET, PATH_API_USER);
}
- protected Request getUserRequest(final String database, final String user) {
- return request(database, RequestType.GET, PATH_API_USER, user);
+ protected Request getUserRequest(final DbName dbName, final String user) {
+ return request(dbName, RequestType.GET, PATH_API_USER, user);
}
protected ResponseDeserializer> getUsersResponseDeserializer() {
@@ -142,33 +140,33 @@ protected ResponseDeserializer> getUsersResponseDeseriali
};
}
- protected Request updateUserRequest(final String database, final String user, final UserUpdateOptions options) {
+ protected Request updateUserRequest(final DbName dbName, final String user, final UserUpdateOptions options) {
final Request request;
- request = request(database, RequestType.PATCH, PATH_API_USER, user);
+ request = request(dbName, RequestType.PATCH, PATH_API_USER, user);
request.setBody(util().serialize(options != null ? options : new UserUpdateOptions()));
return request;
}
- protected Request replaceUserRequest(final String database, final String user, final UserUpdateOptions options) {
+ protected Request replaceUserRequest(final DbName dbName, final String user, final UserUpdateOptions options) {
final Request request;
- request = request(database, RequestType.PUT, PATH_API_USER, user);
+ request = request(dbName, RequestType.PUT, PATH_API_USER, user);
request.setBody(util().serialize(options != null ? options : new UserUpdateOptions()));
return request;
}
protected Request updateUserDefaultDatabaseAccessRequest(final String user, final Permissions permissions) {
- return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ return request(DbName.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
"*").setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
}
protected Request updateUserDefaultCollectionAccessRequest(final String user, final Permissions permissions) {
- return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ return request(DbName.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
"*", "*").setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
}
protected Request getLogsRequest(final LogOptions options) {
final LogOptions params = options != null ? options : new LogOptions();
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_ADMIN_LOG)
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_ADMIN_LOG)
.putQueryParam(LogOptions.PROPERTY_UPTO, params.getUpto())
.putQueryParam(LogOptions.PROPERTY_LEVEL, params.getLevel())
.putQueryParam(LogOptions.PROPERTY_START, params.getStart())
@@ -180,7 +178,7 @@ protected Request getLogsRequest(final LogOptions options) {
protected Request getLogEntriesRequest(final LogOptions options) {
final LogOptions params = options != null ? options : new LogOptions();
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_ADMIN_LOG_ENTRIES)
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_ADMIN_LOG_ENTRIES)
.putQueryParam(LogOptions.PROPERTY_UPTO, params.getUpto())
.putQueryParam(LogOptions.PROPERTY_LEVEL, params.getLevel())
.putQueryParam(LogOptions.PROPERTY_START, params.getStart())
@@ -191,11 +189,11 @@ protected Request getLogEntriesRequest(final LogOptions options) {
}
protected Request getLogLevelRequest() {
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_ADMIN_LOG_LEVEL);
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_ADMIN_LOG_LEVEL);
}
protected Request setLogLevelRequest(final LogLevelEntity entity) {
- return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_ADMIN_LOG_LEVEL)
+ return request(DbName.SYSTEM, RequestType.PUT, PATH_API_ADMIN_LOG_LEVEL)
.setBody(util().serialize(entity));
}
diff --git a/src/main/java/com/arangodb/internal/InternalArangoDatabase.java b/src/main/java/com/arangodb/internal/InternalArangoDatabase.java
index 4cf14c320..179d9073e 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoDatabase.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoDatabase.java
@@ -20,6 +20,7 @@
package com.arangodb.internal;
+import com.arangodb.DbName;
import com.arangodb.entity.*;
import com.arangodb.entity.arangosearch.AnalyzerEntity;
import com.arangodb.entity.arangosearch.analyzer.SearchAnalyzer;
@@ -70,21 +71,21 @@ public abstract class InternalArangoDatabase> getDatabaseResponseDeserializer() {
@@ -92,15 +93,15 @@ protected ResponseDeserializer> getDatabaseResponseDeserializ
}
protected Request getAccessibleDatabasesRequest() {
- return request(name, RequestType.GET, PATH_API_DATABASE, "user");
+ return request(dbName, RequestType.GET, PATH_API_DATABASE, "user");
}
protected Request getVersionRequest() {
- return request(name, RequestType.GET, PATH_API_VERSION);
+ return request(dbName, RequestType.GET, PATH_API_VERSION);
}
protected Request getEngineRequest() {
- return request(name, RequestType.GET, PATH_API_ENGINE);
+ return request(dbName, RequestType.GET, PATH_API_ENGINE);
}
protected Request createCollectionRequest(final String name, final CollectionCreateOptions options) {
@@ -108,12 +109,12 @@ protected Request createCollectionRequest(final String name, final CollectionCre
VPackSlice body = util()
.serialize(OptionsBuilder.build(options != null ? options : new CollectionCreateOptions(), name));
- return request(name(), RequestType.POST, InternalArangoCollection.PATH_API_COLLECTION).setBody(body);
+ return request(dbName, RequestType.POST, InternalArangoCollection.PATH_API_COLLECTION).setBody(body);
}
protected Request getCollectionsRequest(final CollectionsReadOptions options) {
final Request request;
- request = request(name(), RequestType.GET, InternalArangoCollection.PATH_API_COLLECTION);
+ request = request(dbName, RequestType.GET, InternalArangoCollection.PATH_API_COLLECTION);
final CollectionsReadOptions params = (options != null ? options : new CollectionsReadOptions());
request.putQueryParam("excludeSystem", params.getExcludeSystem());
return request;
@@ -128,7 +129,7 @@ protected ResponseDeserializer> getCollectionsRespo
}
protected Request dropRequest() {
- return request(ArangoRequestParam.SYSTEM, RequestType.DELETE, PATH_API_DATABASE, name);
+ return request(DbName.SYSTEM, RequestType.DELETE, PATH_API_DATABASE, dbName.get());
}
protected ResponseDeserializer createDropResponseDeserializer() {
@@ -136,23 +137,23 @@ protected ResponseDeserializer createDropResponseDeserializer() {
}
protected Request grantAccessRequest(final String user, final Permissions permissions) {
- return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- name).setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
+ return request(DbName.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ dbName.get()).setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
}
protected Request resetAccessRequest(final String user) {
- return request(ArangoRequestParam.SYSTEM, RequestType.DELETE, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- name);
+ return request(DbName.SYSTEM, RequestType.DELETE, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ dbName.get());
}
protected Request updateUserDefaultCollectionAccessRequest(final String user, final Permissions permissions) {
- return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- name, "*").setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
+ return request(DbName.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ dbName.get(), "*").setBody(util().serialize(OptionsBuilder.build(new UserAccessOptions(), permissions)));
}
protected Request getPermissionsRequest(final String user) {
- return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE,
- name);
+ return request(DbName.SYSTEM, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE,
+ dbName.get());
}
protected ResponseDeserializer getPermissionsResponseDeserialzer() {
@@ -171,7 +172,7 @@ protected ResponseDeserializer getPermissionsResponseDeserialzer()
protected Request queryRequest(
final String query, final Map bindVars, final AqlQueryOptions options) {
final AqlQueryOptions opt = options != null ? options : new AqlQueryOptions();
- final Request request = request(name, RequestType.POST, PATH_API_CURSOR)
+ final Request request = request(dbName, RequestType.POST, PATH_API_CURSOR)
.setBody(util().serialize(OptionsBuilder
.build(opt, query, bindVars != null ?
util(ArangoSerializationFactory.Serializer.CUSTOM).serialize(bindVars, new ArangoSerializer.Options().serializeNullValues(true)) :
@@ -185,7 +186,7 @@ protected Request queryRequest(
protected Request queryNextRequest(final String id, final AqlQueryOptions options, Map meta) {
- final Request request = request(name, RequestType.PUT, PATH_API_CURSOR, id);
+ final Request request = request(dbName, RequestType.PUT, PATH_API_CURSOR, id);
if (meta != null) {
request.getHeaderParam().putAll(meta);
@@ -202,7 +203,7 @@ protected Request queryNextRequest(final String id, final AqlQueryOptions option
protected Request queryCloseRequest(final String id, final AqlQueryOptions options, Map meta) {
- final Request request = request(name, RequestType.DELETE, PATH_API_CURSOR, id);
+ final Request request = request(dbName, RequestType.DELETE, PATH_API_CURSOR, id);
if (meta != null) {
request.getHeaderParam().putAll(meta);
@@ -225,7 +226,7 @@ protected Request explainQueryRequest(
final AqlQueryExplainOptions opt = options != null ? options : new AqlQueryExplainOptions();
- return request(name, RequestType.POST, PATH_API_EXPLAIN)
+ return request(dbName, RequestType.POST, PATH_API_EXPLAIN)
.setBody(util().serialize(OptionsBuilder.build(
opt,
query,
@@ -235,54 +236,54 @@ protected Request explainQueryRequest(
}
protected Request parseQueryRequest(final String query) {
- return request(name, RequestType.POST, PATH_API_QUERY)
+ return request(dbName, RequestType.POST, PATH_API_QUERY)
.setBody(util().serialize(OptionsBuilder.build(new AqlQueryParseOptions(), query)));
}
protected Request clearQueryCacheRequest() {
- return request(name, RequestType.DELETE, PATH_API_QUERY_CACHE);
+ return request(dbName, RequestType.DELETE, PATH_API_QUERY_CACHE);
}
protected Request getQueryCachePropertiesRequest() {
- return request(name, RequestType.GET, PATH_API_QUERY_CACHE_PROPERTIES);
+ return request(dbName, RequestType.GET, PATH_API_QUERY_CACHE_PROPERTIES);
}
protected Request setQueryCachePropertiesRequest(final QueryCachePropertiesEntity properties) {
- return request(name, RequestType.PUT, PATH_API_QUERY_CACHE_PROPERTIES).setBody(util().serialize(properties));
+ return request(dbName, RequestType.PUT, PATH_API_QUERY_CACHE_PROPERTIES).setBody(util().serialize(properties));
}
protected Request getQueryTrackingPropertiesRequest() {
- return request(name, RequestType.GET, PATH_API_QUERY_PROPERTIES);
+ return request(dbName, RequestType.GET, PATH_API_QUERY_PROPERTIES);
}
protected Request setQueryTrackingPropertiesRequest(final QueryTrackingPropertiesEntity properties) {
- return request(name, RequestType.PUT, PATH_API_QUERY_PROPERTIES).setBody(util().serialize(properties));
+ return request(dbName, RequestType.PUT, PATH_API_QUERY_PROPERTIES).setBody(util().serialize(properties));
}
protected Request getCurrentlyRunningQueriesRequest() {
- return request(name, RequestType.GET, PATH_API_QUERY_CURRENT);
+ return request(dbName, RequestType.GET, PATH_API_QUERY_CURRENT);
}
protected Request getSlowQueriesRequest() {
- return request(name, RequestType.GET, PATH_API_QUERY_SLOW);
+ return request(dbName, RequestType.GET, PATH_API_QUERY_SLOW);
}
protected Request clearSlowQueriesRequest() {
- return request(name, RequestType.DELETE, PATH_API_QUERY_SLOW);
+ return request(dbName, RequestType.DELETE, PATH_API_QUERY_SLOW);
}
protected Request killQueryRequest(final String id) {
- return request(name, RequestType.DELETE, PATH_API_QUERY, id);
+ return request(dbName, RequestType.DELETE, PATH_API_QUERY, id);
}
protected Request createAqlFunctionRequest(
final String name, final String code, final AqlFunctionCreateOptions options) {
- return request(name(), RequestType.POST, PATH_API_AQLFUNCTION).setBody(util().serialize(
+ return request(dbName, RequestType.POST, PATH_API_AQLFUNCTION).setBody(util().serialize(
OptionsBuilder.build(options != null ? options : new AqlFunctionCreateOptions(), name, code)));
}
protected Request deleteAqlFunctionRequest(final String name, final AqlFunctionDeleteOptions options) {
- final Request request = request(name(), RequestType.DELETE, PATH_API_AQLFUNCTION, name);
+ final Request request = request(dbName, RequestType.DELETE, PATH_API_AQLFUNCTION, name);
final AqlFunctionDeleteOptions params = options != null ? options : new AqlFunctionDeleteOptions();
request.putQueryParam("group", params.getGroup());
return request;
@@ -305,7 +306,7 @@ protected ResponseDeserializer deleteAqlFunctionResponseDeserializer()
}
protected Request getAqlFunctionsRequest(final AqlFunctionGetOptions options) {
- final Request request = request(name(), RequestType.GET, PATH_API_AQLFUNCTION);
+ final Request request = request(dbName, RequestType.GET, PATH_API_AQLFUNCTION);
final AqlFunctionGetOptions params = options != null ? options : new AqlFunctionGetOptions();
request.putQueryParam("namespace", params.getNamespace());
return request;
@@ -324,7 +325,7 @@ protected ResponseDeserializer> getAqlFunctionsRes
protected Request createGraphRequest(
final String name, final Collection edgeDefinitions, final GraphCreateOptions options) {
- return request(name(), RequestType.POST, InternalArangoGraph.PATH_API_GHARIAL).setBody(util().serialize(
+ return request(dbName, RequestType.POST, InternalArangoGraph.PATH_API_GHARIAL).setBody(util().serialize(
OptionsBuilder.build(options != null ? options : new GraphCreateOptions(), name, edgeDefinitions)));
}
@@ -333,7 +334,7 @@ protected ResponseDeserializer createGraphResponseDeserializer() {
}
protected Request getGraphsRequest() {
- return request(name, RequestType.GET, InternalArangoGraph.PATH_API_GHARIAL);
+ return request(dbName, RequestType.GET, InternalArangoGraph.PATH_API_GHARIAL);
}
protected ResponseDeserializer> getGraphsResponseDeserializer() {
@@ -342,7 +343,7 @@ protected ResponseDeserializer> getGraphsResponseDeseria
}
protected Request transactionRequest(final String action, final TransactionOptions options) {
- return request(name, RequestType.POST, PATH_API_TRANSACTION).setBody(
+ return request(dbName, RequestType.POST, PATH_API_TRANSACTION).setBody(
util().serialize(OptionsBuilder.build(options != null ? options : new TransactionOptions(), action)));
}
@@ -360,20 +361,20 @@ protected ResponseDeserializer transactionResponseDeserializer(final Clas
}
protected Request beginStreamTransactionRequest(final StreamTransactionOptions options) {
- return request(name, RequestType.POST, PATH_API_BEGIN_STREAM_TRANSACTION)
+ return request(dbName, RequestType.POST, PATH_API_BEGIN_STREAM_TRANSACTION)
.setBody(util().serialize(options != null ? options : new StreamTransactionOptions()));
}
protected Request abortStreamTransactionRequest(String id) {
- return request(name, RequestType.DELETE, PATH_API_TRANSACTION, id);
+ return request(dbName, RequestType.DELETE, PATH_API_TRANSACTION, id);
}
protected Request getStreamTransactionsRequest() {
- return request(name, RequestType.GET, PATH_API_TRANSACTION);
+ return request(dbName, RequestType.GET, PATH_API_TRANSACTION);
}
protected Request getStreamTransactionRequest(String id) {
- return request(name, RequestType.GET, PATH_API_TRANSACTION, id);
+ return request(dbName, RequestType.GET, PATH_API_TRANSACTION, id);
}
protected ResponseDeserializer> transactionsResponseDeserializer() {
@@ -385,7 +386,7 @@ protected ResponseDeserializer> transactionsRespon
}
protected Request commitStreamTransactionRequest(String id) {
- return request(name, RequestType.PUT, PATH_API_TRANSACTION, id);
+ return request(dbName, RequestType.PUT, PATH_API_TRANSACTION, id);
}
protected ResponseDeserializer streamTransactionResponseDeserializer() {
@@ -394,7 +395,7 @@ protected ResponseDeserializer streamTransactionRespons
}
protected Request getInfoRequest() {
- return request(name, RequestType.GET, PATH_API_DATABASE, "current");
+ return request(dbName, RequestType.GET, PATH_API_DATABASE, "current");
}
protected ResponseDeserializer getInfoResponseDeserializer() {
@@ -402,7 +403,7 @@ protected ResponseDeserializer getInfoResponseDeserializer() {
}
protected Request executeTraversalRequest(final TraversalOptions options) {
- return request(name, RequestType.POST, PATH_API_TRAVERSAL)
+ return request(dbName, RequestType.POST, PATH_API_TRAVERSAL)
.setBody(util().serialize(options != null ? options : new TransactionOptions()));
}
@@ -445,11 +446,11 @@ protected Collection deserializeEdges(final Class edgeClass, final VPa
}
protected Request reloadRoutingRequest() {
- return request(name, RequestType.POST, PATH_API_ADMIN_ROUTING_RELOAD);
+ return request(dbName, RequestType.POST, PATH_API_ADMIN_ROUTING_RELOAD);
}
protected Request getViewsRequest() {
- return request(name, RequestType.GET, InternalArangoView.PATH_API_VIEW);
+ return request(dbName, RequestType.GET, InternalArangoView.PATH_API_VIEW);
}
protected ResponseDeserializer> getViewsResponseDeserializer() {
@@ -461,21 +462,21 @@ protected ResponseDeserializer> getViewsResponseDeseriali
}
protected Request createViewRequest(final String name, final ViewType type) {
- return request(name(), RequestType.POST, InternalArangoView.PATH_API_VIEW)
+ return request(dbName, RequestType.POST, InternalArangoView.PATH_API_VIEW)
.setBody(util().serialize(OptionsBuilder.build(new ViewCreateOptions(), name, type)));
}
protected Request createArangoSearchRequest(final String name, final ArangoSearchCreateOptions options) {
- return request(name(), RequestType.POST, InternalArangoView.PATH_API_VIEW).setBody(util().serialize(
+ return request(dbName, RequestType.POST, InternalArangoView.PATH_API_VIEW).setBody(util().serialize(
ArangoSearchOptionsBuilder.build(options != null ? options : new ArangoSearchCreateOptions(), name)));
}
protected Request getAnalyzerRequest(final String name) {
- return request(name(), RequestType.GET, InternalArangoView.PATH_API_ANALYZER, name);
+ return request(dbName, RequestType.GET, InternalArangoView.PATH_API_ANALYZER, name);
}
protected Request getAnalyzersRequest() {
- return request(name(), RequestType.GET, InternalArangoView.PATH_API_ANALYZER);
+ return request(dbName, RequestType.GET, InternalArangoView.PATH_API_ANALYZER);
}
protected ResponseDeserializer> getAnalyzersResponseDeserializer() {
@@ -495,17 +496,17 @@ protected ResponseDeserializer> getSearchAnalyzersRes
}
protected Request createAnalyzerRequest(final AnalyzerEntity options) {
- return request(name(), RequestType.POST, InternalArangoView.PATH_API_ANALYZER)
+ return request(dbName, RequestType.POST, InternalArangoView.PATH_API_ANALYZER)
.setBody(util().serialize(options));
}
protected Request createAnalyzerRequest(final SearchAnalyzer options) {
- return request(name(), RequestType.POST, InternalArangoView.PATH_API_ANALYZER)
+ return request(dbName, RequestType.POST, InternalArangoView.PATH_API_ANALYZER)
.setBody(util().serialize(options));
}
protected Request deleteAnalyzerRequest(final String name, final AnalyzerDeleteOptions options) {
- Request request = request(name(), RequestType.DELETE, InternalArangoView.PATH_API_ANALYZER, name);
+ Request request = request(dbName, RequestType.DELETE, InternalArangoView.PATH_API_ANALYZER, name);
request.putQueryParam("force", options != null ? options.getForce() : null);
return request;
}
diff --git a/src/main/java/com/arangodb/internal/InternalArangoEdgeCollection.java b/src/main/java/com/arangodb/internal/InternalArangoEdgeCollection.java
index a901e9f2d..1fc5dfc43 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoEdgeCollection.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoEdgeCollection.java
@@ -65,7 +65,7 @@ public String name() {
}
protected Request insertEdgeRequest(final T value, final EdgeCreateOptions options) {
- final Request request = request(graph.db().name(), RequestType.POST, PATH_API_GHARIAL, graph.name(), EDGE,
+ final Request request = request(graph.db().dbName(), RequestType.POST, PATH_API_GHARIAL, graph.name(), EDGE,
name);
final EdgeCreateOptions params = (options != null ? options : new EdgeCreateOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -88,7 +88,7 @@ protected ResponseDeserializer insertEdgeResponseDeserializer(fi
}
protected Request getEdgeRequest(final String key, final GraphDocumentReadOptions options) {
- final Request request = request(graph.db().name(), RequestType.GET, PATH_API_GHARIAL, graph.name(), EDGE,
+ final Request request = request(graph.db().dbName(), RequestType.GET, PATH_API_GHARIAL, graph.name(), EDGE,
DocumentUtil.createDocumentHandle(name, key));
final GraphDocumentReadOptions params = (options != null ? options : new GraphDocumentReadOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -105,7 +105,7 @@ protected ResponseDeserializer getEdgeResponseDeserializer(final Class
}
protected Request replaceEdgeRequest(final String key, final T value, final EdgeReplaceOptions options) {
- final Request request = request(graph.db().name(), RequestType.PUT, PATH_API_GHARIAL, graph.name(), EDGE,
+ final Request request = request(graph.db().dbName(), RequestType.PUT, PATH_API_GHARIAL, graph.name(), EDGE,
DocumentUtil.createDocumentHandle(name, key));
final EdgeReplaceOptions params = (options != null ? options : new EdgeReplaceOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -128,7 +128,7 @@ protected ResponseDeserializer replaceEdgeResponseDeserial
protected Request updateEdgeRequest(final String key, final T value, final EdgeUpdateOptions options) {
final Request request;
- request = request(graph.db().name(), RequestType.PATCH, PATH_API_GHARIAL, graph.name(), EDGE,
+ request = request(graph.db().dbName(), RequestType.PATCH, PATH_API_GHARIAL, graph.name(), EDGE,
DocumentUtil.createDocumentHandle(name, key));
final EdgeUpdateOptions params = (options != null ? options : new EdgeUpdateOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -152,7 +152,7 @@ protected ResponseDeserializer updateEdgeResponseDeseriali
}
protected Request deleteEdgeRequest(final String key, final EdgeDeleteOptions options) {
- final Request request = request(graph.db().name(), RequestType.DELETE, PATH_API_GHARIAL, graph.name(), EDGE,
+ final Request request = request(graph.db().dbName(), RequestType.DELETE, PATH_API_GHARIAL, graph.name(), EDGE,
DocumentUtil.createDocumentHandle(name, key));
final EdgeDeleteOptions params = (options != null ? options : new EdgeDeleteOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
diff --git a/src/main/java/com/arangodb/internal/InternalArangoGraph.java b/src/main/java/com/arangodb/internal/InternalArangoGraph.java
index 59300ef29..5e71cb60c 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoGraph.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoGraph.java
@@ -64,7 +64,7 @@ protected Request dropRequest() {
}
protected Request dropRequest(final boolean dropCollections) {
- final Request request = request(db.name(), RequestType.DELETE, PATH_API_GHARIAL, name);
+ final Request request = request(db.dbName(), RequestType.DELETE, PATH_API_GHARIAL, name);
if (dropCollections) {
request.putQueryParam("dropCollections", true);
}
@@ -72,7 +72,7 @@ protected Request dropRequest(final boolean dropCollections) {
}
protected Request getInfoRequest() {
- return request(db.name(), RequestType.GET, PATH_API_GHARIAL, name);
+ return request(db.dbName(), RequestType.GET, PATH_API_GHARIAL, name);
}
protected ResponseDeserializer getInfoResponseDeserializer() {
@@ -80,7 +80,7 @@ protected ResponseDeserializer getInfoResponseDeserializer() {
}
protected Request getVertexCollectionsRequest() {
- return request(db.name(), RequestType.GET, PATH_API_GHARIAL, name, VERTEX);
+ return request(db.dbName(), RequestType.GET, PATH_API_GHARIAL, name, VERTEX);
}
protected ResponseDeserializer> getVertexCollectionsResponseDeserializer() {
@@ -89,7 +89,7 @@ protected ResponseDeserializer> getVertexCollectionsResponseD
}
protected Request addVertexCollectionRequest(final String name) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_GHARIAL, name(), VERTEX);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_GHARIAL, name(), VERTEX);
request.setBody(util().serialize(OptionsBuilder.build(new VertexCollectionCreateOptions(), name)));
return request;
}
@@ -99,7 +99,7 @@ protected ResponseDeserializer addVertexCollectionResponseDeseriali
}
protected Request getEdgeDefinitionsRequest() {
- return request(db.name(), RequestType.GET, PATH_API_GHARIAL, name, EDGE);
+ return request(db.dbName(), RequestType.GET, PATH_API_GHARIAL, name, EDGE);
}
protected ResponseDeserializer> getEdgeDefinitionsDeserializer() {
@@ -108,7 +108,7 @@ protected ResponseDeserializer> getEdgeDefinitionsDeserialize
}
protected Request addEdgeDefinitionRequest(final EdgeDefinition definition) {
- final Request request = request(db.name(), RequestType.POST, PATH_API_GHARIAL, name, EDGE);
+ final Request request = request(db.dbName(), RequestType.POST, PATH_API_GHARIAL, name, EDGE);
request.setBody(util().serialize(definition));
return request;
}
@@ -118,7 +118,7 @@ protected ResponseDeserializer addEdgeDefinitionResponseDeserialize
}
protected Request replaceEdgeDefinitionRequest(final EdgeDefinition definition) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_GHARIAL, name, EDGE,
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_GHARIAL, name, EDGE,
definition.getCollection());
request.setBody(util().serialize(definition));
return request;
@@ -129,7 +129,7 @@ protected ResponseDeserializer replaceEdgeDefinitionResponseDeseria
}
protected Request removeEdgeDefinitionRequest(final String definitionName) {
- return request(db.name(), RequestType.DELETE, PATH_API_GHARIAL, name, EDGE, definitionName);
+ return request(db.dbName(), RequestType.DELETE, PATH_API_GHARIAL, name, EDGE, definitionName);
}
protected ResponseDeserializer removeEdgeDefinitionResponseDeserializer() {
diff --git a/src/main/java/com/arangodb/internal/InternalArangoRoute.java b/src/main/java/com/arangodb/internal/InternalArangoRoute.java
index c73bc665a..9c6a4171a 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoRoute.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoRoute.java
@@ -66,7 +66,7 @@ public void _withBody(final Object body) {
}
protected Request createRequest(final RequestType requestType) {
- final Request request = request(db.name(), requestType, path);
+ final Request request = request(db.dbName(), requestType, path);
for (final Entry param : headerParam.entrySet()) {
request.putHeaderParam(param.getKey(), param.getValue());
}
diff --git a/src/main/java/com/arangodb/internal/InternalArangoSearch.java b/src/main/java/com/arangodb/internal/InternalArangoSearch.java
index 00e7f5c71..dac8d35e8 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoSearch.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoSearch.java
@@ -35,17 +35,17 @@ protected InternalArangoSearch(final D db, final String name) {
}
protected Request getPropertiesRequest() {
- return request(db.name(), RequestType.GET, PATH_API_VIEW, name, "properties");
+ return request(db.dbName(), RequestType.GET, PATH_API_VIEW, name, "properties");
}
protected Request replacePropertiesRequest(final ArangoSearchPropertiesOptions options) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_VIEW, name, "properties");
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_VIEW, name, "properties");
request.setBody(util().serialize(options != null ? options : new ArangoSearchPropertiesOptions()));
return request;
}
protected Request updatePropertiesRequest(final ArangoSearchPropertiesOptions options) {
- final Request request = request(db.name(), RequestType.PATCH, PATH_API_VIEW, name, "properties");
+ final Request request = request(db.dbName(), RequestType.PATCH, PATH_API_VIEW, name, "properties");
request.setBody(util().serialize(options != null ? options : new ArangoSearchPropertiesOptions()));
return request;
}
diff --git a/src/main/java/com/arangodb/internal/InternalArangoVertexCollection.java b/src/main/java/com/arangodb/internal/InternalArangoVertexCollection.java
index 722afe09c..df12b743c 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoVertexCollection.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoVertexCollection.java
@@ -65,11 +65,11 @@ public String name() {
}
protected Request dropRequest() {
- return request(graph.db().name(), RequestType.DELETE, PATH_API_GHARIAL, graph.name(), VERTEX, name);
+ return request(graph.db().dbName(), RequestType.DELETE, PATH_API_GHARIAL, graph.name(), VERTEX, name);
}
protected Request insertVertexRequest(final T value, final VertexCreateOptions options) {
- final Request request = request(graph.db().name(), RequestType.POST, PATH_API_GHARIAL, graph.name(), VERTEX,
+ final Request request = request(graph.db().dbName(), RequestType.POST, PATH_API_GHARIAL, graph.name(), VERTEX,
name);
final VertexCreateOptions params = (options != null ? options : new VertexCreateOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -92,7 +92,7 @@ protected ResponseDeserializer insertVertexResponseDeserialize
}
protected Request getVertexRequest(final String key, final GraphDocumentReadOptions options) {
- final Request request = request(graph.db().name(), RequestType.GET, PATH_API_GHARIAL, graph.name(), VERTEX,
+ final Request request = request(graph.db().dbName(), RequestType.GET, PATH_API_GHARIAL, graph.name(), VERTEX,
DocumentUtil.createDocumentHandle(name, key));
final GraphDocumentReadOptions params = (options != null ? options : new GraphDocumentReadOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -109,7 +109,7 @@ protected ResponseDeserializer getVertexResponseDeserializer(final Class<
}
protected Request replaceVertexRequest(final String key, final T value, final VertexReplaceOptions options) {
- final Request request = request(graph.db().name(), RequestType.PUT, PATH_API_GHARIAL, graph.name(), VERTEX,
+ final Request request = request(graph.db().dbName(), RequestType.PUT, PATH_API_GHARIAL, graph.name(), VERTEX,
DocumentUtil.createDocumentHandle(name, key));
final VertexReplaceOptions params = (options != null ? options : new VertexReplaceOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -132,7 +132,7 @@ protected ResponseDeserializer replaceVertexResponseDese
protected Request updateVertexRequest(final String key, final T value, final VertexUpdateOptions options) {
final Request request;
- request = request(graph.db().name(), RequestType.PATCH, PATH_API_GHARIAL, graph.name(), VERTEX,
+ request = request(graph.db().dbName(), RequestType.PATCH, PATH_API_GHARIAL, graph.name(), VERTEX,
DocumentUtil.createDocumentHandle(name, key));
final VertexUpdateOptions params = (options != null ? options : new VertexUpdateOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
@@ -156,7 +156,7 @@ protected ResponseDeserializer updateVertexResponseDeser
}
protected Request deleteVertexRequest(final String key, final VertexDeleteOptions options) {
- final Request request = request(graph.db().name(), RequestType.DELETE, PATH_API_GHARIAL, graph.name(), VERTEX,
+ final Request request = request(graph.db().dbName(), RequestType.DELETE, PATH_API_GHARIAL, graph.name(), VERTEX,
DocumentUtil.createDocumentHandle(name, key));
final VertexDeleteOptions params = (options != null ? options : new VertexDeleteOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
diff --git a/src/main/java/com/arangodb/internal/InternalArangoView.java b/src/main/java/com/arangodb/internal/InternalArangoView.java
index 0c1e19ed3..1fa76f015 100644
--- a/src/main/java/com/arangodb/internal/InternalArangoView.java
+++ b/src/main/java/com/arangodb/internal/InternalArangoView.java
@@ -53,17 +53,17 @@ public String name() {
}
protected Request dropRequest() {
- return request(db.name(), RequestType.DELETE, PATH_API_VIEW, name);
+ return request(db.dbName(), RequestType.DELETE, PATH_API_VIEW, name);
}
protected Request renameRequest(final String newName) {
- final Request request = request(db.name(), RequestType.PUT, PATH_API_VIEW, name, "rename");
+ final Request request = request(db.dbName(), RequestType.PUT, PATH_API_VIEW, name, "rename");
request.setBody(util().serialize(OptionsBuilder.build(new ViewRenameOptions(), newName)));
return request;
}
protected Request getInfoRequest() {
- return request(db.name(), RequestType.GET, PATH_API_VIEW, name);
+ return request(db.dbName(), RequestType.GET, PATH_API_VIEW, name);
}
}
diff --git a/src/main/java/com/arangodb/internal/http/HttpConnection.java b/src/main/java/com/arangodb/internal/http/HttpConnection.java
index 50cbc504d..5d1d1eb03 100644
--- a/src/main/java/com/arangodb/internal/http/HttpConnection.java
+++ b/src/main/java/com/arangodb/internal/http/HttpConnection.java
@@ -239,7 +239,7 @@ public void close() throws IOException {
private static String buildUrl(final String baseUrl, final Request request) {
final StringBuilder sb = new StringBuilder().append(baseUrl);
- final String database = request.getDatabase();
+ final String database = request.getDbName().get();
if (database != null && !database.isEmpty()) {
sb.append("/_db/").append(database);
}
diff --git a/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java b/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java
index f23e42d66..eb7dd40e0 100644
--- a/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java
+++ b/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java
@@ -21,8 +21,8 @@
package com.arangodb.internal.net;
import com.arangodb.ArangoDBException;
+import com.arangodb.DbName;
import com.arangodb.internal.ArangoExecutorSync;
-import com.arangodb.internal.ArangoRequestParam;
import com.arangodb.internal.util.HostUtils;
import com.arangodb.util.ArangoSerialization;
import com.arangodb.velocypack.VPackSlice;
@@ -125,7 +125,7 @@ private Collection resolveFromServer() throws ArangoDBException {
try {
response = executor.execute(
- new Request(ArangoRequestParam.SYSTEM, RequestType.GET, "/_api/cluster/endpoints"),
+ new Request(DbName.SYSTEM, RequestType.GET, "/_api/cluster/endpoints"),
response1 -> {
final VPackSlice field = response1.getBody().get("endpoints");
Collection endpoints;
diff --git a/src/main/java/com/arangodb/internal/util/EncodeUtils.java b/src/main/java/com/arangodb/internal/util/EncodeUtils.java
index 9696c30fc..1472b4301 100644
--- a/src/main/java/com/arangodb/internal/util/EncodeUtils.java
+++ b/src/main/java/com/arangodb/internal/util/EncodeUtils.java
@@ -20,20 +20,36 @@
package com.arangodb.internal.util;
+import com.arangodb.ArangoDBException;
+
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
-/**
- * @author Mark Vollmary
- */
-public final class EncodeUtils {
-
+public class EncodeUtils {
private EncodeUtils() {
}
- public static String encodeURL(final String value) throws UnsupportedEncodingException {
- return URLEncoder.encode(value, "UTF-8").replaceAll("\\+", "%20").replaceAll("\\%21", "!")
- .replaceAll("\\%27", "'").replaceAll("\\%28", "(").replaceAll("\\%29", ")").replaceAll("\\%7E", "~");
+ /**
+ * Encodes a string by replacing each instance of certain characters by one, two, three, or four escape sequences
+ * representing the UTF-8 encoding of the character.
+ * It behaves the same as Javascript encodeURIComponent()
.
+ *
+ * @param value string to encode
+ * @return encoded string
+ */
+ public static String encodeURIComponent(final String value) {
+ try {
+ return URLEncoder.encode(value, StandardCharsets.UTF_8.name())
+ .replace("+", "%20")
+ .replace("%21", "!")
+ .replace("%27", "'")
+ .replace("%28", "(")
+ .replace("%29", ")")
+ .replace("%7E", "~");
+ } catch (UnsupportedEncodingException e) {
+ throw new ArangoDBException(e);
+ }
}
}
diff --git a/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java b/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java
index ef3346db9..1d95b211f 100644
--- a/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java
+++ b/src/main/java/com/arangodb/internal/velocypack/VPackSerializers.java
@@ -65,7 +65,7 @@ public class VPackSerializers {
builder.add(attribute, ValueType.ARRAY);
builder.add(value.getVersion());
builder.add(value.getType());
- builder.add(value.getDatabase());
+ builder.add(value.getDbName().get());
builder.add(value.getRequestType().getType());
builder.add(value.getRequest());
builder.add(ValueType.OBJECT);
diff --git a/src/main/java/com/arangodb/internal/velocystream/internal/AuthenticationRequest.java b/src/main/java/com/arangodb/internal/velocystream/internal/AuthenticationRequest.java
index 550329d32..9d47bc548 100644
--- a/src/main/java/com/arangodb/internal/velocystream/internal/AuthenticationRequest.java
+++ b/src/main/java/com/arangodb/internal/velocystream/internal/AuthenticationRequest.java
@@ -20,6 +20,7 @@
package com.arangodb.internal.velocystream.internal;
+import com.arangodb.DbName;
import com.arangodb.velocystream.Request;
/**
@@ -32,7 +33,7 @@ public class AuthenticationRequest extends Request {
private final String encryption;// "plain"
public AuthenticationRequest(final String user, final String password, final String encryption) {
- super(null, null, null);
+ super(DbName.of(null), null, null);
this.user = user;
this.password = password;
this.encryption = encryption;
diff --git a/src/main/java/com/arangodb/internal/velocystream/internal/JwtAuthenticationRequest.java b/src/main/java/com/arangodb/internal/velocystream/internal/JwtAuthenticationRequest.java
index 53ab1a58c..c2ccf53b3 100644
--- a/src/main/java/com/arangodb/internal/velocystream/internal/JwtAuthenticationRequest.java
+++ b/src/main/java/com/arangodb/internal/velocystream/internal/JwtAuthenticationRequest.java
@@ -1,5 +1,6 @@
package com.arangodb.internal.velocystream.internal;
+import com.arangodb.DbName;
import com.arangodb.velocystream.Request;
public class JwtAuthenticationRequest extends Request {
@@ -8,7 +9,7 @@ public class JwtAuthenticationRequest extends Request {
private final String encryption; // "jwt"
public JwtAuthenticationRequest(final String token, final String encryption) {
- super(null, null, null);
+ super(DbName.of(null), null, null);
this.token = token;
this.encryption = encryption;
setType(1000);
diff --git a/src/main/java/com/arangodb/model/DBCreateOptions.java b/src/main/java/com/arangodb/model/DBCreateOptions.java
index abd574a95..23708bb18 100644
--- a/src/main/java/com/arangodb/model/DBCreateOptions.java
+++ b/src/main/java/com/arangodb/model/DBCreateOptions.java
@@ -20,6 +20,8 @@
package com.arangodb.model;
+import com.arangodb.DbName;
+
import java.util.Collection;
/**
@@ -59,9 +61,19 @@ public String getName() {
/**
* @param name Has to contain a valid database name
* @return options
+ * @deprecated Use {@link #name(DbName)} instead.
*/
+ @Deprecated
public DBCreateOptions name(final String name) {
- this.name = name;
+ return name(DbName.of(name));
+ }
+
+ /**
+ * @param dbName database name
+ * @return options
+ */
+ public DBCreateOptions name(final DbName dbName) {
+ name = dbName.get();
return this;
}
diff --git a/src/main/java/com/arangodb/util/UnicodeUtils.java b/src/main/java/com/arangodb/util/UnicodeUtils.java
new file mode 100644
index 000000000..bb6236ac1
--- /dev/null
+++ b/src/main/java/com/arangodb/util/UnicodeUtils.java
@@ -0,0 +1,51 @@
+/*
+ * 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.util;
+
+import java.text.Normalizer;
+
+/**
+ * @author Mark Vollmary
+ * @author Michele Rastelli
+ */
+public final class UnicodeUtils {
+
+ private UnicodeUtils() {
+ }
+
+ /**
+ * Normalizes a unicode string according to ArangoDB extended naming convention.
+ *
+ * @param value string to normalize
+ * @return NFC normalized string
+ */
+ public static String normalize(final String value) {
+ if (value == null) {
+ return null;
+ }
+ return Normalizer.normalize(value, Normalizer.Form.NFC);
+ }
+
+ public static void checkNormalized(final String value) {
+ if (value != null && !normalize(value).equals(value))
+ throw new IllegalArgumentException("Unicode String not normalized: NFC normal form is required.");
+ }
+}
diff --git a/src/main/java/com/arangodb/velocystream/Request.java b/src/main/java/com/arangodb/velocystream/Request.java
index ab470df77..c57e22a81 100644
--- a/src/main/java/com/arangodb/velocystream/Request.java
+++ b/src/main/java/com/arangodb/velocystream/Request.java
@@ -20,6 +20,7 @@
package com.arangodb.velocystream;
+import com.arangodb.DbName;
import com.arangodb.velocypack.VPackSlice;
import com.arangodb.velocypack.annotations.Expose;
@@ -33,7 +34,7 @@ public class Request {
private int version = 1;
private int type = 1;
- private final String database;
+ private final DbName dbName;
private final RequestType requestType;
private final String request;
private final Map queryParam;
@@ -41,9 +42,17 @@ public class Request {
@Expose(serialize = false)
private VPackSlice body;
+ /**
+ * @deprecated Use {@link #Request(DbName, RequestType, String)} instead
+ */
+ @Deprecated
public Request(final String database, final RequestType requestType, final String path) {
+ this(DbName.of(database), requestType, path);
+ }
+
+ public Request(final DbName dbName, final RequestType requestType, final String path) {
super();
- this.database = database;
+ this.dbName = dbName;
this.requestType = requestType;
this.request = path;
body = null;
@@ -69,8 +78,16 @@ public Request setType(final int type) {
return this;
}
+ /**
+ * @deprecated Use {@link #getDbName()} instead
+ */
+ @Deprecated
public String getDatabase() {
- return database;
+ return getDbName().get();
+ }
+
+ public DbName getDbName() {
+ return dbName;
}
public RequestType getRequestType() {
diff --git a/src/test/java/com/arangodb/ArangoDBTest.java b/src/test/java/com/arangodb/ArangoDBTest.java
index 985862226..355d68d89 100644
--- a/src/test/java/com/arangodb/ArangoDBTest.java
+++ b/src/test/java/com/arangodb/ArangoDBTest.java
@@ -20,16 +20,7 @@
package com.arangodb;
-import com.arangodb.entity.ArangoDBVersion;
-import com.arangodb.entity.DatabaseEntity;
-import com.arangodb.entity.License;
-import com.arangodb.entity.LogEntity;
-import com.arangodb.entity.LogEntriesEntity;
-import com.arangodb.entity.LogLevel;
-import com.arangodb.entity.LogLevelEntity;
-import com.arangodb.entity.Permissions;
-import com.arangodb.entity.ServerRole;
-import com.arangodb.entity.UserEntity;
+import com.arangodb.entity.*;
import com.arangodb.model.DBCreateOptions;
import com.arangodb.model.DatabaseOptions;
import com.arangodb.model.DatabaseUsersOptions;
@@ -72,8 +63,8 @@
@RunWith(Parameterized.class)
public class ArangoDBTest {
- private static final String DB1 = "ArangoDBTest_db1";
- private static final String DB2 = "ArangoDBTest_db2";
+ private static final DbName DB1 = DbName.of("ArangoDBTest_db1");
+ private static final DbName DB2 = DbName.of("ArangoDBTest_db2");
private static final String ROOT = "root";
private static final String PW = "machts der hund";
@@ -82,10 +73,12 @@ public class ArangoDBTest {
private final ArangoDatabase db1;
private final ArangoDatabase db2;
+ private static Boolean extendedNames;
+
@BeforeClass
public static void initDB() {
ArangoDB arango = BaseTest.arangos.get(0);
- for (String db : new String[]{DB1, DB2}) {
+ for (DbName db : new DbName[]{DB1, DB2}) {
ArangoDatabase database = arango.db(db);
if (!database.exists())
database.create();
@@ -95,7 +88,7 @@ public static void initDB() {
@AfterClass
public static void shutdown() {
ArangoDB arango = BaseTest.arangos.get(0);
- for (String db : new String[]{DB1, DB2}) {
+ for (DbName db : new DbName[]{DB1, DB2}) {
ArangoDatabase database = arango.db(db);
if (database.exists())
database.drop();
@@ -127,6 +120,20 @@ private boolean isAtLeastVersion(final int major, final int minor) {
return TestUtils.isAtLeastVersion(arangoDB.getVersion().getVersion(), major, minor, 0);
}
+ private boolean supportsExtendedNames() {
+ if (extendedNames == null) {
+ try {
+ ArangoDatabase testDb = arangoDB.db(DbName.of("test-" + TestUtils.generateRandomDbName(20, true)));
+ testDb.create();
+ extendedNames = true;
+ testDb.drop();
+ } catch (ArangoDBException e) {
+ extendedNames = false;
+ }
+ }
+ return extendedNames;
+ }
+
@Test
public void getVersion() {
final ArangoDBVersion version = arangoDB.getVersion();
@@ -137,18 +144,36 @@ public void getVersion() {
@Test
public void createAndDeleteDatabase() {
- final String dbName = "testDB-" + UUID.randomUUID().toString();
- final Boolean resultCreate = arangoDB.createDatabase(dbName);
+ final DbName dbName = DbName.of("testDB-" + TestUtils.generateRandomDbName(20, supportsExtendedNames()));
+ final Boolean resultCreate;
+ resultCreate = arangoDB.createDatabase(dbName);
assertThat(resultCreate, is(true));
final Boolean resultDelete = arangoDB.db(dbName).drop();
assertThat(resultDelete, is(true));
}
+ @Test
+ public void createWithNotNormalizedName() {
+ assumeTrue(supportsExtendedNames());
+
+ final String dbName = "testDB-\u006E\u0303\u00f1";
+ DbName normalized = DbName.normalize(dbName);
+ arangoDB.createDatabase(normalized);
+ arangoDB.db(normalized).drop();
+
+ try {
+ DbName.of(dbName);
+ fail();
+ } catch (IllegalArgumentException e) {
+ assertThat(e.getMessage(), containsString("not normalized"));
+ }
+ }
+
@Test
public void createDatabaseWithOptions() {
assumeTrue(isCluster());
assumeTrue(isAtLeastVersion(3, 6));
- final String dbName = "testDB-" + UUID.randomUUID().toString();
+ final DbName dbName = DbName.of("testDB-" + TestUtils.generateRandomDbName(20, supportsExtendedNames()));
final Boolean resultCreate = arangoDB.createDatabase(new DBCreateOptions()
.name(dbName)
.options(new DatabaseOptions()
@@ -170,12 +195,12 @@ public void createDatabaseWithOptions() {
}
@Test
- public void createDatabaseWithOptionsSatellite() {
+ public void createDatabaseWithOptionsSatellite() {
assumeTrue(isCluster());
assumeTrue(isEnterprise());
assumeTrue(isAtLeastVersion(3, 6));
- final String dbName = "testDB-" + UUID.randomUUID().toString();
+ final DbName dbName = DbName.of("testDB-" + TestUtils.generateRandomDbName(20, supportsExtendedNames()));
final Boolean resultCreate = arangoDB.createDatabase(new DBCreateOptions()
.name(dbName)
.options(new DatabaseOptions()
@@ -198,7 +223,7 @@ public void createDatabaseWithOptionsSatellite() {
@Test
public void createDatabaseWithUsers() throws InterruptedException {
- final String dbName = "testDB-" + UUID.randomUUID().toString();
+ final DbName dbName = DbName.of("testDB-" + TestUtils.generateRandomDbName(20, supportsExtendedNames()));
final Map extra = Collections.singletonMap("key", "value");
final Boolean resultCreate = arangoDB.createDatabase(new DBCreateOptions()
.name(dbName)
@@ -212,7 +237,7 @@ public void createDatabaseWithUsers() throws InterruptedException {
assertThat(resultCreate, is(true));
DatabaseEntity info = arangoDB.db(dbName).getInfo();
- assertThat(info.getName(), is(dbName));
+ assertThat(info.getName(), is(dbName.get()));
Optional retrievedUserOptional = arangoDB.getUsers().stream()
.filter(it -> it.getUser().equals("testUser"))
@@ -246,7 +271,7 @@ public void getDatabases() {
assertThat(dbs, is(notNullValue()));
assertThat(dbs.size(), is(greaterThan(0)));
assertThat(dbs.contains("_system"), is(true));
- assertThat(dbs, hasItem(DB1));
+ assertThat(dbs, hasItem(DB1.get()));
}
@Test
@@ -410,7 +435,7 @@ public void authenticationFailUser() {
@Test
public void execute() throws VPackException {
- final Response response = arangoDB.execute(new Request("_system", RequestType.GET, "/_api/version"));
+ final Response response = arangoDB.execute(new Request(DbName.SYSTEM, RequestType.GET, "/_api/version"));
assertThat(response.getBody(), is(notNullValue()));
assertThat(response.getBody().get("version").isString(), is(true));
}
@@ -477,7 +502,7 @@ public void getLogsOffset() {
public void getLogsSearch() {
assumeTrue(isAtLeastVersion(3, 7)); // it fails in 3.6 active-failover (BTS-362)
final LogEntity logs = arangoDB.getLogs(null);
- final LogEntity logsSearch = arangoDB.getLogs(new LogOptions().search(BaseTest.TEST_DB));
+ final LogEntity logsSearch = arangoDB.getLogs(new LogOptions().search(BaseTest.TEST_DB.get()));
assertThat(logsSearch, is(notNullValue()));
assertThat(logs.getTotalAmount(), greaterThan(logsSearch.getTotalAmount()));
}
@@ -508,7 +533,7 @@ public void getLogsSortDesc() {
@Test
public void getLogEntries() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(null);
assertThat(logs, is(notNullValue()));
assertThat(logs.getTotal(), greaterThan(0L));
@@ -517,7 +542,7 @@ public void getLogEntries() {
@Test
public void getLogEntriesUpto() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logsUpto = arangoDB.getLogEntries(new LogOptions().upto(LogLevel.WARNING));
assertThat(logsUpto, is(notNullValue()));
assertThat(
@@ -530,7 +555,7 @@ public void getLogEntriesUpto() {
@Test
public void getLogEntriesLevel() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logsInfo = arangoDB.getLogEntries(new LogOptions().level(LogLevel.INFO));
assertThat(logsInfo, is(notNullValue()));
assertThat(
@@ -543,7 +568,7 @@ public void getLogEntriesLevel() {
@Test
public void getLogEntriesStart() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(null);
final Long firstId = logs.getMessages().get(0).getId();
final LogEntriesEntity logsStart = arangoDB.getLogEntries(new LogOptions().start(firstId + 1));
@@ -558,7 +583,7 @@ public void getLogEntriesStart() {
@Test
public void getLogEntriesSize() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(null);
int count = logs.getMessages().size();
assertThat(count, greaterThan(0));
@@ -569,7 +594,7 @@ public void getLogEntriesSize() {
@Test
public void getLogEntriesOffset() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(null);
assertThat(logs.getTotal(), greaterThan(0L));
Long firstId = logs.getMessages().get(0).getId();
@@ -584,16 +609,16 @@ public void getLogEntriesOffset() {
@Test
public void getLogEntriesSearch() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(null);
- final LogEntriesEntity logsSearch = arangoDB.getLogEntries(new LogOptions().search(BaseTest.TEST_DB));
+ final LogEntriesEntity logsSearch = arangoDB.getLogEntries(new LogOptions().search(BaseTest.TEST_DB.get()));
assertThat(logsSearch, is(notNullValue()));
assertThat(logs.getTotal(), greaterThan(logsSearch.getTotal()));
}
@Test
public void getLogEntriesSortAsc() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(new LogOptions().sort(SortOrder.asc));
assertThat(logs, is(notNullValue()));
long lastId = -1;
@@ -608,7 +633,7 @@ public void getLogEntriesSortAsc() {
@Test
public void getLogEntriesSortDesc() {
- assumeTrue(isAtLeastVersion(3,8));
+ assumeTrue(isAtLeastVersion(3, 8));
final LogEntriesEntity logs = arangoDB.getLogEntries(new LogOptions().sort(SortOrder.desc));
assertThat(logs, is(notNullValue()));
long lastId = Long.MAX_VALUE;
@@ -647,7 +672,7 @@ public void setLogLevel() {
@Test
public void arangoDBException() {
try {
- arangoDB.db("no").getInfo();
+ arangoDB.db(DbName.of("no")).getInfo();
fail();
} catch (final ArangoDBException e) {
assertThat(e.getResponseCode(), is(404));
@@ -674,9 +699,9 @@ public void loadproperties2() {
@Test
public void accessMultipleDatabases() {
- final ArangoDBVersion version1 = db1.getVersion();
- assertThat(version1, is(notNullValue()));
- final ArangoDBVersion version2 = db2.getVersion();
- assertThat(version2, is(notNullValue()));
+ final ArangoDBVersion version1 = db1.getVersion();
+ assertThat(version1, is(notNullValue()));
+ final ArangoDBVersion version2 = db2.getVersion();
+ assertThat(version2, is(notNullValue()));
}
}
diff --git a/src/test/java/com/arangodb/ArangoDatabaseTest.java b/src/test/java/com/arangodb/ArangoDatabaseTest.java
index 9e3c35093..b1e74ac0d 100644
--- a/src/test/java/com/arangodb/ArangoDatabaseTest.java
+++ b/src/test/java/com/arangodb/ArangoDatabaseTest.java
@@ -1223,7 +1223,7 @@ public void getInfo() {
final DatabaseEntity info = db.getInfo();
assertThat(info, is(notNullValue()));
assertThat(info.getId(), is(notNullValue()));
- assertThat(info.getName(), is(BaseTest.TEST_DB));
+ assertThat(info.getName(), is(BaseTest.TEST_DB.get()));
assertThat(info.getPath(), is(notNullValue()));
assertThat(info.getIsSystem(), is(false));
diff --git a/src/test/java/com/arangodb/ArangoSearchTest.java b/src/test/java/com/arangodb/ArangoSearchTest.java
index 76e9aa953..83b5f2f1b 100644
--- a/src/test/java/com/arangodb/ArangoSearchTest.java
+++ b/src/test/java/com/arangodb/ArangoSearchTest.java
@@ -293,7 +293,7 @@ public void replaceProperties() {
private void createGetAndDeleteAnalyzer(AnalyzerEntity options) {
- String fullyQualifiedName = db.name() + "::" + options.getName();
+ String fullyQualifiedName = db.dbName().get() + "::" + options.getName();
// createAnalyzer
AnalyzerEntity createdAnalyzer = db.createAnalyzer(options);
@@ -337,7 +337,7 @@ private void createGetAndDeleteAnalyzer(AnalyzerEntity options) {
private void createGetAndDeleteTypedAnalyzer(SearchAnalyzer analyzer) {
- String fullyQualifiedName = db.name() + "::" + analyzer.getName();
+ String fullyQualifiedName = db.dbName().get() + "::" + analyzer.getName();
analyzer.setName(fullyQualifiedName);
// createAnalyzer
diff --git a/src/test/java/com/arangodb/BaseTest.java b/src/test/java/com/arangodb/BaseTest.java
index c09950bc8..2248d600c 100644
--- a/src/test/java/com/arangodb/BaseTest.java
+++ b/src/test/java/com/arangodb/BaseTest.java
@@ -20,11 +20,7 @@
package com.arangodb;
-import com.arangodb.entity.ArangoDBEngine;
-import com.arangodb.entity.CollectionType;
-import com.arangodb.entity.EdgeDefinition;
-import com.arangodb.entity.License;
-import com.arangodb.entity.ServerRole;
+import com.arangodb.entity.*;
import com.arangodb.mapping.ArangoJack;
import com.arangodb.model.CollectionCreateOptions;
import com.arangodb.model.GraphCreateOptions;
@@ -44,7 +40,7 @@
*/
public abstract class BaseTest {
- static final String TEST_DB = "java_driver_test_db";
+ static final DbName TEST_DB = DbName.of("java_driver_test_db");
// TODO: make configurable
static final List arangos = Arrays.asList(
diff --git a/src/test/java/com/arangodb/UserAuthTest.java b/src/test/java/com/arangodb/UserAuthTest.java
index db66bebfc..6b3d604d8 100644
--- a/src/test/java/com/arangodb/UserAuthTest.java
+++ b/src/test/java/com/arangodb/UserAuthTest.java
@@ -20,10 +20,7 @@
package com.arangodb;
-import com.arangodb.entity.BaseDocument;
-import com.arangodb.entity.CollectionEntity;
-import com.arangodb.entity.IndexEntity;
-import com.arangodb.entity.Permissions;
+import com.arangodb.entity.*;
import com.arangodb.model.AqlQueryOptions;
import com.arangodb.model.CollectionPropertiesOptions;
import com.arangodb.model.HashIndexOptions;
@@ -52,8 +49,8 @@
@Ignore
public class UserAuthTest {
- private static final String DB_NAME = "AuthUnitTestDB";
- private static final String DB_NAME_NEW = DB_NAME + "new";
+ private static final DbName DB_NAME = DbName.of("AuthUnitTestDB");
+ private static final DbName DB_NAME_NEW = DB_NAME.of(DB_NAME.get() + "new");
private static final String COLLECTION_NAME = "AuthUnitTestCollection";
private static final String COLLECTION_NAME_NEW = COLLECTION_NAME + "new";
private static final String USER_NAME = "AuthUnitTestUser";
@@ -137,14 +134,14 @@ public void createDatabase() {
} catch (final ArangoDBException e) {
fail(details);
}
- assertThat(details, arangoDBRoot.getDatabases(), hasItem(DB_NAME_NEW));
+ assertThat(details, arangoDBRoot.getDatabases(), hasItem(DB_NAME_NEW.get()));
} else {
try {
arangoDB.createDatabase(DB_NAME_NEW);
fail(details);
} catch (final ArangoDBException e) {
}
- assertThat(details, arangoDBRoot.getDatabases(), not(hasItem(DB_NAME_NEW)));
+ assertThat(details, arangoDBRoot.getDatabases(), not(hasItem(DB_NAME_NEW.get())));
}
} finally {
try {
@@ -164,14 +161,14 @@ public void dropDatabase() {
} catch (final ArangoDBException e) {
fail(details);
}
- assertThat(details, arangoDBRoot.getDatabases(), not(hasItem(DB_NAME)));
+ assertThat(details, arangoDBRoot.getDatabases(), not(hasItem(DB_NAME.get())));
} else {
try {
arangoDB.db(DB_NAME).drop();
fail(details);
} catch (final ArangoDBException e) {
}
- assertThat(details, arangoDBRoot.getDatabases(), hasItem(DB_NAME));
+ assertThat(details, arangoDBRoot.getDatabases(), hasItem(DB_NAME.get()));
}
} finally {
try {
diff --git a/src/test/java/com/arangodb/async/ArangoDBTest.java b/src/test/java/com/arangodb/async/ArangoDBTest.java
index c21715354..02a389ae6 100644
--- a/src/test/java/com/arangodb/async/ArangoDBTest.java
+++ b/src/test/java/com/arangodb/async/ArangoDBTest.java
@@ -22,21 +22,16 @@
import com.arangodb.ArangoDB;
import com.arangodb.ArangoDBException;
-import com.arangodb.entity.DatabaseEntity;
-import com.arangodb.entity.License;
-import com.arangodb.entity.LogEntity;
-import com.arangodb.entity.LogEntriesEntity;
-import com.arangodb.entity.LogLevel;
-import com.arangodb.entity.LogLevelEntity;
-import com.arangodb.entity.Permissions;
-import com.arangodb.entity.ServerRole;
-import com.arangodb.entity.UserEntity;
+import com.arangodb.ArangoDatabase;
+import com.arangodb.DbName;
+import com.arangodb.entity.*;
import com.arangodb.model.DBCreateOptions;
import com.arangodb.model.DatabaseOptions;
import com.arangodb.model.LogOptions;
import com.arangodb.model.LogOptions.SortOrder;
import com.arangodb.model.UserCreateOptions;
import com.arangodb.model.UserUpdateOptions;
+import com.arangodb.util.TestUtils;
import com.arangodb.velocypack.exception.VPackException;
import com.arangodb.velocystream.Request;
import com.arangodb.velocystream.RequestType;
@@ -45,7 +40,6 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
@@ -63,6 +57,7 @@ public class ArangoDBTest {
private static final String ROOT = "root";
private static final String USER = "mit dem mund";
private static final String PW = "machts der hund";
+ private static Boolean extendedNames;
private boolean isEnterprise() {
final ArangoDB arangoDB = new ArangoDB.Builder().build();
@@ -79,6 +74,21 @@ private boolean isAtLeastVersion(final int major, final int minor) {
return com.arangodb.util.TestUtils.isAtLeastVersion(arangoDB.getVersion().getVersion(), major,minor,0);
}
+ private boolean supportsExtendedNames() {
+ final ArangoDB arangoDB = new ArangoDB.Builder().build();
+ if (extendedNames == null) {
+ try {
+ ArangoDatabase testDb = arangoDB.db(DbName.of("test-" + TestUtils.generateRandomDbName(20, true)));
+ testDb.create();
+ extendedNames = true;
+ testDb.drop();
+ } catch (ArangoDBException e) {
+ extendedNames = false;
+ }
+ }
+ return extendedNames;
+ }
+
@Test
public void getVersion() throws InterruptedException, ExecutionException {
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().build();
@@ -149,7 +159,7 @@ public void createDatabaseWithOptions() throws ExecutionException, InterruptedEx
assumeTrue(isAtLeastVersion(3, 6));
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().build();
- final String dbName = "testDB-" + UUID.randomUUID().toString();
+ final DbName dbName = DbName.of("testDB-" + TestUtils.generateRandomDbName(20, supportsExtendedNames()));
final Boolean resultCreate = arangoDB.createDatabase(new DBCreateOptions()
.name(dbName)
.options(new DatabaseOptions()
@@ -177,7 +187,7 @@ public void createDatabaseWithOptionsSatellite() throws ExecutionException, Inte
assumeTrue(isAtLeastVersion(3, 6));
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().build();
- final String dbName = "testDB-" + UUID.randomUUID().toString();
+ final DbName dbName = DbName.of("testDB-" + TestUtils.generateRandomDbName(20, supportsExtendedNames()));
final Boolean resultCreate = arangoDB.createDatabase(new DBCreateOptions()
.name(dbName)
.options(new DatabaseOptions()
@@ -220,7 +230,7 @@ public void getDatabases() throws InterruptedException, ExecutionException {
dbs = arangoDB.getDatabases().get();
assertThat(dbs.size(), is(greaterThan(dbCount)));
assertThat(dbs, hasItem("_system"));
- assertThat(dbs, hasItem(BaseTest.TEST_DB));
+ assertThat(dbs, hasItem(BaseTest.TEST_DB.get()));
arangoDB.db(BaseTest.TEST_DB).drop().get();
}
@@ -450,7 +460,7 @@ public void authenticationFailUser() throws InterruptedException {
public void execute() throws VPackException, InterruptedException, ExecutionException {
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().build();
arangoDB
- .execute(new Request("_system", RequestType.GET, "/_api/version"))
+ .execute(new Request(DbName.SYSTEM, RequestType.GET, "/_api/version"))
.whenComplete((response, ex) -> {
assertThat(response.getBody(), is(notNullValue()));
assertThat(response.getBody().get("version").isString(), is(true));
@@ -462,7 +472,7 @@ public void execute() throws VPackException, InterruptedException, ExecutionExce
public void execute_acquireHostList_enabled() throws VPackException, InterruptedException, ExecutionException {
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().acquireHostList(true).build();
arangoDB
- .execute(new Request("_system", RequestType.GET, "/_api/version"))
+ .execute(new Request(DbName.SYSTEM, RequestType.GET, "/_api/version"))
.whenComplete((response, ex) -> {
assertThat(response.getBody(), is(notNullValue()));
assertThat(response.getBody().get("version").isString(), is(true));
@@ -561,7 +571,7 @@ public void getLogsSearch() throws InterruptedException, ExecutionException {
assumeTrue(isAtLeastVersion(3, 7)); // it fails in 3.6 active-failover (BTS-362)
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().build();
final LogEntity logs = arangoDB.getLogs(null).get();
- arangoDB.getLogs(new LogOptions().search(BaseTest.TEST_DB))
+ arangoDB.getLogs(new LogOptions().search(BaseTest.TEST_DB.get()))
.whenComplete((logsSearch, ex) -> {
assertThat(logsSearch, is(notNullValue()));
assertThat(logs.getTotalAmount(), greaterThan(logsSearch.getTotalAmount()));
@@ -619,7 +629,7 @@ public void getLogEntriesSearch() throws InterruptedException, ExecutionExceptio
assumeTrue(isAtLeastVersion(3, 8));
final ArangoDBAsync arangoDB = new ArangoDBAsync.Builder().build();
final LogEntriesEntity logs = arangoDB.getLogEntries(null).get();
- arangoDB.getLogs(new LogOptions().search(BaseTest.TEST_DB))
+ arangoDB.getLogs(new LogOptions().search(BaseTest.TEST_DB.get()))
.whenComplete((logsSearch, ex) -> {
assertThat(logsSearch, is(notNullValue()));
assertThat(logs.getTotal(), greaterThan(logsSearch.getTotalAmount()));
diff --git a/src/test/java/com/arangodb/async/ArangoDatabaseTest.java b/src/test/java/com/arangodb/async/ArangoDatabaseTest.java
index 067dc9a38..8d9426f62 100644
--- a/src/test/java/com/arangodb/async/ArangoDatabaseTest.java
+++ b/src/test/java/com/arangodb/async/ArangoDatabaseTest.java
@@ -21,6 +21,7 @@
package com.arangodb.async;
import com.arangodb.ArangoDBException;
+import com.arangodb.DbName;
import com.arangodb.entity.AqlExecutionExplainEntity.ExecutionPlan;
import com.arangodb.entity.*;
import com.arangodb.entity.AqlParseEntity.AstNode;
@@ -58,10 +59,10 @@ public class ArangoDatabaseTest extends BaseTest {
@Test
public void create() throws InterruptedException, ExecutionException {
try {
- final Boolean result = arangoDB.db(BaseTest.TEST_DB + "_1").create().get();
+ final Boolean result = arangoDB.db(DbName.of(BaseTest.TEST_DB.get() + "_1")).create().get();
assertThat(result, is(true));
} finally {
- arangoDB.db(BaseTest.TEST_DB + "_1").drop().get();
+ arangoDB.db(DbName.of(BaseTest.TEST_DB.get() + "_1")).drop().get();
}
}
@@ -86,7 +87,7 @@ public void getEngine() throws ExecutionException, InterruptedException {
@Test
public void exists() throws InterruptedException, ExecutionException {
assertThat(db.exists().get(), is(true));
- assertThat(arangoDB.db("no").exists().get(), is(false));
+ assertThat(arangoDB.db(DbName.of("no")).exists().get(), is(false));
}
@Test
diff --git a/src/test/java/com/arangodb/async/ArangoSearchTest.java b/src/test/java/com/arangodb/async/ArangoSearchTest.java
index 8b7732730..fd9ad387d 100644
--- a/src/test/java/com/arangodb/async/ArangoSearchTest.java
+++ b/src/test/java/com/arangodb/async/ArangoSearchTest.java
@@ -228,7 +228,7 @@ public void replaceProperties() throws InterruptedException, ExecutionException
private void createGetAndDeleteTypedAnalyzer(SearchAnalyzer analyzer) throws ExecutionException, InterruptedException {
- String fullyQualifiedName = db.name() + "::" + analyzer.getName();
+ String fullyQualifiedName = db.dbName().get() + "::" + analyzer.getName();
analyzer.setName(fullyQualifiedName);
// createAnalyzer
@@ -264,7 +264,7 @@ private void createGetAndDeleteTypedAnalyzer(SearchAnalyzer analyzer) throws Exe
private void createGetAndDeleteAnalyzer(AnalyzerEntity options) throws ExecutionException, InterruptedException {
- String fullyQualifiedName = db.name() + "::" + options.getName();
+ String fullyQualifiedName = db.dbName().get() + "::" + options.getName();
// createAnalyzer
AnalyzerEntity createdAnalyzer = db.createAnalyzer(options).get();
diff --git a/src/test/java/com/arangodb/async/BaseTest.java b/src/test/java/com/arangodb/async/BaseTest.java
index f30438070..13ade24d7 100644
--- a/src/test/java/com/arangodb/async/BaseTest.java
+++ b/src/test/java/com/arangodb/async/BaseTest.java
@@ -21,12 +21,11 @@
package com.arangodb.async;
import com.arangodb.entity.ArangoDBEngine;
+import com.arangodb.DbName;
import com.arangodb.entity.License;
import com.arangodb.entity.ServerRole;
import org.junit.AfterClass;
import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.rules.TestRule;
import java.util.concurrent.ExecutionException;
@@ -36,7 +35,7 @@
*/
public abstract class BaseTest {
- static final String TEST_DB = "java_driver_test_db";
+ static final DbName TEST_DB = DbName.of("java_driver_test_db");
static ArangoDBAsync arangoDB;
static ArangoDatabaseAsync db;
diff --git a/src/test/java/com/arangodb/async/debug/ConsolidationIntervalMsec.java b/src/test/java/com/arangodb/async/debug/ConsolidationIntervalMsec.java
index 1b0a83b4e..d921a4029 100644
--- a/src/test/java/com/arangodb/async/debug/ConsolidationIntervalMsec.java
+++ b/src/test/java/com/arangodb/async/debug/ConsolidationIntervalMsec.java
@@ -23,6 +23,7 @@
import com.arangodb.async.ArangoDBAsync;
import com.arangodb.async.ArangoDatabaseAsync;
import com.arangodb.async.BaseTest;
+import com.arangodb.DbName;
import com.arangodb.entity.ViewEntity;
import com.arangodb.entity.ViewType;
import com.arangodb.entity.arangosearch.ArangoSearchPropertiesEntity;
@@ -53,7 +54,7 @@ public void consolidationIntervalMsec() throws ExecutionException, InterruptedEx
.password("test")
.build();
- ArangoDatabaseAsync db = arango.db("database_of_things");
+ ArangoDatabaseAsync db = arango.db(DbName.of("database_of_things"));
if (db.exists().join()) {
db.drop().join();
}
diff --git a/src/test/java/com/arangodb/util/TestUtils.java b/src/test/java/com/arangodb/util/TestUtils.java
index b9d7e2c68..d33c5aa75 100644
--- a/src/test/java/com/arangodb/util/TestUtils.java
+++ b/src/test/java/com/arangodb/util/TestUtils.java
@@ -22,11 +22,19 @@
package com.arangodb.util;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.UUID;
+
/**
* @author Michele Rastelli
*/
public final class TestUtils {
+ private static final String[] allChars = TestUtils.generateAllInputChars();
+ private static final Random r = new Random();
+
private TestUtils() {
}
@@ -65,4 +73,34 @@ public static boolean isAtLeastVersion(final String version, final int otherMajo
return true;
}
+ private static String[] generateAllInputChars() {
+ List list = new ArrayList<>();
+ for (int codePoint = 0; codePoint < Character.MAX_CODE_POINT + 1; codePoint++) {
+ String s = new String(Character.toChars(codePoint));
+ if (codePoint == 47 || // '/'
+ codePoint == 58 || // ':'
+ Character.isISOControl(codePoint) ||
+ Character.isLowSurrogate(s.charAt(0)) ||
+ (Character.isHighSurrogate(s.charAt(0)) && s.length() == 1)) {
+ continue;
+ }
+ list.add(s);
+ }
+ return list.toArray(new String[0]);
+ }
+
+ public static String generateRandomDbName(int length, boolean extendedNames) {
+ if(extendedNames){
+ int max = allChars.length;
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ String allChar = allChars[r.nextInt(max)];
+ sb.append(allChar);
+ }
+ return UnicodeUtils.normalize(sb.toString());
+ } else {
+ return UUID.randomUUID().toString();
+ }
+ }
+
}
diff --git a/src/test/java/com/arangodb/util/UnicodeUtilsTest.java b/src/test/java/com/arangodb/util/UnicodeUtilsTest.java
new file mode 100644
index 000000000..42e388837
--- /dev/null
+++ b/src/test/java/com/arangodb/util/UnicodeUtilsTest.java
@@ -0,0 +1,56 @@
+package com.arangodb.util;
+
+import com.arangodb.internal.util.EncodeUtils;
+import org.graalvm.polyglot.Context;
+import org.graalvm.polyglot.Value;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assume.assumeTrue;
+
+public class UnicodeUtilsTest {
+
+ private static Context context;
+ private static Value jsEncoder;
+ private static Value jsNormalizer;
+ private static final String encodeFn = "(function encode(x){return encodeURIComponent(x);})";
+ private static final String normalizeFn = "(function normalize(x){return x.normalize('NFC');})";
+
+ @BeforeClass
+ public static void beforeClass() {
+ assumeTrue("This test requires GraalVM", org.graalvm.home.Version.getCurrent().isRelease());
+ context = Context.create();
+ jsEncoder = context.eval("js", encodeFn);
+ jsNormalizer = context.eval("js", normalizeFn);
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ if (context != null)
+ context.close();
+ }
+
+ @Test
+ public void normalizeShouldBehaveAsJs() {
+ for (int i = 0; i < 10_000; i++) {
+ String value = TestUtils.generateRandomDbName(100, true);
+ String jsNormalized = jsNormalizer.execute(value).as(String.class);
+ String javaNormalized = UnicodeUtils.normalize(value);
+ assertThat(javaNormalized, is(jsNormalized));
+ }
+ }
+
+ @Test
+ public void encodeURIComponentShouldBehaveAsJs() {
+ for (int i = 0; i < 10_000; i++) {
+ String value = TestUtils.generateRandomDbName(100, true);
+ String jsEncoded = jsEncoder.execute(value).as(String.class);
+ String driverJavaEncoded = EncodeUtils.encodeURIComponent(value);
+ assertThat(driverJavaEncoded, is(jsEncoded));
+ }
+ }
+
+}
\ No newline at end of file