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