From 9ac21386f9411a3085e3d453230cde56c76a95f2 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Fri, 14 Feb 2025 05:58:07 +0000 Subject: [PATCH] Master --- .docker/docker-compose.yml | 20 +- .docs/.openapi/api.base.yaml | 4 +- .docs/changelog.md | 11 + .docs/index.md | 2 +- .docs/kubernetes.md | 2 +- .gitlab-ci.yml | 6 +- Makefile | 4 +- README.md | 2 +- dbrepo-analyse-service/Pipfile | 2 +- dbrepo-analyse-service/Pipfile.lock | 22 +- .../lib/dbrepo-1.6.4-py3-none-any.whl | Bin 0 -> 30969 bytes .../lib/dbrepo-1.6.4.tar.gz | Bin 0 -> 40698 bytes dbrepo-auth-service/dbrepo-realm.json | 61 +- .../src/main/java/at/tuwien/Client.java | 3 +- .../tuwien/CreateEventListenerProvider.java | 1 - .../target/create-event-listener.jar | Bin 10130 -> 10146 bytes dbrepo-data-service/pom.xml | 2 +- dbrepo-data-service/querystore/pom.xml | 4 +- dbrepo-data-service/report/pom.xml | 4 +- dbrepo-data-service/rest-service/pom.xml | 6 +- dbrepo-data-service/services/pom.xml | 6 +- dbrepo-metadata-service/api/pom.xml | 6 +- .../at/tuwien/api/auth/CreateUserDto.java | 3 - dbrepo-metadata-service/entities/pom.xml | 4 +- .../java/at/tuwien/entities/user/User.java | 2 +- dbrepo-metadata-service/oai/pom.xml | 4 +- dbrepo-metadata-service/pom.xml | 2 +- dbrepo-metadata-service/report/pom.xml | 4 +- dbrepo-metadata-service/repositories/pom.xml | 4 +- dbrepo-metadata-service/rest-service/pom.xml | 4 +- .../at/tuwien/endpoints/DatabaseEndpoint.java | 7 + .../at/tuwien/endpoints/UserEndpoint.java | 44 +- .../tuwien/handlers/ApiExceptionHandler.java | 17 +- .../tuwien/validation/EndpointValidator.java | 2 +- .../at/tuwien/ApplicationIntegrationTest.java | 23 + .../endpoints/DatabaseEndpointUnitTest.java | 87 +- .../endpoints/TableEndpointUnitTest.java | 70 +- .../endpoints/UserEndpointUnitTest.java | 73 +- .../KeycloakGatewayIntegrationTest.java | 19 - .../handlers/ApiExceptionHandlerTest.java | 918 +++++- .../service/UserServiceIntegrationTest.java | 85 + .../service/UserServicePersistenceTest.java | 14 +- .../tuwien/service/UserServiceUnitTest.java | 4 +- .../validator/EndpointValidatorUnitTest.java | 94 +- dbrepo-metadata-service/services/pom.xml | 4 +- .../at/tuwien/gateway/KeycloakGateway.java | 9 +- .../gateway/impl/KeycloakGatewayImpl.java | 33 +- .../tuwien/service/AuthenticationService.java | 4 +- .../java/at/tuwien/service/UserService.java | 3 +- .../impl/AuthenticationServiceImpl.java | 7 +- .../tuwien/service/impl/UserServiceImpl.java | 4 +- dbrepo-metadata-service/test/pom.xml | 4 +- .../main/java/at/tuwien/test/BaseTest.java | 2889 ++++++++--------- dbrepo-search-service/Pipfile | 2 +- dbrepo-search-service/Pipfile.lock | 6 +- .../init/lib/dbrepo-1.6.4-py3-none-any.whl | Bin 0 -> 30969 bytes .../init/lib/dbrepo-1.6.4.tar.gz | Bin 0 -> 40698 bytes .../lib/dbrepo-1.6.4-py3-none-any.whl | Bin 0 -> 30969 bytes dbrepo-search-service/lib/dbrepo-1.6.4.tar.gz | Bin 0 -> 40698 bytes .../composables/authentication-service.ts | 24 - dbrepo-ui/composables/axios-instance.ts | 2 +- dbrepo-ui/composables/user-service.ts | 32 - dbrepo-ui/layouts/default.vue | 3 +- dbrepo-ui/locales/en-US.json | 12 +- dbrepo-ui/pages/user/authentication.vue | 13 +- dbrepo-ui/pages/user/info.vue | 14 +- dbrepo-upload-service/pom.xml | 2 +- docker-compose.yml | 2 +- helm/dbrepo/Chart.yaml | 6 +- helm/dbrepo/README.md | 12 +- helm/dbrepo/files/create-event-listener.jar | Bin 10130 -> 10146 bytes helm/dbrepo/values.yaml | 20 +- install.sh | 2 +- lib/python/README.md | 12 +- lib/python/docs/index.rst | 4 +- lib/python/pyproject.toml | 6 +- lib/python/setup.py | 4 +- mkdocs.yml | 6 +- sonar-project.properties | 2 +- versions.json | 5 - 80 files changed, 3019 insertions(+), 1781 deletions(-) create mode 100644 dbrepo-analyse-service/lib/dbrepo-1.6.4-py3-none-any.whl create mode 100644 dbrepo-analyse-service/lib/dbrepo-1.6.4.tar.gz create mode 100644 dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/ApplicationIntegrationTest.java create mode 100644 dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java create mode 100644 dbrepo-search-service/init/lib/dbrepo-1.6.4-py3-none-any.whl create mode 100644 dbrepo-search-service/init/lib/dbrepo-1.6.4.tar.gz create mode 100644 dbrepo-search-service/lib/dbrepo-1.6.4-py3-none-any.whl create mode 100644 dbrepo-search-service/lib/dbrepo-1.6.4.tar.gz delete mode 100644 dbrepo-ui/composables/authentication-service.ts diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml index 0f675e47eb..f637eb4f8b 100644 --- a/.docker/docker-compose.yml +++ b/.docker/docker-compose.yml @@ -114,7 +114,7 @@ services: init: true restart: "no" container_name: dbrepo-auth-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.4 environment: AUTH_SERVICE_ADMIN: ${AUTH_SERVICE_ADMIN:-admin} AUTH_SERVICE_ADMIN_PASSWORD: ${AUTH_SERVICE_ADMIN_PASSWORD:-admin} @@ -135,7 +135,7 @@ services: restart: "no" container_name: dbrepo-metadata-service hostname: metadata-service - image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.4 volumes: - "${SHARED_VOLUME:-/tmp}:/tmp" environment: @@ -198,7 +198,7 @@ services: restart: "no" container_name: dbrepo-analyse-service hostname: analyse-service - image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.6.4 environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -253,7 +253,7 @@ services: restart: "no" container_name: dbrepo-search-db hostname: search-db - image: registry.datalab.tuwien.ac.at/dbrepo/search-db:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/search-db:1.6.4 healthcheck: test: curl -sSL localhost:9200/_plugins/_security/health | jq .status | grep UP interval: 10s @@ -277,7 +277,7 @@ services: restart: "no" container_name: dbrepo-search-service hostname: search-service - image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.6.4 environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -301,7 +301,7 @@ services: restart: "no" container_name: dbrepo-ui hostname: ui - image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.4 environment: NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}" NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://gateway-service}" @@ -381,7 +381,7 @@ services: init: true container_name: dbrepo-search-service-init hostname: search-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.6.4 environment: LOG_LEVEL: ${LOG_LEVEL:-info} METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} @@ -438,7 +438,7 @@ services: restart: "no" container_name: dbrepo-dashboard-service hostname: dashboard-service - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.6.4 ports: - "3000:3000" volumes: @@ -465,7 +465,7 @@ services: init: true container_name: dbrepo-storage-service-init hostname: storage-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.4 environment: S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin} S3_BUCKET: "${S3_BUCKET:-dbrepo}" @@ -511,7 +511,7 @@ services: restart: "no" container_name: dbrepo-data-service hostname: data-service - image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.7.0 + image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.4 volumes: - "${SHARED_VOLUME:-/tmp}:/tmp" environment: diff --git a/.docs/.openapi/api.base.yaml b/.docs/.openapi/api.base.yaml index abadb218e7..f37d861b09 100644 --- a/.docs/.openapi/api.base.yaml +++ b/.docs/.openapi/api.base.yaml @@ -11,7 +11,7 @@ components: type: http externalDocs: description: Project Website - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/ + url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/ info: contact: email: andreas.rauber@tuwien.ac.at @@ -24,7 +24,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: DBRepo REST API - version: 1.7.0 + version: 1.6.4 openapi: 3.1.0 servers: - description: Test Instance diff --git a/.docs/changelog.md b/.docs/changelog.md index efdb4dd291..e1452dd12c 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,6 +2,17 @@ author: Martin Weise --- +## v1.6.4 (2025-02-13) + +[:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.4) + +### What's Changed + +#### Fixes + +* Fixed a bug where the users were not synced with the Metadata Database and the API Password was not recommended on + first login in [#489](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/489). + ## v1.6.3 (2025-02-05) [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.3) diff --git a/.docs/index.md b/.docs/index.md index aa9c6e7693..cf54cf46cc 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.7.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.6.4](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that are used from the beginning until the end of a research project supporting data evolution, -citation and -versioning. It implements the query store of the diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index 68f9bc16c1..ea377171d3 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -14,7 +14,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.7.0" \ + --version "1.6.4" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b20acd3f2a..74cfb6df9a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,9 +9,9 @@ variables: NODE_VERSION: "18" SONARQUBE_VERSION: "10.0" BUN_VERSION: "1.1.40" - DOC_VERSION: "1.7" - APP_VERSION: "1.7.0" - CHART_VERSION: "1.7.0" + DOC_VERSION: "1.6" + APP_VERSION: "1.6.4" + CHART_VERSION: "1.6.4" CACHE_FALLBACK_KEY: "${CI_DEFAULT_BRANCH}" # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. diff --git a/Makefile b/Makefile index e8f2553784..c81307ab1f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.7.0 -CHART_VERSION ?= 1.7.0 +APP_VERSION ?= 1.6.4 +CHART_VERSION ?= 1.6.4 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/README.md b/README.md index 901d24dd06..628da3f3f3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ If you have [Docker](https://docs.docker.com/engine/install/) already installed with: ```bash -curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.7/install.sh | bash +curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.6/install.sh | bash ``` ## Documentation diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 6b144eec80..3d7911147c 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.7.0.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.6.4.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 83ed8a674d..c3a282c985 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0af9d522f713554dd7996401992cffddf372ade320c11d7950bdcd5888aa1a03" + "sha256": "b24e4e03891018663e2746e2dbe5a9fe716f823be5ccb310c90e8e68b9ffd1d5" }, "pipfile-spec": 6, "requires": { @@ -180,20 +180,20 @@ }, "boto3": { "hashes": [ - "sha256:59bcf0c4b04d9cc36f8b418ad17ab3c4a99a21a175d2fad7096aa21cbe84630b", - "sha256:5ecae20e780a3ce9afb3add532b61c466a8cb8960618e4fa565b3883064c1346" + "sha256:7784590369a9d545bb07b2de56b6ce4d5a5e232883a957f704c3f842caeba155", + "sha256:8c2c2a4ccdfe35dd2611ee1b7473dd2383948415c777e42dc4e7f1ebe371fe8c" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.36.17" + "version": "==1.36.19" }, "botocore": { "hashes": [ - "sha256:069858b2fd693548035d7fd53a774e37e4260fea64e0ac9b8a3aee904f9321df", - "sha256:cec13e0a7ce78e71aad0b397581b4e81824c7981ef4c261d2e296d200c399b09" + "sha256:98882c106fec4c08678ea028199f7f5119550fab95d682b30846f7aae04b7bec", + "sha256:cdf6729f601f82b1acdb9004b1f88b57cfb470f576394cdb3bbf5150f7fafb5b" ], "markers": "python_version >= '3.8'", - "version": "==1.36.17" + "version": "==1.36.19" }, "certifi": { "hashes": [ @@ -421,9 +421,9 @@ }, "dbrepo": { "hashes": [ - "sha256:f25d5adbd618bf2906578e671af2bf3bcc24d738ef8bc791c220e7e5b714e2f7" + "sha256:a518aee79540d9e302b161e7e10072f50730489da19368f00a1e68204009ce44" ], - "path": "./lib/dbrepo-1.7.0.tar.gz" + "path": "./lib/dbrepo-1.6.4.tar.gz" }, "events": { "hashes": [ @@ -1621,7 +1621,7 @@ "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.9'", "version": "==2.3.0" }, "werkzeug": { @@ -2246,7 +2246,7 @@ "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.9'", "version": "==2.3.0" }, "wrapt": { diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.6.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..d083b0bafc937528fdcc09634c41132578cbf345 GIT binary patch literal 30969 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 bZWAF@Nq{#i8%QZ110TaRW(Ee{QV<US?`Zyw literal 0 HcmV?d00001 diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.6.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..87e9a503ebc621238ebe7efca15f2bdf0a6e1a85 GIT binary patch literal 40698 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 Bo(KQ{ literal 0 HcmV?d00001 diff --git a/dbrepo-auth-service/dbrepo-realm.json b/dbrepo-auth-service/dbrepo-realm.json index 1c703b8375..bac2ddc978 100644 --- a/dbrepo-auth-service/dbrepo-realm.json +++ b/dbrepo-auth-service/dbrepo-realm.json @@ -1475,6 +1475,39 @@ "claim.name" : "language", "jsonType.label" : "String" } + }, { + "id" : "9bdc3e60-09b8-4241-915e-29f083434026", + "name" : "provider", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "identity_provider", + "introspection.token.claim" : "true", + "userinfo.token.claim" : "true", + "id.token.claim" : "true", + "lightweight.claim" : "false", + "access.token.claim" : "true", + "claim.name" : "identity_provider", + "jsonType.label" : "String", + "access.tokenResponse.claim" : "false" + } + }, { + "id" : "e567cb5c-8856-4124-8b86-f19cd53d7c71", + "name" : "setup_finished", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "introspection.token.claim" : "true", + "userinfo.token.claim" : "true", + "user.attribute" : "SETUP_FINISHED", + "id.token.claim" : "true", + "lightweight.claim" : "false", + "access.token.claim" : "true", + "claim.name" : "setup_finished", + "jsonType.label" : "boolean" + } }, { "id" : "b817424d-7f91-43d8-b7d0-6a32582377fb", "name" : "family name", @@ -2376,7 +2409,7 @@ "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "saml-role-list-mapper", "oidc-full-name-mapper", "oidc-usermodel-attribute-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "saml-user-property-mapper", "oidc-address-mapper", "oidc-usermodel-property-mapper", "oidc-full-name-mapper", "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper", "oidc-sha256-pairwise-sub-mapper" ] } }, { "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", @@ -2402,7 +2435,7 @@ "subType" : "authenticated", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "oidc-full-name-mapper", "saml-role-list-mapper", "oidc-address-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper" ] + "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-role-list-mapper", "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "saml-user-property-mapper", "oidc-address-mapper" ] } } ], "org.keycloak.userprofile.UserProfileProvider" : [ { @@ -2426,8 +2459,8 @@ "config" : { "ldap.attribute" : [ "createTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "always.read.value.from.ldap" : [ "true" ], "read.only" : [ "true" ], + "always.read.value.from.ldap" : [ "true" ], "user.model.attribute" : [ "createTimestamp" ] } }, { @@ -2438,8 +2471,8 @@ "config" : { "ldap.attribute" : [ "sn" ], "is.mandatory.in.ldap" : [ "true" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "true" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "lastName" ] } }, { @@ -2450,8 +2483,8 @@ "config" : { "ldap.attribute" : [ "cn" ], "is.mandatory.in.ldap" : [ "true" ], - "always.read.value.from.ldap" : [ "true" ], "read.only" : [ "false" ], + "always.read.value.from.ldap" : [ "true" ], "user.model.attribute" : [ "firstName" ] } }, { @@ -2462,8 +2495,8 @@ "config" : { "ldap.attribute" : [ "mail" ], "is.mandatory.in.ldap" : [ "false" ], - "always.read.value.from.ldap" : [ "false" ], "read.only" : [ "false" ], + "always.read.value.from.ldap" : [ "false" ], "user.model.attribute" : [ "email" ] } }, { @@ -2476,15 +2509,15 @@ "membership.attribute.type" : [ "DN" ], "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], "group.name.ldap.attribute" : [ "cn" ], - "membership.user.ldap.attribute" : [ "uid" ], - "ignore.missing.groups" : [ "false" ], "preserve.group.inheritance" : [ "false" ], "membership.ldap.attribute" : [ "member" ], - "memberof.ldap.attribute" : [ "memberOf" ], - "group.object.classes" : [ "groupOfNames" ], + "ignore.missing.groups" : [ "false" ], + "membership.user.ldap.attribute" : [ "uid" ], "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], - "groups.path" : [ "/" ], - "drop.non.existing.groups.during.sync" : [ "false" ] + "group.object.classes" : [ "groupOfNames" ], + "memberof.ldap.attribute" : [ "memberOf" ], + "drop.non.existing.groups.during.sync" : [ "false" ], + "groups.path" : [ "/" ] } }, { "id" : "b6ff3285-35af-4e86-8bb4-d94b8e0d70bb", @@ -2518,8 +2551,8 @@ "fullSyncPeriod" : [ "-1" ], "pagination" : [ "false" ], "startTls" : [ "false" ], - "connectionPooling" : [ "true" ], "usersDn" : [ "ou=users,dc=dbrepo,dc=at" ], + "connectionPooling" : [ "true" ], "cachePolicy" : [ "DEFAULT" ], "useKerberosForPasswordAuthentication" : [ "false" ], "importEnabled" : [ "true" ], @@ -2531,8 +2564,8 @@ "lastSync" : [ "1719252666" ], "vendor" : [ "other" ], "uuidLDAPAttribute" : [ "entryUUID" ], - "allowKerberosAuthentication" : [ "false" ], "connectionUrl" : [ "ldap://identity-service:1389" ], + "allowKerberosAuthentication" : [ "false" ], "syncRegistrations" : [ "true" ], "authType" : [ "simple" ], "useTruststoreSpi" : [ "always" ], diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java index 769ec49097..c63e88618b 100644 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java +++ b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java @@ -31,8 +31,7 @@ public class Client { if (systemPassword == null || systemPassword.isEmpty()) { throw new IllegalArgumentException("Environment variable SYSTEM_PASSWORD is not set or is empty."); } - - URL url = URI.create(urlString).toURL(); + final URL url = URI.create(urlString + "/api/user").toURL(); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java index 93f2b2919b..ea4aa7794b 100644 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java +++ b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java @@ -57,7 +57,6 @@ public class CreateEventListenerProvider implements EventListenerProvider { final String userData = "{" + quoteAttr("id", user.getId()) + ", " + quoteAttr("username", user.getUsername()) + ", " + - quoteAttr("email", user.getEmail()) + ", " + quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " + quoteAttr("given_name", user.getFirstName()) + ", " + quoteAttr("family_name", user.getLastName()) + diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar index a23243d39509ec3821219e5799a25740c93e2ca1..7b332886dd5aca385115460c47692fdef8522e0b 100644 GIT binary patch delta 6759 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 bsAxagTAc?h<fSgns5CiEU5#y<638$B;Od`~ delta 6755 zcmZ4FKgnM@z?+#xgn@yBgW-jkPt^OFECMBr3=C(O7#Kt*KU5O0?+rTGcgsLvulp(c zAM81s6;&ogFKicc)OOrnUTvf)*4g~VQ=>j!I3pl%>u&bj$>%@sd2W7BD_iT!k@`iS zmu+RO7MyGmWf{_<8Xw2CEz~yZ+sT6mzr45+vLyV-CgakR*Pl*&@6YitO3wZIi4ZoC zR<A$p3#GWjvf7tVTiwTZXL0>&-Ur4-PyE_0o%f91wl3jy>TBD};@b{SstpuzkDndf z%NtcS|2^j~{)IFCs{eO9cm3|N1olOf^_SSpKYu7BE}+~jqm^l)hg7uX)03qRbDj0` zKc&d9F5bLhP3U^Jedky7ZhHLiejiKr{_4874hKVm(_U`)ziifrJG~q4zE8A&WLz&; zbz<_I`x~n>eyrLm*4VbEec6xH42ht&pBFM2bCvrm8h3>rHxy9RO#Hzu^Lv4%&7AAU zgriEfAF_UPHuhQ0t`na<jn)R8Q2(r{a+Ap<#L8DVBBg5GSD(dEci!#Y_3PoCXekv- zmzym77j3ujI5jQUJuM+c<}V{CR=5}#I2c$!(K2}>qYCqLF`vmd7<Iuk2a_C_)?`v; zej(;FIgm*UOxH1)fa$GFUSN49=Cfe>5_30*-kiWPhl%&Om`_x|#9KcOa4<0RP3B}* ztQS5mS^GFUwen!!fg455i(5{!yG;;q%I*6x;o#buBSOpCww36veajlT`pr6@1)i79 za&K+fV)D|p>Z0)%KgE!;w`xnoeLdd)wwpBXW$oYN>%W{m)y`w2X>V+7{rTDK{CnlS zdVk7a88Y1dD6h{IuwsFStDzT*7GKumD1(Kn?oE5^o!P(6P!8C1)<fzXU*n-&zZm&# znEt&B*s^u8>8&aSp;z)RviM~=zLtFXTK3gt?}tS`jjNJ4r|C@)vrMx7C9$;kMc+Ib z@rY>gbCIPw%9fXc>Ys*aY8CV{&F@N$@avo<Tym+M*H$vef5XzcR?cFV1!_4_$_JaB zm*uis8Xnqvu->5hZq~<y)&r+pOY`{FY}~t|E#9%W>-oc|##cvE0{`!@n<6JE7BSuZ z|A(h<wqD_{2<(0>!V(hGFD(}IC{HMW$J%6CQQr=p_rV*Y9<)`4gexuV&*%)xR<S+y zyX{@aOU>g3ljYWkzTi<k&U@PD)YJnz(j;#MIPvRLU2RBYpR}xActfdrLewYk>FoI* zl0;uEVZXv1@@zBr+j|-Ta*{nR&Ue|r1?2f>m!D`>Ys{?--NCc-#z8q2)@iY9)7U;H zT>ev8yLRG<d-wkF@#j_beNLO$9seaQC$ONqYi-58hFAAYR$3pl{TsU__sk_zclE#B zzn}5!aP`Ux+{k;IwM(|xzrKFPwzbg=T*6y~w`*mDUTpi;dR%bd6`z+U%Zz6(S$tu^ zmxrgnonOCIgQKuEuW<Y0C1MPFUL4R9-F+~7%ExQ6Y5BK2mrBaHmi}JyGwwuSe7=fS z<6W()B`dW#-dxZ3f4%MUTI<DWcaG1wu>6tP7w(YW%=QvFfy;CDwi%zA_%_4yc)i$- zs?ziEHq&f7xO6goKWm(}Se5!!?m!%?evn~D?dFRU%X(Zk_-_8HJDYWnkHo^1Gd-tY z>@J(OQ0By|nW3BhChc)K=p8C^;Izb%$Zb5v64F<7;!JPMdwa4bM*i9*&h)$_zdX5$ z?w$vVqJ~FUZLTbP+p&0Z+pS$kw_kam|2avbUYW}+RKmhywXfXPmA&u!7Cp;xiU{1k zUzfkujzeWh=`=58wa^(JoIjrR-blZ=SZAikJY~zLEvDzgGozoSEZ3}3Sz7I2wQ5U< zR^pKuZdU$VU-moPlFYlMbzU~SP@>$x;-t&9;~Ku#XWUwy?x~`<Q(LdmUA0kv`nwlJ z#o}=bAJpfGu0OJxW!m%GM>kmINE%6XtI9GLowwDBQ(hhNu|O%e-z)cB=trwPcB_5& z=PiG+wB*)~ch4^AvF6X{mHK|~@5?30JuizbuN;3=?ql>zZRYn~p9<a`tz8lPK};$& z?BupDA2#H@{8$&e_@{`?fhLRH*QU<7Y`<Hlv}ShK_Q$eYjO$C!Fiv<TbErtH;>BMJ z#mgU?CtcYiaPoNJp6I4~hk2~{PszQW^{qBU=X6HG4Wr{sf_J5^uRXx_kGmrEX!U-b za(RIjryuM7{(ODY;~x{c_#Z3xu)GrFm-Y<WyGJko;kQRqy80g_Z)w#u4tzRiQmxCG z_;12LmNfaV{ITVX=jl%g5%o&JpR^Ay`Yw5@u=B*;;B77C4|=-Xm(*80Zj(Lz%#C&a zS;1RZt<$UZ&m}n>U9zY9jN#o~x!KCQ_**?rY|T9R_BpH6IytY4fv0VByeD}3o5}?j z^7V6133~Eo_Cn2YmujcYxoO8;=WF*&T*E%yyR7<Bvhyy{sp<yT4yXBe^PCZ>-#hc9 zQu>t*Pj5Z-SN78Kp1Dog(kRJg+OoAra{4~TR%%zRc)Rb?w;Q{rUODz<XQ$n&nj2eY z{O8hay3BoArgTD%aqqeF@qr7Y?pRfNsINJ&WS{n@=UmH_vmIr)!?rXjZi<jSC*OD{ zDCwMt^}^@7BKx*3?JGQcF`{0nPt5wt+NEjrFFv13Trnj*TF3D7t*>rpwuoM~=H=8n zZM4hLD{X3)vG4IR9o?zAv&$+u>)sx{T;X;wKgH_j+5@jDt9qYUyth4Ev~5vYmf`U& zGgkON*>#M^K)Yo7v>x@6>e3q~{7Zu?H+@f%P8B=Pd|v!Qcvr@Cp-zs?df8v!XXaki zvH79=xWC@?bO-B?kLpo7gOxQuIus|Ao7@t=pxf=Q6M4|W`AGbXvNVA{$q9TX(r3JG zj9FH>`-R{%Y1U0$TE?jX2klv|{fUp!_#wXf{ndqEI(25Of5(+pxuNXZiTMIDqD5!q zt#kGtSg%lhaNmwZrbj01tUr`)3zct@iBDRc#`wc%-=TdX_0I$SMa;!x9^^=-zW<~- zS%Y`J<IeS)44YRS`}|>3{7;2xKFL=X<ez1^Hutlsz~#O3yk8ejyLMW2XCZU?>Kf_J zmzhe-G}((6A2IPuDrP%-*7e^ao-&)hzGq4GhV66zCEe#X;#i+Q%Sr!2%%S%uRKET2 zR@-RLtjk=>)!x8!Y)4W3?(=2rl1pZb?!PqQ;6$ExU$iCnMEUJ2>t24Tn0KB{r_@dR zLZN+`cg!PR&O9XD$hqg|9g{wOzsLU^JL_Jv+_P*fH=XYF_kQ#b4K5>#m-=TPG&i5U z_j!d~bNiorJa&51<)<xP6+C_3L}~x|Nq_twzftf!<@2!E;W5jyb91M;bobUjQhRpa z={gU8g6Zw2Chn@e8=K75JnE6>mAQN7)mCBcpD)%vt^Q`UPl356d5u$3N8y@-b0fN| zH}D+~IL;K)FZ@RS(Yf}G^HNL<{qq-inm^LaIpklcJa6d{?;WmF5?4nYoX@^BL#+3P znpu*%=`B68<n|Xw)~@rGSsFa0gRMr?zdqnOTVRvArPcyD|Hn-3I!aUiitKAsdS%qQ z{;_n))MTBx_n%~Op11GHe|S5f<Kjoz8gaRKdpYkP{vN0`?PHj|!nxDNwLcW=o_yNG zZU0Q>gYduoys6@Wix+JBqNKHHZhYDF0(~#b6F+aSTyR+Sj;o@$U_im2MSonQsyml+ zf7@i4`C6HE!KS7w)gLzR{IKKR*V?MR>yw1~?V3Ja&eJ*D?!o&0SFw3cU1R*F^$RD& z7d|b|`^~<+_FC@$p8Z9!`*ybdeDz<N`Q`f`>i>BE|7QR-ogfWbP(w$6uTL?Fmw_Qz zj)6g&VY0uP?qp8^-uej=2iy|gFmg|D6Kc+N;$g~J$jaT{qQseapzn{#=Lu}RX-CdT zGv4dnY@R#I_QA5;OGk6>ZZYdjHO{=W#rNc;Exxm_Zrr@>+$FW#%W8KgS^a%qoA0J9 z!Tal%Y0Zm$yXQT%KW$rX_qXWXVuo)gUjJR;u(VN2`05HllQ|pG))pM{s`qQ*@0-72 zao>WpavRC=Z(LflqusI}I<IBi-)S|Y$#<G?*{0=>%8c$z-KKl|-OR0%{Z!@^zF9I? z&S!brV?%3Q1EVrEVSm+1rAc1?Ez92+UvxP&i_3p`QkjzQzRS}5yKh^)+930lP0DAD zgG0e%p>qKNUK3`Vo8VsT?WyOSWvgEw(jJsLwe#u@w}7?f6E03Vx7KlS<5sn653LUV zVpY#sTCcVyQNq$VnY+f>_V@2L_o_A)bC*-^-hOyobtgd~BZ=9JOG^B%uY-C{|G&1= zQ*|B7cxU<K97;<{nSUmVGil2%%c7ktt)u$1?#}Yvl5zCcu4*>7Uv7OpynM1UPZKiM z)Njwvs7TQ%DyYBTFlp;m7wKE9bzGNot;1pj;~XnZo~{x0Z~47;W*>vCZcdVPo>ING z)Yf#F@Hanmk8eJ?!dbcP`_bJ&Cw<ChSzLc8mSg^bOW68@*TGG!E}aKHhU_}t<;P`a z7T+3ldc~x&<(;uF3YK0Kd)v(!_Vnll3m)s26-D(;bG|36Z@leur_ZmeDs=vWsh?d~ zZ_i%8B;uI-@6dSbn(3W+UoJ>)mbCU&nJrfM*m>s93zzIR-#;SjwK<Awq1f-FQi}#_ zUKgJ)$qoX0q$C~ZmY3a^WIbK*`6^4?s=lse)rZbkNSl1rG7vh`Gq-2u(!A3fx3Hd` zUn+dQqtjU;wO+|<i5g4x*O|hPSNf=(>Et{m(D%VRpk{~n2BWE03@_Y~oZYwku9$t_ zqZy66eeX1fb6?YOYjo?l`S@n1>!Xw_?bR<|I+v+U^>u&ypy#R2JFdJ_KMea;G|u3R zzPWg1NKBO1tPgv9nyTJf>#cMQ3UczBF~eof$3;gi^lk(lTJ7asZx*UE^DxVV={dJt zgjTlxxg#SKrP97*lh}LJE$Xa|&BkT7f)ckiI38<h*3lO<(s)x~xn<hZ4GG4PbCN#I zcF$NnxkxlGuh8;m!LcK?JLV@&j~9BArFS@CUW9vR#rmVo6(<fHR+Brpxaq8Svr|B6 zM#R#uMLpsP&(-HIi`v7s-n9OMmGJuG(izuP7deH$kb3n}Cb2HUYEs>&te|N(Uml<R zv74>#<dNtPr@7btw5i)V^G(IE*X#4%X){jd&le6kGBf60W4Tnt^v-f^{rGsZ5=qZ5 zZTn_yx@9T+{G&zW+%wB$c3&=(NZ&r~`)j8>O~td-ne|h(CSTjKHszP8@cwlyr|Op* znZ7^#TeH#j>~7E8pT5HTmu_28a(A&>ZADYKr&8M4o}<ZjfArWVzB_kt<G#GDe?5iw z_wyUf+p*Vt-Z=}eXFn>gEwnV7?(<po$RFp@r$;iEY}~WJfA)?AOAJ1zuy0u+zv#vB zwJ$3k`6ND{)0zHR%T=d5nW3p$t?0*w2e&e_Pt`xO72i7NaAA7T-HJZfd;yzHDlz}} zr+I1p6MXh!#X7EL&)*>dGqoiA*{s=r-!b@?Tyy5Y{24!j|47<yS~1DzNNL=f*`BF$ z60L2e`)^HGePnYxkh%VxkNy4&#ZgnmztqdyDehP{U2R*kqq=BMROb<!*NcBl>GXfi zlD+)$$}feY_44x#KTiLlUFBf2x&O$rlB3ljYiq6@xnH4ed)fG$q`aN_gauK*nmY9# zdF%KuTB*_<xBU3(_18qZZ<}T=ZI7(Hd2+>BE$sudepjX*<Yx)!6c2e{$Q-|P&*##f z)ejp(=9F&Xk57NFb>jW*AIr3^><^vxFM}cUN44u$)q}cAH(#!)FO4`<(sjPvr$+p~ zGD}#`*8^v}i@T>xn;9B!Ixqa{$?v{@6y6_Rm-#!1@ydgr3_Rt>`F;On+sXY(vr67* z;{A(3xGnDQ#?E^EBWsMp7`DFJApd`9*Qx(vZ*t;%I#yqu;dOcbs@+SRQ%_F!{nJx+ zw5aIS8LP>yv$idL^EPzL*2DVsqBrtAROJ=DtpptAhFlIgwEg<LBJq=lj>MhHc(Nzh z^gjQAkRLk1XN#_05%$pgW6;3H`qHA#=loRBWh_&k|C;hV>Z3|(WTQ9}#{<^+AAD1C zPO<FGm}siwzNAp@<)=`OmAhO5BhycnZo0QN_;YF4Z>IBJ5i@(jJ*Mfr;n~@EEu#L) z!u2&3X4BW{=-20O+pucQt4C6+7jxLAD_Gm+Eq7n@ktLmJqR8gsE2j3X-e?~A)aTes z$!I0-D#pvTy&?PV?cV3(k>$DS@;h&(imgg>l2)v#I(qt3*RROCje4I;Q!9+Sd9A}r zy54L1pS~c}y=t*n&i>GlD|vCZ9NTVN{O|kZU;p%nN2kxdhq0gE1uGUTWj6Ah$R9dq zt59UnO10BG`yXzyn7$~u*l9Vh9gmo|#v0a&>AW|EPaVjN-k->`bFQ0izScbNh|7-+ zS8K*^H2Y{;b9+%|w&!#`!~72`s?J^A@^+Pe>!QQ^?p|#9e!H(eV*1Lxg{fZ?B>nHL z(wO*uU&yJ%`kfhPzuZ2TqBU*h`iabSJA;+lzRWgKVE?&lcDj`Rxn;}V6u5Ao7QR-f z{c6c2lc>8TA72<B-BjHk!&V+~GUCuV6W5@XE8qB3)`-bm`T6PpmKU3J>bE^TbyY7+ z>Tu!lcNr7HW7B$#eop+syV-4;VDPRbyB&8~7T(Y=KPl+kw~G5wy~O>=;U9`h%efES zv*~#M^JnvmT>CJm$wm!7p2)F%_<Kn#=EHx-`8^+lZfHoCvrfM0a!9?zV7}a@kDgN+ zSI(PRePsD0m)u)_Kf3Y$4EyN5ca~G{<G6JN?rR>rdi1l($=6`H)UJECm0Qf0ewb&t zH2B-k7RUJcTKkf()_rxJU1z<b{-93f)A`a_HBnPv|9lned*?VWXLj8m2JOz0i@W2_ z+8#+!UG<sc^OQF?m7*iQeNmN6`1NkHahuJtTZx|EjGt^hWBqiykX5;{*@k(m8cuxG zvAn+Oejr2K*U~kjSISM-J>1UcwMwBp_d!O>Z|xtkqE%u-S+#6#E50gC<D7T!)N;%E zctz>2H?_89-!R*x7u`KILfyRRnbh|+CMVTa)UP(te^z-@C)$Ruc#7*>xjhZp(a$&3 z@tMzaKg^o*k?nbbcJ)G;ZA{{Y#jH;9hrG_+sS@0+ec}AXLc!lGxpQ9c?bzqV({k&1 zL4arY%B9h#orHHZ-dC8_d5|yX2;-fO<{N94^3+fK&u8Mbc}u`O<|}q8Yo~M>iK@s? zG0R+jM5JlA_O-n0RxPozM;^qOhM$W&Q1IY`Oy7$460Dn^6~uh?-!T8fFXK1M_x{W2 zXue$ap<(yaH<oYqHXOfWn{U%T+otsXlB=>BD{ik_VSeSzL-8%=cCT{k4dvc)&uh)p zJi9GI-_2g#J6B((U8dwCyFF3D{NSOpJLGSF)F{hP*%r*r?bz$08lGh$bjm87+hfku z+#=!J6;<Y^b-ysQdYV2_R|#HNck8o5;++?Z%O0#PnYo>N-r;Jd{fFMI-*xx<#^2I; z-?v9I?=KeIAHI;i{=m=WcYgA3`rY&H*^LG9j^EsKTUNidtog#JQ!gDLJU!#BznyO< z-va~rQu*&+?jL+4er4K?4NUJAq`y0s_GaO=>YKZJcYhab)|>b8>B>AAXa1xc@gF*p zS4@5TiR&$UnPYXd@}i2hlVv}7`B(q?dER5mrH1ndta<D>Ukb^ufBN}}jokM?HOIP_ z1iV&Vv-IP?M|-xtj-TItQ|iZU%levsGJn2&(r5N>jVk`ZwVyRw?|RS#^><6&e-l3% z=8?Bl<ig&$Z$xcMVtIe>4tQLc|8)MQnP=E@d*?}9I^t7)F?ci6chC0n59}#xXUzX+ z5N9Lw<JRUMZu`5oe6{>Dx9e{HYL7Dy<v;zcKl5<@r@!}P{#oAtKV9aZ?|1&<4~xAc z7S?zC(P;m#;nSw4xWF#g^3QVdms`I0KXWXQ{UzWio4U%fN9~TQxt&w8+)-JR>yCHU z)?HjGcznXamTTHCPQ@AA&ouAxRMy;`+Mm8JD&&vIcZrI^twD3^-dlZ`T^Zr})tlR? zAo1AG`Ids_FGW7w480n$^pLrFXyx0Tr!|;5o#O@T{kq)bRvmsjeZ%&Rt76;T{Ib5L z?CzU6=f~&8%df1^v#)aN_4&Rd&9~|Fr;61k6DL2doUwGC!D`>2c!qe@KBYO;KUr9o zy(r<#ahfD?-XO*=i6QgR?1wqij5qgu3$Ebyd%V}8S^Xn}T@(99O`D$cj|6LE`$dJg z7<C@}7y1}}GP&MTes12byDj}E<L2gV4-`zDtd%>tDr8TOI`2+j_AA}nO@3UJeQWvD zd0z0gEwN2EkG+`K_L-w4>UPnlOIKfVUU~gctK4F~*xl8y;?&r=uPdJ7KB)I;ikL2A zi9hSK7x&INEeKy+bn}zdsYAccOnzD>nyb|^qdV+WmRiZqZ=V#n#p+$xM0P}6?u`&r zux+)tyWsm}Rpx!qQ{J*0{@K!Zx-v+6rTcod{qgS}d}mxU#qJ#MsR=TZ0^jY8-oF0Y z+r7JFujl$~KVE9R^0x3U--_px@BN&->+B1&)whFp*)G2QyY%;hJo#zvnvL`KZvG@y zDJ%6~9MLB$;rEGB__leo>>XzCNcAMeSzuaUX)@;v*aXDn(@K_BARYq};DoaU7~VQA zV`O0Pbq#UU_4ISo5AbGW5@809motEd$?cS-na(m!e#k5`IbWHF86;GvEG_nzk%1wx z1Vi<DWobsa$)}YiW6-VSN3qh43CYUb#In>p6r<2JOQL8lp6sBa0rqLOiZs(IrpXHx z4JYqZ;ZXo}Qvb|rbLwJXVEDkmz@P!w#=x+o@jKIGL1wMV{HhRN$f-&*9cP~WklAH& zJyfVqRhlW3WpX}?$>jU05aZy3`vMFMVkpLaVVlgyE};VnFI=5ugpMVRFZd_>t64IY z@K5eilVO@HJ9(j^>Eyd={9vEFSCeKcRh+y~(SEYGIuBSVN?n>!XmXjl8rw1@kU0Q{ CmX)ml diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index db7947432e..0e2001b931 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> <name>dbrepo-data-service</name> - <version>1.7.0</version> + <version>1.6.4</version> <description>Service that manages the data</description> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index 1aa138f611..0c01d6893c 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-data-service-querystore</artifactId> <name>dbrepo-data-service-querystore</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index 98536501d3..ed4826a38d 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>report</artifactId> <name>dbrepo-data-service-report</name> - <version>1.7.0</version> + <version>1.6.4</version> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 434c423ef0..8367823870 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>rest-service</artifactId> <name>dbrepo-data-service-rest-service</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>services</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index 5252e6a3d3..3f645dda32 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>services</artifactId> <name>dbrepo-data-service-services</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml index 6c3b1aa13f..3f68887ec0 100644 --- a/dbrepo-metadata-service/api/pom.xml +++ b/dbrepo-metadata-service/api/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-api</artifactId> <name>dbrepo-metadata-service-api</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-entities</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> <scope>compile</scope> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/auth/CreateUserDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/auth/CreateUserDto.java index 16f45aec4d..9742986ae0 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/auth/CreateUserDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/auth/CreateUserDto.java @@ -40,7 +40,4 @@ public class CreateUserDto { @Schema(example = "bar") private String familyName; - @Schema(example = "foo.bar@example.com") - private String email; - } diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml index 313309e188..382fa2e7e8 100644 --- a/dbrepo-metadata-service/entities/pom.xml +++ b/dbrepo-metadata-service/entities/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-entities</artifactId> <name>dbrepo-metadata-service-entity</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies/> diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java index ba86e3d29c..156fc3b4c8 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java @@ -65,7 +65,7 @@ public class User { @Column(name = "mariadb_password", nullable = false) private String mariadbPassword; - @Column(name = "is_internal", nullable = false, updatable = false) + @Column(name = "is_internal", nullable = false, updatable = false, columnDefinition = "bool default false") private Boolean isInternal; } diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index 54c464b11a..76beb8d88f 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-oai</artifactId> <name>dbrepo-metadata-service-oai</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index d64da973f0..ae5c004e0c 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> - <version>1.7.0</version> + <version>1.6.4</version> <description>Service that manages the metadata</description> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 6bcb8d579b..be6e86a4d0 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-report</artifactId> <name>dbrepo-metadata-service-report</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 4d3b5f933d..cf327942a4 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-repositories</artifactId> <name>dbrepo-metadata-service-repositories</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index 9e9f23d11f..e1524f7971 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-rest-service</artifactId> <name>dbrepo-metadata-service-rest</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index 50016103d8..41cc59ca6a 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -511,19 +511,26 @@ public class DatabaseEndpoint extends AbstractEndpoint { .stream() .filter(a -> a.getUser().getId().equals(getId(principal))) .findFirst(); + optional.ifPresentOrElse(access -> log.trace("user has access: {}", access), () -> log.trace("user has no access")); if (!database.getIsPublic() && !database.getIsSchemaPublic() && optional.isEmpty() && !isSystem(principal)) { log.error("Failed to find database: not public and no access found"); throw new NotAllowedException("Failed to find database: not public and no access found"); } /* reduce metadata */ + final int tables = database.getTables() + .size(); database.setTables(database.getTables() .stream() .filter(t -> t.getIsPublic() || t.getIsSchemaPublic() || optional.isPresent()) .toList()); + log.trace("filtered database tables from {} to {}", tables, database.getTables().size()); + final int views = database.getViews() + .size(); database.setViews(database.getViews() .stream() .filter(v -> v.getIsPublic() || v.getIsSchemaPublic() || optional.isPresent()) .toList()); + log.trace("filtered database views from {} to {}", views, database.getViews().size()); if (!isSystem(principal) && !database.getOwner().getId().equals(getId(principal))) { log.trace("authenticated user {} is not owner: remove access list", principal.getName()); database.setAccesses(List.of()); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index 51f323c30f..5ca14a5a34 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -106,47 +106,15 @@ public class UserEndpoint extends AbstractEndpoint { @ApiResponse(responseCode = "400", description = "Parameters are not well-formed (likely email)", content = {@Content(mediaType = "application/json")}), - @ApiResponse(responseCode = "403", - description = "Internal authentication to the auth service is invalid", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "404", - description = "Default role not found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "409", - description = "User with username already exists", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "417", - description = "User with e-mail already exists", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "502", - description = "Failed to create in auth service", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "503", - description = "Failed to create in auth service", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody CreateUserDto data) - throws UserExistsException, EmailExistsException, AuthServiceException, AuthServiceConnectionException, - UserNotFoundException, CredentialsInvalidException { + public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody CreateUserDto data) { log.debug("endpoint create user, data.id={}, data.username={}", data.getId(), data.getUsername()); return ResponseEntity.status(HttpStatus.CREATED) .body(userMapper.userToUserBriefDto( userService.create(data))); } - @GetMapping("/{userId}") + @RequestMapping(value = "/{userId}", method = {RequestMethod.GET, RequestMethod.HEAD}) @Transactional(readOnly = true) @PreAuthorize("isAuthenticated()") @Observed(name = "dbrepo_user_find") @@ -181,12 +149,14 @@ public class UserEndpoint extends AbstractEndpoint { throw new NotAllowedException("Failed to find user: foreign user"); } if (user.getIsInternal()) { - throw new UserNotFoundException("Failed to find user with username: " + user.getUsername()); + log.error("Failed to find user: internal user"); + throw new NotAllowedException("Failed to find user: internal user"); } final HttpHeaders headers = new HttpHeaders(); if (isSystem(principal)) { headers.set("X-Username", user.getUsername()); headers.set("X-Password", user.getMariadbPassword()); + headers.set("Access-Control-Expose-Headers", "X-Username X-Password"); } return ResponseEntity.status(HttpStatus.OK) .headers(headers) @@ -282,18 +252,18 @@ public class UserEndpoint extends AbstractEndpoint { @NotNull @Valid @RequestBody UserPasswordDto data, @NotNull Principal principal) throws NotAllowedException, UserNotFoundException, DatabaseNotFoundException, DataServiceException, - DataServiceConnectionException { + DataServiceConnectionException, AuthServiceException { log.debug("endpoint modify a user password, userId={}, principal.name={}", userId, principal.getName()); final User user = userService.findById(userId); if (!user.getUsername().equals(principal.getName())) { log.error("Failed to modify user password: not current user"); throw new NotAllowedException("Failed to modify user password: not current user"); } - authenticationService.updatePassword(user, data); for (Database database : databaseService.findAllAtLestReadAccess(userId)) { databaseService.updatePassword(database, user); } userService.updatePassword(user, data); + authenticationService.setupFinished(user); return ResponseEntity.accepted() .build(); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java index 5b5769583a..44e35f3a29 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java @@ -2,6 +2,7 @@ package at.tuwien.handlers; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; +import com.auth0.jwt.exceptions.TokenExpiredException; import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.log4j.Log4j2; import org.springframework.http.HttpHeaders; @@ -16,6 +17,20 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep @ControllerAdvice public class ApiExceptionHandler extends ResponseEntityExceptionHandler { + @Hidden + @ResponseStatus(code = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(TokenExpiredException.class) + public ResponseEntity<ApiErrorDto> handle(TokenExpiredException e) { + final HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "application/problem+json"); + final ApiErrorDto response = ApiErrorDto.builder() + .status(HttpStatus.UNAUTHORIZED) + .message(e.getLocalizedMessage()) + .code("error.token.expired") + .build(); + return new ResponseEntity<>(response, headers, response.getStatus()); + } + @Hidden @ResponseStatus(code = HttpStatus.NOT_FOUND) @ExceptionHandler(AccessNotFoundException.class) @@ -471,7 +486,7 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { final ApiErrorDto response = ApiErrorDto.builder() .status(annotation.code()) .message(message) - .code(annotation.reason()) + .code(exceptionClass.getAnnotation(ResponseStatus.class).reason()) .build(); return new ResponseEntity<>(response, headers, response.getStatus()); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java index a54f616b01..6fe29c118b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java @@ -131,7 +131,7 @@ public class EndpointValidator extends AbstractEndpoint { final Optional<CreateTableColumnDto> optional3 = data.getColumns() .stream() .filter(c -> c.getType().equals(ColumnTypeDto.SET)) - .filter(c -> c.getEnums() == null || c.getSets().isEmpty()) + .filter(c -> c.getSets() == null || c.getSets().isEmpty()) .findFirst(); if (optional3.isPresent()) { log.error("Validation failed: column {} needs at least 1 allowed set value", optional3.get().getName()); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/ApplicationIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/ApplicationIntegrationTest.java new file mode 100644 index 0000000000..33c7bc76c5 --- /dev/null +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/ApplicationIntegrationTest.java @@ -0,0 +1,23 @@ +package at.tuwien; + +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@Log4j2 +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class ApplicationIntegrationTest { + + @Test + public void main_succeeds() { + + /* test */ + DbrepoMetadataServiceApplication.main(new String[]{}); + } + +} diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index fd91fb5655..1340d552d1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -269,7 +269,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser - public void list_anonymous_succeeds() throws DatabaseNotFoundException, UserNotFoundException { + public void list_anonymous_succeeds() { /* mock */ when(databaseService.findAllPublicOrSchemaPublic()) @@ -281,7 +281,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"list-databases"}) - public void list_hasRole_succeeds() throws DatabaseNotFoundException, UserNotFoundException { + public void list_hasRole_succeeds() { /* pre-condition */ assertTrue(DATABASE_3_PUBLIC); @@ -296,7 +296,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"list-databases"}) - public void list_hasRoleForeign_succeeds() throws DatabaseNotFoundException, UserNotFoundException { + public void list_hasRoleForeign_succeeds() { /* pre-condition */ assertTrue(DATABASE_3_PUBLIC); @@ -311,7 +311,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"list-databases"}) - public void list_hasRoleFilter_succeeds() throws DatabaseNotFoundException, UserNotFoundException { + public void list_hasRoleFilter_succeeds() { /* mock */ when(databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(USER_1_ID, DATABASE_3_INTERNALNAME)) @@ -323,7 +323,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"list-databases"}) - public void list_hasRoleFilterNoResult_succeeds() throws DatabaseNotFoundException, UserNotFoundException { + public void list_hasRoleFilterNoResult_succeeds() { /* mock */ when(databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(USER_1_ID, "i_do_not_exist")) @@ -333,6 +333,18 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { list_generic("i_do_not_exist", USER_1_PRINCIPAL, 0); } + @Test + @WithAnonymousUser + public void list_filterNoResult_succeeds() { + + /* mock */ + when(databaseService.findAllPublicOrSchemaPublicByInternalName("i_do_not_exist")) + .thenReturn(List.of()); + + /* test */ + list_generic("i_do_not_exist", null, 0); + } + @Test @WithAnonymousUser public void visibility_anonymous_fails() { @@ -562,15 +574,15 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { } @Test - @WithAnonymousUser - public void findById_anonymousPrivateSchemaNoAccessSystem_succeeds() throws UserNotFoundException, + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void findById_privateSchemaNoAccessInternalUser_succeeds() throws UserNotFoundException, NotAllowedException, DataServiceException, DatabaseNotFoundException, ExchangeNotFoundException, DataServiceConnectionException { /* test */ - final DatabaseDto database = findById_generic(DATABASE_1_ID, DATABASE_1, USER_LOCAL_ADMIN_PRINCIPAL); - assertEquals(4, database.getTables().size()); - assertEquals(2, database.getViews().size()); + final DatabaseDto database = findById_generic(DATABASE_3_ID, DATABASE_3, USER_LOCAL_ADMIN_PRINCIPAL); + assertEquals(0, database.getTables().size()); + assertEquals(1, database.getViews().size()); assertNotEquals(0, database.getAccesses().size()); } @@ -610,6 +622,58 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { assertEquals(3, database.getAccesses().size()); } + @Test + @WithMockUser(username = USER_2_USERNAME) + public void findById_hiddenAccessRights_succeeds() throws DataServiceException, DataServiceConnectionException, + DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException, NotAllowedException { + + /* mock */ + when(accessService.list(DATABASE_1)) + .thenReturn(List.of(DATABASE_1_USER_1_WRITE_ALL_ACCESS, DATABASE_1_USER_2_READ_ACCESS)); + + /* test */ + final DatabaseDto database = findById_generic(DATABASE_1_ID, DATABASE_1, USER_2_PRINCIPAL); + assertEquals(4, database.getTables().size()); + assertEquals(3, database.getViews().size()); + assertEquals(0, database.getAccesses().size()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void findById_hiddenAccessRightsSeesOwn_succeeds() throws DataServiceException, DataServiceConnectionException, + DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException, NotAllowedException { + + /* mock */ + when(accessService.list(DATABASE_1)) + .thenReturn(List.of(DATABASE_1_USER_1_WRITE_ALL_ACCESS, DATABASE_1_USER_2_READ_ACCESS)); + + /* test */ + final DatabaseDto database = findById_generic(DATABASE_1_ID, DATABASE_1, USER_1_PRINCIPAL); + assertEquals(4, database.getTables().size()); + assertEquals(3, database.getViews().size()); + assertEquals(3, database.getAccesses().size()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void findById_privateDataPrivateSchemaNoAccess_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + findById_generic(DATABASE_1_ID, DATABASE_1, USER_4_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void findById_anonymousPrivateDataPrivateSchema_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + findById_generic(DATABASE_1_ID, DATABASE_1, null); + }); + } + @Test @WithAnonymousUser public void findPreviewImage_anonymous_succeeds() throws DatabaseNotFoundException { @@ -660,8 +724,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - public void list_generic(String internalName, Principal principal, Integer expectedSize) - throws DatabaseNotFoundException, UserNotFoundException { + public void list_generic(String internalName, Principal principal, Integer expectedSize) { /* test */ final ResponseEntity<List<DatabaseBriefDto>> response = databaseEndpoint.list(internalName, principal); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java index a17d31649e..16551784c8 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java @@ -1,12 +1,12 @@ package at.tuwien.endpoints; -import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.CreateTableDto; +import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.TableUpdateDto; -import at.tuwien.api.database.table.columns.CreateTableColumnDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; +import at.tuwien.api.database.table.columns.CreateTableColumnDto; import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.api.database.table.constraints.CreateTableConstraintsDto; import at.tuwien.api.semantics.EntityDto; @@ -40,6 +40,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; import java.util.List; +import java.util.UUID; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; @@ -524,7 +525,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void findById_publicDatabasePrivateDataPrivateSchemaAnonymous_succeeds() throws UserNotFoundException, - TableNotFoundException, NotAllowedException, DataServiceException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, DataServiceConnectionException { + TableNotFoundException, NotAllowedException, DataServiceException, DatabaseNotFoundException, + AccessNotFoundException, QueueNotFoundException, DataServiceConnectionException { /* test */ final ResponseEntity<TableDto> response = generic_findById(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, null, null, null); @@ -596,6 +598,16 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_4_USERNAME, authorities = {"table-semantic-analyse"}) + public void analyseTable_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + analyseTable_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_4_PRINCIPAL); + }); + } + @Test @WithMockUser(username = USER_4_USERNAME) public void findAll_noRole_fails() { @@ -930,6 +942,29 @@ public class TableEndpointUnitTest extends AbstractUnitTest { generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_2_ID, TABLE_2, null, null, null); } + @Test + @WithMockUser(username = USER_4_USERNAME) + public void findById_privateSchemaNotOwnerNoAccess_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_findById(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, USER_4_PRINCIPAL, USER_4, null); + }); + } + + @Test + @WithMockUser(username = USER_4_USERNAME) + public void findById_publicSchemaNotOwnerNoAccess_succeeds() throws UserNotFoundException, TableNotFoundException, + NotAllowedException, DataServiceException, DatabaseNotFoundException, AccessNotFoundException, + QueueNotFoundException, DataServiceConnectionException { + + /* test */ + final ResponseEntity<TableDto> response = generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_2_ID, TABLE_2, USER_4_PRINCIPAL, USER_4, null); + assertEquals(HttpStatus.OK, response.getStatusCode()); + final TableDto body = response.getBody(); + assertNotNull(body); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = "find-table") public void findById_privateHasRoleTableNotFound_fails() { @@ -970,7 +1005,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { AccessNotFoundException, QueueNotFoundException, DataServiceConnectionException { /* test */ - generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_4_PRINCIPAL, USER_4, null); + generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_4_PRINCIPAL, USER_4, DATABASE_1_USER_4_READ_ACCESS); } @Test @@ -1081,6 +1116,17 @@ public class TableEndpointUnitTest extends AbstractUnitTest { assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system", "update-table-statistic"}) + public void updateStatistic_internalUser_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, NotAllowedException, DataServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* test */ + final ResponseEntity<Void> response = generic_updateStatistic(USER_LOCAL_ADMIN_PRINCIPAL); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + } + /* ################################################################################################### */ /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ @@ -1148,7 +1194,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { } protected ResponseEntity<TableBriefDto> generic_create(Long databaseId, Database database, CreateTableDto data, - Principal principal, User user, DatabaseAccess access) + Principal principal, User user, DatabaseAccess access) throws MalformedException, NotAllowedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, TableNotFoundException, TableExistsException, SearchServiceException, SearchServiceConnectionException, OntologyNotFoundException, @@ -1203,11 +1249,21 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .when(tableService) .findById(any(Database.class), eq(tableId)); } - if (principal != null) { + if (user != null) { when(userService.findById(user.getId())) .thenReturn(user); - when(accessService.find(any(Database.class), eq(user))) + } else { + doThrow(UserNotFoundException.class) + .when(userService) + .findById(any(UUID.class)); + } + if (access != null) { + when(accessService.find(any(Database.class), any(User.class))) .thenReturn(access); + } else { + doThrow(AccessNotFoundException.class) + .when(accessService) + .find(any(Database.class), any(User.class)); } /* test */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java index 6ef4bd8779..de5c8993a1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java @@ -1,5 +1,6 @@ package at.tuwien.endpoints; +import at.tuwien.api.auth.CreateUserDto; import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; import at.tuwien.api.user.UserPasswordDto; @@ -19,6 +20,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.test.context.support.WithAnonymousUser; @@ -63,6 +65,15 @@ public class UserEndpointUnitTest extends AbstractUnitTest { assertEquals(2, response.size()); } + @Test + @WithAnonymousUser + public void findAll_filterInternalUserEmptyList_succeeds() throws UserNotFoundException { + + /* test */ + final List<UserBriefDto> response = findAll_generic(USER_LOCAL_ADMIN_USERNAME, null); + assertEquals(0, response.size()); + } + @Test @WithMockUser(username = USER_1_USERNAME) public void findAll_noRole_succeeds() throws UserNotFoundException { @@ -142,6 +153,18 @@ public class UserEndpointUnitTest extends AbstractUnitTest { assertEquals(USER_3_DATABASE_PASSWORD, response.getHeaders().get("X-Password").get(0)); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void find_internalUser_fails() { + final Principal principal = new UsernamePasswordAuthenticationToken(USER_LOCAL_ADMIN_DETAILS, USER_LOCAL_ADMIN_PASSWORD, List.of( + new SimpleGrantedAuthority("system"))); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + find_generic(USER_LOCAL_ADMIN_ID, USER_LOCAL, principal); + }); + } + @Test @WithAnonymousUser public void modify_anonymous_fails() { @@ -233,7 +256,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME) public void password_succeeds() throws NotAllowedException, DataServiceException, DataServiceConnectionException, - UserNotFoundException, DatabaseNotFoundException { + UserNotFoundException, DatabaseNotFoundException, AuthServiceException { final UserPasswordDto request = UserPasswordDto.builder() .password(USER_1_PASSWORD) .build(); @@ -242,6 +265,38 @@ public class UserEndpointUnitTest extends AbstractUnitTest { password_generic(USER_1_PRINCIPAL, request); } + @Test + @WithAnonymousUser + public void create_anonymous_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + generic_create(USER_1_CREATE_USER_DTO); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME) + public void create_notInternalUser_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + generic_create(USER_1_CREATE_USER_DTO); + }); + } + + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void create_succeeds() { + + /* mock */ + when(userService.create(USER_1_CREATE_USER_DTO)) + .thenReturn(USER_1); + + /* test */ + generic_create(USER_1_CREATE_USER_DTO); + } + /* ################################################################################################### */ /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ @@ -260,7 +315,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { } } else { when(userService.findAll()) - .thenReturn(List.of(USER_1, USER_2)); + .thenReturn(List.of(USER_1, USER_2, USER_LOCAL)); } /* test */ @@ -310,14 +365,15 @@ public class UserEndpointUnitTest extends AbstractUnitTest { } protected void password_generic(Principal principal, UserPasswordDto data) throws NotAllowedException, - DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException { + DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, + AuthServiceException { /* mock */ when(userService.findById(USER_1_ID)) .thenReturn(USER_1); doNothing() .when(authenticationService) - .updatePassword(USER_1, data); + .setupFinished(USER_1); doNothing() .when(userService) .updatePassword(USER_1, data); @@ -331,4 +387,13 @@ public class UserEndpointUnitTest extends AbstractUnitTest { final ResponseEntity<?> response = userEndpoint.password(USER_1_ID, data, principal); assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); } + + protected void generic_create(CreateUserDto data) { + + /* test */ + final ResponseEntity<UserBriefDto> response = userEndpoint.create(data); + assertEquals(HttpStatus.CREATED, response.getStatusCode()); + final UserBriefDto body = response.getBody(); + assertNotNull(body); + } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/KeycloakGatewayIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/KeycloakGatewayIntegrationTest.java index e72cd7fa75..58701adfc3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/KeycloakGatewayIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/KeycloakGatewayIntegrationTest.java @@ -92,23 +92,4 @@ public class KeycloakGatewayIntegrationTest extends AbstractUnitTest { }); } - @Test - public void updateUserCredentials_succeeds() throws UserNotFoundException { - - /* mock */ - keycloakUtils.createUser(USER_1_ID, USER_1_KEYCLOAK_SIGNUP_REQUEST); - - /* test */ - keycloakGateway.updateUserCredentials(keycloakUtils.getUserId(USER_1_USERNAME), USER_1_PASSWORD_DTO); - } - - @Test - public void updateUserCredentials_notFound_fails() { - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - keycloakGateway.updateUserCredentials(keycloakUtils.getUserId(USER_1_USERNAME), USER_1_PASSWORD_DTO); - }); - } - } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java index 9075ec2a02..06a4e377b0 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java @@ -1,29 +1,40 @@ package at.tuwien.handlers; +import at.tuwien.api.error.ApiErrorDto; +import at.tuwien.exception.*; import at.tuwien.test.AbstractUnitTest; +import com.auth0.jwt.exceptions.TokenExpiredException; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.web.bind.annotation.ResponseStatus; import java.io.IOException; import java.lang.reflect.Method; +import java.time.Instant; import java.util.Arrays; import java.util.List; import java.util.Optional; import static at.tuwien.test.utils.EndpointUtils.getErrorCodes; import static at.tuwien.test.utils.EndpointUtils.getExceptions; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; @Log4j2 @ExtendWith(SpringExtension.class) @SpringBootTest public class ApiExceptionHandlerTest extends AbstractUnitTest { + @Autowired + private ApiExceptionHandler apiExceptionHandler; + @Test public void handle_succeeds() throws ClassNotFoundException, IOException { final List<Method> handlers = Arrays.asList(ApiExceptionHandler.class.getMethods()); @@ -42,7 +53,912 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest { Assertions.assertNotNull(exception.getDeclaredAnnotation(ResponseStatus.class).reason(), "Exception " + exception.getName() + " does not provide a reason code"); Assertions.assertTrue(errorCodes.contains(exception.getDeclaredAnnotation(ResponseStatus.class).reason()), "Exception code " + exception.getDeclaredAnnotation(ResponseStatus.class).reason() + " does have a reason code mapped in localized ui error messages"); /* handler method */ - Assertions.assertEquals(method.getDeclaredAnnotation(ResponseStatus.class).code(), exception.getDeclaredAnnotation(ResponseStatus.class).code()); + assertEquals(method.getDeclaredAnnotation(ResponseStatus.class).code(), exception.getDeclaredAnnotation(ResponseStatus.class).code()); } } + + @Test + public void handle_tokenExpiredException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new TokenExpiredException("msg", Instant.now())); + assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertNotNull(body.getMessage()); + assertEquals(HttpStatus.UNAUTHORIZED, body.getStatus()); + assertEquals("error.token.expired", body.getCode()); + } + + @Test + public void handle_accessNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new AccessNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.access.missing", body.getCode()); + } + + @Test + public void handle_accountNotSetupException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new AccountNotSetupException("msg")); + assertEquals(HttpStatus.PRECONDITION_REQUIRED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.PRECONDITION_REQUIRED, body.getStatus()); + assertEquals("error.user.setup", body.getCode()); + } + + @Test + public void handle_analyseServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new AnalyseServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.analyse.invalid", body.getCode()); + } + + @Test + public void handle_authServiceConnectionException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new AuthServiceConnectionException("msg")); + assertEquals(HttpStatus.BAD_GATEWAY, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_GATEWAY, body.getStatus()); + assertEquals("error.auth.connection", body.getCode()); + } + + @Test + public void handle_authServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new AuthServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.auth.invalid", body.getCode()); + } + + + @Test + public void handle_brokerServiceConnectionException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new BrokerServiceConnectionException("msg")); + assertEquals(HttpStatus.BAD_GATEWAY, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_GATEWAY, body.getStatus()); + assertEquals("error.broker.connection", body.getCode()); + } + + + @Test + public void handle_brokerServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new BrokerServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.broker.invalid", body.getCode()); + } + + + @Test + public void handle_conceptNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ConceptNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.concept.missing", body.getCode()); + } + + + @Test + public void handle_containerAlreadyExistsException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ContainerAlreadyExistsException("msg")); + assertEquals(HttpStatus.CONFLICT, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.CONFLICT, body.getStatus()); + assertEquals("error.container.exists", body.getCode()); + } + + + @Test + public void handle_containerNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ContainerNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.container.missing", body.getCode()); + } + + + @Test + public void handle_containerQuotaException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ContainerQuotaException("msg")); + assertEquals(HttpStatus.LOCKED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.LOCKED, body.getStatus()); + assertEquals("error.container.quota", body.getCode()); + } + + + @Test + public void handle_credentialsInvalidException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new CredentialsInvalidException("msg")); + assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.FORBIDDEN, body.getStatus()); + assertEquals("error.user.credentials", body.getCode()); + } + + + @Test + public void handle_dataServiceConnectionException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new DataServiceConnectionException("msg")); + assertEquals(HttpStatus.BAD_GATEWAY, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_GATEWAY, body.getStatus()); + assertEquals("error.data.connection", body.getCode()); + } + + + @Test + public void handle_dataServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new DataServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.data.invalid", body.getCode()); + } + + + @Test + public void handle_databaseMalformedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new DatabaseMalformedException("msg")); + assertEquals(HttpStatus.EXPECTATION_FAILED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.EXPECTATION_FAILED, body.getStatus()); + assertEquals("error.database.invalid", body.getCode()); + } + + + @Test + public void handle_databaseNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new DatabaseNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.database.missing", body.getCode()); + } + + + @Test + public void handle_databaseUnavailableException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new DatabaseUnavailableException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.database.connection", body.getCode()); + } + + + @Test + public void handle_doiNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new DoiNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.doi.missing", body.getCode()); + } + + + @Test + public void handle_emailExistsException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new EmailExistsException("msg")); + assertEquals(HttpStatus.EXPECTATION_FAILED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.EXPECTATION_FAILED, body.getStatus()); + assertEquals("error.user.email-exists", body.getCode()); + } + + + @Test + public void handle_exchangeNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ExchangeNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.exchange.missing", body.getCode()); + } + + + @Test + public void handle_externalServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ExternalServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.external.invalid", body.getCode()); + } + + + @Test + public void handle_filterBadRequestException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new FilterBadRequestException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.semantic.filter", body.getCode()); + } + + + @Test + public void handle_formatNotAvailableException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new FormatNotAvailableException("msg")); + assertEquals(HttpStatus.NOT_ACCEPTABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_ACCEPTABLE, body.getStatus()); + assertEquals("error.identifier.format", body.getCode()); + } + + + @Test + public void handle_identifierNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new IdentifierNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.identifier.missing", body.getCode()); + } + + + @Test + public void handle_identifierNotSupportedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new IdentifierNotSupportedException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.identifier.unsupported", body.getCode()); + } + + + @Test + public void handle_imageAlreadyExistsException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ImageAlreadyExistsException("msg")); + assertEquals(HttpStatus.CONFLICT, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.CONFLICT, body.getStatus()); + assertEquals("error.image.exists", body.getCode()); + } + + + @Test + public void handle_imageInvalidException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ImageInvalidException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.image.invalid", body.getCode()); + } + + + @Test + public void handle_imageNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ImageNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.image.missing", body.getCode()); + } + + + @Test + public void handle_licenseNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new LicenseNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.license.missing", body.getCode()); + } + + + @Test + public void handle_malformedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new MalformedException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.request.invalid", body.getCode()); + } + + + @Test + public void handle_messageNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new MessageNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.message.missing", body.getCode()); + } + + + @Test + public void handle_metadataServiceConnectionException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new MetadataServiceConnectionException("msg")); + assertEquals(HttpStatus.BAD_GATEWAY, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_GATEWAY, body.getStatus()); + assertEquals("error.metadata.connection", body.getCode()); + } + + + @Test + public void handle_metadataServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new MetadataServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.metadata.invalid", body.getCode()); + } + + + @Test + public void handle_notAllowedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new NotAllowedException("msg")); + assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.FORBIDDEN, body.getStatus()); + assertEquals("error.request.forbidden", body.getCode()); + } + + + @Test + public void handle_ontologyNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new OntologyNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.ontology.missing", body.getCode()); + } + + + @Test + public void handle_orcidNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new OrcidNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.orcid.missing", body.getCode()); + } + + + @Test + public void handle_paginationException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new PaginationException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.request.pagination", body.getCode()); + } + + + @Test + public void handle_queryMalformedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryMalformedException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.query.invalid", body.getCode()); + } + + + @Test + public void handle_queryNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.query.missing", body.getCode()); + } + + + @Test + public void handle_queryNotSupportedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryNotSupportedException("msg")); + assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_IMPLEMENTED, body.getStatus()); + assertEquals("error.query.invalid", body.getCode()); + } + + + @Test + public void handle_queryStoreCreateException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryStoreCreateException("msg")); + assertEquals(HttpStatus.EXPECTATION_FAILED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.EXPECTATION_FAILED, body.getStatus()); + assertEquals("error.store.invalid", body.getCode()); + } + + + @Test + public void handle_queryStoreGCException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryStoreGCException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.store.clean", body.getCode()); + } + + + @Test + public void handle_queryStoreInsertException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryStoreInsertException("msg")); + assertEquals(HttpStatus.EXPECTATION_FAILED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.EXPECTATION_FAILED, body.getStatus()); + assertEquals("error.store.insert", body.getCode()); + } + + + @Test + public void handle_queryStorePersistException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueryStorePersistException("msg")); + assertEquals(HttpStatus.EXPECTATION_FAILED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.EXPECTATION_FAILED, body.getStatus()); + assertEquals("error.store.persist", body.getCode()); + } + + + @Test + public void handle_queueNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new QueueNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.queue.missing", body.getCode()); + } + + + @Test + public void handle_remoteUnavailableException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new RemoteUnavailableException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.metadata.privileged", body.getCode()); + } + + + @Test + public void handle_rorNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new RorNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.ror.missing", body.getCode()); + } + + + @Test + public void handle_searchServiceConnectionException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new SearchServiceConnectionException("msg")); + assertEquals(HttpStatus.BAD_GATEWAY, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_GATEWAY, body.getStatus()); + assertEquals("error.search.connection", body.getCode()); + } + + + @Test + public void handle_searchServiceException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new SearchServiceException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.search.invalid", body.getCode()); + } + + + @Test + public void handle_semanticEntityNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new SemanticEntityNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.semantic.missing", body.getCode()); + } + + + @Test + public void handle_sortException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new SortException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.request.sort", body.getCode()); + } + + + @Test + public void handle_storageNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new StorageNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.storage.missing", body.getCode()); + } + + + @Test + public void handle_storageUnavailableException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new StorageUnavailableException("msg")); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.SERVICE_UNAVAILABLE, body.getStatus()); + assertEquals("error.storage.invalid", body.getCode()); + } + + + @Test + public void handle_tableExistsException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new TableExistsException("msg")); + assertEquals(HttpStatus.CONFLICT, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.CONFLICT, body.getStatus()); + assertEquals("error.table.exists", body.getCode()); + } + + + @Test + public void handle_tableMalformedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new TableMalformedException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.table.invalid", body.getCode()); + } + + + @Test + public void handle_tableNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new TableNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.table.missing", body.getCode()); + } + + + @Test + public void handle_tableSchemaException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new TableSchemaException("msg")); + assertEquals(HttpStatus.CONFLICT, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.CONFLICT, body.getStatus()); + assertEquals("error.schema.table", body.getCode()); + } + + + @Test + public void handle_unitNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new UnitNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.unit.missing", body.getCode()); + } + + + @Test + public void handle_uriMalformedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new UriMalformedException("msg")); + assertEquals(HttpStatus.EXPECTATION_FAILED, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.EXPECTATION_FAILED, body.getStatus()); + assertEquals("error.semantics.uri", body.getCode()); + } + + + @Test + public void handle_userExistsException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new UserExistsException("msg")); + assertEquals(HttpStatus.CONFLICT, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.CONFLICT, body.getStatus()); + assertEquals("error.user.exists", body.getCode()); + } + + + @Test + public void handle_userNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new UserNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.user.missing", body.getCode()); + } + + + @Test + public void handle_viewMalformedException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ViewMalformedException("msg")); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.BAD_REQUEST, body.getStatus()); + assertEquals("error.view.invalid", body.getCode()); + } + + + @Test + public void handle_viewNotFoundException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ViewNotFoundException("msg")); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.NOT_FOUND, body.getStatus()); + assertEquals("error.view.missing", body.getCode()); + } + + + @Test + public void handle_viewSchemaException_succeeds() { + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new ViewSchemaException("msg")); + assertEquals(HttpStatus.CONFLICT, response.getStatusCode()); + final ApiErrorDto body = response.getBody(); + assertNotNull(body); + assertEquals("msg", body.getMessage()); + assertEquals(HttpStatus.CONFLICT, body.getStatus()); + assertEquals("error.schema.view", body.getCode()); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java new file mode 100644 index 0000000000..39aed0d28e --- /dev/null +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java @@ -0,0 +1,85 @@ +package at.tuwien.service; + +import at.tuwien.entities.user.User; +import at.tuwien.exception.AuthServiceException; +import at.tuwien.exception.UserNotFoundException; +import at.tuwien.gateway.KeycloakGateway; +import at.tuwien.repository.UserRepository; +import at.tuwien.test.AbstractUnitTest; +import at.tuwien.utils.KeycloakUtils; +import dasniko.testcontainers.keycloak.KeycloakContainer; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.testcontainers.images.PullPolicy; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@Log4j2 +@Testcontainers +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class UserServiceIntegrationTest extends AbstractUnitTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserService userService; + + @Autowired + private KeycloakUtils keycloakUtils; + + @BeforeEach + public void beforeEach() { + genesis(); + /* keycloak */ + userRepository.deleteAll(); + keycloakUtils.deleteUser(USER_1_USERNAME); + } + + @Container + private static KeycloakContainer keycloakContainer = new KeycloakContainer(KEYCLOAK_IMAGE) + .withImagePullPolicy(PullPolicy.alwaysPull()) + .withAdminUsername("admin") + .withAdminPassword("admin") + .withRealmImportFile("./init/dbrepo-realm.json") + .withEnv("KC_HOSTNAME_STRICT_HTTPS", "false"); + + @DynamicPropertySource + static void keycloakProperties(DynamicPropertyRegistry registry) { + final String authServiceEndpoint = "http://localhost:" + keycloakContainer.getMappedPort(8080); + log.trace("set auth endpoint: {}", authServiceEndpoint); + registry.add("dbrepo.endpoints.authService", () -> authServiceEndpoint); + } + + @Test + public void create_succeeds() throws UserNotFoundException, AuthServiceException { + + /* test */ + final User response = userService.create(USER_1_CREATE_USER_DTO); + assertEquals(USER_1_ID, response.getId()); + assertEquals(USER_1_KEYCLOAK_ID, response.getKeycloakId()); + assertEquals(USER_1_USERNAME, response.getUsername()); + assertEquals(USER_1_THEME, response.getTheme()); + assertNotNull(response.getMariadbPassword()); + assertEquals(USER_1_LANGUAGE, response.getLanguage()); + assertEquals(USER_1_FIRSTNAME, response.getFirstname()); + assertEquals(USER_1_LASTNAME, response.getLastname()); + assertEquals(USER_1_IS_INTERNAL, response.getIsInternal()); + } + +} diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java index 514d23b227..eb228ab3c3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java @@ -42,7 +42,7 @@ public class UserServicePersistenceTest extends AbstractUnitTest { public void beforeEach() { genesis(); /* metadata database */ - userRepository.save(USER_1); + userRepository.saveAll(List.of(USER_1, USER_LOCAL)); } @Test @@ -54,6 +54,16 @@ public class UserServicePersistenceTest extends AbstractUnitTest { assertEquals(USER_1_USERNAME, response.getUsername()); } + @Test + public void findAllInternalUsers_succeeds() { + + /* test */ + final List<User> response = userService.findAllInternalUsers(); + assertEquals(1, response.size()); + final User user0 = response.get(0); + assertEquals(USER_LOCAL_ADMIN_ID, user0.getId()); + } + @Test public void findByUsername_fails() { @@ -68,7 +78,7 @@ public class UserServicePersistenceTest extends AbstractUnitTest { /* test */ final List<User> response = userService.findAll(); - assertEquals(1, response.size()); + assertEquals(2, response.size()); } @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java index 58d7cdc5e4..df13d00b08 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java @@ -93,12 +93,12 @@ public class UserServiceUnitTest extends AbstractUnitTest { } @Test - public void updatePassword_succeeds() throws UserNotFoundException { + public void updatePassword_succeeds() throws UserNotFoundException, AuthServiceException { /* mock */ doNothing() .when(keycloakGateway) - .updateUserCredentials(USER_1_ID, USER_1_PASSWORD_DTO); + .setupFinished(USER_1_ID); when(userRepository.findById(USER_1_ID)) .thenReturn(Optional.of(USER_1)); when(userRepository.save(any(User.class))) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java index 486db28e59..8105a7fb89 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java @@ -52,9 +52,27 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { public static Stream<Arguments> needSize_parameters() { return Stream.of( - Arguments.arguments(ColumnTypeDto.VARCHAR), - Arguments.arguments(ColumnTypeDto.BINARY), - Arguments.arguments(ColumnTypeDto.VARBINARY) + Arguments.arguments("varchar", ColumnTypeDto.VARCHAR), + Arguments.arguments("binary", ColumnTypeDto.BINARY), + Arguments.arguments("varbinary", ColumnTypeDto.VARBINARY) + ); + } + + public static Stream<Arguments> needSizeAndD_parameters() { + return Stream.of( + Arguments.arguments("double_size", ColumnTypeDto.DOUBLE, 40L, null), + Arguments.arguments("double_d", ColumnTypeDto.DOUBLE, null, 10L), + Arguments.arguments("decimal_size", ColumnTypeDto.DECIMAL, 40L, null), + Arguments.arguments("decimal_d", ColumnTypeDto.DECIMAL, null, 10L) + ); + } + + public static Stream<Arguments> enums_parameters() { + return Stream.of( + Arguments.arguments("enums_null", ColumnTypeDto.ENUM, null), + Arguments.arguments("enums_empty", ColumnTypeDto.ENUM, List.of()), + Arguments.arguments("sets_null", ColumnTypeDto.SET, null), + Arguments.arguments("sets_empty", ColumnTypeDto.SET, List.of()) ); } @@ -244,6 +262,20 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { endpointValidator.validateOnlyWriteOwnOrWriteAllAccess(TABLE_1, USER_1); } + @Test + public void validateOnlyWriteOwnOrWriteAllAccess_writeOwnAccess_succeeds() throws DatabaseNotFoundException, + TableNotFoundException, AccessNotFoundException, NotAllowedException { + + /* mock */ + when(tableService.findById(DATABASE_1, TABLE_1_ID)) + .thenReturn(TABLE_1); + when(accessService.find(eq(DATABASE_1), any(User.class))) + .thenReturn(DATABASE_1_USER_1_WRITE_OWN_ACCESS); + + /* test */ + endpointValidator.validateOnlyWriteOwnOrWriteAllAccess(TABLE_1, USER_1); + } + @Test public void validateOnlyWriteOwnOrWriteAllAccess_privateHasReadAccess_fails() throws DatabaseNotFoundException, TableNotFoundException, AccessNotFoundException { @@ -285,7 +317,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { @ParameterizedTest @MethodSource("needSize_parameters") - public void validateColumnCreateConstraints_needSize_fails(ColumnTypeDto type) { + public void validateColumnCreateConstraints_needSize_fails(String name, ColumnTypeDto type) { final CreateTableDto request = CreateTableDto.builder() .columns(List.of(CreateTableColumnDto.builder() .type(type) @@ -299,12 +331,13 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { }); } - @Test - public void validateColumnCreateConstraints_needEnum_fails() { + @ParameterizedTest + @MethodSource("enums_parameters") + public void validateColumnCreateConstraints_needEnum_fails(String name, ColumnTypeDto type, List<String> enums) { final CreateTableDto request = CreateTableDto.builder() .columns(List.of(CreateTableColumnDto.builder() - .type(ColumnTypeDto.ENUM) - .enums(null) // <<<<<<< + .type(type) + .enums(enums) .build())) .build(); @@ -314,12 +347,14 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { }); } - @Test - public void validateColumnCreateConstraints_needSet_fails() { + @ParameterizedTest + @MethodSource("needSizeAndD_parameters") + public void validateColumnCreateConstraints_needSizeAndD_fails(String name, ColumnTypeDto type, Long size, Long d) { final CreateTableDto request = CreateTableDto.builder() .columns(List.of(CreateTableColumnDto.builder() - .type(ColumnTypeDto.SET) - .sets(null) // <<<<<<< + .type(type) + .size(size) + .d(d) .build())) .build(); @@ -345,6 +380,34 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { }); } + @Test + public void validateOnlyOwnerOrWriteAll_writeOwnAccess_succeeds() throws DatabaseNotFoundException, + TableNotFoundException, AccessNotFoundException, NotAllowedException { + + /* mock */ + when(tableService.findById(DATABASE_1, TABLE_1_ID)) + .thenReturn(TABLE_1); + when(accessService.find(DATABASE_1, USER_1)) + .thenReturn(DATABASE_1_USER_1_WRITE_OWN_ACCESS); + + /* test */ + endpointValidator.validateOnlyOwnerOrWriteAll(TABLE_1, USER_1); + } + + @Test + public void validateOnlyOwnerOrWriteAll_writeAllAccess_succeeds() throws DatabaseNotFoundException, + TableNotFoundException, AccessNotFoundException, NotAllowedException { + + /* mock */ + when(tableService.findById(DATABASE_1, TABLE_1_ID)) + .thenReturn(TABLE_1); + when(accessService.find(DATABASE_1, USER_2)) + .thenReturn(DATABASE_1_USER_2_WRITE_ALL_ACCESS); + + /* test */ + endpointValidator.validateOnlyOwnerOrWriteAll(TABLE_1, USER_2); + } + @Test public void validateOnlyPrivateDataHasRole_publicDatabase_succeeds() throws NotAllowedException { @@ -555,6 +618,13 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { assertTrue(endpointValidator.validateOnlyMineOrWriteAccessOrHasRole(USER_1, USER_1_PRINCIPAL, DATABASE_1_USER_1_WRITE_OWN_ACCESS, "nobody-role")); } + @Test + public void validateOnlyMineOrWriteAccessOrHasRole_ownerOnlyWriteAll_succeeds() { + + /* test */ + assertTrue(endpointValidator.validateOnlyMineOrWriteAccessOrHasRole(USER_1, USER_1_PRINCIPAL, DATABASE_1_USER_1_WRITE_ALL_ACCESS, "nobody-role")); + } + @Test public void validateOnlyMineOrWriteAccessOrHasRole_notOwnerOnlyWriteOwn_fails() { diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index 906fa5258b..e918d3ae24 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-services</artifactId> <name>dbrepo-metadata-service-services</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/KeycloakGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/KeycloakGateway.java index cd5fd08a7e..296457b3d8 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/KeycloakGateway.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/KeycloakGateway.java @@ -1,7 +1,6 @@ package at.tuwien.gateway; import at.tuwien.api.keycloak.TokenDto; -import at.tuwien.api.user.UserPasswordDto; import at.tuwien.api.user.UserUpdateDto; import at.tuwien.exception.AuthServiceException; import at.tuwien.exception.UserNotFoundException; @@ -22,13 +21,7 @@ public interface KeycloakGateway { */ void deleteUser(UUID id) throws UserNotFoundException; - /** - * Update the credentials for a given user. - * - * @param id The user id. - * @param password The user credential. - */ - void updateUserCredentials(UUID id, UserPasswordDto password) throws UserNotFoundException; + void setupFinished(UUID id) throws AuthServiceException, UserNotFoundException; void updateUser(UUID id, UserUpdateDto data) throws AuthServiceException, UserNotFoundException; } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java index af54651d6c..270653ee8f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java @@ -1,14 +1,12 @@ package at.tuwien.gateway.impl; import at.tuwien.api.keycloak.TokenDto; -import at.tuwien.api.user.UserPasswordDto; import at.tuwien.api.user.UserUpdateDto; import at.tuwien.config.KeycloakConfig; import at.tuwien.exception.AuthServiceException; import at.tuwien.exception.UserNotFoundException; import at.tuwien.gateway.KeycloakGateway; import at.tuwien.mapper.MetadataMapper; -import jakarta.ws.rs.BadRequestException; import jakarta.ws.rs.ForbiddenException; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.Response; @@ -17,7 +15,6 @@ import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; import org.keycloak.admin.client.resource.UserResource; -import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.springframework.stereotype.Service; @@ -80,21 +77,25 @@ public class KeycloakGatewayImpl implements KeycloakGateway { } @Override - public void updateUserCredentials(UUID id, UserPasswordDto data) throws UserNotFoundException { - final CredentialRepresentation credential = new CredentialRepresentation(); - credential.setTemporary(false); - credential.setValue(data.getPassword()); - credential.setType(CredentialRepresentation.PASSWORD); + public void setupFinished(UUID id) throws AuthServiceException, UserNotFoundException { + final UserResource resource = keycloak.realm(keycloakConfig.getRealm()) + .users() + .get(String.valueOf(id)); + final UserRepresentation user; try { - keycloak.realm(keycloakConfig.getRealm()) - .users() - .get(String.valueOf(id)) - .resetPassword(credential); + user = resource.toRepresentation(); } catch (NotFoundException e) { - log.error("Failed to update user password: not found"); - throw new UserNotFoundException("Failed to update user password: not found", e); + log.error("Failed to update user setup: not found: {}", e.getMessage()); + throw new UserNotFoundException("Failed to update user setup: not found", e); + } + user.singleAttribute("SETUP_FINISHED", "true"); + try { + resource.update(user); + } catch (ForbiddenException e) { + log.error("Failed to update user setup: forbidden: {}", e.getMessage()); + throw new AuthServiceException("Failed to update user setup: forbidden", e); } - log.info("Updated user {} password at auth service", id); + log.info("Updated user {} setup at auth service", id); } @Override @@ -102,7 +103,7 @@ public class KeycloakGatewayImpl implements KeycloakGateway { final UserResource resource = keycloak.realm(keycloakConfig.getRealm()) .users() .get(String.valueOf(id)); - UserRepresentation user; + final UserRepresentation user; try { user = resource.toRepresentation(); } catch (NotFoundException e) { diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AuthenticationService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AuthenticationService.java index 75b647bf95..3abe07a10a 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AuthenticationService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AuthenticationService.java @@ -1,6 +1,5 @@ package at.tuwien.service; -import at.tuwien.api.user.UserPasswordDto; import at.tuwien.entities.user.User; import at.tuwien.exception.AuthServiceConnectionException; import at.tuwien.exception.AuthServiceException; @@ -23,8 +22,7 @@ public interface AuthenticationService { * Updates the password of a user with given id. * * @param user The user. - * @param data The new password. * @throws UserNotFoundException The user was not found after creation in the auth database. */ - void updatePassword(User user, UserPasswordDto data) throws UserNotFoundException; + void setupFinished(User user) throws UserNotFoundException, AuthServiceException; } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java index 581641a93a..c6ca0ff21e 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java @@ -4,7 +4,6 @@ import at.tuwien.api.auth.CreateUserDto; import at.tuwien.api.user.UserPasswordDto; import at.tuwien.api.user.UserUpdateDto; import at.tuwien.entities.user.User; -import at.tuwien.exception.AuthServiceConnectionException; import at.tuwien.exception.AuthServiceException; import at.tuwien.exception.UserExistsException; import at.tuwien.exception.UserNotFoundException; @@ -47,7 +46,7 @@ public interface UserService { * @param data The user data. * @return The user, if successful. */ - User create(CreateUserDto data) throws UserNotFoundException, AuthServiceException; + User create(CreateUserDto data); /** * Updates the user information for a user with given id in the metadata database. diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AuthenticationServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AuthenticationServiceImpl.java index 1159913039..dec3577886 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AuthenticationServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AuthenticationServiceImpl.java @@ -1,10 +1,7 @@ package at.tuwien.service.impl; -import at.tuwien.api.user.UserPasswordDto; import at.tuwien.entities.user.User; -import at.tuwien.exception.AuthServiceConnectionException; import at.tuwien.exception.AuthServiceException; -import at.tuwien.exception.CredentialsInvalidException; import at.tuwien.exception.UserNotFoundException; import at.tuwien.gateway.KeycloakGateway; import at.tuwien.service.AuthenticationService; @@ -29,8 +26,8 @@ public class AuthenticationServiceImpl implements AuthenticationService { } @Override - public void updatePassword(User user, UserPasswordDto data) throws UserNotFoundException { - keycloakGateway.updateUserCredentials(user.getKeycloakId(), data); + public void setupFinished(User user) throws AuthServiceException, UserNotFoundException { + keycloakGateway.setupFinished(user.getKeycloakId()); } } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java index 1d582bb975..e79dd9bd84 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java @@ -65,14 +65,14 @@ public class UserServiceImpl implements UserService { } @Override - public User create(CreateUserDto data) throws UserNotFoundException, AuthServiceException { + public User create(CreateUserDto data) { /* create at authentication service */ final User entity = User.builder() .id(data.getLdapId()) .keycloakId(data.getId()) .username(data.getUsername()) .theme("light") - .mariadbPassword(getMariaDbPassword(RandomStringUtils.randomAlphabetic(10))) /* user needs to set it later to access */ + .mariadbPassword(getMariaDbPassword(RandomStringUtils.randomAlphabetic(10))) .language("en") .firstname(data.getGivenName()) .lastname(data.getFamilyName()) diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml index 792523227e..4aa6188f9f 100644 --- a/dbrepo-metadata-service/test/pom.xml +++ b/dbrepo-metadata-service/test/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.7.0</version> + <version>1.6.4</version> </parent> <artifactId>dbrepo-metadata-service-test</artifactId> <name>dbrepo-metadata-service-test</name> - <version>1.7.0</version> + <version>1.6.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index bccf903b8b..2921447017 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -5,6 +5,7 @@ import at.tuwien.api.amqp.CreateVirtualHostDto; import at.tuwien.api.amqp.ExchangeDto; import at.tuwien.api.amqp.GrantVirtualHostPermissionsDto; import at.tuwien.api.amqp.QueueDto; +import at.tuwien.api.auth.CreateUserDto; import at.tuwien.api.auth.LoginRequestDto; import at.tuwien.api.auth.RefreshTokenRequestDto; import at.tuwien.api.container.ContainerBriefDto; @@ -145,173 +146,173 @@ import static java.time.temporal.ChronoUnit.MINUTES; */ public abstract class BaseTest { - public final static String MINIO_IMAGE = "minio/minio:RELEASE.2024-06-06T09-36-42Z"; + public static final String MINIO_IMAGE = "minio/minio:RELEASE.2024-06-06T09-36-42Z"; - public final static String MARIADB_IMAGE = "mariadb:11.3.2"; + public static final String MARIADB_IMAGE = "mariadb:11.3.2"; - public final static String RABBITMQ_IMAGE = "rabbitmq:3.13.7"; + public static final String RABBITMQ_IMAGE = "rabbitmq:3.13.7"; - public final static String KEYCLOAK_IMAGE = "quay.io/keycloak/keycloak:26.0"; + public static final String KEYCLOAK_IMAGE = "quay.io/keycloak/keycloak:26.0"; - public final static String[] DEFAULT_SEMANTICS_HANDLING = new String[]{"default-semantics-handling", + public static final String[] DEFAULT_SEMANTICS_HANDLING = new String[]{"default-semantics-handling", "create-semantic-unit", "execute-semantic-query", "table-semantic-analyse", "create-semantic-concept"}; - public final static String[] DEFAULT_VIEW_HANDLING = new String[]{"update-database-view", "create-database-view", + public static final String[] DEFAULT_VIEW_HANDLING = new String[]{"update-database-view", "create-database-view", "delete-database-view", "list-database-views", "modify-view-visibility", "find-database-view"}; - public final static String[] ESCALATED_SEMANTICS_HANDLING = new String[]{"escalated-semantics-handling", + public static final String[] ESCALATED_SEMANTICS_HANDLING = new String[]{"escalated-semantics-handling", "update-semantic-concept", "modify-foreign-table-column-semantics", "delete-ontology", "list-ontologies", "update-semantic-unit", "create-ontology", "update-ontology"}; - public final static String[] DEFAULT_CONTAINER_HANDLING = new String[]{"default-container-handling", + public static final String[] DEFAULT_CONTAINER_HANDLING = new String[]{"default-container-handling", "create-container", "list-containers", "modify-container-state"}; - public final static String[] ESCALATED_CONTAINER_HANDLING = new String[]{"escalated-container-handling", + public static final String[] ESCALATED_CONTAINER_HANDLING = new String[]{"escalated-container-handling", "modify-foreign-container-state", "delete-container"}; - public final static String[] DEFAULT_DATABASE_HANDLING = new String[]{"default-database-handling", + public static final String[] DEFAULT_DATABASE_HANDLING = new String[]{"default-database-handling", "update-database-access", "modify-database-visibility", "create-database", "modify-database-owner", "delete-database-access", "check-database-access", "list-databases", "modify-database-image", "create-database-access", "find-database", "import-database-data"}; - public final static String[] ESCALATED_DATABASE_HANDLING = new String[]{"escalated-database-handling", + public static final String[] ESCALATED_DATABASE_HANDLING = new String[]{"escalated-database-handling", "delete-database"}; - public final static String[] DEFAULT_IDENTIFIER_HANDLING = new String[]{"default-identifier-handling", + public static final String[] DEFAULT_IDENTIFIER_HANDLING = new String[]{"default-identifier-handling", "create-identifier", "find-identifier", "list-identifiers", "publish-identifier", "delete-identifier"}; - public final static String[] ESCALATED_IDENTIFIER_HANDLING = new String[]{"escalated-identifier-handling", + public static final String[] ESCALATED_IDENTIFIER_HANDLING = new String[]{"escalated-identifier-handling", "modify-identifier-metadata", "update-foreign-identifier", "create-foreign-identifier"}; - public final static String[] DEFAULT_QUERY_HANDLING = new String[]{"default-query-handling", "view-table-data", + public static final String[] DEFAULT_QUERY_HANDLING = new String[]{"default-query-handling", "view-table-data", "execute-query", "view-table-history", "list-database-views", "export-query-data", "create-database-view", "delete-database-view", "delete-table-data", "export-table-data", "persist-query", "re-execute-query", "insert-table-data", "find-database-view"}; - public final static String[] ESCALATED_QUERY_HANDLING = new String[]{"escalated-query-handling"}; + public static final String[] ESCALATED_QUERY_HANDLING = new String[]{"escalated-query-handling"}; - public final static String[] DEFAULT_TABLE_HANDLING = new String[]{"default-table-handling", + public static final String[] DEFAULT_TABLE_HANDLING = new String[]{"default-table-handling", "list-tables", "create-table", "modify-table-column-semantics", "find-table", "delete-table", "update-table-statistic", "update-table"}; - public final static String[] ESCALATED_TABLE_HANDLING = new String[]{"escalated-table-handling", + public static final String[] ESCALATED_TABLE_HANDLING = new String[]{"escalated-table-handling", "delete-foreign-table"}; - public final static String[] DEFAULT_USER_HANDLING = new String[]{"default-user-handling", "modify-user-theme", + public static final String[] DEFAULT_USER_HANDLING = new String[]{"default-user-handling", "modify-user-theme", "modify-user-information"}; - public final static String[] ESCALATED_USER_HANDLING = new String[]{"escalated-user-handling", "find-user"}; + public static final String[] ESCALATED_USER_HANDLING = new String[]{"escalated-user-handling", "find-user"}; - public final static String[] DEFAULT_RESEARCHER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-researcher-roles"}, + public static final String[] DEFAULT_RESEARCHER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-researcher-roles"}, DEFAULT_CONTAINER_HANDLING, DEFAULT_DATABASE_HANDLING, DEFAULT_IDENTIFIER_HANDLING, DEFAULT_QUERY_HANDLING, DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, DEFAULT_SEMANTICS_HANDLING, DEFAULT_VIEW_HANDLING)); - public final static String[] DEFAULT_DEVELOPER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-developer-roles"}, + public static final String[] DEFAULT_DEVELOPER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-developer-roles"}, DEFAULT_CONTAINER_HANDLING, DEFAULT_DATABASE_HANDLING, DEFAULT_IDENTIFIER_HANDLING, DEFAULT_QUERY_HANDLING, DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, ESCALATED_USER_HANDLING, ESCALATED_CONTAINER_HANDLING, ESCALATED_DATABASE_HANDLING, ESCALATED_IDENTIFIER_HANDLING, ESCALATED_QUERY_HANDLING, ESCALATED_TABLE_HANDLING, DEFAULT_VIEW_HANDLING)); - public final static String[] DEFAULT_DATA_STEWARD_ROLES = ArrayUtils.merge(List.of(new String[]{"default-data-steward-roles"}, + public static final String[] DEFAULT_DATA_STEWARD_ROLES = ArrayUtils.merge(List.of(new String[]{"default-data-steward-roles"}, ESCALATED_IDENTIFIER_HANDLING, DEFAULT_SEMANTICS_HANDLING, ESCALATED_SEMANTICS_HANDLING, DEFAULT_VIEW_HANDLING)); - public final static String[] DEFAULT_LOCAL_ADMIN_ROLES = new String[]{"system"}; + public static final String[] DEFAULT_LOCAL_ADMIN_ROLES = new String[]{"system"}; - public final static List<GrantedAuthorityDto> AUTHORITY_LOCAL_ADMIN_ROLES = Arrays.stream(DEFAULT_LOCAL_ADMIN_ROLES) + public static final List<GrantedAuthorityDto> AUTHORITY_LOCAL_ADMIN_ROLES = Arrays.stream(DEFAULT_LOCAL_ADMIN_ROLES) .map(GrantedAuthorityDto::new) .collect(Collectors.toList()); - public final static List<GrantedAuthorityDto> AUTHORITY_DEFAULT_RESEARCHER_ROLES = Arrays.stream(DEFAULT_RESEARCHER_ROLES) + public static final List<GrantedAuthorityDto> AUTHORITY_DEFAULT_RESEARCHER_ROLES = Arrays.stream(DEFAULT_RESEARCHER_ROLES) .map(GrantedAuthorityDto::new) .collect(Collectors.toList()); - public final static List<GrantedAuthorityDto> AUTHORITY_DEFAULT_DEVELOPER_ROLES = Arrays.stream(DEFAULT_DEVELOPER_ROLES) + public static final List<GrantedAuthorityDto> AUTHORITY_DEFAULT_DEVELOPER_ROLES = Arrays.stream(DEFAULT_DEVELOPER_ROLES) .map(GrantedAuthorityDto::new) .collect(Collectors.toList()); - public final static List<GrantedAuthorityDto> AUTHORITY_DEFAULT_DATA_STEWARD_ROLES = Arrays.stream(DEFAULT_DATA_STEWARD_ROLES) + public static final List<GrantedAuthorityDto> AUTHORITY_DEFAULT_DATA_STEWARD_ROLES = Arrays.stream(DEFAULT_DATA_STEWARD_ROLES) .map(GrantedAuthorityDto::new) .collect(Collectors.toList()); - public final static List<GrantedAuthority> AUTHORITY_DEFAULT_LOCAL_ADMIN_AUTHORITIES = AUTHORITY_LOCAL_ADMIN_ROLES.stream() + public static final List<GrantedAuthority> AUTHORITY_DEFAULT_LOCAL_ADMIN_AUTHORITIES = AUTHORITY_LOCAL_ADMIN_ROLES.stream() .map(a -> new SimpleGrantedAuthority(a.getAuthority())) .collect(Collectors.toList()); - public final static List<GrantedAuthority> AUTHORITY_DEFAULT_RESEARCHER_AUTHORITIES = AUTHORITY_DEFAULT_RESEARCHER_ROLES.stream() + public static final List<GrantedAuthority> AUTHORITY_DEFAULT_RESEARCHER_AUTHORITIES = AUTHORITY_DEFAULT_RESEARCHER_ROLES.stream() .map(a -> new SimpleGrantedAuthority(a.getAuthority())) .collect(Collectors.toList()); - public final static List<GrantedAuthority> AUTHORITY_DEFAULT_DEVELOPER_AUTHORITIES = AUTHORITY_DEFAULT_DEVELOPER_ROLES.stream() + public static final List<GrantedAuthority> AUTHORITY_DEFAULT_DEVELOPER_AUTHORITIES = AUTHORITY_DEFAULT_DEVELOPER_ROLES.stream() .map(a -> new SimpleGrantedAuthority(a.getAuthority())) .collect(Collectors.toList()); - public final static List<GrantedAuthority> AUTHORITY_DEFAULT_DATA_STEWARD_AUTHORITIES = AUTHORITY_DEFAULT_DATA_STEWARD_ROLES.stream() + public static final List<GrantedAuthority> AUTHORITY_DEFAULT_DATA_STEWARD_AUTHORITIES = AUTHORITY_DEFAULT_DATA_STEWARD_ROLES.stream() .map(a -> new SimpleGrantedAuthority(a.getAuthority())) .collect(Collectors.toList()); - public final static UUID REALM_DBREPO_ID = UUID.fromString("6264bf7b-d1d3-4562-9c07-ce4364a8f9d3"); - public final static String REALM_DBREPO_NAME = "dbrepo"; - public final static Boolean REALM_DBREPO_ENABLED = true; + public static final UUID REALM_DBREPO_ID = UUID.fromString("6264bf7b-d1d3-4562-9c07-ce4364a8f9d3"); + public static final String REALM_DBREPO_NAME = "dbrepo"; + public static final Boolean REALM_DBREPO_ENABLED = true; - public final static UUID ROLE_DEFAULT_REALM_DBREPO_ROLES_ID = UUID.fromString("c74cbbe7-3ab1-4472-9211-cc904567268"); - public final static String ROLE_DEFAULT_REALM_DBREPO_ROLES_NAME = "default-dbrepo-roles"; - public final static UUID ROLE_DEFAULT_REALM_DBREPO_ROLES_REALM_ID = REALM_DBREPO_ID; + public static final UUID ROLE_DEFAULT_REALM_DBREPO_ROLES_ID = UUID.fromString("c74cbbe7-3ab1-4472-9211-cc904567268"); + public static final String ROLE_DEFAULT_REALM_DBREPO_ROLES_NAME = "default-dbrepo-roles"; + public static final UUID ROLE_DEFAULT_REALM_DBREPO_ROLES_REALM_ID = REALM_DBREPO_ID; - public final static UUID ROLE_DEFAULT_RESEARCHER_ROLES_ID = UUID.fromString("c74cbbe7-3ab1-4472-9211-cc9045672682"); - public final static String ROLE_DEFAULT_RESEARCHER_ROLES_NAME = "default-researcher-roles"; - public final static UUID ROLE_DEFAULT_RESEARCHER_ROLES_REALM_ID = REALM_DBREPO_ID; + public static final UUID ROLE_DEFAULT_RESEARCHER_ROLES_ID = UUID.fromString("c74cbbe7-3ab1-4472-9211-cc9045672682"); + public static final String ROLE_DEFAULT_RESEARCHER_ROLES_NAME = "default-researcher-roles"; + public static final UUID ROLE_DEFAULT_RESEARCHER_ROLES_REALM_ID = REALM_DBREPO_ID; - public final static CreateAccessDto UPDATE_DATABASE_ACCESS_READ_DTO = CreateAccessDto.builder() + public static final CreateAccessDto UPDATE_DATABASE_ACCESS_READ_DTO = CreateAccessDto.builder() .type(AccessTypeDto.READ) .build(); - public final static CreateAccessDto UPDATE_DATABASE_ACCESS_WRITE_OWN_DTO = CreateAccessDto.builder() + public static final CreateAccessDto UPDATE_DATABASE_ACCESS_WRITE_OWN_DTO = CreateAccessDto.builder() .type(AccessTypeDto.WRITE_OWN) .build(); - public final static CreateAccessDto UPDATE_DATABASE_ACCESS_WRITE_ALL_DTO = CreateAccessDto.builder() + public static final CreateAccessDto UPDATE_DATABASE_ACCESS_WRITE_ALL_DTO = CreateAccessDto.builder() .type(AccessTypeDto.WRITE_ALL) .build(); - public final static String TOKEN_ACCESS_TOKEN = "ey.yee.skrr"; - public final static String TOKEN_ACCESS_SCOPE = "openid"; + public static final String TOKEN_ACCESS_TOKEN = "ey.yee.skrr"; + public static final String TOKEN_ACCESS_SCOPE = "openid"; - public final static TokenDto TOKEN_DTO = TokenDto.builder() + public static final TokenDto TOKEN_DTO = TokenDto.builder() .accessToken(TOKEN_ACCESS_TOKEN) .scope(TOKEN_ACCESS_SCOPE) .build(); - public final static RefreshTokenRequestDto REFRESH_TOKEN_REQUEST_DTO = RefreshTokenRequestDto.builder() + public static final RefreshTokenRequestDto REFRESH_TOKEN_REQUEST_DTO = RefreshTokenRequestDto.builder() .refreshToken("ey.yee.skrr") .build(); - public final static Long CONCEPT_1_ID = 1L; - public final static String CONCEPT_1_NAME = "precipitation"; - public final static String CONCEPT_1_URI = "http://www.wikidata.org/entity/Q25257"; - public final static String CONCEPT_1_DESCRIPTION = null; - public final static Instant CONCEPT_1_CREATED = Instant.ofEpochSecond(1701976048L) /* 2023-12-07 19:07:27 (UTC) */; + public static final Long CONCEPT_1_ID = 1L; + public static final String CONCEPT_1_NAME = "precipitation"; + public static final String CONCEPT_1_URI = "http://www.wikidata.org/entity/Q25257"; + public static final String CONCEPT_1_DESCRIPTION = null; + public static final Instant CONCEPT_1_CREATED = Instant.ofEpochSecond(1701976048L) /* 2023-12-07 19:07:27 (UTC) */; - public final static ConceptSaveDto CONCEPT_1_SAVE_DTO = ConceptSaveDto.builder() + public static final ConceptSaveDto CONCEPT_1_SAVE_DTO = ConceptSaveDto.builder() .uri(CONCEPT_1_URI) .name(CONCEPT_1_NAME) .description(CONCEPT_1_DESCRIPTION) .build(); - public final static ConceptDto CONCEPT_1_DTO = ConceptDto.builder() + public static final ConceptDto CONCEPT_1_DTO = ConceptDto.builder() .id(CONCEPT_1_ID) .uri(CONCEPT_1_URI) .name(CONCEPT_1_NAME) .description(CONCEPT_1_DESCRIPTION) .build(); - public final static ConceptBriefDto CONCEPT_1_BRIEF_DTO = ConceptBriefDto.builder() + public static final ConceptBriefDto CONCEPT_1_BRIEF_DTO = ConceptBriefDto.builder() .id(CONCEPT_1_ID) .uri(CONCEPT_1_URI) .name(CONCEPT_1_NAME) .description(CONCEPT_1_DESCRIPTION) .build(); - public final static TableColumnConcept CONCEPT_1 = TableColumnConcept.builder() + public static final TableColumnConcept CONCEPT_1 = TableColumnConcept.builder() .id(CONCEPT_1_ID) .uri(CONCEPT_1_URI) .name(CONCEPT_1_NAME) @@ -319,39 +320,39 @@ public abstract class BaseTest { .created(CONCEPT_1_CREATED) .build(); - public final static EntityDto CONCEPT_1_ENTITY_DTO = EntityDto.builder() + public static final EntityDto CONCEPT_1_ENTITY_DTO = EntityDto.builder() .uri(CONCEPT_1_URI) .description(CONCEPT_1_DESCRIPTION) .label(CONCEPT_1_NAME) .build(); - public final static Long CONCEPT_2_ID = 2L; - public final static String CONCEPT_2_NAME = "FAIR data"; - public final static String CONCEPT_2_URI = "http://www.wikidata.org/entity/Q29032648"; - public final static String CONCEPT_2_DESCRIPTION = "data compliant with the terms of the FAIR Data Principles"; - public final static Instant CONCEPT_2_CREATED = Instant.now(); + public static final Long CONCEPT_2_ID = 2L; + public static final String CONCEPT_2_NAME = "FAIR data"; + public static final String CONCEPT_2_URI = "http://www.wikidata.org/entity/Q29032648"; + public static final String CONCEPT_2_DESCRIPTION = "data compliant with the terms of the FAIR Data Principles"; + public static final Instant CONCEPT_2_CREATED = Instant.now(); - public final static ConceptSaveDto CONCEPT_2_SAVE_DTO = ConceptSaveDto.builder() + public static final ConceptSaveDto CONCEPT_2_SAVE_DTO = ConceptSaveDto.builder() .uri(CONCEPT_2_URI) .name(CONCEPT_2_NAME) .description(CONCEPT_2_DESCRIPTION) .build(); - public final static ConceptDto CONCEPT_2_DTO = ConceptDto.builder() + public static final ConceptDto CONCEPT_2_DTO = ConceptDto.builder() .id(CONCEPT_2_ID) .uri(CONCEPT_2_URI) .name(CONCEPT_2_NAME) .description(CONCEPT_2_DESCRIPTION) .build(); - public final static ConceptBriefDto CONCEPT_2_BRIEF_DTO = ConceptBriefDto.builder() + public static final ConceptBriefDto CONCEPT_2_BRIEF_DTO = ConceptBriefDto.builder() .id(CONCEPT_2_ID) .uri(CONCEPT_2_URI) .name(CONCEPT_2_NAME) .description(CONCEPT_2_DESCRIPTION) .build(); - public final static TableColumnConcept CONCEPT_2 = TableColumnConcept.builder() + public static final TableColumnConcept CONCEPT_2 = TableColumnConcept.builder() .id(CONCEPT_2_ID) .uri(CONCEPT_2_URI) .name(CONCEPT_2_NAME) @@ -359,33 +360,33 @@ public abstract class BaseTest { .created(CONCEPT_2_CREATED) .build(); - public final static Long UNIT_1_ID = 1L; - public final static String UNIT_1_NAME = "millimetre"; - public final static String UNIT_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/millimetre"; - public final static String UNIT_1_DESCRIPTION = "The millimetre is a unit of length defined as 1.0e-3 metre."; - public final static Instant UNIT_1_CREATED = Instant.ofEpochSecond(1701976282L) /* 2023-12-07 19:11:22 */; + public static final Long UNIT_1_ID = 1L; + public static final String UNIT_1_NAME = "millimetre"; + public static final String UNIT_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/millimetre"; + public static final String UNIT_1_DESCRIPTION = "The millimetre is a unit of length defined as 1.0e-3 metre."; + public static final Instant UNIT_1_CREATED = Instant.ofEpochSecond(1701976282L) /* 2023-12-07 19:11:22 */; - public final static UnitSaveDto UNIT_1_SAVE_DTO = UnitSaveDto.builder() + public static final UnitSaveDto UNIT_1_SAVE_DTO = UnitSaveDto.builder() .uri(UNIT_1_URI) .name(UNIT_1_NAME) .description(UNIT_1_DESCRIPTION) .build(); - public final static UnitDto UNIT_1_DTO = UnitDto.builder() + public static final UnitDto UNIT_1_DTO = UnitDto.builder() .id(UNIT_1_ID) .uri(UNIT_1_URI) .name(UNIT_1_NAME) .description(UNIT_1_DESCRIPTION) .build(); - public final static UnitBriefDto UNIT_1_BRIEF_DTO = UnitBriefDto.builder() + public static final UnitBriefDto UNIT_1_BRIEF_DTO = UnitBriefDto.builder() .id(UNIT_1_ID) .uri(UNIT_1_URI) .name(UNIT_1_NAME) .description(UNIT_1_DESCRIPTION) .build(); - public final static TableColumnUnit UNIT_1 = TableColumnUnit.builder() + public static final TableColumnUnit UNIT_1 = TableColumnUnit.builder() .id(UNIT_1_ID) .uri(UNIT_1_URI) .name(UNIT_1_NAME) @@ -393,39 +394,39 @@ public abstract class BaseTest { .created(UNIT_1_CREATED) .build(); - public final static EntityDto UNIT_1_ENTITY_DTO = EntityDto.builder() + public static final EntityDto UNIT_1_ENTITY_DTO = EntityDto.builder() .uri(UNIT_1_URI) .description(UNIT_1_DESCRIPTION) .label(UNIT_1_NAME) .build(); - public final static Long UNIT_2_ID = 2L; - public final static String UNIT_2_NAME = "tonne"; - public final static String UNIT_2_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/tonne"; - public final static String UNIT_2_DESCRIPTION = "The tonne is a unit of mass defined as 1000 kilogram."; - public final static Instant UNIT_2_CREATED = Instant.ofEpochSecond(1701976462L) /* 2023-12-07 19:14:22 */; + public static final Long UNIT_2_ID = 2L; + public static final String UNIT_2_NAME = "tonne"; + public static final String UNIT_2_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/tonne"; + public static final String UNIT_2_DESCRIPTION = "The tonne is a unit of mass defined as 1000 kilogram."; + public static final Instant UNIT_2_CREATED = Instant.ofEpochSecond(1701976462L) /* 2023-12-07 19:14:22 */; - public final static UnitSaveDto UNIT_2_SAVE_DTO = UnitSaveDto.builder() + public static final UnitSaveDto UNIT_2_SAVE_DTO = UnitSaveDto.builder() .uri(UNIT_2_URI) .name(UNIT_2_NAME) .description(UNIT_2_DESCRIPTION) .build(); - public final static UnitDto UNIT_2_DTO = UnitDto.builder() + public static final UnitDto UNIT_2_DTO = UnitDto.builder() .id(UNIT_2_ID) .uri(UNIT_2_URI) .name(UNIT_2_NAME) .description(UNIT_2_DESCRIPTION) .build(); - public final static UnitBriefDto UNIT_2_BRIEF_DTO = UnitBriefDto.builder() + public static final UnitBriefDto UNIT_2_BRIEF_DTO = UnitBriefDto.builder() .id(UNIT_2_ID) .uri(UNIT_2_URI) .name(UNIT_2_NAME) .description(UNIT_2_DESCRIPTION) .build(); - public final static TableColumnUnit UNIT_2 = TableColumnUnit.builder() + public static final TableColumnUnit UNIT_2 = TableColumnUnit.builder() .id(UNIT_2_ID) .uri(UNIT_2_URI) .name(UNIT_2_NAME) @@ -433,34 +434,34 @@ public abstract class BaseTest { .created(UNIT_2_CREATED) .build(); - public final static String USER_BROKER_USERNAME = "guest"; + public static final String USER_BROKER_USERNAME = "guest"; @SuppressWarnings("java:S2068") - public final static String USER_BROKER_PASSWORD = "guest"; + public static final String USER_BROKER_PASSWORD = "guest"; - public final static UUID USER_LOCAL_ADMIN_ID = UUID.fromString("a54dcb2e-a644-4e82-87e7-05a96413983d"); - public final static UUID USER_LOCAL_ADMIN_KEYCLOAK_ID = UUID.fromString("703c2ca0-8fc3-4c03-9bc5-4dae6b211e78"); - public final static String USER_LOCAL_ADMIN_USERNAME = "admin"; + public static final UUID USER_LOCAL_ADMIN_ID = UUID.fromString("a54dcb2e-a644-4e82-87e7-05a96413983d"); + public static final UUID USER_LOCAL_ADMIN_KEYCLOAK_ID = UUID.fromString("703c2ca0-8fc3-4c03-9bc5-4dae6b211e78"); + public static final String USER_LOCAL_ADMIN_USERNAME = "admin"; @SuppressWarnings("java:S2068") - public final static String USER_LOCAL_ADMIN_PASSWORD = "admin"; - public final static String USER_LOCAL_ADMIN_THEME = "dark"; - public final static Boolean USER_LOCAL_ADMIN_IS_INTERNAL = true; - public final static Boolean USER_LOCAL_ADMIN_ENABLED = true; + public static final String USER_LOCAL_ADMIN_PASSWORD = "admin"; + public static final String USER_LOCAL_ADMIN_THEME = "dark"; + public static final Boolean USER_LOCAL_ADMIN_IS_INTERNAL = true; + public static final Boolean USER_LOCAL_ADMIN_ENABLED = true; @SuppressWarnings("java:S2068") - public final static String USER_LOCAL_ADMIN_MARIADB_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA"; + public static final String USER_LOCAL_ADMIN_MARIADB_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA"; - public final static LoginRequestDto USER_LOCAL_ADMIN_LOGIN_REQUEST_DTO = LoginRequestDto.builder() + public static final LoginRequestDto USER_LOCAL_ADMIN_LOGIN_REQUEST_DTO = LoginRequestDto.builder() .username(USER_LOCAL_ADMIN_USERNAME) .password(USER_LOCAL_ADMIN_PASSWORD) .build(); - public final static UserDetails USER_LOCAL_ADMIN_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_LOCAL_ADMIN_DETAILS = UserDetailsDto.builder() .id(USER_LOCAL_ADMIN_ID.toString()) .username(USER_LOCAL_ADMIN_USERNAME) .password(USER_LOCAL_ADMIN_PASSWORD) .authorities(AUTHORITY_DEFAULT_LOCAL_ADMIN_AUTHORITIES) .build(); - public final static User USER_LOCAL = User.builder() + public static final User USER_LOCAL = User.builder() .id(USER_LOCAL_ADMIN_ID) .keycloakId(USER_LOCAL_ADMIN_KEYCLOAK_ID) .username(USER_LOCAL_ADMIN_USERNAME) @@ -469,43 +470,34 @@ public abstract class BaseTest { .isInternal(USER_LOCAL_ADMIN_IS_INTERNAL) .build(); - public final static Principal USER_LOCAL_ADMIN_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_LOCAL_ADMIN_DETAILS, + public static final Principal USER_LOCAL_ADMIN_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_LOCAL_ADMIN_DETAILS, USER_LOCAL_ADMIN_PASSWORD, USER_LOCAL_ADMIN_DETAILS.getAuthorities()); - public final static UUID USER_1_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b"); - public final static UUID USER_1_KEYCLOAK_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b"); - public final static String USER_1_USERNAME = "junit1"; + public static final UUID USER_1_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b"); + public static final UUID USER_1_KEYCLOAK_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b"); + public static final String USER_1_USERNAME = "junit1"; @SuppressWarnings("java:S2068") - public final static String USER_1_PASSWORD = "junit1"; + public static final String USER_1_PASSWORD = "junit1"; @SuppressWarnings("java:S2068") - public final static String USER_1_PASSWORD_ENCODED = "$2a$10$0dtdedA/RLTrFbUsvpbUw.I73AXOKeQP3t5UXj96OvnDEaDb3d3M6"; - @SuppressWarnings("java:S2068") - public final static String USER_1_DATABASE_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA" /* junit1 */; - public final static String USER_1_FIRSTNAME = "John"; - public final static String USER_1_LASTNAME = "Doe"; - public final static String USER_1_QUALIFIED_NAME = USER_1_FIRSTNAME + " " + USER_1_LASTNAME + " — @" + USER_1_USERNAME; - public final static String USER_1_NAME = "John Doe"; - public final static String USER_1_AFFILIATION = "TU Graz"; - public final static String USER_1_ORCID_URL = "https://orcid.org/0000-0003-4216-302X"; - public final static String USER_1_TITLES_BEFORE = "Dr."; - public final static String USER_1_TITLES_AFTER = "MSc BSc"; - public final static Boolean USER_1_VERIFIED = false; - public final static Boolean USER_1_TOTP = false; - public final static Long USER_1_NOT_BEFORE = 0L; - public final static Boolean USER_1_ENABLED = true; - public final static Boolean USER_1_IS_INTERNAL = false; - public final static String USER_1_THEME = "light"; - public final static String USER_1_LANGUAGE = "en"; - public final static Instant USER_1_CREATED = Instant.ofEpochSecond(1677399441L) /* 2023-02-26 08:17:21 (UTC) */; - public final static Instant USER_1_LAST_MODIFIED = USER_1_CREATED; - public final static UUID USER_1_REALM_ID = REALM_DBREPO_ID; - - public final static UpdateUserPasswordDto USER_1_UPDATE_PASSWORD_DTO = UpdateUserPasswordDto.builder() + public static final String USER_1_DATABASE_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA" /* junit1 */; + public static final String USER_1_FIRSTNAME = "John"; + public static final String USER_1_LASTNAME = "Doe"; + public static final String USER_1_QUALIFIED_NAME = USER_1_FIRSTNAME + " " + USER_1_LASTNAME + " — @" + USER_1_USERNAME; + public static final String USER_1_NAME = "John Doe"; + public static final String USER_1_AFFILIATION = "TU Graz"; + public static final String USER_1_ORCID_URL = "https://orcid.org/0000-0003-4216-302X"; + public static final Boolean USER_1_ENABLED = true; + public static final Boolean USER_1_IS_INTERNAL = false; + public static final String USER_1_THEME = "light"; + public static final String USER_1_LANGUAGE = "en"; + public static final Instant USER_1_CREATED = Instant.ofEpochSecond(1677399441L) /* 2023-02-26 08:17:21 (UTC) */; + + public static final UpdateUserPasswordDto USER_1_UPDATE_PASSWORD_DTO = UpdateUserPasswordDto.builder() .username(USER_1_USERNAME) .password(USER_1_PASSWORD) .build(); - public final static UserAttributesDto USER_1_ATTRIBUTES_DTO = UserAttributesDto.builder() + public static final UserAttributesDto USER_1_ATTRIBUTES_DTO = UserAttributesDto.builder() .theme(USER_1_THEME) .orcid(USER_1_ORCID_URL) .affiliation(USER_1_AFFILIATION) @@ -513,19 +505,19 @@ public abstract class BaseTest { .language(USER_1_LANGUAGE) .build(); - public final static CredentialDto USER_1_KEYCLOAK_CREDENTIAL_1 = CredentialDto.builder() + public static final CredentialDto USER_1_KEYCLOAK_CREDENTIAL_1 = CredentialDto.builder() .type(CredentialTypeDto.PASSWORD) .temporary(false) .value(USER_1_PASSWORD) .build(); - public final static CredentialDto USER_LOCAL_KEYCLOAK_CREDENTIAL_1 = CredentialDto.builder() + public static final CredentialDto USER_LOCAL_KEYCLOAK_CREDENTIAL_1 = CredentialDto.builder() .type(CredentialTypeDto.PASSWORD) .temporary(false) .value(USER_LOCAL_ADMIN_PASSWORD) .build(); - public final static UserCreateDto USER_1_KEYCLOAK_SIGNUP_REQUEST = UserCreateDto.builder() + public static final UserCreateDto USER_1_KEYCLOAK_SIGNUP_REQUEST = UserCreateDto.builder() .username(USER_1_USERNAME) .enabled(USER_1_ENABLED) .credentials(new LinkedList<>(List.of(USER_1_KEYCLOAK_CREDENTIAL_1))) @@ -534,7 +526,7 @@ public abstract class BaseTest { .build()) .build(); - public final static UserCreateDto USER_LOCAL_KEYCLOAK_SIGNUP_REQUEST = UserCreateDto.builder() + public static final UserCreateDto USER_LOCAL_KEYCLOAK_SIGNUP_REQUEST = UserCreateDto.builder() .username(USER_LOCAL_ADMIN_USERNAME) .enabled(USER_LOCAL_ADMIN_ENABLED) .credentials(new LinkedList<>(List.of(USER_LOCAL_KEYCLOAK_CREDENTIAL_1))) @@ -544,7 +536,7 @@ public abstract class BaseTest { .build()) .build(); - public final static User USER_1 = User.builder() + public static final User USER_1 = User.builder() .id(USER_1_ID) .keycloakId(USER_1_KEYCLOAK_ID) .username(USER_1_USERNAME) @@ -558,7 +550,7 @@ public abstract class BaseTest { .isInternal(USER_1_IS_INTERNAL) .build(); - public final static UserDto USER_1_DTO = UserDto.builder() + public static final UserDto USER_1_DTO = UserDto.builder() .id(USER_1_ID) .username(USER_1_USERNAME) .firstname(USER_1_FIRSTNAME) @@ -568,7 +560,15 @@ public abstract class BaseTest { .qualifiedName(USER_1_QUALIFIED_NAME) .build(); - public final static UserUpdateDto USER_1_UPDATE_DTO = UserUpdateDto.builder() + public static final CreateUserDto USER_1_CREATE_USER_DTO = CreateUserDto.builder() + .id(USER_1_KEYCLOAK_ID) + .ldapId(USER_1_ID) + .givenName(USER_1_FIRSTNAME) + .familyName(USER_1_LASTNAME) + .username(USER_1_USERNAME) + .build(); + + public static final UserUpdateDto USER_1_UPDATE_DTO = UserUpdateDto.builder() .firstname(USER_1_FIRSTNAME) .lastname(USER_1_LASTNAME) .affiliation(USER_1_AFFILIATION) @@ -577,11 +577,11 @@ public abstract class BaseTest { .language(USER_1_LANGUAGE) .build(); - public final static UserPasswordDto USER_1_PASSWORD_DTO = UserPasswordDto.builder() + public static final UserPasswordDto USER_1_PASSWORD_DTO = UserPasswordDto.builder() .password(USER_1_PASSWORD) .build(); - public final static UserBriefDto USER_1_BRIEF_DTO = UserBriefDto.builder() + public static final UserBriefDto USER_1_BRIEF_DTO = UserBriefDto.builder() .id(USER_1_ID) .username(USER_1_USERNAME) .firstname(USER_1_FIRSTNAME) @@ -591,47 +591,39 @@ public abstract class BaseTest { .orcid(USER_1_ORCID_URL) .build(); - public final static UserDetails USER_1_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_1_DETAILS = UserDetailsDto.builder() .id(USER_1_ID.toString()) .username(USER_1_USERNAME) .password(USER_1_PASSWORD) .authorities(AUTHORITY_DEFAULT_RESEARCHER_AUTHORITIES) .build(); - public final static Principal USER_1_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_1_DETAILS, + public static final Principal USER_1_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_1_DETAILS, USER_1_PASSWORD, USER_1_DETAILS.getAuthorities()); - public final static LoginRequestDto USER_1_LOGIN_REQUEST_DTO = LoginRequestDto.builder() + public static final LoginRequestDto USER_1_LOGIN_REQUEST_DTO = LoginRequestDto.builder() .username(USER_1_USERNAME) .password(USER_1_PASSWORD) .build(); - public final static UUID USER_2_ID = UUID.fromString("eeb9a51b-4cd8-4039-90bf-e24f17372f7c"); - public final static UUID USER_2_KEYCLOAK_ID = UUID.fromString("eeb9a51b-4cd8-4039-90bf-e24f17372f7c"); - public final static String USER_2_EMAIL = "jane.doe@example.com"; - public final static String USER_2_USERNAME = "junit2"; - public final static String USER_2_FIRSTNAME = "Jane"; - public final static String USER_2_LASTNAME = "Doe"; - public final static String USER_2_NAME = "Jane Doe"; - public final static String USER_2_AFFILIATION = "TU Wien"; - public final static String USER_2_ORCID_URL = "https://orcid.org/0000-0002-9272-6225"; + public static final UUID USER_2_ID = UUID.fromString("eeb9a51b-4cd8-4039-90bf-e24f17372f7c"); + public static final UUID USER_2_KEYCLOAK_ID = UUID.fromString("eeb9a51b-4cd8-4039-90bf-e24f17372f7c"); + public static final String USER_2_USERNAME = "junit2"; + public static final String USER_2_FIRSTNAME = "Jane"; + public static final String USER_2_LASTNAME = "Doe"; + public static final String USER_2_NAME = "Jane Doe"; + public static final String USER_2_AFFILIATION = "TU Wien"; + public static final String USER_2_ORCID_URL = "https://orcid.org/0000-0002-9272-6225"; @SuppressWarnings("java:S2068") - public final static String USER_2_PASSWORD = "junit2"; + public static final String USER_2_PASSWORD = "junit2"; @SuppressWarnings("java:S2068") - public final static String USER_2_DATABASE_PASSWORD = "*9AA70A8B0EEFAFCB5BED5BDEF6EE264D5DA915AE" /* junit2 */; - public final static String USER_2_QUALIFIED_NAME = USER_2_FIRSTNAME + " " + USER_2_LASTNAME + " — @" + USER_2_USERNAME; - public final static Boolean USER_2_VERIFIED = true; - public final static Boolean USER_2_TOTP = false; - public final static Long USER_2_NOT_BEFORE = 0L; - public final static Boolean USER_2_ENABLED = true; - public final static Boolean USER_2_IS_INTERNAL = false; - public final static String USER_2_THEME = "light"; - public final static String USER_2_LANGUAGE = "de"; - public final static Instant USER_2_CREATED = Instant.ofEpochSecond(1677399528L) /* 2023-02-26 08:18:48 (UTC) */; - public final static Instant USER_2_LAST_MODIFIED = USER_1_CREATED; - public final static UUID USER_2_REALM_ID = REALM_DBREPO_ID; - - public final static UserAttributesDto USER_2_ATTRIBUTES_DTO = UserAttributesDto.builder() + public static final String USER_2_DATABASE_PASSWORD = "*9AA70A8B0EEFAFCB5BED5BDEF6EE264D5DA915AE" /* junit2 */; + public static final String USER_2_QUALIFIED_NAME = USER_2_FIRSTNAME + " " + USER_2_LASTNAME + " — @" + USER_2_USERNAME; + public static final Boolean USER_2_IS_INTERNAL = false; + public static final String USER_2_THEME = "light"; + public static final String USER_2_LANGUAGE = "de"; + + public static final UserAttributesDto USER_2_ATTRIBUTES_DTO = UserAttributesDto.builder() .theme(USER_2_THEME) .orcid(USER_2_ORCID_URL) .affiliation(USER_2_AFFILIATION) @@ -639,7 +631,7 @@ public abstract class BaseTest { .language(USER_2_LANGUAGE) .build(); - public final static User USER_2 = User.builder() + public static final User USER_2 = User.builder() .id(USER_2_ID) .keycloakId(USER_2_KEYCLOAK_ID) .username(USER_2_USERNAME) @@ -653,7 +645,7 @@ public abstract class BaseTest { .isInternal(USER_2_IS_INTERNAL) .build(); - public final static UserDto USER_2_DTO = UserDto.builder() + public static final UserDto USER_2_DTO = UserDto.builder() .id(USER_2_ID) .username(USER_2_USERNAME) .firstname(USER_2_FIRSTNAME) @@ -663,7 +655,7 @@ public abstract class BaseTest { .attributes(USER_2_ATTRIBUTES_DTO) .build(); - public final static UserBriefDto USER_2_BRIEF_DTO = UserBriefDto.builder() + public static final UserBriefDto USER_2_BRIEF_DTO = UserBriefDto.builder() .id(USER_2_ID) .username(USER_2_USERNAME) .firstname(USER_2_FIRSTNAME) @@ -673,53 +665,46 @@ public abstract class BaseTest { .qualifiedName(USER_2_QUALIFIED_NAME) .build(); - public final static UserDetails USER_2_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_2_DETAILS = UserDetailsDto.builder() .id(USER_2_ID.toString()) .username(USER_2_USERNAME) .password(USER_2_PASSWORD) .authorities(AUTHORITY_DEFAULT_RESEARCHER_AUTHORITIES) .build(); - public final static at.tuwien.api.amqp.UserDetailsDto USER_2_DETAILS_DTO = at.tuwien.api.amqp.UserDetailsDto.builder() + public static final at.tuwien.api.amqp.UserDetailsDto USER_2_DETAILS_DTO = at.tuwien.api.amqp.UserDetailsDto.builder() .name(USER_2_USERNAME) .tags(new String[]{}) .build(); - public final static Principal USER_2_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_2_DETAILS, + public static final Principal USER_2_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_2_DETAILS, USER_2_PASSWORD, USER_2_DETAILS.getAuthorities()); - public final static UUID USER_3_ID = UUID.fromString("7b080e33-d8db-4276-9d53-47208e657006"); - public final static UUID USER_3_KEYCLOAK_ID = UUID.fromString("b0108bc3-95aa-4a3f-8868-dc301286aeca"); - public final static String USER_3_USERNAME = "junit3"; - public final static String USER_3_FIRSTNAME = "System"; - public final static String USER_3_LASTNAME = "System"; - public final static String USER_3_NAME = "System System"; - public final static String USER_3_AFFILIATION = "TU Wien"; - public final static String USER_3_ORCID_URL = null; - public final static String USER_3_ORCID_UNCOMPRESSED = null; - public final static String USER_3_EMAIL = "system@example.com"; + public static final UUID USER_3_ID = UUID.fromString("7b080e33-d8db-4276-9d53-47208e657006"); + public static final UUID USER_3_KEYCLOAK_ID = UUID.fromString("b0108bc3-95aa-4a3f-8868-dc301286aeca"); + public static final String USER_3_USERNAME = "junit3"; + public static final String USER_3_FIRSTNAME = "System"; + public static final String USER_3_LASTNAME = "System"; + public static final String USER_3_NAME = "System System"; + public static final String USER_3_AFFILIATION = "TU Wien"; + public static final String USER_3_ORCID_URL = null; + public static final String USER_3_ORCID_UNCOMPRESSED = null; @SuppressWarnings("java:S2068") - public final static String USER_3_PASSWORD = "password"; + public static final String USER_3_PASSWORD = "password"; @SuppressWarnings("java:S2068") - public final static String USER_3_DATABASE_PASSWORD = "*D65FCA043964B63E849DD6334699ECB065905DA4" /* junit3 */; - public final static String USER_3_QUALIFIED_NAME = USER_3_FIRSTNAME + " " + USER_3_LASTNAME + " — @" + USER_3_USERNAME; - public final static Boolean USER_3_VERIFIED = true; - public final static Boolean USER_3_TOTP = false; - public final static Long USER_3_NOT_BEFORE = 0L; - public final static Boolean USER_3_ENABLED = true; - public final static Boolean USER_3_IS_INTERNAL = false; - public final static String USER_3_THEME = "light"; - public final static Instant USER_3_CREATED = Instant.ofEpochSecond(1677399559L) /* 2023-02-26 08:19:19 (UTC) */; - public final static UUID USER_3_REALM_ID = REALM_DBREPO_ID; - - public final static UserAttributesDto USER_3_ATTRIBUTES_DTO = UserAttributesDto.builder() + public static final String USER_3_DATABASE_PASSWORD = "*D65FCA043964B63E849DD6334699ECB065905DA4" /* junit3 */; + public static final String USER_3_QUALIFIED_NAME = USER_3_FIRSTNAME + " " + USER_3_LASTNAME + " — @" + USER_3_USERNAME; + public static final Boolean USER_3_IS_INTERNAL = false; + public static final String USER_3_THEME = "light"; + + public static final UserAttributesDto USER_3_ATTRIBUTES_DTO = UserAttributesDto.builder() .theme(USER_3_THEME) .orcid(USER_3_ORCID_UNCOMPRESSED) .affiliation(USER_3_AFFILIATION) .mariadbPassword(USER_3_DATABASE_PASSWORD) .build(); - public final static User USER_3 = User.builder() + public static final User USER_3 = User.builder() .id(USER_3_ID) .keycloakId(USER_3_KEYCLOAK_ID) .username(USER_3_USERNAME) @@ -732,7 +717,7 @@ public abstract class BaseTest { .isInternal(USER_3_IS_INTERNAL) .build(); - public final static UserDto USER_3_DTO = UserDto.builder() + public static final UserDto USER_3_DTO = UserDto.builder() .id(USER_3_ID) .username(USER_3_USERNAME) .firstname(USER_3_FIRSTNAME) @@ -742,7 +727,7 @@ public abstract class BaseTest { .attributes(USER_3_ATTRIBUTES_DTO) .build(); - public final static UserBriefDto USER_3_BRIEF_DTO = UserBriefDto.builder() + public static final UserBriefDto USER_3_BRIEF_DTO = UserBriefDto.builder() .id(USER_3_ID) .username(USER_3_USERNAME) .firstname(USER_3_FIRSTNAME) @@ -751,49 +736,45 @@ public abstract class BaseTest { .qualifiedName(USER_3_QUALIFIED_NAME) .build(); - public final static UserDetails USER_3_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_3_DETAILS = UserDetailsDto.builder() .id(USER_3_ID.toString()) .username(USER_3_USERNAME) .password(USER_3_PASSWORD) .authorities(AUTHORITY_DEFAULT_RESEARCHER_AUTHORITIES) .build(); - public final static Principal USER_3_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_3_DETAILS, + public static final Principal USER_3_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_3_DETAILS, USER_3_PASSWORD, USER_3_DETAILS.getAuthorities()); - public final static at.tuwien.api.amqp.UserDetailsDto USER_3_DETAILS_DTO = at.tuwien.api.amqp.UserDetailsDto.builder() + public static final at.tuwien.api.amqp.UserDetailsDto USER_3_DETAILS_DTO = at.tuwien.api.amqp.UserDetailsDto.builder() .name(USER_3_USERNAME) .tags(new String[]{}) .build(); - public final static UUID USER_4_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0"); - public final static UUID USER_4_KEYCLOAK_ID = UUID.fromString("25040ad3-6d57-4052-b357-6b4c8a6e7f4d"); - public final static String USER_4_USERNAME = "junit4"; - public final static String USER_4_FIRSTNAME = "JUnit"; - public final static String USER_4_LASTNAME = "4"; - public final static String USER_4_NAME = "JUnit 4"; - public final static String USER_4_AFFILIATION = "TU Wien"; - public final static String USER_4_ORCID_URL = null; + public static final UUID USER_4_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0"); + public static final UUID USER_4_KEYCLOAK_ID = UUID.fromString("25040ad3-6d57-4052-b357-6b4c8a6e7f4d"); + public static final String USER_4_USERNAME = "junit4"; + public static final String USER_4_FIRSTNAME = "JUnit"; + public static final String USER_4_LASTNAME = "4"; + public static final String USER_4_NAME = "JUnit 4"; + public static final String USER_4_AFFILIATION = "TU Wien"; + public static final String USER_4_ORCID_URL = null; @SuppressWarnings("java:S2068") - public final static String USER_4_PASSWORD = "junit4"; + public static final String USER_4_PASSWORD = "junit4"; @SuppressWarnings("java:S2068") - public final static String USER_4_DATABASE_PASSWORD = "*C20EF5C6875857DEFA9BE6E9B62DD76AAAE51882" /* junit4 */; - public final static String USER_4_QUALIFIED_NAME = USER_4_FIRSTNAME + " " + USER_4_LASTNAME + " — @" + USER_4_USERNAME; - public final static Boolean USER_4_VERIFIED = true; - public final static Boolean USER_4_ENABLED = true; - public final static Boolean USER_4_IS_INTERNAL = false; - public final static String USER_4_THEME = "light"; - public final static Instant USER_4_CREATED = Instant.ofEpochSecond(1677399592L) /* 2023-02-26 08:19:52 (UTC) */; - public final static UUID USER_4_REALM_ID = REALM_DBREPO_ID; - - public final static UserAttributesDto USER_4_ATTRIBUTES_DTO = UserAttributesDto.builder() + public static final String USER_4_DATABASE_PASSWORD = "*C20EF5C6875857DEFA9BE6E9B62DD76AAAE51882" /* junit4 */; + public static final String USER_4_QUALIFIED_NAME = USER_4_FIRSTNAME + " " + USER_4_LASTNAME + " — @" + USER_4_USERNAME; + public static final Boolean USER_4_IS_INTERNAL = false; + public static final String USER_4_THEME = "light"; + + public static final UserAttributesDto USER_4_ATTRIBUTES_DTO = UserAttributesDto.builder() .theme(USER_4_THEME) .orcid(USER_4_ORCID_URL) .affiliation(USER_4_AFFILIATION) .mariadbPassword(USER_4_DATABASE_PASSWORD) .build(); - public final static User USER_4 = User.builder() + public static final User USER_4 = User.builder() .id(USER_4_ID) .keycloakId(USER_4_KEYCLOAK_ID) .username(USER_4_USERNAME) @@ -806,7 +787,7 @@ public abstract class BaseTest { .isInternal(USER_4_IS_INTERNAL) .build(); - public final static UserDto USER_4_DTO = UserDto.builder() + public static final UserDto USER_4_DTO = UserDto.builder() .id(USER_4_ID) .username(USER_4_USERNAME) .firstname(USER_4_FIRSTNAME) @@ -816,7 +797,7 @@ public abstract class BaseTest { .qualifiedName(USER_4_QUALIFIED_NAME) .build(); - public final static UserBriefDto USER_4_BRIEF_DTO = UserBriefDto.builder() + public static final UserBriefDto USER_4_BRIEF_DTO = UserBriefDto.builder() .id(USER_4_ID) .username(USER_4_USERNAME) .firstname(USER_4_FIRSTNAME) @@ -825,43 +806,38 @@ public abstract class BaseTest { .qualifiedName(USER_4_QUALIFIED_NAME) .build(); - public final static UserDetails USER_4_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_4_DETAILS = UserDetailsDto.builder() .id(USER_4_ID.toString()) .username(USER_4_USERNAME) .password(USER_4_PASSWORD) .authorities(new LinkedList<>()) .build(); - public final static Principal USER_4_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_4_DETAILS, + public static final Principal USER_4_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_4_DETAILS, USER_4_PASSWORD, USER_4_DETAILS.getAuthorities()); - public final static UUID USER_5_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); - public final static UUID USER_5_KEYCLOAK_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); - public final static String USER_5_USERNAME = "nobody"; - public final static String USER_5_FIRSTNAME = "No"; - public final static String USER_5_LASTNAME = "Body"; - public final static String USER_5_NAME = "No Body"; - public final static String USER_5_AFFILIATION = "TU Wien"; - public final static String USER_5_ORCID = null; + public static final UUID USER_5_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); + public static final UUID USER_5_KEYCLOAK_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); + public static final String USER_5_USERNAME = "nobody"; + public static final String USER_5_FIRSTNAME = "No"; + public static final String USER_5_LASTNAME = "Body"; + public static final String USER_5_NAME = "No Body"; + public static final String USER_5_AFFILIATION = "TU Wien"; @SuppressWarnings("java:S2068") - public final static String USER_5_PASSWORD = "junit5"; + public static final String USER_5_PASSWORD = "junit5"; @SuppressWarnings("java:S2068") - public final static String USER_5_DATABASE_PASSWORD = "*C20EF5C6875857DEFA9BE6E9B62DD76AAAE51882" /* junit5 */; - public final static String USER_5_QUALIFIED_NAME = USER_5_FIRSTNAME + " " + USER_5_LASTNAME + " — @" + USER_5_USERNAME; - public final static Boolean USER_5_VERIFIED = true; - public final static Boolean USER_5_ENABLED = true; - public final static Boolean USER_5_IS_INTERNAL = false; - public final static String USER_5_THEME = "dark"; - public final static Instant USER_5_CREATED = Instant.ofEpochSecond(1677399592L) /* 2023-02-26 08:19:52 (UTC) */; - public final static UUID USER_5_REALM_ID = REALM_DBREPO_ID; - - public final static UserAttributesDto USER_5_ATTRIBUTES_DTO = UserAttributesDto.builder() + public static final String USER_5_DATABASE_PASSWORD = "*C20EF5C6875857DEFA9BE6E9B62DD76AAAE51882" /* junit5 */; + public static final String USER_5_QUALIFIED_NAME = USER_5_FIRSTNAME + " " + USER_5_LASTNAME + " — @" + USER_5_USERNAME; + public static final Boolean USER_5_IS_INTERNAL = false; + public static final String USER_5_THEME = "dark"; + + public static final UserAttributesDto USER_5_ATTRIBUTES_DTO = UserAttributesDto.builder() .theme(USER_5_THEME) .affiliation(USER_5_AFFILIATION) .mariadbPassword(USER_5_DATABASE_PASSWORD) .build(); - public final static UserDto USER_5_DTO = UserDto.builder() + public static final UserDto USER_5_DTO = UserDto.builder() .id(USER_5_ID) .username(USER_5_USERNAME) .firstname(USER_5_FIRSTNAME) @@ -871,7 +847,7 @@ public abstract class BaseTest { .attributes(USER_5_ATTRIBUTES_DTO) .build(); - public final static UserBriefDto USER_5_BRIEF_DTO = UserBriefDto.builder() + public static final UserBriefDto USER_5_BRIEF_DTO = UserBriefDto.builder() .id(USER_5_ID) .username(USER_5_USERNAME) .firstname(USER_5_FIRSTNAME) @@ -879,17 +855,17 @@ public abstract class BaseTest { .qualifiedName(USER_5_QUALIFIED_NAME) .build(); - public final static UserDetails USER_5_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_5_DETAILS = UserDetailsDto.builder() .id(USER_5_ID.toString()) .username(USER_5_USERNAME) .password(USER_5_PASSWORD) .authorities(AUTHORITY_DEFAULT_DEVELOPER_AUTHORITIES) .build(); - public final static Principal USER_5_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_5_DETAILS, + public static final Principal USER_5_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_5_DETAILS, USER_5_PASSWORD, USER_5_DETAILS.getAuthorities()); - public final static User USER_5 = User.builder() + public static final User USER_5 = User.builder() .id(USER_5_ID) .keycloakId(USER_5_KEYCLOAK_ID) .username(USER_5_USERNAME) @@ -901,52 +877,52 @@ public abstract class BaseTest { .isInternal(USER_5_IS_INTERNAL) .build(); - public final static UUID USER_6_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); - public final static String USER_6_USERNAME = "system"; - public final static String USER_6_FIRSTNAME = "System"; - public final static String USER_6_LASTNAME = "System"; - public final static String USER_6_NAME = "System System"; - public final static String USER_6_AFFILIATION = "TU Wien"; - public final static String USER_6_ORCID = null; + public static final UUID USER_6_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); + public static final String USER_6_USERNAME = "system"; + public static final String USER_6_FIRSTNAME = "System"; + public static final String USER_6_LASTNAME = "System"; + public static final String USER_6_NAME = "System System"; + public static final String USER_6_AFFILIATION = "TU Wien"; + public static final String USER_6_ORCID = null; @SuppressWarnings("java:S2068") - public final static String USER_6_PASSWORD = "junit5"; + public static final String USER_6_PASSWORD = "junit5"; @SuppressWarnings("java:S2068") - public final static String USER_6_DATABASE_PASSWORD = "*C20EF5C6875857DEFA9BE6E9B62DD76AAAE51882" /* junit5 */; - public final static Boolean USER_6_VERIFIED = true; - public final static Boolean USER_6_ENABLED = true; - public final static Boolean USER_6_IS_INTERNAL = false; - public final static Boolean USER_6_THEME_DARK = false; - public final static Instant USER_6_CREATED = Instant.ofEpochSecond(1677399592L) /* 2023-02-26 08:19:52 (UTC) */; - public final static UUID USER_6_REALM_ID = REALM_DBREPO_ID; - - public final static UserDto USER_6_DTO = UserDto.builder() + public static final String USER_6_DATABASE_PASSWORD = "*C20EF5C6875857DEFA9BE6E9B62DD76AAAE51882" /* junit5 */; + public static final Boolean USER_6_VERIFIED = true; + public static final Boolean USER_6_ENABLED = true; + public static final Boolean USER_6_IS_INTERNAL = false; + public static final Boolean USER_6_THEME_DARK = false; + public static final Instant USER_6_CREATED = Instant.ofEpochSecond(1677399592L) /* 2023-02-26 08:19:52 (UTC) */; + public static final UUID USER_6_REALM_ID = REALM_DBREPO_ID; + + public static final UserDto USER_6_DTO = UserDto.builder() .id(USER_6_ID) .username(USER_6_USERNAME) .firstname(USER_6_FIRSTNAME) .lastname(USER_6_LASTNAME) .build(); - public final static UserDetails USER_6_DETAILS = UserDetailsDto.builder() + public static final UserDetails USER_6_DETAILS = UserDetailsDto.builder() .id(USER_6_ID.toString()) .username(USER_6_USERNAME) .password(USER_6_PASSWORD) .authorities(AUTHORITY_DEFAULT_RESEARCHER_AUTHORITIES) .build(); - public final static Principal USER_6_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_6_DETAILS, + public static final Principal USER_6_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_6_DETAILS, USER_6_PASSWORD, USER_6_DETAILS.getAuthorities()); - public final static Long IMAGE_1_ID = 1L; - public final static String IMAGE_1_REGISTRY = "docker.io"; - public final static String IMAGE_1_NAME = "mariadb"; - public final static String IMAGE_1_VERSION = "11.1.3"; - public final static String IMAGE_1_DIALECT = "org.hibernate.dialect.MariaDBDialect"; - public final static String IMAGE_1_DRIVER = "org.mariadb.jdbc.Driver"; - public final static String IMAGE_1_JDBC = "mariadb"; - public final static Integer IMAGE_1_PORT = 3306; - public final static Boolean IMAGE_1_IS_DEFAULT = true; - - public final static ImageCreateDto IMAGE_1_CREATE_DTO = ImageCreateDto.builder() + public static final Long IMAGE_1_ID = 1L; + public static final String IMAGE_1_REGISTRY = "docker.io"; + public static final String IMAGE_1_NAME = "mariadb"; + public static final String IMAGE_1_VERSION = "11.1.3"; + public static final String IMAGE_1_DIALECT = "org.hibernate.dialect.MariaDBDialect"; + public static final String IMAGE_1_DRIVER = "org.mariadb.jdbc.Driver"; + public static final String IMAGE_1_JDBC = "mariadb"; + public static final Integer IMAGE_1_PORT = 3306; + public static final Boolean IMAGE_1_IS_DEFAULT = true; + + public static final ImageCreateDto IMAGE_1_CREATE_DTO = ImageCreateDto.builder() .registry(IMAGE_1_REGISTRY) .name(IMAGE_1_NAME) .version(IMAGE_1_VERSION) @@ -956,7 +932,7 @@ public abstract class BaseTest { .defaultPort(IMAGE_1_PORT) .build(); - public final static ImageChangeDto IMAGE_1_CHANGE_DTO = ImageChangeDto.builder() + public static final ImageChangeDto IMAGE_1_CHANGE_DTO = ImageChangeDto.builder() .registry(IMAGE_1_REGISTRY) .dialect(IMAGE_1_DIALECT) .jdbcMethod(IMAGE_1_JDBC) @@ -964,7 +940,7 @@ public abstract class BaseTest { .defaultPort(IMAGE_1_PORT) .build(); - public final static ContainerImage IMAGE_1 = ContainerImage.builder() + public static final ContainerImage IMAGE_1 = ContainerImage.builder() .id(IMAGE_1_ID) .name(IMAGE_1_NAME) .registry(IMAGE_1_REGISTRY) @@ -977,7 +953,7 @@ public abstract class BaseTest { .operators(new LinkedList<>()) /* IMAGE_1_OPERATORS */ .build(); - public final static ImageDto IMAGE_1_DTO = ImageDto.builder() + public static final ImageDto IMAGE_1_DTO = ImageDto.builder() .id(IMAGE_1_ID) .registry(IMAGE_1_REGISTRY) .name(IMAGE_1_NAME) @@ -990,7 +966,7 @@ public abstract class BaseTest { .operators(null) .build(); - public final static ImageBriefDto IMAGE_1_BRIEF_DTO = ImageBriefDto.builder() + public static final ImageBriefDto IMAGE_1_BRIEF_DTO = ImageBriefDto.builder() .id(IMAGE_1_ID) .name(IMAGE_1_NAME) .version(IMAGE_1_VERSION) @@ -998,12 +974,12 @@ public abstract class BaseTest { .jdbcMethod(IMAGE_1_JDBC) .build(); - public final static Long IMAGE_1_OPERATORS_1_ID = 1L; - public final static String IMAGE_1_OPERATORS_1_DISPLAY_NAME = "XOR"; - public final static String IMAGE_1_OPERATORS_1_VALUE = "XOR"; - public final static String IMAGE_1_OPERATORS_1_DOCUMENTATION = "https://mariadb.com/kb/en/xor/"; + public static final Long IMAGE_1_OPERATORS_1_ID = 1L; + public static final String IMAGE_1_OPERATORS_1_DISPLAY_NAME = "XOR"; + public static final String IMAGE_1_OPERATORS_1_VALUE = "XOR"; + public static final String IMAGE_1_OPERATORS_1_DOCUMENTATION = "https://mariadb.com/kb/en/xor/"; - public final static List<Operator> IMAGE_1_OPERATORS = new LinkedList<>(List.of( + public static final List<Operator> IMAGE_1_OPERATORS = new LinkedList<>(List.of( Operator.builder() .id(IMAGE_1_OPERATORS_1_ID) .image(IMAGE_1) @@ -1012,7 +988,7 @@ public abstract class BaseTest { .documentation(IMAGE_1_OPERATORS_1_DOCUMENTATION) .build())); - public final static List<OperatorDto> IMAGE_1_OPERATORS_DTO = new LinkedList<>(List.of( + public static final List<OperatorDto> IMAGE_1_OPERATORS_DTO = new LinkedList<>(List.of( OperatorDto.builder() .id(IMAGE_1_OPERATORS_1_ID) .displayName(IMAGE_1_OPERATORS_1_DISPLAY_NAME) @@ -1020,22 +996,22 @@ public abstract class BaseTest { .documentation(IMAGE_1_OPERATORS_1_DOCUMENTATION) .build())); - public final static Long CONTAINER_1_ID = 1L; - public final static String CONTAINER_1_NAME = "u01"; - public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-u01"; - public final static String CONTAINER_1_UI_HOST = "localhost"; - public final static Integer CONTAINER_1_UI_PORT = 3306; - public final static String CONTAINER_1_UI_ADDITIONAL_FLAGS = "?sslMode=disable"; - public final static Integer CONTAINER_1_QUOTA = 4; - public final static Integer CONTAINER_1_COUNT = 3; - public final static String CONTAINER_1_HOST = "localhost"; - public final static Integer CONTAINER_1_PORT = 3308; - public final static String CONTAINER_1_PRIVILEGED_USERNAME = "root"; + public static final Long CONTAINER_1_ID = 1L; + public static final String CONTAINER_1_NAME = "u01"; + public static final String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-u01"; + public static final String CONTAINER_1_UI_HOST = "localhost"; + public static final Integer CONTAINER_1_UI_PORT = 3306; + public static final String CONTAINER_1_UI_ADDITIONAL_FLAGS = "?sslMode=disable"; + public static final Integer CONTAINER_1_QUOTA = 4; + public static final Integer CONTAINER_1_COUNT = 3; + public static final String CONTAINER_1_HOST = "localhost"; + public static final Integer CONTAINER_1_PORT = 3308; + public static final String CONTAINER_1_PRIVILEGED_USERNAME = "root"; @SuppressWarnings("java:S2068") - public final static String CONTAINER_1_PRIVILEGED_PASSWORD = "dbrepo"; - public final static Instant CONTAINER_1_CREATED = Instant.ofEpochSecond(1677399629L) /* 2023-02-26 08:20:29 (UTC) */; + public static final String CONTAINER_1_PRIVILEGED_PASSWORD = "dbrepo"; + public static final Instant CONTAINER_1_CREATED = Instant.ofEpochSecond(1677399629L) /* 2023-02-26 08:20:29 (UTC) */; - public final static Container CONTAINER_1 = Container.builder() + public static final Container CONTAINER_1 = Container.builder() .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) @@ -1051,7 +1027,7 @@ public abstract class BaseTest { .privilegedPassword(CONTAINER_1_PRIVILEGED_PASSWORD) .build(); - public final static ContainerDto CONTAINER_1_DTO = ContainerDto.builder() + public static final ContainerDto CONTAINER_1_DTO = ContainerDto.builder() .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) @@ -1060,7 +1036,7 @@ public abstract class BaseTest { .port(CONTAINER_1_PORT) .build(); - public final static ContainerBriefDto CONTAINER_1_BRIEF_DTO = ContainerBriefDto.builder() + public static final ContainerBriefDto CONTAINER_1_BRIEF_DTO = ContainerBriefDto.builder() .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) @@ -1069,7 +1045,7 @@ public abstract class BaseTest { .image(IMAGE_1_BRIEF_DTO) .build(); - public final static ContainerDto CONTAINER_1_PRIVILEGED_DTO = ContainerDto.builder() + public static final ContainerDto CONTAINER_1_PRIVILEGED_DTO = ContainerDto.builder() .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) @@ -1081,21 +1057,21 @@ public abstract class BaseTest { .password(CONTAINER_1_PRIVILEGED_PASSWORD) .build(); - public final static Long CONTAINER_2_ID = 2L; - public final static ContainerImage CONTAINER_2_IMAGE = IMAGE_1; - public final static ImageDto CONTAINER_2_IMAGE_DTO = IMAGE_1_DTO; - public final static String CONTAINER_2_NAME = "u02"; - public final static String CONTAINER_2_INTERNALNAME = "dbrepo-userdb-u02"; - public final static String CONTAINER_2_HOST = "localhost"; - public final static Integer CONTAINER_2_PORT = 3309; - public final static Integer CONTAINER_2_QUOTA = 3; - public final static Integer CONTAINER_2_COUNT = 3; - public final static String CONTAINER_2_PRIVILEGED_USERNAME = "root"; + public static final Long CONTAINER_2_ID = 2L; + public static final ContainerImage CONTAINER_2_IMAGE = IMAGE_1; + public static final ImageDto CONTAINER_2_IMAGE_DTO = IMAGE_1_DTO; + public static final String CONTAINER_2_NAME = "u02"; + public static final String CONTAINER_2_INTERNALNAME = "dbrepo-userdb-u02"; + public static final String CONTAINER_2_HOST = "localhost"; + public static final Integer CONTAINER_2_PORT = 3309; + public static final Integer CONTAINER_2_QUOTA = 3; + public static final Integer CONTAINER_2_COUNT = 3; + public static final String CONTAINER_2_PRIVILEGED_USERNAME = "root"; @SuppressWarnings("java:S2068") - public final static String CONTAINER_2_PRIVILEGED_PASSWORD = "dbrepo"; - public final static Instant CONTAINER_2_CREATED = Instant.ofEpochSecond(1677399655L) /* 2023-02-26 08:20:55 (UTC) */; + public static final String CONTAINER_2_PRIVILEGED_PASSWORD = "dbrepo"; + public static final Instant CONTAINER_2_CREATED = Instant.ofEpochSecond(1677399655L) /* 2023-02-26 08:20:55 (UTC) */; - public final static Container CONTAINER_2 = Container.builder() + public static final Container CONTAINER_2 = Container.builder() .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) @@ -1109,7 +1085,7 @@ public abstract class BaseTest { .privilegedPassword(CONTAINER_2_PRIVILEGED_PASSWORD) .build(); - public final static ContainerDto CONTAINER_2_DTO = ContainerDto.builder() + public static final ContainerDto CONTAINER_2_DTO = ContainerDto.builder() .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) @@ -1118,14 +1094,14 @@ public abstract class BaseTest { .port(CONTAINER_2_PORT) .build(); - public final static ContainerBriefDto CONTAINER_2_DTO_BRIEF = ContainerBriefDto.builder() + public static final ContainerBriefDto CONTAINER_2_DTO_BRIEF = ContainerBriefDto.builder() .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) .quota(CONTAINER_2_QUOTA) .build(); - public final static ContainerDto CONTAINER_2_PRIVILEGED_DTO = ContainerDto.builder() + public static final ContainerDto CONTAINER_2_PRIVILEGED_DTO = ContainerDto.builder() .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) @@ -1137,19 +1113,19 @@ public abstract class BaseTest { .password(CONTAINER_2_PRIVILEGED_PASSWORD) .build(); - public final static Long CONTAINER_3_ID = 3L; - public final static ContainerImage CONTAINER_3_IMAGE = IMAGE_1; - public final static String CONTAINER_3_NAME = "u03"; - public final static String CONTAINER_3_INTERNALNAME = "dbrepo-userdb-u03"; - public final static String CONTAINER_3_HOST = "localhost"; - public final static Integer CONTAINER_3_PORT = 3310; - public final static Integer CONTAINER_3_QUOTA = 20; - public final static String CONTAINER_3_PRIVILEGED_USERNAME = "root"; + public static final Long CONTAINER_3_ID = 3L; + public static final ContainerImage CONTAINER_3_IMAGE = IMAGE_1; + public static final String CONTAINER_3_NAME = "u03"; + public static final String CONTAINER_3_INTERNALNAME = "dbrepo-userdb-u03"; + public static final String CONTAINER_3_HOST = "localhost"; + public static final Integer CONTAINER_3_PORT = 3310; + public static final Integer CONTAINER_3_QUOTA = 20; + public static final String CONTAINER_3_PRIVILEGED_USERNAME = "root"; @SuppressWarnings("java:S2068") - public final static String CONTAINER_3_PRIVILEGED_PASSWORD = "dbrepo"; - public final static Instant CONTAINER_3_CREATED = Instant.ofEpochSecond(1677399672L) /* 2023-02-26 08:21:12 (UTC) */; + public static final String CONTAINER_3_PRIVILEGED_PASSWORD = "dbrepo"; + public static final Instant CONTAINER_3_CREATED = Instant.ofEpochSecond(1677399672L) /* 2023-02-26 08:21:12 (UTC) */; - public final static Container CONTAINER_3 = Container.builder() + public static final Container CONTAINER_3 = Container.builder() .id(CONTAINER_3_ID) .name(CONTAINER_3_NAME) .internalName(CONTAINER_3_INTERNALNAME) @@ -1163,19 +1139,19 @@ public abstract class BaseTest { .privilegedPassword(CONTAINER_3_PRIVILEGED_PASSWORD) .build(); - public final static Long CONTAINER_4_ID = 4L; - public final static ContainerImage CONTAINER_4_IMAGE = IMAGE_1; - public final static String CONTAINER_4_NAME = "u04"; - public final static String CONTAINER_4_INTERNALNAME = "dbrepo-userdb-u04"; - public final static String CONTAINER_4_HOST = "localhost"; - public final static Integer CONTAINER_4_PORT = 3311; - public final static Integer CONTAINER_4_QUOTA = 0; - public final static String CONTAINER_4_PRIVILEGED_USERNAME = "root"; + public static final Long CONTAINER_4_ID = 4L; + public static final ContainerImage CONTAINER_4_IMAGE = IMAGE_1; + public static final String CONTAINER_4_NAME = "u04"; + public static final String CONTAINER_4_INTERNALNAME = "dbrepo-userdb-u04"; + public static final String CONTAINER_4_HOST = "localhost"; + public static final Integer CONTAINER_4_PORT = 3311; + public static final Integer CONTAINER_4_QUOTA = 0; + public static final String CONTAINER_4_PRIVILEGED_USERNAME = "root"; @SuppressWarnings("java:S2068") - public final static String CONTAINER_4_PRIVILEGED_PASSWORD = "dbrepo"; - public final static Instant CONTAINER_4_CREATED = Instant.ofEpochSecond(1677399688L) /* 2023-02-26 08:21:28 (UTC) */; + public static final String CONTAINER_4_PRIVILEGED_PASSWORD = "dbrepo"; + public static final Instant CONTAINER_4_CREATED = Instant.ofEpochSecond(1677399688L) /* 2023-02-26 08:21:28 (UTC) */; - public final static Container CONTAINER_4 = Container.builder() + public static final Container CONTAINER_4 = Container.builder() .id(CONTAINER_4_ID) .name(CONTAINER_4_NAME) .internalName(CONTAINER_4_INTERNALNAME) @@ -1188,14 +1164,14 @@ public abstract class BaseTest { .privilegedPassword(CONTAINER_4_PRIVILEGED_PASSWORD) .build(); - public final static String EXCHANGE_DBREPO_NAME = "dbrepo"; - public final static Boolean EXCHANGE_DBREPO_AUTO_DELETE = true; - public final static Boolean EXCHANGE_DBREPO_DURABLE = true; - public final static Boolean EXCHANGE_DBREPO_INTERNAL = true; - public final static String EXCHANGE_DBREPO_TYPE = "topic"; - public final static String EXCHANGE_DBREPO_VHOST = "dbrepo"; + public static final String EXCHANGE_DBREPO_NAME = "dbrepo"; + public static final Boolean EXCHANGE_DBREPO_AUTO_DELETE = true; + public static final Boolean EXCHANGE_DBREPO_DURABLE = true; + public static final Boolean EXCHANGE_DBREPO_INTERNAL = true; + public static final String EXCHANGE_DBREPO_TYPE = "topic"; + public static final String EXCHANGE_DBREPO_VHOST = "dbrepo"; - public final static ExchangeDto EXCHANGE_DBREPO_DTO = ExchangeDto.builder() + public static final ExchangeDto EXCHANGE_DBREPO_DTO = ExchangeDto.builder() .autoDelete(EXCHANGE_DBREPO_AUTO_DELETE) .type(EXCHANGE_DBREPO_TYPE) .name(EXCHANGE_DBREPO_NAME) @@ -1204,24 +1180,24 @@ public abstract class BaseTest { .internal(EXCHANGE_DBREPO_INTERNAL) .build(); - public final static Long DATABASE_1_ID = 1L; - public final static String DATABASE_1_NAME = "Weather"; - public final static String DATABASE_1_DESCRIPTION = "Weather in Australia"; - public final static String DATABASE_1_INTERNALNAME = "weather"; - public final static Boolean DATABASE_1_PUBLIC = false; - public final static Boolean DATABASE_1_SCHEMA_PUBLIC = false; - public final static String DATABASE_1_EXCHANGE = "dbrepo"; - public final static Instant DATABASE_1_CREATED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */; - public final static Instant DATABASE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */; - public final static UUID DATABASE_1_CREATED_BY = USER_1_ID; + public static final Long DATABASE_1_ID = 1L; + public static final String DATABASE_1_NAME = "Weather"; + public static final String DATABASE_1_DESCRIPTION = "Weather in Australia"; + public static final String DATABASE_1_INTERNALNAME = "weather"; + public static final Boolean DATABASE_1_PUBLIC = false; + public static final Boolean DATABASE_1_SCHEMA_PUBLIC = false; + public static final String DATABASE_1_EXCHANGE = "dbrepo"; + public static final Instant DATABASE_1_CREATED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */; + public static final Instant DATABASE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */; + public static final UUID DATABASE_1_CREATED_BY = USER_1_ID; - public final static CreateDatabaseDto DATABASE_1_CREATE = CreateDatabaseDto.builder() + public static final CreateDatabaseDto DATABASE_1_CREATE = CreateDatabaseDto.builder() .name(DATABASE_1_NAME) .isPublic(DATABASE_1_PUBLIC) .cid(CONTAINER_1_ID) .build(); - public final static at.tuwien.api.database.internal.CreateDatabaseDto DATABASE_1_CREATE_INTERNAL = at.tuwien.api.database.internal.CreateDatabaseDto.builder() + public static final at.tuwien.api.database.internal.CreateDatabaseDto DATABASE_1_CREATE_INTERNAL = at.tuwien.api.database.internal.CreateDatabaseDto.builder() .internalName(DATABASE_1_INTERNALNAME) .containerId(CONTAINER_1_ID) .username(USER_1_USERNAME) @@ -1231,36 +1207,36 @@ public abstract class BaseTest { .privilegedPassword(CONTAINER_1_PRIVILEGED_PASSWORD) .build(); - public final static Long DATABASE_2_ID = 2L; - public final static String DATABASE_2_NAME = "Zoo"; - public final static String DATABASE_2_DESCRIPTION = "Zoo data"; - public final static String DATABASE_2_INTERNALNAME = "zoo"; - public final static Boolean DATABASE_2_PUBLIC = false; - public final static Boolean DATABASE_2_SCHEMA_PUBLIC = true; - public final static String DATABASE_2_EXCHANGE = "dbrepo"; - public final static Instant DATABASE_2_CREATED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */; - public final static Instant DATABASE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */; - public final static UUID DATABASE_2_OWNER = USER_2_ID; - public final static UUID DATABASE_2_CREATOR = USER_2_ID; + public static final Long DATABASE_2_ID = 2L; + public static final String DATABASE_2_NAME = "Zoo"; + public static final String DATABASE_2_DESCRIPTION = "Zoo data"; + public static final String DATABASE_2_INTERNALNAME = "zoo"; + public static final Boolean DATABASE_2_PUBLIC = false; + public static final Boolean DATABASE_2_SCHEMA_PUBLIC = true; + public static final String DATABASE_2_EXCHANGE = "dbrepo"; + public static final Instant DATABASE_2_CREATED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */; + public static final Instant DATABASE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */; + public static final UUID DATABASE_2_OWNER = USER_2_ID; + public static final UUID DATABASE_2_CREATOR = USER_2_ID; - public final static CreateDatabaseDto DATABASE_2_CREATE = CreateDatabaseDto.builder() + public static final CreateDatabaseDto DATABASE_2_CREATE = CreateDatabaseDto.builder() .name(DATABASE_2_NAME) .isPublic(DATABASE_2_PUBLIC) .cid(CONTAINER_1_ID) .build(); - public final static Long DATABASE_3_ID = 3L; - public final static String DATABASE_3_NAME = "Musicology"; - public final static String DATABASE_3_DESCRIPTION = "Musicology data"; - public final static String DATABASE_3_INTERNALNAME = "musicology"; - public final static Boolean DATABASE_3_PUBLIC = true; - public final static Boolean DATABASE_3_SCHEMA_PUBLIC = false; - public final static String DATABASE_3_EXCHANGE = "dbrepo"; - public final static Instant DATABASE_3_CREATED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */; - public final static Instant DATABASE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */; - public final static UUID DATABASE_3_OWNER = USER_3_ID; + public static final Long DATABASE_3_ID = 3L; + public static final String DATABASE_3_NAME = "Musicology"; + public static final String DATABASE_3_DESCRIPTION = "Musicology data"; + public static final String DATABASE_3_INTERNALNAME = "musicology"; + public static final Boolean DATABASE_3_PUBLIC = true; + public static final Boolean DATABASE_3_SCHEMA_PUBLIC = false; + public static final String DATABASE_3_EXCHANGE = "dbrepo"; + public static final Instant DATABASE_3_CREATED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */; + public static final Instant DATABASE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */; + public static final UUID DATABASE_3_OWNER = USER_3_ID; - public final static DatabaseDto DATABASE_3_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_3_DTO = DatabaseDto.builder() .id(DATABASE_3_ID) .isPublic(DATABASE_3_PUBLIC) .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC) @@ -1274,7 +1250,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) /* IDENTIFIER_6_DTO */ .build(); - public final static DatabaseDto DATABASE_3_PRIVILEGED_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_3_PRIVILEGED_DTO = DatabaseDto.builder() .id(DATABASE_3_ID) .isPublic(DATABASE_3_PUBLIC) .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC) @@ -1289,7 +1265,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static DatabaseBriefDto DATABASE_3_BRIEF_DTO = DatabaseBriefDto.builder() + public static final DatabaseBriefDto DATABASE_3_BRIEF_DTO = DatabaseBriefDto.builder() .id(DATABASE_3_ID) .isPublic(DATABASE_3_PUBLIC) .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC) @@ -1299,25 +1275,25 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .build(); - public final static CreateDatabaseDto DATABASE_3_CREATE = CreateDatabaseDto.builder() + public static final CreateDatabaseDto DATABASE_3_CREATE = CreateDatabaseDto.builder() .name(DATABASE_3_NAME) .isPublic(DATABASE_3_PUBLIC) .cid(CONTAINER_1_ID) .build(); - public final static Long DATABASE_4_ID = 4L; - public final static String DATABASE_4_NAME = "Weather AT"; - public final static String DATABASE_4_DESCRIPTION = "Weather data"; - public final static Boolean DATABASE_4_PUBLIC = true; - public final static Boolean DATABASE_4_SCHEMA_PUBLIC = true; - public final static String DATABASE_4_INTERNALNAME = "weather_at"; - public final static String DATABASE_4_EXCHANGE = "dbrepo"; - public final static Instant DATABASE_4_CREATED = Instant.ofEpochSecond(1677399813L) /* 2023-02-26 08:23:33 (UTC) */; - public final static Instant DATABASE_4_LAST_MODIFIED = Instant.ofEpochSecond(1677399813L) /* 2023-02-26 08:23:33 (UTC) */; - public final static UUID DATABASE_4_OWNER = USER_4_ID; - public final static UUID DATABASE_4_CREATOR = USER_4_ID; + public static final Long DATABASE_4_ID = 4L; + public static final String DATABASE_4_NAME = "Weather AT"; + public static final String DATABASE_4_DESCRIPTION = "Weather data"; + public static final Boolean DATABASE_4_PUBLIC = true; + public static final Boolean DATABASE_4_SCHEMA_PUBLIC = true; + public static final String DATABASE_4_INTERNALNAME = "weather_at"; + public static final String DATABASE_4_EXCHANGE = "dbrepo"; + public static final Instant DATABASE_4_CREATED = Instant.ofEpochSecond(1677399813L) /* 2023-02-26 08:23:33 (UTC) */; + public static final Instant DATABASE_4_LAST_MODIFIED = Instant.ofEpochSecond(1677399813L) /* 2023-02-26 08:23:33 (UTC) */; + public static final UUID DATABASE_4_OWNER = USER_4_ID; + public static final UUID DATABASE_4_CREATOR = USER_4_ID; - public final static DatabaseBriefDto DATABASE_4_BRIEF_DTO = DatabaseBriefDto.builder() + public static final DatabaseBriefDto DATABASE_4_BRIEF_DTO = DatabaseBriefDto.builder() .id(DATABASE_4_ID) .isPublic(DATABASE_4_PUBLIC) .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) @@ -1328,7 +1304,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .build(); - public final static DatabaseDto DATABASE_4_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_4_DTO = DatabaseDto.builder() .id(DATABASE_4_ID) .isPublic(DATABASE_4_PUBLIC) .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) @@ -1343,7 +1319,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) /* IDENTIFIER_7_DTO */ .build(); - public final static DatabaseDto DATABASE_4_PRIVILEGED_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_4_PRIVILEGED_DTO = DatabaseDto.builder() .id(DATABASE_4_ID) .isPublic(DATABASE_4_PUBLIC) .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) @@ -1359,7 +1335,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static CreateTableDto TABLE_0_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_0_CREATE_DTO = CreateTableDto.builder() .name("full") .description("full example") .constraints(CreateTableConstraintsDto.builder() @@ -1528,25 +1504,25 @@ public abstract class BaseTest { .build())) .build(); - public final static Long TABLE_1_ID = 1L; - public final static String TABLE_1_NAME = "Weather AUS"; - public final static String TABLE_1_INTERNAL_NAME = "weather_aus"; - public final static Boolean TABLE_1_VERSIONED = true; - public final static Boolean TABLE_1_IS_PUBLIC = false; - public final static Boolean TABLE_1_SCHEMA_PUBLIC = false; - public final static Boolean TABLE_1_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_1_DESCRIPTION = "Weather in Australia"; - public final static String TABLE_1_QUEUE_NAME = TABLE_1_INTERNAL_NAME; - public final static String TABLE_1_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_1_ID; - public final static Long TABLE_1_DATABASE_ID = DATABASE_1_ID; - public final static Long TABLE_1_AVG_ROW_LENGTH = 3L; - public final static Long TABLE_1_NUM_ROWS = 3L; - public final static Long TABLE_1_DATA_LENGTH = 2000L; - public final static Long TABLE_1_MAX_DATA_LENGTH = Long.MAX_VALUE; - public final static Instant TABLE_1_CREATED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */; - public final static Instant TABLE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */; - - public final static TableDto TABLE_1_PRIVILEGED_DTO = TableDto.builder() + public static final Long TABLE_1_ID = 1L; + public static final String TABLE_1_NAME = "Weather AUS"; + public static final String TABLE_1_INTERNAL_NAME = "weather_aus"; + public static final Boolean TABLE_1_VERSIONED = true; + public static final Boolean TABLE_1_IS_PUBLIC = false; + public static final Boolean TABLE_1_SCHEMA_PUBLIC = false; + public static final Boolean TABLE_1_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_1_DESCRIPTION = "Weather in Australia"; + public static final String TABLE_1_QUEUE_NAME = TABLE_1_INTERNAL_NAME; + public static final String TABLE_1_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_1_ID; + public static final Long TABLE_1_DATABASE_ID = DATABASE_1_ID; + public static final Long TABLE_1_AVG_ROW_LENGTH = 3L; + public static final Long TABLE_1_NUM_ROWS = 3L; + public static final Long TABLE_1_DATA_LENGTH = 2000L; + public static final Long TABLE_1_MAX_DATA_LENGTH = Long.MAX_VALUE; + public static final Instant TABLE_1_CREATED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */; + public static final Instant TABLE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */; + + public static final TableDto TABLE_1_PRIVILEGED_DTO = TableDto.builder() .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_1_INTERNAL_NAME) @@ -1569,7 +1545,7 @@ public abstract class BaseTest { .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); - public final static Table TABLE_1 = Table.builder() + public static final Table TABLE_1 = Table.builder() .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) .database(null /* DATABASE_1 */) @@ -1593,7 +1569,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_1_MAX_DATA_LENGTH) .build(); - public final static TableDto TABLE_1_DTO = TableDto.builder() + public static final TableDto TABLE_1_DTO = TableDto.builder() .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_1_INTERNAL_NAME) @@ -1614,7 +1590,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_1_MAX_DATA_LENGTH) .build(); - public final static List<ColumnDto> TABLE_1_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_1_COLUMNS_DTO = List.of(ColumnDto.builder() .id(1L) .tableId(TABLE_1_ID) .databaseId(DATABASE_1_ID) @@ -1682,7 +1658,7 @@ public abstract class BaseTest { .sets(null) .build()); - public final static TableBriefDto TABLE_1_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_1_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_1_ID) .databaseId(DATABASE_1_ID) .internalName(TABLE_1_INTERNAL_NAME) @@ -1694,9 +1670,9 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static Long TABLE_1_DATA_COUNT = 3L; + public static final Long TABLE_1_DATA_COUNT = 3L; @SuppressWarnings("java:S3599") - public final static List<Map<String, Object>> TABLE_1_DATA_DTO = new LinkedList<>(List.of( + public static final List<Map<String, Object>> TABLE_1_DATA_DTO = new LinkedList<>(List.of( new HashMap<>() {{ put("id", BigInteger.valueOf(1L)); put("date", LocalDate.of(2008, 12, 1).atStartOfDay().toInstant(ZoneOffset.UTC)); @@ -1720,24 +1696,24 @@ public abstract class BaseTest { }} )); - public final static Long TABLE_2_ID = 2L; - public final static String TABLE_2_NAME = "Weather Location"; - public final static String TABLE_2_INTERNALNAME = "weather_location"; - public final static Boolean TABLE_2_VERSIONED = true; - public final static Boolean TABLE_2_IS_PUBLIC = false; - public final static Boolean TABLE_2_SCHEMA_PUBLIC = true; - public final static Boolean TABLE_2_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_2_DESCRIPTION = "Weather location"; - public final static String TABLE_2_QUEUE_NAME = TABLE_2_INTERNALNAME; - public final static String TABLE_2_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_2_ID; - public final static Instant TABLE_2_CREATED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */; - public final static Instant TABLE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */; - public final static Long TABLE_2_AVG_ROW_LENGTH = 3L; - public final static Long TABLE_2_NUM_ROWS = 3L; - public final static Long TABLE_2_DATA_LENGTH = 2000L; - public final static Long TABLE_2_MAX_DATA_LENGTH = Long.MAX_VALUE; - - public final static Table TABLE_2 = Table.builder() + public static final Long TABLE_2_ID = 2L; + public static final String TABLE_2_NAME = "Weather Location"; + public static final String TABLE_2_INTERNALNAME = "weather_location"; + public static final Boolean TABLE_2_VERSIONED = true; + public static final Boolean TABLE_2_IS_PUBLIC = false; + public static final Boolean TABLE_2_SCHEMA_PUBLIC = true; + public static final Boolean TABLE_2_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_2_DESCRIPTION = "Weather location"; + public static final String TABLE_2_QUEUE_NAME = TABLE_2_INTERNALNAME; + public static final String TABLE_2_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_2_ID; + public static final Instant TABLE_2_CREATED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */; + public static final Instant TABLE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */; + public static final Long TABLE_2_AVG_ROW_LENGTH = 3L; + public static final Long TABLE_2_NUM_ROWS = 3L; + public static final Long TABLE_2_DATA_LENGTH = 2000L; + public static final Long TABLE_2_MAX_DATA_LENGTH = Long.MAX_VALUE; + + public static final Table TABLE_2 = Table.builder() .id(TABLE_2_ID) .tdbid(DATABASE_1_ID) .database(null /* DATABASE_1 */) @@ -1760,7 +1736,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_2_MAX_DATA_LENGTH) .build(); - public final static TableDto TABLE_2_PRIVILEGED_DTO = TableDto.builder() + public static final TableDto TABLE_2_PRIVILEGED_DTO = TableDto.builder() .id(TABLE_2_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_2_INTERNALNAME) @@ -1783,7 +1759,7 @@ public abstract class BaseTest { .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); - public final static TableDto TABLE_2_DTO = TableDto.builder() + public static final TableDto TABLE_2_DTO = TableDto.builder() .id(TABLE_2_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_2_INTERNALNAME) @@ -1803,7 +1779,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_2_MAX_DATA_LENGTH) .build(); - public final static TableBriefDto TABLE_2_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_2_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_2_ID) .databaseId(DATABASE_1_ID) .internalName(TABLE_2_INTERNALNAME) @@ -1815,24 +1791,24 @@ public abstract class BaseTest { .ownedBy(USER_2_ID) .build(); - public final static Long TABLE_3_ID = 3L; - public final static String TABLE_3_NAME = "Sensor"; - public final static String TABLE_3_INTERNALNAME = "sensor"; - public final static Boolean TABLE_3_VERSIONED = true; - public final static Boolean TABLE_3_IS_PUBLIC = false; - public final static Boolean TABLE_3_SCHEMA_PUBLIC = false; - public final static Boolean TABLE_3_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_3_DESCRIPTION = "Some sensor data"; - public final static String TABLE_3_QUEUE_NAME = TABLE_3_INTERNALNAME; - public final static String TABLE_3_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_3_ID; - public final static Instant TABLE_3_CREATED = Instant.ofEpochSecond(1677400031L) /* 2023-02-26 08:27:11 (UTC) */; - public final static Instant TABLE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677400031L) /* 2023-02-26 08:27:11 (UTC) */; - public final static Long TABLE_3_AVG_ROW_LENGTH = 6L; - public final static Long TABLE_3_NUM_ROWS = 6L; - public final static Long TABLE_3_DATA_LENGTH = 1800L; - public final static Long TABLE_3_MAX_DATA_LENGTH = Long.MAX_VALUE; - - public final static Table TABLE_3 = Table.builder() + public static final Long TABLE_3_ID = 3L; + public static final String TABLE_3_NAME = "Sensor"; + public static final String TABLE_3_INTERNALNAME = "sensor"; + public static final Boolean TABLE_3_VERSIONED = true; + public static final Boolean TABLE_3_IS_PUBLIC = false; + public static final Boolean TABLE_3_SCHEMA_PUBLIC = false; + public static final Boolean TABLE_3_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_3_DESCRIPTION = "Some sensor data"; + public static final String TABLE_3_QUEUE_NAME = TABLE_3_INTERNALNAME; + public static final String TABLE_3_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_3_ID; + public static final Instant TABLE_3_CREATED = Instant.ofEpochSecond(1677400031L) /* 2023-02-26 08:27:11 (UTC) */; + public static final Instant TABLE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677400031L) /* 2023-02-26 08:27:11 (UTC) */; + public static final Long TABLE_3_AVG_ROW_LENGTH = 6L; + public static final Long TABLE_3_NUM_ROWS = 6L; + public static final Long TABLE_3_DATA_LENGTH = 1800L; + public static final Long TABLE_3_MAX_DATA_LENGTH = Long.MAX_VALUE; + + public static final Table TABLE_3 = Table.builder() .id(TABLE_3_ID) .tdbid(DATABASE_1_ID) .database(null /* DATABASE_1 */) @@ -1855,7 +1831,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_3_MAX_DATA_LENGTH) .build(); - public final static TableDto TABLE_3_DTO = TableDto.builder() + public static final TableDto TABLE_3_DTO = TableDto.builder() .id(TABLE_3_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_3_INTERNALNAME) @@ -1875,7 +1851,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_3_MAX_DATA_LENGTH) .build(); - public final static TableBriefDto TABLE_3_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_3_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_3_ID) .databaseId(DATABASE_1_ID) .internalName(TABLE_3_INTERNALNAME) @@ -1887,14 +1863,14 @@ public abstract class BaseTest { .ownedBy(USER_3_ID) .build(); - public final static CreateTableConstraintsDto TABLE_3_CONSTRAINTS_CREATE_DTO = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_3_CONSTRAINTS_CREATE_DTO = CreateTableConstraintsDto.builder() .checks(new LinkedHashSet<>()) .primaryKey(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) .build(); - public final static CreateTableConstraintsDto TABLE_3_CONSTRAINTS_INVALID_CREATE_DTO = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_3_CONSTRAINTS_INVALID_CREATE_DTO = CreateTableConstraintsDto.builder() .checks(new LinkedHashSet<>()) .primaryKey(new LinkedHashSet<>()) // <<<< .uniques(new LinkedList<>()) @@ -1905,38 +1881,38 @@ public abstract class BaseTest { .build())) .build(); - public final static CreateTableDto TABLE_3_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_3_CREATE_DTO = CreateTableDto.builder() .name(TABLE_3_NAME) .description(TABLE_3_DESCRIPTION) .columns(new LinkedList<>()) .constraints(TABLE_3_CONSTRAINTS_CREATE_DTO) .build(); - public final static CreateTableDto TABLE_3_INVALID_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_3_INVALID_CREATE_DTO = CreateTableDto.builder() .name(TABLE_3_NAME) .description(TABLE_3_DESCRIPTION) .columns(new LinkedList<>()) .constraints(TABLE_3_CONSTRAINTS_INVALID_CREATE_DTO) .build(); - public final static Long TABLE_5_ID = 5L; - public final static String TABLE_5_NAME = "zoo"; - public final static String TABLE_5_INTERNALNAME = "zoo"; - public final static Boolean TABLE_5_VERSIONED = true; - public final static Boolean TABLE_5_IS_PUBLIC = true; - public final static Boolean TABLE_5_SCHEMA_PUBLIC = true; - public final static Boolean TABLE_5_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_5_DESCRIPTION = "Some Kaggle dataset"; - public final static String TABLE_5_QUEUE_NAME = TABLE_5_INTERNALNAME; - public final static String TABLE_5_ROUTING_KEY = "dbrepo\\." + DATABASE_2_ID + "\\." + TABLE_5_ID; - public final static Instant TABLE_5_CREATED = Instant.ofEpochSecond(1677400067L) /* 2023-02-26 08:27:47 (UTC) */; - public final static Instant TABLE_5_LAST_MODIFIED = Instant.ofEpochSecond(1677400067L) /* 2023-02-26 08:27:47 (UTC) */; - public final static Long TABLE_5_AVG_ROW_LENGTH = 1080L; - public final static Long TABLE_5_NUM_ROWS = 101L; - public final static Long TABLE_5_DATA_LENGTH = 15200L; - public final static Long TABLE_5_MAX_DATA_LENGTH = Long.MAX_VALUE; - - public final static Table TABLE_5 = Table.builder() + public static final Long TABLE_5_ID = 5L; + public static final String TABLE_5_NAME = "zoo"; + public static final String TABLE_5_INTERNALNAME = "zoo"; + public static final Boolean TABLE_5_VERSIONED = true; + public static final Boolean TABLE_5_IS_PUBLIC = true; + public static final Boolean TABLE_5_SCHEMA_PUBLIC = true; + public static final Boolean TABLE_5_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_5_DESCRIPTION = "Some Kaggle dataset"; + public static final String TABLE_5_QUEUE_NAME = TABLE_5_INTERNALNAME; + public static final String TABLE_5_ROUTING_KEY = "dbrepo\\." + DATABASE_2_ID + "\\." + TABLE_5_ID; + public static final Instant TABLE_5_CREATED = Instant.ofEpochSecond(1677400067L) /* 2023-02-26 08:27:47 (UTC) */; + public static final Instant TABLE_5_LAST_MODIFIED = Instant.ofEpochSecond(1677400067L) /* 2023-02-26 08:27:47 (UTC) */; + public static final Long TABLE_5_AVG_ROW_LENGTH = 1080L; + public static final Long TABLE_5_NUM_ROWS = 101L; + public static final Long TABLE_5_DATA_LENGTH = 15200L; + public static final Long TABLE_5_MAX_DATA_LENGTH = Long.MAX_VALUE; + + public static final Table TABLE_5 = Table.builder() .id(TABLE_5_ID) .tdbid(DATABASE_2_ID) .created(Instant.now()) @@ -1954,7 +1930,7 @@ public abstract class BaseTest { .owner(USER_1) .build(); - public final static TableDto TABLE_5_DTO = TableDto.builder() + public static final TableDto TABLE_5_DTO = TableDto.builder() .id(TABLE_5_ID) .tdbid(DATABASE_2_ID) .internalName(TABLE_5_INTERNALNAME) @@ -1970,7 +1946,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static TableDto TABLE_5_PRIVILEGED_DTO = TableDto.builder() + public static final TableDto TABLE_5_PRIVILEGED_DTO = TableDto.builder() .id(TABLE_5_ID) .tdbid(DATABASE_2_ID) .internalName(TABLE_5_INTERNALNAME) @@ -1993,7 +1969,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static TableBriefDto TABLE_5_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_5_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_5_ID) .databaseId(DATABASE_2_ID) .internalName(TABLE_5_INTERNALNAME) @@ -2005,20 +1981,20 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static Long TABLE_6_ID = 6L; - public final static String TABLE_6_NAME = "names"; - public final static String TABLE_6_INTERNALNAME = "names"; - public final static Boolean TABLE_6_VERSIONED = true; - public final static Boolean TABLE_6_IS_PUBLIC = true; - public final static Boolean TABLE_6_SCHEMA_PUBLIC = false; - public final static Boolean TABLE_6_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_6_DESCRIPTION = "Some names dataset"; - public final static String TABLE_6_QUEUE_NAME = TABLE_6_INTERNALNAME; - public final static String TABLE_6_ROUTING_KEY = "dbrepo\\." + DATABASE_2_ID + "\\." + TABLE_6_ID; - public final static Instant TABLE_6_CREATED = Instant.ofEpochSecond(1677400117L) /* 2023-02-26 08:28:37 (UTC) */; - public final static Instant TABLE_6_LAST_MODIFIED = Instant.ofEpochSecond(1677400117L) /* 2023-02-26 08:28:37 (UTC) */; - - public final static Table TABLE_6 = Table.builder() + public static final Long TABLE_6_ID = 6L; + public static final String TABLE_6_NAME = "names"; + public static final String TABLE_6_INTERNALNAME = "names"; + public static final Boolean TABLE_6_VERSIONED = true; + public static final Boolean TABLE_6_IS_PUBLIC = true; + public static final Boolean TABLE_6_SCHEMA_PUBLIC = false; + public static final Boolean TABLE_6_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_6_DESCRIPTION = "Some names dataset"; + public static final String TABLE_6_QUEUE_NAME = TABLE_6_INTERNALNAME; + public static final String TABLE_6_ROUTING_KEY = "dbrepo\\." + DATABASE_2_ID + "\\." + TABLE_6_ID; + public static final Instant TABLE_6_CREATED = Instant.ofEpochSecond(1677400117L) /* 2023-02-26 08:28:37 (UTC) */; + public static final Instant TABLE_6_LAST_MODIFIED = Instant.ofEpochSecond(1677400117L) /* 2023-02-26 08:28:37 (UTC) */; + + public static final Table TABLE_6 = Table.builder() .id(TABLE_6_ID) .tdbid(DATABASE_2_ID) .created(TABLE_6_CREATED) @@ -2037,7 +2013,7 @@ public abstract class BaseTest { .created(TABLE_6_CREATED) .build(); - public final static TableDto TABLE_6_DTO = TableDto.builder() + public static final TableDto TABLE_6_DTO = TableDto.builder() .id(TABLE_6_ID) .tdbid(DATABASE_2_ID) .internalName(TABLE_6_INTERNALNAME) @@ -2053,7 +2029,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static TableBriefDto TABLE_6_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_6_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_6_ID) .databaseId(DATABASE_2_ID) .internalName(TABLE_6_INTERNALNAME) @@ -2065,20 +2041,20 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static Long TABLE_7_ID = 7L; - public final static String TABLE_7_NAME = "likes"; - public final static String TABLE_7_INTERNAL_NAME = "likes"; - public final static Boolean TABLE_7_VERSIONED = true; - public final static Boolean TABLE_7_IS_PUBLIC = true; - public final static Boolean TABLE_7_SCHEMA_PUBLIC = true; - public final static Boolean TABLE_7_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_7_DESCRIPTION = "Some likes dataset"; - public final static String TABLE_7_QUEUE_NAME = TABLE_7_INTERNAL_NAME; - public final static String TABLE_7_ROUTING_KEY = "dbrepo\\." + DATABASE_2_ID + "\\." + TABLE_7_ID; - public final static Instant TABLE_7_CREATED = Instant.ofEpochSecond(1677400147L) /* 2023-02-26 08:29:07 (UTC) */; - public final static Instant TABLE_7_LAST_MODIFIED = Instant.ofEpochSecond(1677400147L) /* 2023-02-26 08:29:07 (UTC) */; - - public final static Table TABLE_7 = Table.builder() + public static final Long TABLE_7_ID = 7L; + public static final String TABLE_7_NAME = "likes"; + public static final String TABLE_7_INTERNAL_NAME = "likes"; + public static final Boolean TABLE_7_VERSIONED = true; + public static final Boolean TABLE_7_IS_PUBLIC = true; + public static final Boolean TABLE_7_SCHEMA_PUBLIC = true; + public static final Boolean TABLE_7_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_7_DESCRIPTION = "Some likes dataset"; + public static final String TABLE_7_QUEUE_NAME = TABLE_7_INTERNAL_NAME; + public static final String TABLE_7_ROUTING_KEY = "dbrepo\\." + DATABASE_2_ID + "\\." + TABLE_7_ID; + public static final Instant TABLE_7_CREATED = Instant.ofEpochSecond(1677400147L) /* 2023-02-26 08:29:07 (UTC) */; + public static final Instant TABLE_7_LAST_MODIFIED = Instant.ofEpochSecond(1677400147L) /* 2023-02-26 08:29:07 (UTC) */; + + public static final Table TABLE_7 = Table.builder() .id(TABLE_7_ID) .tdbid(DATABASE_2_ID) .created(TABLE_7_CREATED) @@ -2097,7 +2073,7 @@ public abstract class BaseTest { .created(TABLE_7_CREATED) .build(); - public final static TableDto TABLE_7_DTO = TableDto.builder() + public static final TableDto TABLE_7_DTO = TableDto.builder() .id(TABLE_7_ID) .tdbid(DATABASE_2_ID) .internalName(TABLE_7_INTERNAL_NAME) @@ -2113,7 +2089,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static TableBriefDto TABLE_7_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_7_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_7_ID) .databaseId(DATABASE_2_ID) .internalName(TABLE_7_INTERNAL_NAME) @@ -2125,23 +2101,23 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static Long TABLE_4_ID = 4L; - public final static String TABLE_4_NAME = "Sensor 2"; - public final static String TABLE_4_INTERNALNAME = "sensor_2"; - public final static Boolean TABLE_4_VERSIONED = true; - public final static Boolean TABLE_4_IS_PUBLIC = true; - public final static Boolean TABLE_4_SCHEMA_PUBLIC = false; - public final static String TABLE_4_DESCRIPTION = "Hello sensor"; - public final static String TABLE_4_QUEUE_NAME = TABLE_4_INTERNALNAME; - public final static String TABLE_4_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_4_ID; - public final static Instant TABLE_4_CREATED = Instant.ofEpochSecond(1677400175L) /* 2023-02-26 08:29:35 (UTC) */; - public final static Instant TABLE_4_LAST_MODIFIED = Instant.ofEpochSecond(1677400175L) /* 2023-02-26 08:29:35 (UTC) */; - public final static Long TABLE_4_AVG_ROW_LENGTH = 0L; - public final static Long TABLE_4_NUM_ROWS = 0L; - public final static Long TABLE_4_DATA_LENGTH = 1000L; - public final static Long TABLE_4_MAX_DATA_LENGTH = Long.MAX_VALUE; - - public final static Table TABLE_4 = Table.builder() + public static final Long TABLE_4_ID = 4L; + public static final String TABLE_4_NAME = "Sensor 2"; + public static final String TABLE_4_INTERNALNAME = "sensor_2"; + public static final Boolean TABLE_4_VERSIONED = true; + public static final Boolean TABLE_4_IS_PUBLIC = true; + public static final Boolean TABLE_4_SCHEMA_PUBLIC = false; + public static final String TABLE_4_DESCRIPTION = "Hello sensor"; + public static final String TABLE_4_QUEUE_NAME = TABLE_4_INTERNALNAME; + public static final String TABLE_4_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_4_ID; + public static final Instant TABLE_4_CREATED = Instant.ofEpochSecond(1677400175L) /* 2023-02-26 08:29:35 (UTC) */; + public static final Instant TABLE_4_LAST_MODIFIED = Instant.ofEpochSecond(1677400175L) /* 2023-02-26 08:29:35 (UTC) */; + public static final Long TABLE_4_AVG_ROW_LENGTH = 0L; + public static final Long TABLE_4_NUM_ROWS = 0L; + public static final Long TABLE_4_DATA_LENGTH = 1000L; + public static final Long TABLE_4_MAX_DATA_LENGTH = Long.MAX_VALUE; + + public static final Table TABLE_4 = Table.builder() .id(TABLE_4_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_4_INTERNALNAME) @@ -2164,7 +2140,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_4_MAX_DATA_LENGTH) .build(); - public final static TableDto TABLE_4_DTO = TableDto.builder() + public static final TableDto TABLE_4_DTO = TableDto.builder() .id(TABLE_4_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_4_INTERNALNAME) @@ -2184,7 +2160,7 @@ public abstract class BaseTest { .maxDataLength(TABLE_4_MAX_DATA_LENGTH) .build(); - public final static TableDto TABLE_4_PRIVILEGED_DTO = TableDto.builder() + public static final TableDto TABLE_4_PRIVILEGED_DTO = TableDto.builder() .id(TABLE_4_ID) .tdbid(DATABASE_1_ID) .internalName(TABLE_4_INTERNALNAME) @@ -2206,7 +2182,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static TableBriefDto TABLE_4_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_4_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_4_ID) .databaseId(DATABASE_1_ID) .internalName(TABLE_4_INTERNALNAME) @@ -2218,18 +2194,18 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static ColumnBriefDto TABLE_4_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_4_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(44L) .name("Timestamp") .internalName("timestamp") .columnType(ColumnTypeDto.TIMESTAMP) .build(); - public final static Long COLUMN_4_1_ID = 44L; + public static final Long COLUMN_4_1_ID = 44L; - public final static Long COLUMN_4_2_ID = 45L; + public static final Long COLUMN_4_2_ID = 45L; - public final static List<TableColumn> TABLE_4_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_4_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_4_1_ID) .ordinalPosition(0) .table(TABLE_4) @@ -2248,7 +2224,7 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static List<CreateTableColumnDto> TABLE_4_COLUMNS_CREATE_DTO = List.of(CreateTableColumnDto.builder() + public static final List<CreateTableColumnDto> TABLE_4_COLUMNS_CREATE_DTO = List.of(CreateTableColumnDto.builder() .name("Timestamp") .type(ColumnTypeDto.TIMESTAMP) .nullAllowed(false) @@ -2261,28 +2237,28 @@ public abstract class BaseTest { .d(10L) .build()); - public final static CreateTableConstraintsDto TABLE_4_CONSTRAINTS_CREATE_DTO = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_4_CONSTRAINTS_CREATE_DTO = CreateTableConstraintsDto.builder() .checks(new LinkedHashSet<>()) .primaryKey(new LinkedHashSet<>(Set.of("Timestamp"))) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>(List.of(List.of("Timestamp")))) .build(); - public final static CreateTableDto TABLE_4_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_4_CREATE_DTO = CreateTableDto.builder() .name(TABLE_4_NAME) .description(TABLE_4_DESCRIPTION) .columns(TABLE_4_COLUMNS_CREATE_DTO) .constraints(TABLE_4_CONSTRAINTS_CREATE_DTO) .build(); - public final static at.tuwien.api.database.table.internal.TableCreateDto TABLE_4_CREATE_INTERNAL_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() + public static final at.tuwien.api.database.table.internal.TableCreateDto TABLE_4_CREATE_INTERNAL_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() .name(TABLE_4_NAME) .description(TABLE_4_DESCRIPTION) .columns(TABLE_4_COLUMNS_CREATE_DTO) .constraints(TABLE_4_CONSTRAINTS_CREATE_DTO) .build(); - public final static List<ColumnDto> TABLE_4_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_4_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_4_1_ID) .databaseId(DATABASE_1_ID) .tableId(TABLE_4_ID) @@ -2301,20 +2277,20 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static Long TABLE_8_ID = 8L; - public final static Long TABLE_8_DATABASE_ID = DATABASE_3_ID; - public final static String TABLE_8_NAME = "location"; - public final static String TABLE_8_INTERNAL_NAME = "mfcc"; - public final static Boolean TABLE_8_VERSIONED = true; - public final static Boolean TABLE_8_IS_PUBLIC = false; - public final static Boolean TABLE_8_SCHEMA_PUBLIC = false; - public final static String TABLE_8_DESCRIPTION = "Hello mfcc"; - public final static String TABLE_8_QUEUE_NAME = TABLE_8_INTERNAL_NAME; - public final static String TABLE_8_ROUTING_KEY = "dbrepo\\." + DATABASE_3_ID + "\\." + TABLE_8_ID; - public final static Instant TABLE_8_CREATED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; - public final static Instant TABLE_8_LAST_MODIFIED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; - - public final static Table TABLE_8 = Table.builder() + public static final Long TABLE_8_ID = 8L; + public static final Long TABLE_8_DATABASE_ID = DATABASE_3_ID; + public static final String TABLE_8_NAME = "location"; + public static final String TABLE_8_INTERNAL_NAME = "mfcc"; + public static final Boolean TABLE_8_VERSIONED = true; + public static final Boolean TABLE_8_IS_PUBLIC = false; + public static final Boolean TABLE_8_SCHEMA_PUBLIC = false; + public static final String TABLE_8_DESCRIPTION = "Hello mfcc"; + public static final String TABLE_8_QUEUE_NAME = TABLE_8_INTERNAL_NAME; + public static final String TABLE_8_ROUTING_KEY = "dbrepo\\." + DATABASE_3_ID + "\\." + TABLE_8_ID; + public static final Instant TABLE_8_CREATED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; + public static final Instant TABLE_8_LAST_MODIFIED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; + + public static final Table TABLE_8 = Table.builder() .id(TABLE_8_ID) .tdbid(TABLE_8_DATABASE_ID) .internalName(TABLE_8_INTERNAL_NAME) @@ -2333,7 +2309,7 @@ public abstract class BaseTest { .lastModified(TABLE_8_LAST_MODIFIED) .build(); - public final static TableDto TABLE_8_DTO = TableDto.builder() + public static final TableDto TABLE_8_DTO = TableDto.builder() .id(TABLE_8_ID) .tdbid(TABLE_8_DATABASE_ID) .internalName(TABLE_8_INTERNAL_NAME) @@ -2348,7 +2324,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static TableBriefDto TABLE_8_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_8_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_8_ID) .databaseId(DATABASE_3_ID) .internalName(TABLE_8_INTERNAL_NAME) @@ -2360,7 +2336,7 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static TableDto TABLE_8_PRIVILEGED_DTO = TableDto.builder() + public static final TableDto TABLE_8_PRIVILEGED_DTO = TableDto.builder() .id(TABLE_8_ID) .tdbid(TABLE_8_DATABASE_ID) .internalName(TABLE_8_INTERNAL_NAME) @@ -2376,21 +2352,21 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static Long TABLE_9_ID = 9L; - public final static Long TABLE_9_DATABASE_ID = DATABASE_4_ID; - public final static String TABLE_9_NAME = "mfcc"; - public final static String TABLE_9_INTERNAL_NAME = "mfcc"; - public final static Boolean TABLE_9_VERSIONED = true; - public final static Boolean TABLE_9_IS_PUBLIC = false; - public final static Boolean TABLE_9_SCHEMA_PUBLIC = true; - public final static Boolean TABLE_9_PROCESSED_CONSTRAINTS = true; - public final static String TABLE_9_DESCRIPTION = "Hello mfcc"; - public final static String TABLE_9_QUEUE_NAME = TABLE_9_INTERNAL_NAME; - public final static String TABLE_9_ROUTING_KEY = "dbrepo\\." + DATABASE_3_ID + "\\." + TABLE_9_ID; - public final static Instant TABLE_9_CREATED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; - public final static Instant TABLE_9_LAST_MODIFIED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; - - public final static Table TABLE_9 = Table.builder() + public static final Long TABLE_9_ID = 9L; + public static final Long TABLE_9_DATABASE_ID = DATABASE_4_ID; + public static final String TABLE_9_NAME = "mfcc"; + public static final String TABLE_9_INTERNAL_NAME = "mfcc"; + public static final Boolean TABLE_9_VERSIONED = true; + public static final Boolean TABLE_9_IS_PUBLIC = false; + public static final Boolean TABLE_9_SCHEMA_PUBLIC = true; + public static final Boolean TABLE_9_PROCESSED_CONSTRAINTS = true; + public static final String TABLE_9_DESCRIPTION = "Hello mfcc"; + public static final String TABLE_9_QUEUE_NAME = TABLE_9_INTERNAL_NAME; + public static final String TABLE_9_ROUTING_KEY = "dbrepo\\." + DATABASE_3_ID + "\\." + TABLE_9_ID; + public static final Instant TABLE_9_CREATED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; + public static final Instant TABLE_9_LAST_MODIFIED = Instant.ofEpochSecond(1688400185L) /* 2023-02-26 08:29:35 (UTC) */; + + public static final Table TABLE_9 = Table.builder() .id(TABLE_9_ID) .tdbid(TABLE_9_DATABASE_ID) .internalName(TABLE_9_INTERNAL_NAME) @@ -2409,7 +2385,7 @@ public abstract class BaseTest { .lastModified(TABLE_9_LAST_MODIFIED) .build(); - public final static TableDto TABLE_9_DTO = TableDto.builder() + public static final TableDto TABLE_9_DTO = TableDto.builder() .id(TABLE_9_ID) .tdbid(TABLE_9_DATABASE_ID) .internalName(TABLE_9_INTERNAL_NAME) @@ -2424,7 +2400,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static TableBriefDto TABLE_9_BRIEF_DTO = TableBriefDto.builder() + public static final TableBriefDto TABLE_9_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_9_ID) .databaseId(DATABASE_4_ID) .internalName(TABLE_9_INTERNAL_NAME) @@ -2436,7 +2412,7 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static TableDto TABLE_9_PRIVILEGED_DTO = TableDto.builder() + public static final TableDto TABLE_9_PRIVILEGED_DTO = TableDto.builder() .id(TABLE_9_ID) .tdbid(TABLE_9_DATABASE_ID) .internalName(TABLE_9_INTERNAL_NAME) @@ -2452,22 +2428,22 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static Long COLUMN_9_1_ID = 78L; - public final static String COLUMN_9_1_NAME = "location"; - public final static String COLUMN_9_1_INTERNAL_NAME = "location"; + public static final Long COLUMN_9_1_ID = 78L; + public static final String COLUMN_9_1_NAME = "location"; + public static final String COLUMN_9_1_INTERNAL_NAME = "location"; - public final static ColumnBriefDto TABLE_9_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_9_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_9_1_ID) .name(COLUMN_9_1_NAME) .internalName(COLUMN_9_1_INTERNAL_NAME) .columnType(ColumnTypeDto.BIGINT) .build(); - public final static Long COLUMN_9_2_ID = 79L; + public static final Long COLUMN_9_2_ID = 79L; - public final static Long COLUMN_9_3_ID = 80L; + public static final Long COLUMN_9_3_ID = 80L; - public final static List<TableColumn> TABLE_9_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_9_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_9_1_ID) .ordinalPosition(0) .table(TABLE_9) @@ -2506,7 +2482,7 @@ public abstract class BaseTest { .sets(null) .build()); - public final static List<ColumnDto> TABLE_9_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_9_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_9_1_ID) .ordinalPosition(0) .name(COLUMN_9_1_NAME) @@ -2542,7 +2518,7 @@ public abstract class BaseTest { .sets(null) .build()); - public final static Constraints TABLE_9_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_9_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -2553,7 +2529,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_9_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_9_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -2564,14 +2540,14 @@ public abstract class BaseTest { .build()))) .build(); - public final static String QUEUE_NAME = "dbrepo"; - public final static String QUEUE_VHOST = "dbrepo"; - public final static Boolean QUEUE_AUTO_DELETE = false; - public final static Boolean QUEUE_DURABLE = true; - public final static Boolean QUEUE_EXCLUSIVE = false; - public final static String QUEUE_TYPE = "quorum"; + public static final String QUEUE_NAME = "dbrepo"; + public static final String QUEUE_VHOST = "dbrepo"; + public static final Boolean QUEUE_AUTO_DELETE = false; + public static final Boolean QUEUE_DURABLE = true; + public static final Boolean QUEUE_EXCLUSIVE = false; + public static final String QUEUE_TYPE = "quorum"; - public final static QueueDto QUEUE_DTO = QueueDto.builder() + public static final QueueDto QUEUE_DTO = QueueDto.builder() .name(QUEUE_NAME) .vhost(QUEUE_VHOST) .autoDelete(QUEUE_AUTO_DELETE) @@ -2580,18 +2556,18 @@ public abstract class BaseTest { .type(QUEUE_TYPE) .build(); - public final static Long ONTOLOGY_1_ID = 1L; - public final static String ONTOLOGY_1_PREFIX = "om2"; - public final static String ONTOLOGY_1_NEW_PREFIX = "om-2"; - public final static String ONTOLOGY_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/"; - public final static String ONTOLOGY_1_URI_PATTERN = "http://www.ontology-of-units-of-measure.org/resource/om-2/.*"; - public final static String ONTOLOGY_1_SPARQL_ENDPOINT = null; - public final static Boolean ONTOLOGY_1_SPARQL = false; - public final static String ONTOLOGY_1_RDF_PATH = "rdf/om-2.0.rdf"; - public final static Boolean ONTOLOGY_1_RDF = true; - public final static UUID ONTOLOGY_1_CREATED_BY = USER_1_ID; + public static final Long ONTOLOGY_1_ID = 1L; + public static final String ONTOLOGY_1_PREFIX = "om2"; + public static final String ONTOLOGY_1_NEW_PREFIX = "om-2"; + public static final String ONTOLOGY_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/"; + public static final String ONTOLOGY_1_URI_PATTERN = "http://www.ontology-of-units-of-measure.org/resource/om-2/.*"; + public static final String ONTOLOGY_1_SPARQL_ENDPOINT = null; + public static final Boolean ONTOLOGY_1_SPARQL = false; + public static final String ONTOLOGY_1_RDF_PATH = "rdf/om-2.0.rdf"; + public static final Boolean ONTOLOGY_1_RDF = true; + public static final UUID ONTOLOGY_1_CREATED_BY = USER_1_ID; - public final static Ontology ONTOLOGY_1 = Ontology.builder() + public static final Ontology ONTOLOGY_1 = Ontology.builder() .id(ONTOLOGY_1_ID) .prefix(ONTOLOGY_1_PREFIX) .uri(ONTOLOGY_1_URI) @@ -2600,7 +2576,7 @@ public abstract class BaseTest { .rdfPath(ONTOLOGY_1_RDF_PATH) .build(); - public final static OntologyDto ONTOLOGY_1_DTO = OntologyDto.builder() + public static final OntologyDto ONTOLOGY_1_DTO = OntologyDto.builder() .id(ONTOLOGY_1_ID) .prefix(ONTOLOGY_1_PREFIX) .uri(ONTOLOGY_1_URI) @@ -2611,7 +2587,7 @@ public abstract class BaseTest { .rdf(ONTOLOGY_1_RDF) .build(); - public final static OntologyBriefDto ONTOLOGY_1_BRIEF_DTO = OntologyBriefDto.builder() + public static final OntologyBriefDto ONTOLOGY_1_BRIEF_DTO = OntologyBriefDto.builder() .id(ONTOLOGY_1_ID) .prefix(ONTOLOGY_1_PREFIX) .uri(ONTOLOGY_1_URI) @@ -2620,131 +2596,131 @@ public abstract class BaseTest { .rdf(ONTOLOGY_1_RDF) .build(); - public final static OntologyCreateDto ONTOLOGY_1_CREATE_DTO = OntologyCreateDto.builder() + public static final OntologyCreateDto ONTOLOGY_1_CREATE_DTO = OntologyCreateDto.builder() .prefix(ONTOLOGY_1_PREFIX) .uri(ONTOLOGY_1_URI) .sparqlEndpoint(ONTOLOGY_1_SPARQL_ENDPOINT) .build(); - public final static OntologyModifyDto ONTOLOGY_1_MODIFY_DTO = OntologyModifyDto.builder() + public static final OntologyModifyDto ONTOLOGY_1_MODIFY_DTO = OntologyModifyDto.builder() .prefix(ONTOLOGY_1_NEW_PREFIX) .uri(ONTOLOGY_1_URI) .sparqlEndpoint(ONTOLOGY_1_SPARQL_ENDPOINT) .build(); - public final static Long ONTOLOGY_2_ID = 2L; - public final static String ONTOLOGY_2_PREFIX = "wd"; - public final static String ONTOLOGY_2_URI = "http://www.wikidata.org/"; - public final static String ONTOLOGY_2_SPARQL_ENDPOINT = "https://query.wikidata.org/sparql"; - public final static UUID ONTOLOGY_2_CREATED_BY = USER_1_ID; + public static final Long ONTOLOGY_2_ID = 2L; + public static final String ONTOLOGY_2_PREFIX = "wd"; + public static final String ONTOLOGY_2_URI = "http://www.wikidata.org/"; + public static final String ONTOLOGY_2_SPARQL_ENDPOINT = "https://query.wikidata.org/sparql"; + public static final UUID ONTOLOGY_2_CREATED_BY = USER_1_ID; - public final static Ontology ONTOLOGY_2 = Ontology.builder() + public static final Ontology ONTOLOGY_2 = Ontology.builder() .id(ONTOLOGY_2_ID) .prefix(ONTOLOGY_2_PREFIX) .uri(ONTOLOGY_2_URI) .sparqlEndpoint(ONTOLOGY_2_SPARQL_ENDPOINT) .build(); - public final static OntologyCreateDto ONTOLOGY_2_CREATE_DTO = OntologyCreateDto.builder() + public static final OntologyCreateDto ONTOLOGY_2_CREATE_DTO = OntologyCreateDto.builder() .prefix(ONTOLOGY_2_PREFIX) .uri(ONTOLOGY_2_URI) .sparqlEndpoint(ONTOLOGY_2_SPARQL_ENDPOINT) .build(); - public final static Long ONTOLOGY_3_ID = 3L; - public final static String ONTOLOGY_3_PREFIX = "rdfs"; - public final static String ONTOLOGY_3_URI = "http://www.w3.org/2000/01/rdf-schema#"; - public final static String ONTOLOGY_3_SPARQL_ENDPOINT = null; - public final static UUID ONTOLOGY_3_CREATED_BY = USER_1_ID; + public static final Long ONTOLOGY_3_ID = 3L; + public static final String ONTOLOGY_3_PREFIX = "rdfs"; + public static final String ONTOLOGY_3_URI = "http://www.w3.org/2000/01/rdf-schema#"; + public static final String ONTOLOGY_3_SPARQL_ENDPOINT = null; + public static final UUID ONTOLOGY_3_CREATED_BY = USER_1_ID; - public final static Ontology ONTOLOGY_3 = Ontology.builder() + public static final Ontology ONTOLOGY_3 = Ontology.builder() .id(ONTOLOGY_3_ID) .prefix(ONTOLOGY_3_PREFIX) .uri(ONTOLOGY_3_URI) .sparqlEndpoint(ONTOLOGY_3_SPARQL_ENDPOINT) .build(); - public final static OntologyCreateDto ONTOLOGY_3_CREATE_DTO = OntologyCreateDto.builder() + public static final OntologyCreateDto ONTOLOGY_3_CREATE_DTO = OntologyCreateDto.builder() .prefix(ONTOLOGY_3_PREFIX) .uri(ONTOLOGY_3_URI) .sparqlEndpoint(ONTOLOGY_3_SPARQL_ENDPOINT) .build(); - public final static Long ONTOLOGY_4_ID = 4L; - public final static String ONTOLOGY_4_PREFIX = "schema"; - public final static String ONTOLOGY_4_URI = "http://schema.org/"; - public final static String ONTOLOGY_4_SPARQL_ENDPOINT = null; - public final static UUID ONTOLOGY_4_CREATED_BY = USER_1_ID; + public static final Long ONTOLOGY_4_ID = 4L; + public static final String ONTOLOGY_4_PREFIX = "schema"; + public static final String ONTOLOGY_4_URI = "http://schema.org/"; + public static final String ONTOLOGY_4_SPARQL_ENDPOINT = null; + public static final UUID ONTOLOGY_4_CREATED_BY = USER_1_ID; - public final static Ontology ONTOLOGY_4 = Ontology.builder() + public static final Ontology ONTOLOGY_4 = Ontology.builder() .id(ONTOLOGY_4_ID) .prefix(ONTOLOGY_4_PREFIX) .uri(ONTOLOGY_4_URI) .sparqlEndpoint(ONTOLOGY_4_SPARQL_ENDPOINT) .build(); - public final static OntologyCreateDto ONTOLOGY_4_CREATE_DTO = OntologyCreateDto.builder() + public static final OntologyCreateDto ONTOLOGY_4_CREATE_DTO = OntologyCreateDto.builder() .prefix(ONTOLOGY_4_PREFIX) .uri(ONTOLOGY_4_URI) .sparqlEndpoint(ONTOLOGY_4_SPARQL_ENDPOINT) .build(); - public final static Long ONTOLOGY_5_ID = 5L; - public final static String ONTOLOGY_5_PREFIX = "db"; - public final static String ONTOLOGY_5_URI = "http://dbpedia.org"; - public final static String ONTOLOGY_5_SPARQL_ENDPOINT = "http://dbpedia.org/sparql"; - public final static UUID ONTOLOGY_5_CREATED_BY = USER_1_ID; + public static final Long ONTOLOGY_5_ID = 5L; + public static final String ONTOLOGY_5_PREFIX = "db"; + public static final String ONTOLOGY_5_URI = "http://dbpedia.org"; + public static final String ONTOLOGY_5_SPARQL_ENDPOINT = "http://dbpedia.org/sparql"; + public static final UUID ONTOLOGY_5_CREATED_BY = USER_1_ID; - public final static Ontology ONTOLOGY_5 = Ontology.builder() + public static final Ontology ONTOLOGY_5 = Ontology.builder() .id(ONTOLOGY_5_ID) .prefix(ONTOLOGY_5_PREFIX) .uri(ONTOLOGY_5_URI) .sparqlEndpoint(ONTOLOGY_5_SPARQL_ENDPOINT) .build(); - public final static OntologyCreateDto ONTOLOGY_5_CREATE_DTO = OntologyCreateDto.builder() + public static final OntologyCreateDto ONTOLOGY_5_CREATE_DTO = OntologyCreateDto.builder() .prefix(ONTOLOGY_5_PREFIX) .uri(ONTOLOGY_5_URI) .sparqlEndpoint(ONTOLOGY_5_SPARQL_ENDPOINT) .build(); - public final static Long COLUMN_8_1_ID = 75L; - public final static Integer COLUMN_8_1_ORDINALPOS = 0; - public final static String COLUMN_8_1_NAME = "ID"; - public final static String COLUMN_8_1_INTERNAL_NAME = "id"; - public final static TableColumnType COLUMN_8_1_TYPE = TableColumnType.BIGINT; - public final static ColumnTypeDto COLUMN_8_1_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Boolean COLUMN_8_1_NULL = false; - public final static Boolean COLUMN_8_1_AUTO_GENERATED = true; - - public final static Long COLUMN_8_2_ID = 76L; - public final static Integer COLUMN_8_2_ORDINALPOS = 1; - public final static String COLUMN_8_2_NAME = "Value"; - public final static String COLUMN_8_2_INTERNAL_NAME = "value"; - public final static TableColumnType COLUMN_8_2_TYPE = TableColumnType.DECIMAL; - public final static ColumnTypeDto COLUMN_8_2_TYPE_DTO = ColumnTypeDto.DECIMAL; - public final static Long COLUMN_8_2_SIZE = 10L; - public final static Long COLUMN_8_2_D = 10L; - public final static Boolean COLUMN_8_2_NULL = false; - public final static Boolean COLUMN_8_2_AUTO_GENERATED = false; - - public final static Long COLUMN_8_3_ID = 77L; - public final static Integer COLUMN_8_3_ORDINALPOS = 2; - public final static String COLUMN_8_3_NAME = "raw"; - public final static String COLUMN_8_3_INTERNAL_NAME = "raw"; - public final static TableColumnType COLUMN_8_3_TYPE = TableColumnType.LONGBLOB; - public final static ColumnTypeDto COLUMN_8_3_TYPE_DTO = ColumnTypeDto.LONGBLOB; - public final static Boolean COLUMN_8_3_NULL = true; - public final static Boolean COLUMN_8_3_AUTO_GENERATED = false; - - public final static ColumnBriefDto TABLE_8_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final Long COLUMN_8_1_ID = 75L; + public static final Integer COLUMN_8_1_ORDINALPOS = 0; + public static final String COLUMN_8_1_NAME = "ID"; + public static final String COLUMN_8_1_INTERNAL_NAME = "id"; + public static final TableColumnType COLUMN_8_1_TYPE = TableColumnType.BIGINT; + public static final ColumnTypeDto COLUMN_8_1_TYPE_DTO = ColumnTypeDto.BIGINT; + public static final Boolean COLUMN_8_1_NULL = false; + public static final Boolean COLUMN_8_1_AUTO_GENERATED = true; + + public static final Long COLUMN_8_2_ID = 76L; + public static final Integer COLUMN_8_2_ORDINALPOS = 1; + public static final String COLUMN_8_2_NAME = "Value"; + public static final String COLUMN_8_2_INTERNAL_NAME = "value"; + public static final TableColumnType COLUMN_8_2_TYPE = TableColumnType.DECIMAL; + public static final ColumnTypeDto COLUMN_8_2_TYPE_DTO = ColumnTypeDto.DECIMAL; + public static final Long COLUMN_8_2_SIZE = 10L; + public static final Long COLUMN_8_2_D = 10L; + public static final Boolean COLUMN_8_2_NULL = false; + public static final Boolean COLUMN_8_2_AUTO_GENERATED = false; + + public static final Long COLUMN_8_3_ID = 77L; + public static final Integer COLUMN_8_3_ORDINALPOS = 2; + public static final String COLUMN_8_3_NAME = "raw"; + public static final String COLUMN_8_3_INTERNAL_NAME = "raw"; + public static final TableColumnType COLUMN_8_3_TYPE = TableColumnType.LONGBLOB; + public static final ColumnTypeDto COLUMN_8_3_TYPE_DTO = ColumnTypeDto.LONGBLOB; + public static final Boolean COLUMN_8_3_NULL = true; + public static final Boolean COLUMN_8_3_AUTO_GENERATED = false; + + public static final ColumnBriefDto TABLE_8_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_8_1_ID) .name(COLUMN_8_1_NAME) .internalName(COLUMN_8_1_INTERNAL_NAME) .columnType(ColumnTypeDto.BIGINT) .build(); - public final static List<TableColumn> TABLE_8_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_8_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_8_1_ID) .ordinalPosition(COLUMN_8_1_ORDINALPOS) .table(TABLE_8) @@ -2774,7 +2750,7 @@ public abstract class BaseTest { .isNullAllowed(COLUMN_8_3_NULL) .build()); - public final static List<ColumnDto> TABLE_8_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_8_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_8_1_ID) .ordinalPosition(COLUMN_8_1_ORDINALPOS) .name(COLUMN_8_1_NAME) @@ -2799,9 +2775,9 @@ public abstract class BaseTest { .isNullAllowed(COLUMN_8_3_NULL) .build()); - public final static Long TABLE_8_DATA_COUNT = 6L; + public static final Long TABLE_8_DATA_COUNT = 6L; @SuppressWarnings("java:S3599") - public final static List<Map<String, Object>> TABLE_8_DATA_DTO = new LinkedList<>(List.of( + public static final List<Map<String, Object>> TABLE_8_DATA_DTO = new LinkedList<>(List.of( new HashMap<>() {{ put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(1L)); put(COLUMN_8_2_INTERNAL_NAME, 11.2); @@ -2835,7 +2811,7 @@ public abstract class BaseTest { )); @SuppressWarnings("java:S3599") - public final static TableStatisticDto TABLE_8_STATISTIC_DTO = TableStatisticDto.builder() + public static final TableStatisticDto TABLE_8_STATISTIC_DTO = TableStatisticDto.builder() .columns(new HashMap<>() {{ put(COLUMN_8_1_INTERNAL_NAME, ColumnStatisticDto.builder() .min(BigDecimal.valueOf(11.2)) @@ -2847,19 +2823,19 @@ public abstract class BaseTest { }}) .build(); - public final static Long QUERY_1_ID = 1L; - public final static String QUERY_1_STATEMENT = "SELECT `id`, `date`, `location`, `mintemp`, `rainfall` FROM `weather_aus` ORDER BY id ASC"; - public final static String QUERY_1_DOI = null; - public final static Long QUERY_1_CONTAINER_ID = CONTAINER_1_ID; - public final static Long QUERY_1_DATABASE_ID = DATABASE_1_ID; - public final static Long QUERY_1_RESULT_NUMBER = 2L; - public final static String QUERY_1_QUERY_HASH = "a3b8ac39e38167d14cf3a9c20a69e4b6954d049525390b973a2c23064953a992"; - public final static String QUERY_1_RESULT_HASH = "8358c8ade4849d2094ab5bb29127afdae57e6bb5acb1db7af603813d406c467a"; - public final static Instant QUERY_1_CREATED = Instant.ofEpochSecond(1677648377L); - public final static Instant QUERY_1_EXECUTION = Instant.now(); - public final static Boolean QUERY_1_PERSISTED = true; + public static final Long QUERY_1_ID = 1L; + public static final String QUERY_1_STATEMENT = "SELECT `id`, `date`, `location`, `mintemp`, `rainfall` FROM `weather_aus` ORDER BY id ASC"; + public static final String QUERY_1_DOI = null; + public static final Long QUERY_1_CONTAINER_ID = CONTAINER_1_ID; + public static final Long QUERY_1_DATABASE_ID = DATABASE_1_ID; + public static final Long QUERY_1_RESULT_NUMBER = 2L; + public static final String QUERY_1_QUERY_HASH = "a3b8ac39e38167d14cf3a9c20a69e4b6954d049525390b973a2c23064953a992"; + public static final String QUERY_1_RESULT_HASH = "8358c8ade4849d2094ab5bb29127afdae57e6bb5acb1db7af603813d406c467a"; + public static final Instant QUERY_1_CREATED = Instant.ofEpochSecond(1677648377L); + public static final Instant QUERY_1_EXECUTION = Instant.now(); + public static final Boolean QUERY_1_PERSISTED = true; - public final static QueryDto QUERY_1_DTO = QueryDto.builder() + public static final QueryDto QUERY_1_DTO = QueryDto.builder() .id(QUERY_1_ID) .databaseId(QUERY_1_DATABASE_ID) .query(QUERY_1_STATEMENT) @@ -2871,7 +2847,7 @@ public abstract class BaseTest { .resultNumber(3L) .build(); - public final static ViewDto QUERY_1_VIEW_DTO = ViewDto.builder() + public static final ViewDto QUERY_1_VIEW_DTO = ViewDto.builder() .vdbid(QUERY_1_DATABASE_ID) .query(QUERY_1_STATEMENT) .queryHash(QUERY_1_QUERY_HASH) @@ -2898,7 +2874,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static QueryBriefDto QUERY_1_BRIEF_DTO = QueryBriefDto.builder() + public static final QueryBriefDto QUERY_1_BRIEF_DTO = QueryBriefDto.builder() .id(QUERY_1_ID) .databaseId(QUERY_1_DATABASE_ID) .query(QUERY_1_STATEMENT) @@ -2910,17 +2886,17 @@ public abstract class BaseTest { .resultNumber(3L) .build(); - public final static Long QUERY_2_ID = 2L; - public final static String QUERY_2_STATEMENT = "SELECT `location` FROM `weather_aus`"; - public final static String QUERY_2_QUERY_HASH = "a2d2dd94ebc7653bb5a3b55dd8ed5e91d3d13c225c6855a1eb4eb7ca14c36ced"; - public final static Long QUERY_2_RESULT_NUMBER = 2L; - public final static String QUERY_2_RESULT_HASH = "ff3f7cbe1b96d296957f6e39e55b8b1b577fa3d205d4795af99594cfd20cb80d"; - public final static Instant QUERY_2_CREATED = Instant.now().minus(2, MINUTES); - public final static Instant QUERY_2_EXECUTION = Instant.now().minus(1, MINUTES); - public final static Instant QUERY_2_LAST_MODIFIED = Instant.ofEpochSecond(1541588352L); - public final static Boolean QUERY_2_PERSISTED = false; + public static final Long QUERY_2_ID = 2L; + public static final String QUERY_2_STATEMENT = "SELECT `location` FROM `weather_aus`"; + public static final String QUERY_2_QUERY_HASH = "a2d2dd94ebc7653bb5a3b55dd8ed5e91d3d13c225c6855a1eb4eb7ca14c36ced"; + public static final Long QUERY_2_RESULT_NUMBER = 2L; + public static final String QUERY_2_RESULT_HASH = "ff3f7cbe1b96d296957f6e39e55b8b1b577fa3d205d4795af99594cfd20cb80d"; + public static final Instant QUERY_2_CREATED = Instant.now().minus(2, MINUTES); + public static final Instant QUERY_2_EXECUTION = Instant.now().minus(1, MINUTES); + public static final Instant QUERY_2_LAST_MODIFIED = Instant.ofEpochSecond(1541588352L); + public static final Boolean QUERY_2_PERSISTED = false; - public final static QueryDto QUERY_2_DTO = QueryDto.builder() + public static final QueryDto QUERY_2_DTO = QueryDto.builder() .id(QUERY_2_ID) .databaseId(DATABASE_2_ID) .query(QUERY_2_STATEMENT) @@ -2934,19 +2910,19 @@ public abstract class BaseTest { .resultNumber(3L) .build(); - public final static Long QUERY_3_ID = 3L; - public final static String QUERY_3_STATEMENT = "SELECT `location`, `mintemp` FROM `weather_aus` WHERE `mintemp` > 10"; - public final static String QUERY_3_QUERY_HASH = "a3d3dd94ebc7653bb5a3b55dd8ed5e91d3d13c335c6855a1eb4eb7ca14c36ced"; - public final static Long QUERY_3_CONTAINER_ID = CONTAINER_1_ID; - public final static Long QUERY_3_DATABASE_ID = DATABASE_1_ID; - public final static String QUERY_3_RESULT_HASH = "ff3f7cbe1b96d396957f6e39e55b8b1b577fa3d305d4795af99594cfd30cb80d"; - public final static Instant QUERY_3_CREATED = Instant.now().minus(3, MINUTES); - public final static Instant QUERY_3_EXECUTION = Instant.now().minus(1, MINUTES); - public final static Instant QUERY_3_LAST_MODIFIED = Instant.ofEpochSecond(1541588353L); - public final static Long QUERY_3_RESULT_NUMBER = 2L; - public final static Boolean QUERY_3_PERSISTED = true; + public static final Long QUERY_3_ID = 3L; + public static final String QUERY_3_STATEMENT = "SELECT `location`, `mintemp` FROM `weather_aus` WHERE `mintemp` > 10"; + public static final String QUERY_3_QUERY_HASH = "a3d3dd94ebc7653bb5a3b55dd8ed5e91d3d13c335c6855a1eb4eb7ca14c36ced"; + public static final Long QUERY_3_CONTAINER_ID = CONTAINER_1_ID; + public static final Long QUERY_3_DATABASE_ID = DATABASE_1_ID; + public static final String QUERY_3_RESULT_HASH = "ff3f7cbe1b96d396957f6e39e55b8b1b577fa3d305d4795af99594cfd30cb80d"; + public static final Instant QUERY_3_CREATED = Instant.now().minus(3, MINUTES); + public static final Instant QUERY_3_EXECUTION = Instant.now().minus(1, MINUTES); + public static final Instant QUERY_3_LAST_MODIFIED = Instant.ofEpochSecond(1541588353L); + public static final Long QUERY_3_RESULT_NUMBER = 2L; + public static final Boolean QUERY_3_PERSISTED = true; - public final static QueryDto QUERY_3_DTO = QueryDto.builder() + public static final QueryDto QUERY_3_DTO = QueryDto.builder() .id(QUERY_3_ID) .databaseId(QUERY_3_DATABASE_ID) .query(QUERY_3_STATEMENT) @@ -2960,18 +2936,18 @@ public abstract class BaseTest { .resultNumber(2L) .build(); - public final static Long QUERY_7_ID = 7L; - public final static String QUERY_7_STATEMENT = "SELECT id, date, a.location, lat, lng FROM weather_aus a JOIN weather_location l on a.location = l.location WHERE date = '2008-12-01'"; - public final static String QUERY_7_QUERY_HASH = "df7da3801dfb5c191ff6711d79ce6455f3c09ec8323ce1ff7208ab85387263f5"; - public final static String QUERY_7_RESULT_HASH = "ff4f7cbe1b96d496957f6e49e55b8b1b577fa4d405d4795af99594cfd40cb80d"; - public final static Instant QUERY_7_CREATED = Instant.now().minus(4, MINUTES); - public final static Instant QUERY_7_EXECUTION = Instant.now().minus(1, MINUTES); - public final static Instant QUERY_7_LAST_MODIFIED = Instant.ofEpochSecond(1541588454L); - public final static Long QUERY_7_RESULT_NUMBER = 6L; - public final static Long QUERY_7_RESULT_ID = 4L; - public final static Boolean QUERY_7_PERSISTED = false; + public static final Long QUERY_7_ID = 7L; + public static final String QUERY_7_STATEMENT = "SELECT id, date, a.location, lat, lng FROM weather_aus a JOIN weather_location l on a.location = l.location WHERE date = '2008-12-01'"; + public static final String QUERY_7_QUERY_HASH = "df7da3801dfb5c191ff6711d79ce6455f3c09ec8323ce1ff7208ab85387263f5"; + public static final String QUERY_7_RESULT_HASH = "ff4f7cbe1b96d496957f6e49e55b8b1b577fa4d405d4795af99594cfd40cb80d"; + public static final Instant QUERY_7_CREATED = Instant.now().minus(4, MINUTES); + public static final Instant QUERY_7_EXECUTION = Instant.now().minus(1, MINUTES); + public static final Instant QUERY_7_LAST_MODIFIED = Instant.ofEpochSecond(1541588454L); + public static final Long QUERY_7_RESULT_NUMBER = 6L; + public static final Long QUERY_7_RESULT_ID = 4L; + public static final Boolean QUERY_7_PERSISTED = false; - public final static QueryDto QUERY_7_DTO = QueryDto.builder() + public static final QueryDto QUERY_7_DTO = QueryDto.builder() .id(QUERY_7_ID) .databaseId(DATABASE_4_ID) .query(QUERY_7_STATEMENT) @@ -2985,20 +2961,20 @@ public abstract class BaseTest { .resultNumber(2L) .build(); - public final static Long QUERY_4_ID = 4L; - public final static String QUERY_4_STATEMENT = "SELECT `id`, `value` FROM `mfcc`"; - public final static String QUERY_4_QUERY_HASH = "df7da3801dfb5c191ff6711d79ce6455f3c09ec8323ce1ff7208ab85387263f5"; - public final static Long QUERY_4_CONTAINER_ID = CONTAINER_3_ID; - public final static Long QUERY_4_DATABASE_ID = DATABASE_3_ID; - public final static String QUERY_4_RESULT_HASH = "ff4f7cbe1b96d496957f6e49e55b8b1b577fa4d405d4795af99594cfd40cb80d"; - public final static Instant QUERY_4_CREATED = Instant.now().minus(4, MINUTES); - public final static Instant QUERY_4_EXECUTION = Instant.now().minus(1, MINUTES); - public final static Instant QUERY_4_LAST_MODIFIED = Instant.ofEpochSecond(1541588454L); - public final static Long QUERY_4_RESULT_NUMBER = 6L; - public final static Long QUERY_4_RESULT_ID = 4L; - public final static Boolean QUERY_4_PERSISTED = false; - - public final static QueryDto QUERY_4 = QueryDto.builder() + public static final Long QUERY_4_ID = 4L; + public static final String QUERY_4_STATEMENT = "SELECT `id`, `value` FROM `mfcc`"; + public static final String QUERY_4_QUERY_HASH = "df7da3801dfb5c191ff6711d79ce6455f3c09ec8323ce1ff7208ab85387263f5"; + public static final Long QUERY_4_CONTAINER_ID = CONTAINER_3_ID; + public static final Long QUERY_4_DATABASE_ID = DATABASE_3_ID; + public static final String QUERY_4_RESULT_HASH = "ff4f7cbe1b96d496957f6e49e55b8b1b577fa4d405d4795af99594cfd40cb80d"; + public static final Instant QUERY_4_CREATED = Instant.now().minus(4, MINUTES); + public static final Instant QUERY_4_EXECUTION = Instant.now().minus(1, MINUTES); + public static final Instant QUERY_4_LAST_MODIFIED = Instant.ofEpochSecond(1541588454L); + public static final Long QUERY_4_RESULT_NUMBER = 6L; + public static final Long QUERY_4_RESULT_ID = 4L; + public static final Boolean QUERY_4_PERSISTED = false; + + public static final QueryDto QUERY_4 = QueryDto.builder() .id(QUERY_4_ID) .query(QUERY_4_STATEMENT) .queryHash(QUERY_4_QUERY_HASH) @@ -3010,7 +2986,7 @@ public abstract class BaseTest { .isPersisted(QUERY_4_PERSISTED) .build(); - public final static List<Map<String, Object>> QUERY_4_RESULT_DTO = new LinkedList<>(List.of( + public static final List<Map<String, Object>> QUERY_4_RESULT_DTO = new LinkedList<>(List.of( new HashMap<>() {{ put("id", BigInteger.valueOf(1L)); put("value", 11.2); @@ -3031,7 +3007,7 @@ public abstract class BaseTest { put("value", 23.1); }})); - public final static QueryDto QUERY_4_DTO = QueryDto.builder() + public static final QueryDto QUERY_4_DTO = QueryDto.builder() .id(QUERY_4_ID) .databaseId(QUERY_4_DATABASE_ID) .query(QUERY_4_STATEMENT) @@ -3044,19 +3020,19 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static Long QUERY_5_ID = 5L; - public final static String QUERY_5_STATEMENT = "SELECT `id`, `value` FROM `mfcc` WHERE `value` > 0"; - public final static String QUERY_5_QUERY_HASH = "6d6dc48b12cdfd959d39a62887334a6bbd529b93eed4f211f3f671bd9e7d6225"; - public final static Long QUERY_5_CONTAINER_ID = CONTAINER_3_ID; - public final static Long QUERY_5_DATABASE_ID = DATABASE_3_ID; - public final static String QUERY_5_RESULT_HASH = "ff5f7cbe1b96d596957f6e59e55b8b1b577fa5d505d5795af99595cfd50cb80d"; - public final static Instant QUERY_5_CREATED = Instant.now().minus(5, MINUTES); - public final static Instant QUERY_5_EXECUTION = Instant.now().minus(1, MINUTES); - public final static Instant QUERY_5_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L); - public final static Long QUERY_5_RESULT_NUMBER = 6L; - public final static Boolean QUERY_5_PERSISTED = true; + public static final Long QUERY_5_ID = 5L; + public static final String QUERY_5_STATEMENT = "SELECT `id`, `value` FROM `mfcc` WHERE `value` > 0"; + public static final String QUERY_5_QUERY_HASH = "6d6dc48b12cdfd959d39a62887334a6bbd529b93eed4f211f3f671bd9e7d6225"; + public static final Long QUERY_5_CONTAINER_ID = CONTAINER_3_ID; + public static final Long QUERY_5_DATABASE_ID = DATABASE_3_ID; + public static final String QUERY_5_RESULT_HASH = "ff5f7cbe1b96d596957f6e59e55b8b1b577fa5d505d5795af99595cfd50cb80d"; + public static final Instant QUERY_5_CREATED = Instant.now().minus(5, MINUTES); + public static final Instant QUERY_5_EXECUTION = Instant.now().minus(1, MINUTES); + public static final Instant QUERY_5_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L); + public static final Long QUERY_5_RESULT_NUMBER = 6L; + public static final Boolean QUERY_5_PERSISTED = true; - public final static QueryDto QUERY_5_DTO = QueryDto.builder() + public static final QueryDto QUERY_5_DTO = QueryDto.builder() .id(QUERY_5_ID) .databaseId(QUERY_5_DATABASE_ID) .query(QUERY_5_STATEMENT) @@ -3069,7 +3045,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static ViewDto QUERY_5_VIEW_DTO = ViewDto.builder() + public static final ViewDto QUERY_5_VIEW_DTO = ViewDto.builder() .vdbid(DATABASE_3_ID) .query(QUERY_5_STATEMENT) .queryHash(QUERY_5_QUERY_HASH) @@ -3084,7 +3060,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static List<Map<String, Object>> QUERY_5_RESULT_DTO = new LinkedList<>(List.of( + public static final List<Map<String, Object>> QUERY_5_RESULT_DTO = new LinkedList<>(List.of( Map.of("id", BigInteger.valueOf(1L), "value", 11.2), Map.of("id", BigInteger.valueOf(2L), "value", 11.3), Map.of("id", BigInteger.valueOf(3L), "value", 11.4), @@ -3093,17 +3069,17 @@ public abstract class BaseTest { Map.of("id", BigInteger.valueOf(6L), "value", 23.1) )); - public final static Long QUERY_6_ID = 6L; - public final static String QUERY_6_STATEMENT = "SELECT `location` FROM `weather_aus` WHERE `id` = 1"; - public final static String QUERY_6_QUERY_HASH = "6d6dc48b12cdfd959d39a62887334a6bbd529b93eed4f211f3f671bd9e7d6225"; - public final static String QUERY_6_RESULT_HASH = "ff5f7cbe1b96d596957f6e59e55b8b1b577fa5d505d5795af99595cfd50cb80d"; - public final static Instant QUERY_6_CREATED = Instant.now().minus(5, MINUTES); - public final static Instant QUERY_6_EXECUTION = Instant.now().minus(1, MINUTES); - public final static Instant QUERY_6_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L); - public final static Long QUERY_6_RESULT_NUMBER = 1L; - public final static Boolean QUERY_6_PERSISTED = true; - - public final static QueryDto QUERY_6_DTO = QueryDto.builder() + public static final Long QUERY_6_ID = 6L; + public static final String QUERY_6_STATEMENT = "SELECT `location` FROM `weather_aus` WHERE `id` = 1"; + public static final String QUERY_6_QUERY_HASH = "6d6dc48b12cdfd959d39a62887334a6bbd529b93eed4f211f3f671bd9e7d6225"; + public static final String QUERY_6_RESULT_HASH = "ff5f7cbe1b96d596957f6e59e55b8b1b577fa5d505d5795af99595cfd50cb80d"; + public static final Instant QUERY_6_CREATED = Instant.now().minus(5, MINUTES); + public static final Instant QUERY_6_EXECUTION = Instant.now().minus(1, MINUTES); + public static final Instant QUERY_6_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L); + public static final Long QUERY_6_RESULT_NUMBER = 1L; + public static final Boolean QUERY_6_PERSISTED = true; + + public static final QueryDto QUERY_6_DTO = QueryDto.builder() .id(QUERY_6_ID) .databaseId(DATABASE_2_ID) .query(QUERY_6_STATEMENT) @@ -3116,24 +3092,24 @@ public abstract class BaseTest { .isPersisted(QUERY_6_PERSISTED) .build(); - public final static ColumnBriefDto TABLE_1_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_1_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(1L) .name("id") .internalName("id") .columnType(ColumnTypeDto.BIGINT) .build(); - public final static Long COLUMN_1_1_ID = 1L; + public static final Long COLUMN_1_1_ID = 1L; - public final static Long COLUMN_1_2_ID = 2L; + public static final Long COLUMN_1_2_ID = 2L; - public final static Long COLUMN_1_3_ID = 3L; + public static final Long COLUMN_1_3_ID = 3L; - public final static Long COLUMN_1_4_ID = 4L; + public static final Long COLUMN_1_4_ID = 4L; - public final static Long COLUMN_1_5_ID = 5L; + public static final Long COLUMN_1_5_ID = 5L; - public final static List<TableColumn> TABLE_1_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_1_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_1_1_ID) .ordinalPosition(0) .table(TABLE_1) @@ -3186,7 +3162,7 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static List<CreateTableColumnDto> TABLE_1_COLUMNS_CREATE_DTO = List.of(CreateTableColumnDto.builder() + public static final List<CreateTableColumnDto> TABLE_1_COLUMNS_CREATE_DTO = List.of(CreateTableColumnDto.builder() .name("id") .type(ColumnTypeDto.BIGINT) .nullAllowed(false) @@ -3221,48 +3197,48 @@ public abstract class BaseTest { .unitUri(UNIT_1_URI) .build()); - public final static CreateTableConstraintsDto TABLE_1_CONSTRAINTS_CREATE_DTO = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_1_CONSTRAINTS_CREATE_DTO = CreateTableConstraintsDto.builder() .checks(new LinkedHashSet<>()) .primaryKey(new LinkedHashSet<>(List.of("id"))) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>(List.of(List.of("date")))) .build(); - public final static CreateTableConstraintsDto TABLE_1_CONSTRAINTS_CREATE_INVALID_DTO = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_1_CONSTRAINTS_CREATE_INVALID_DTO = CreateTableConstraintsDto.builder() .checks(new LinkedHashSet<>()) .primaryKey(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>(List.of(List.of("date")))) .build(); - public final static CreateTableDto TABLE_1_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_1_CREATE_DTO = CreateTableDto.builder() .name(TABLE_1_NAME) .description(TABLE_1_DESCRIPTION) .columns(TABLE_1_COLUMNS_CREATE_DTO) .constraints(TABLE_1_CONSTRAINTS_CREATE_DTO) .build(); - public final static at.tuwien.api.database.table.internal.TableCreateDto TABLE_1_CREATE_INTERNAL_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() + public static final at.tuwien.api.database.table.internal.TableCreateDto TABLE_1_CREATE_INTERNAL_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() .name(TABLE_1_NAME) .description(TABLE_1_DESCRIPTION) .columns(TABLE_1_COLUMNS_CREATE_DTO) .constraints(TABLE_1_CONSTRAINTS_CREATE_DTO) .build(); - public final static at.tuwien.api.database.table.internal.TableCreateDto TABLE_1_CREATE_INTERNAL_INVALID_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() + public static final at.tuwien.api.database.table.internal.TableCreateDto TABLE_1_CREATE_INTERNAL_INVALID_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() .name(TABLE_1_NAME) .description(TABLE_1_DESCRIPTION) .columns(TABLE_1_COLUMNS_CREATE_DTO) .constraints(TABLE_1_CONSTRAINTS_CREATE_INVALID_DTO) .build(); - public final static Long COLUMN_2_1_ID = 6L; + public static final Long COLUMN_2_1_ID = 6L; - public final static Long COLUMN_2_2_ID = 7L; + public static final Long COLUMN_2_2_ID = 7L; - public final static Long COLUMN_2_3_ID = 8L; + public static final Long COLUMN_2_3_ID = 8L; - public final static List<TableColumn> TABLE_2_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_2_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_2_1_ID) .ordinalPosition(0) .table(TABLE_2) @@ -3301,21 +3277,21 @@ public abstract class BaseTest { .sets(null) .build()); - public final static ColumnBriefDto TABLE_2_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_2_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_2_1_ID) .name("location") .internalName("location") .columnType(ColumnTypeDto.VARCHAR) .build(); - public final static ColumnBriefDto TABLE_2_COLUMNS_BRIEF_2_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_2_COLUMNS_BRIEF_2_DTO = ColumnBriefDto.builder() .id(COLUMN_2_3_ID) .name("lng") .internalName("lng") .columnType(ColumnTypeDto.DECIMAL) .build(); - public final static List<ColumnDto> TABLE_2_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_2_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_2_1_ID) .tableId(TABLE_2_ID) .databaseId(DATABASE_1_ID) @@ -3355,7 +3331,7 @@ public abstract class BaseTest { .sets(null) .build()); - public final static List<ColumnBriefDto> TABLE_2_COLUMNS_BRIEF_DTO = List.of(ColumnBriefDto.builder() + public static final List<ColumnBriefDto> TABLE_2_COLUMNS_BRIEF_DTO = List.of(ColumnBriefDto.builder() .id(COLUMN_2_1_ID) .tableId(TABLE_2_ID) .databaseId(DATABASE_1_ID) @@ -3380,84 +3356,84 @@ public abstract class BaseTest { .columnType(ColumnTypeDto.DOUBLE) .build()); - public final static Long COLUMN_3_1_ID = 9L; + public static final Long COLUMN_3_1_ID = 9L; - public final static Long COLUMN_3_2_ID = 10L; + public static final Long COLUMN_3_2_ID = 10L; - public final static Long COLUMN_3_3_ID = 11L; + public static final Long COLUMN_3_3_ID = 11L; - public final static Long COLUMN_3_4_ID = 12L; + public static final Long COLUMN_3_4_ID = 12L; - public final static Long COLUMN_3_5_ID = 13L; + public static final Long COLUMN_3_5_ID = 13L; - public final static Long COLUMN_3_6_ID = 14L; + public static final Long COLUMN_3_6_ID = 14L; - public final static Long COLUMN_3_7_ID = 15L; + public static final Long COLUMN_3_7_ID = 15L; - public final static Long COLUMN_3_8_ID = 16L; + public static final Long COLUMN_3_8_ID = 16L; - public final static Long COLUMN_3_9_ID = 17L; + public static final Long COLUMN_3_9_ID = 17L; - public final static Long COLUMN_3_10_ID = 18L; + public static final Long COLUMN_3_10_ID = 18L; - public final static Long COLUMN_3_11_ID = 19L; + public static final Long COLUMN_3_11_ID = 19L; - public final static Long COLUMN_3_12_ID = 20L; + public static final Long COLUMN_3_12_ID = 20L; - public final static Long COLUMN_3_13_ID = 21L; + public static final Long COLUMN_3_13_ID = 21L; - public final static Long COLUMN_3_14_ID = 22L; + public static final Long COLUMN_3_14_ID = 22L; - public final static Long COLUMN_3_15_ID = 23L; + public static final Long COLUMN_3_15_ID = 23L; - public final static Long COLUMN_3_16_ID = 24L; + public static final Long COLUMN_3_16_ID = 24L; - public final static Long COLUMN_3_17_ID = 25L; + public static final Long COLUMN_3_17_ID = 25L; - public final static Long COLUMN_3_18_ID = 26L; + public static final Long COLUMN_3_18_ID = 26L; - public final static Long COLUMN_3_19_ID = 27L; + public static final Long COLUMN_3_19_ID = 27L; - public final static Long COLUMN_3_20_ID = 28L; + public static final Long COLUMN_3_20_ID = 28L; - public final static Long COLUMN_3_21_ID = 29L; + public static final Long COLUMN_3_21_ID = 29L; - public final static Long COLUMN_3_22_ID = 30L; + public static final Long COLUMN_3_22_ID = 30L; - public final static Long COLUMN_3_23_ID = 31L; + public static final Long COLUMN_3_23_ID = 31L; - public final static Long COLUMN_3_24_ID = 32L; + public static final Long COLUMN_3_24_ID = 32L; - public final static Long COLUMN_3_25_ID = 33L; + public static final Long COLUMN_3_25_ID = 33L; - public final static Long COLUMN_3_26_ID = 34L; + public static final Long COLUMN_3_26_ID = 34L; - public final static Long COLUMN_3_27_ID = 35L; + public static final Long COLUMN_3_27_ID = 35L; - public final static Long COLUMN_3_28_ID = 36L; + public static final Long COLUMN_3_28_ID = 36L; - public final static Long COLUMN_3_29_ID = 37L; + public static final Long COLUMN_3_29_ID = 37L; - public final static Long COLUMN_3_30_ID = 38L; + public static final Long COLUMN_3_30_ID = 38L; - public final static Long COLUMN_3_31_ID = 39L; + public static final Long COLUMN_3_31_ID = 39L; - public final static Long COLUMN_3_32_ID = 40L; + public static final Long COLUMN_3_32_ID = 40L; - public final static Long COLUMN_3_33_ID = 41L; + public static final Long COLUMN_3_33_ID = 41L; - public final static Long COLUMN_3_34_ID = 42L; + public static final Long COLUMN_3_34_ID = 42L; - public final static Long COLUMN_3_35_ID = 43L; + public static final Long COLUMN_3_35_ID = 43L; - public final static ColumnBriefDto TABLE_3_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_3_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_3_1_ID) .columnType(ColumnTypeDto.BIGINT) .name("id") .internalName("id") .build(); - public final static List<TableColumn> TABLE_3_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_3_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_3_1_ID) .table(TABLE_3) .ordinalPosition(0) @@ -3843,7 +3819,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build()); - public final static List<ColumnDto> TABLE_3_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_3_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_3_1_ID) .tableId(TABLE_3_ID) .databaseId(DATABASE_1_ID) @@ -4229,56 +4205,56 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build()); - public final static Long COLUMN_5_1_ID = 46L; + public static final Long COLUMN_5_1_ID = 46L; - public final static Long COLUMN_5_2_ID = 47L; + public static final Long COLUMN_5_2_ID = 47L; - public final static Long COLUMN_5_3_ID = 48L; + public static final Long COLUMN_5_3_ID = 48L; - public final static Long COLUMN_5_4_ID = 49L; + public static final Long COLUMN_5_4_ID = 49L; - public final static Long COLUMN_5_5_ID = 50L; + public static final Long COLUMN_5_5_ID = 50L; - public final static Long COLUMN_5_6_ID = 51L; + public static final Long COLUMN_5_6_ID = 51L; - public final static Long COLUMN_5_7_ID = 52L; + public static final Long COLUMN_5_7_ID = 52L; - public final static Long COLUMN_5_8_ID = 53L; + public static final Long COLUMN_5_8_ID = 53L; - public final static Long COLUMN_5_9_ID = 54L; + public static final Long COLUMN_5_9_ID = 54L; - public final static Long COLUMN_5_10_ID = 55L; + public static final Long COLUMN_5_10_ID = 55L; - public final static Long COLUMN_5_11_ID = 56L; + public static final Long COLUMN_5_11_ID = 56L; - public final static Long COLUMN_5_12_ID = 57L; + public static final Long COLUMN_5_12_ID = 57L; - public final static Long COLUMN_5_13_ID = 58L; + public static final Long COLUMN_5_13_ID = 58L; - public final static Long COLUMN_5_14_ID = 59L; + public static final Long COLUMN_5_14_ID = 59L; - public final static Long COLUMN_5_15_ID = 60L; + public static final Long COLUMN_5_15_ID = 60L; - public final static Long COLUMN_5_16_ID = 61L; + public static final Long COLUMN_5_16_ID = 61L; - public final static Long COLUMN_5_17_ID = 62L; + public static final Long COLUMN_5_17_ID = 62L; - public final static Long COLUMN_5_18_ID = 63L; + public static final Long COLUMN_5_18_ID = 63L; - public final static Long COLUMN_5_19_ID = 64L; + public static final Long COLUMN_5_19_ID = 64L; - public final static Long COLUMN_5_20_ID = 65L; + public static final Long COLUMN_5_20_ID = 65L; - public final static Long COLUMN_5_21_ID = 66L; + public static final Long COLUMN_5_21_ID = 66L; - public final static ColumnBriefDto TABLE_5_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_5_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_5_1_ID) .name("id") .internalName("id") .columnType(ColumnTypeDto.BIGINT) .build(); - public final static List<TableColumn> TABLE_5_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_5_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_5_1_ID) .ordinalPosition(0) .table(TABLE_5) @@ -4468,7 +4444,7 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static List<ColumnDto> TABLE_5_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_5_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_5_1_ID) .ordinalPosition(0) .tableId(TABLE_5_ID) @@ -4658,17 +4634,17 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static List<CreateForeignKeyDto> TABLE_5_FOREIGN_KEYS_INVALID_CREATE = List.of(CreateForeignKeyDto.builder() + public static final List<CreateForeignKeyDto> TABLE_5_FOREIGN_KEYS_INVALID_CREATE = List.of(CreateForeignKeyDto.builder() .columns(new LinkedList<>(List.of("somecolumn"))) .referencedTable("sometable") .referencedColumns(new LinkedList<>(List.of("someothercolumn"))) .build()); - public final static CreateTableConstraintsDto TABLE_5_CONSTRAINTS_INVALID_CREATE = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_5_CONSTRAINTS_INVALID_CREATE = CreateTableConstraintsDto.builder() .foreignKeys(TABLE_5_FOREIGN_KEYS_INVALID_CREATE) .build(); - public final static List<CreateTableColumnDto> TABLE_5_COLUMNS_CREATE = List.of(CreateTableColumnDto.builder() + public static final List<CreateTableColumnDto> TABLE_5_COLUMNS_CREATE = List.of(CreateTableColumnDto.builder() .name("id") .type(ColumnTypeDto.BIGINT) .nullAllowed(false) @@ -4774,28 +4750,28 @@ public abstract class BaseTest { .nullAllowed(true) .build()); - public final static CreateTableConstraintsDto TABLE_5_CREATE_CONSTRAINTS_DTO = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_5_CREATE_CONSTRAINTS_DTO = CreateTableConstraintsDto.builder() .primaryKey(Set.of("id")) .uniques(new LinkedList<>(List.of(List.of("id")))) .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .build(); - public final static CreateTableDto TABLE_5_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_5_CREATE_DTO = CreateTableDto.builder() .name(TABLE_5_NAME) .description(TABLE_5_DESCRIPTION) .columns(TABLE_5_COLUMNS_CREATE) .constraints(TABLE_5_CREATE_CONSTRAINTS_DTO) .build(); - public final static CreateTableDto TABLE_5_INVALID_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_5_INVALID_CREATE_DTO = CreateTableDto.builder() .name(TABLE_5_NAME) .description(TABLE_5_DESCRIPTION) .columns(TABLE_5_COLUMNS_CREATE) .constraints(TABLE_5_CONSTRAINTS_INVALID_CREATE) .build(); - public final static List<TableColumn> TABLE_6_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_6_COLUMNS = List.of(TableColumn.builder() .id(67L) .ordinalPosition(0) .table(TABLE_6) @@ -4850,14 +4826,14 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static ColumnBriefDto TABLE_6_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_6_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(67L) .name("id") .internalName("id") .columnType(ColumnTypeDto.BIGINT) .build(); - public final static List<ColumnDto> TABLE_6_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_6_COLUMNS_DTO = List.of(ColumnDto.builder() .id(67L) .ordinalPosition(0) .tableId(TABLE_6_ID) @@ -4912,25 +4888,25 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static List<List<String>> TABLE_6_UNIQUES_CREATE = List.of( + public static final List<List<String>> TABLE_6_UNIQUES_CREATE = List.of( List.of("firstname", "lastname")); - public final static List<CreateForeignKeyDto> TABLE_6_FOREIGN_KEYS_CREATE = List.of(CreateForeignKeyDto.builder() + public static final List<CreateForeignKeyDto> TABLE_6_FOREIGN_KEYS_CREATE = List.of(CreateForeignKeyDto.builder() .columns(new LinkedList<>(List.of("ref_id"))) .referencedTable("zoo") .referencedColumns(new LinkedList<>(List.of("id"))) .build()); - public final static Set<String> TABLE_6_CHECKS_CREATE = Set.of("firstname != lastname"); + public static final Set<String> TABLE_6_CHECKS_CREATE = Set.of("firstname != lastname"); - public final static CreateTableConstraintsDto TABLE_6_CONSTRAINTS_CREATE = CreateTableConstraintsDto.builder() + public static final CreateTableConstraintsDto TABLE_6_CONSTRAINTS_CREATE = CreateTableConstraintsDto.builder() .uniques(TABLE_6_UNIQUES_CREATE) .foreignKeys(TABLE_6_FOREIGN_KEYS_CREATE) .checks(TABLE_6_CHECKS_CREATE) .primaryKey(Set.of("id")) .build(); - public final static List<CreateTableColumnDto> TABLE_6_COLUMNS_CREATE = List.of( + public static final List<CreateTableColumnDto> TABLE_6_COLUMNS_CREATE = List.of( CreateTableColumnDto.builder() .name("name_id") .type(ColumnTypeDto.BIGINT) @@ -4943,32 +4919,32 @@ public abstract class BaseTest { .nullAllowed(false) .build()); - public final static CreateTableDto TABLE_6_CREATE_DTO = CreateTableDto.builder() + public static final CreateTableDto TABLE_6_CREATE_DTO = CreateTableDto.builder() .name(TABLE_6_NAME) .description(TABLE_6_DESCRIPTION) .columns(TABLE_6_COLUMNS_CREATE) .constraints(TABLE_6_CONSTRAINTS_CREATE) .build(); - public final static Long COLUMN_7_1_ID = 73L; + public static final Long COLUMN_7_1_ID = 73L; - public final static Long COLUMN_7_2_ID = 74L; + public static final Long COLUMN_7_2_ID = 74L; - public final static ColumnBriefDto TABLE_7_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_7_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_7_1_ID) .name("name_id") .internalName("name_id") .columnType(ColumnTypeDto.BIGINT) .build(); - public final static ColumnBriefDto TABLE_7_COLUMNS_BRIEF_1_DTO = ColumnBriefDto.builder() + public static final ColumnBriefDto TABLE_7_COLUMNS_BRIEF_1_DTO = ColumnBriefDto.builder() .id(COLUMN_7_2_ID) .name("zoo_id") .internalName("zoo_id") .columnType(ColumnTypeDto.BIGINT) .build(); - public final static List<TableColumn> TABLE_7_COLUMNS = List.of(TableColumn.builder() + public static final List<TableColumn> TABLE_7_COLUMNS = List.of(TableColumn.builder() .id(COLUMN_7_1_ID) .ordinalPosition(0) .table(TABLE_7) @@ -4987,7 +4963,7 @@ public abstract class BaseTest { .isNullAllowed(false) .build()); - public final static List<ColumnDto> TABLE_7_COLUMNS_DTO = List.of(ColumnDto.builder() + public static final List<ColumnDto> TABLE_7_COLUMNS_DTO = List.of(ColumnDto.builder() .id(COLUMN_7_1_ID) .ordinalPosition(0) .tableId(TABLE_7_ID) @@ -5006,18 +4982,18 @@ public abstract class BaseTest { .isNullAllowed(false) .build()); - public final static Long VIEW_1_ID = 1L; - public final static Boolean VIEW_1_INITIAL_VIEW = false; - public final static String VIEW_1_NAME = "JUnit"; - public final static String VIEW_1_INTERNAL_NAME = "junit"; - public final static Long VIEW_1_CONTAINER_ID = CONTAINER_1_ID; - public final static Long VIEW_1_DATABASE_ID = DATABASE_1_ID; - public final static Boolean VIEW_1_PUBLIC = false; - public final static Boolean VIEW_1_SCHEMA_PUBLIC = false; - public final static String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`"; - public final static String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23"; - - public final static List<ViewColumnDto> VIEW_1_COLUMNS_DTO = List.of( + public static final Long VIEW_1_ID = 1L; + public static final Boolean VIEW_1_INITIAL_VIEW = false; + public static final String VIEW_1_NAME = "JUnit"; + public static final String VIEW_1_INTERNAL_NAME = "junit"; + public static final Long VIEW_1_CONTAINER_ID = CONTAINER_1_ID; + public static final Long VIEW_1_DATABASE_ID = DATABASE_1_ID; + public static final Boolean VIEW_1_PUBLIC = false; + public static final Boolean VIEW_1_SCHEMA_PUBLIC = false; + public static final String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`"; + public static final String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23"; + + public static final List<ViewColumnDto> VIEW_1_COLUMNS_DTO = List.of( ViewColumnDto.builder() .id(1L) .ordinalPosition(0) @@ -5052,7 +5028,7 @@ public abstract class BaseTest { .build() ); - public final static View VIEW_1 = View.builder() + public static final View VIEW_1 = View.builder() .id(VIEW_1_ID) .isInitialView(VIEW_1_INITIAL_VIEW) .name(VIEW_1_NAME) @@ -5068,8 +5044,8 @@ public abstract class BaseTest { .columns(null) /* VIEW_1_COLUMNS */ .build(); - public final static Long VIEW_1_DATA_COUNT = 3L; - public final static List<Map<String, Object>> VIEW_1_DATA_DTO = new LinkedList<>(List.of( + public static final Long VIEW_1_DATA_COUNT = 3L; + public static final List<Map<String, Object>> VIEW_1_DATA_DTO = new LinkedList<>(List.of( new HashMap<>() {{ put("location", "Albury"); put("lat", -36.0653583); @@ -5087,7 +5063,7 @@ public abstract class BaseTest { }} )); - public final static List<ViewColumn> VIEW_1_COLUMNS = List.of( + public static final List<ViewColumn> VIEW_1_COLUMNS = List.of( ViewColumn.builder() .id(1L) .ordinalPosition(0) @@ -5122,7 +5098,7 @@ public abstract class BaseTest { .build() ); - public final static ViewDto VIEW_1_DTO = ViewDto.builder() + public static final ViewDto VIEW_1_DTO = ViewDto.builder() .id(VIEW_1_ID) .isInitialView(VIEW_1_INITIAL_VIEW) .name(VIEW_1_NAME) @@ -5137,7 +5113,7 @@ public abstract class BaseTest { .columns(VIEW_1_COLUMNS_DTO) .build(); - public final static ViewDto VIEW_1_PRIVILEGED_DTO = ViewDto.builder() + public static final ViewDto VIEW_1_PRIVILEGED_DTO = ViewDto.builder() .id(VIEW_1_ID) .isInitialView(VIEW_1_INITIAL_VIEW) .name(VIEW_1_NAME) @@ -5152,7 +5128,7 @@ public abstract class BaseTest { .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); - public final static ViewBriefDto VIEW_1_BRIEF_DTO = ViewBriefDto.builder() + public static final ViewBriefDto VIEW_1_BRIEF_DTO = ViewBriefDto.builder() .id(VIEW_1_ID) .isInitialView(VIEW_1_INITIAL_VIEW) .name(VIEW_1_NAME) @@ -5165,24 +5141,24 @@ public abstract class BaseTest { .queryHash(VIEW_1_QUERY_HASH) .build(); - public final static CreateViewDto VIEW_1_CREATE_DTO = CreateViewDto.builder() + public static final CreateViewDto VIEW_1_CREATE_DTO = CreateViewDto.builder() .isPublic(VIEW_1_PUBLIC) .name(VIEW_1_NAME) .query(VIEW_1_QUERY) .build(); - public final static Long VIEW_2_ID = 2L; - public final static Boolean VIEW_2_INITIAL_VIEW = false; - public final static String VIEW_2_NAME = "JUnit2"; - public final static String VIEW_2_INTERNAL_NAME = "junit2"; - public final static Long VIEW_2_CONTAINER_ID = CONTAINER_1_ID; - public final static Long VIEW_2_DATABASE_ID = DATABASE_1_ID; - public final static Boolean VIEW_2_PUBLIC = true; - public final static Boolean VIEW_2_SCHEMA_PUBLIC = true; - public final static String VIEW_2_QUERY = "select `date`, `location` as loc, `mintemp`, `rainfall` from `weather_aus` where `location` = 'Albury'"; - public final static String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984"; + public static final Long VIEW_2_ID = 2L; + public static final Boolean VIEW_2_INITIAL_VIEW = false; + public static final String VIEW_2_NAME = "JUnit2"; + public static final String VIEW_2_INTERNAL_NAME = "junit2"; + public static final Long VIEW_2_CONTAINER_ID = CONTAINER_1_ID; + public static final Long VIEW_2_DATABASE_ID = DATABASE_1_ID; + public static final Boolean VIEW_2_PUBLIC = true; + public static final Boolean VIEW_2_SCHEMA_PUBLIC = true; + public static final String VIEW_2_QUERY = "select `date`, `location` as loc, `mintemp`, `rainfall` from `weather_aus` where `location` = 'Albury'"; + public static final String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984"; - public final static List<ViewColumnDto> VIEW_2_COLUMNS_DTO = List.of( + public static final List<ViewColumnDto> VIEW_2_COLUMNS_DTO = List.of( ViewColumnDto.builder() .id(4L) .databaseId(DATABASE_1_ID) @@ -5226,7 +5202,7 @@ public abstract class BaseTest { .build() ); - public final static View VIEW_2 = View.builder() + public static final View VIEW_2 = View.builder() .id(VIEW_2_ID) .isInitialView(VIEW_2_INITIAL_VIEW) .name(VIEW_2_NAME) @@ -5241,7 +5217,7 @@ public abstract class BaseTest { .owner(USER_1) .build(); - public final static List<ViewColumn> VIEW_2_COLUMNS = List.of( + public static final List<ViewColumn> VIEW_2_COLUMNS = List.of( ViewColumn.builder() .id(4L) .ordinalPosition(0) @@ -5285,7 +5261,7 @@ public abstract class BaseTest { .build() ); - public final static ViewDto VIEW_2_DTO = ViewDto.builder() + public static final ViewDto VIEW_2_DTO = ViewDto.builder() .id(VIEW_2_ID) .isInitialView(VIEW_2_INITIAL_VIEW) .name(VIEW_2_NAME) @@ -5299,7 +5275,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static ViewDto VIEW_2_PRIVILEGED_DTO = ViewDto.builder() + public static final ViewDto VIEW_2_PRIVILEGED_DTO = ViewDto.builder() .id(VIEW_2_ID) .isInitialView(VIEW_2_INITIAL_VIEW) .name(VIEW_2_NAME) @@ -5315,7 +5291,7 @@ public abstract class BaseTest { .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); - public final static ViewBriefDto VIEW_2_BRIEF_DTO = ViewBriefDto.builder() + public static final ViewBriefDto VIEW_2_BRIEF_DTO = ViewBriefDto.builder() .id(VIEW_2_ID) .isInitialView(VIEW_2_INITIAL_VIEW) .name(VIEW_2_NAME) @@ -5328,20 +5304,20 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static Long VIEW_3_ID = 3L; - public final static Boolean VIEW_3_INITIAL_VIEW = false; - public final static String VIEW_3_NAME = "JUnit3"; - public final static String VIEW_3_INTERNAL_NAME = "junit3"; - public final static Long VIEW_3_CONTAINER_ID = CONTAINER_1_ID; - public final static Long VIEW_3_DATABASE_ID = DATABASE_1_ID; - public final static Boolean VIEW_3_PUBLIC = true; - public final static Boolean VIEW_3_SCHEMA_PUBLIC = false; - public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`"; - public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255"; + public static final Long VIEW_3_ID = 3L; + public static final Boolean VIEW_3_INITIAL_VIEW = false; + public static final String VIEW_3_NAME = "JUnit3"; + public static final String VIEW_3_INTERNAL_NAME = "junit3"; + public static final Long VIEW_3_CONTAINER_ID = CONTAINER_1_ID; + public static final Long VIEW_3_DATABASE_ID = DATABASE_1_ID; + public static final Boolean VIEW_3_PUBLIC = true; + public static final Boolean VIEW_3_SCHEMA_PUBLIC = false; + public static final String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`"; + public static final String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255"; - public final static Long VIEW_3_DATA_COUNT = 3L; + public static final Long VIEW_3_DATA_COUNT = 3L; - public final static List<ViewColumnDto> VIEW_3_COLUMNS_DTO = List.of( + public static final List<ViewColumnDto> VIEW_3_COLUMNS_DTO = List.of( ViewColumnDto.builder() .id(8L) .databaseId(DATABASE_1_ID) @@ -5385,7 +5361,7 @@ public abstract class BaseTest { .build() ); - public final static View VIEW_3 = View.builder() + public static final View VIEW_3 = View.builder() .id(VIEW_3_ID) .isInitialView(VIEW_3_INITIAL_VIEW) .name(VIEW_3_NAME) @@ -5400,7 +5376,7 @@ public abstract class BaseTest { .owner(USER_1) .build(); - public final static ViewDto VIEW_3_PRIVILEGED_DTO = ViewDto.builder() + public static final ViewDto VIEW_3_PRIVILEGED_DTO = ViewDto.builder() .id(VIEW_3_ID) .isInitialView(VIEW_3_INITIAL_VIEW) .name(VIEW_3_NAME) @@ -5416,7 +5392,7 @@ public abstract class BaseTest { .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); - public final static List<ViewColumn> VIEW_3_COLUMNS = List.of( + public static final List<ViewColumn> VIEW_3_COLUMNS = List.of( ViewColumn.builder() .id(8L) .ordinalPosition(0) @@ -5460,7 +5436,7 @@ public abstract class BaseTest { .build() ); - public final static ViewDto VIEW_3_DTO = ViewDto.builder() + public static final ViewDto VIEW_3_DTO = ViewDto.builder() .id(VIEW_3_ID) .isInitialView(VIEW_3_INITIAL_VIEW) .name(VIEW_3_NAME) @@ -5474,7 +5450,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static ViewBriefDto VIEW_3_BRIEF_DTO = ViewBriefDto.builder() + public static final ViewBriefDto VIEW_3_BRIEF_DTO = ViewBriefDto.builder() .id(VIEW_3_ID) .isInitialView(VIEW_3_INITIAL_VIEW) .name(VIEW_3_NAME) @@ -5487,20 +5463,20 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static Long VIEW_4_ID = 4L; - public final static Boolean VIEW_4_INITIAL_VIEW = false; - public final static String VIEW_4_NAME = "Mock View"; - public final static String VIEW_4_INTERNAL_NAME = "mock_view"; - public final static Long VIEW_4_CONTAINER_ID = CONTAINER_2_ID; - public final static Long VIEW_4_DATABASE_ID = DATABASE_2_ID; - public final static Long VIEW_4_TABLE_ID = TABLE_5_ID; - public final static Table VIEW_4_TABLE = TABLE_5; - public final static Boolean VIEW_4_PUBLIC = true; - public final static Boolean VIEW_4_SCHEMA_PUBLIC = false; - public final static String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1"; - public final static String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b"; - - public final static List<ViewColumnDto> VIEW_4_COLUMNS_DTO = List.of( + public static final Long VIEW_4_ID = 4L; + public static final Boolean VIEW_4_INITIAL_VIEW = false; + public static final String VIEW_4_NAME = "Mock View"; + public static final String VIEW_4_INTERNAL_NAME = "mock_view"; + public static final Long VIEW_4_CONTAINER_ID = CONTAINER_2_ID; + public static final Long VIEW_4_DATABASE_ID = DATABASE_2_ID; + public static final Long VIEW_4_TABLE_ID = TABLE_5_ID; + public static final Table VIEW_4_TABLE = TABLE_5; + public static final Boolean VIEW_4_PUBLIC = true; + public static final Boolean VIEW_4_SCHEMA_PUBLIC = false; + public static final String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1"; + public static final String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b"; + + public static final List<ViewColumnDto> VIEW_4_COLUMNS_DTO = List.of( ViewColumnDto.builder() .id(12L) .databaseId(DATABASE_2_ID) @@ -5655,7 +5631,7 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static View VIEW_4 = View.builder() + public static final View VIEW_4 = View.builder() .id(VIEW_4_ID) .isInitialView(VIEW_4_INITIAL_VIEW) .name(VIEW_4_NAME) @@ -5670,7 +5646,7 @@ public abstract class BaseTest { .columns(null) /* VIEW_4_COLUMNS */ .build(); - public final static ViewDto VIEW_4_DTO = ViewDto.builder() + public static final ViewDto VIEW_4_DTO = ViewDto.builder() .id(VIEW_4_ID) .isInitialView(VIEW_4_INITIAL_VIEW) .name(VIEW_4_NAME) @@ -5684,7 +5660,7 @@ public abstract class BaseTest { .columns(VIEW_4_COLUMNS_DTO) .build(); - public final static ViewBriefDto VIEW_4_BRIEF_DTO = ViewBriefDto.builder() + public static final ViewBriefDto VIEW_4_BRIEF_DTO = ViewBriefDto.builder() .id(VIEW_4_ID) .isInitialView(VIEW_4_INITIAL_VIEW) .name(VIEW_4_NAME) @@ -5697,7 +5673,7 @@ public abstract class BaseTest { .ownedBy(USER_1_ID) .build(); - public final static List<ViewColumn> VIEW_4_COLUMNS = List.of( + public static final List<ViewColumn> VIEW_4_COLUMNS = List.of( ViewColumn.builder() .id(12L) .ordinalPosition(0) @@ -5852,18 +5828,18 @@ public abstract class BaseTest { .view(VIEW_4) .build()); - public final static Long VIEW_5_ID = 5L; - public final static Boolean VIEW_5_INITIAL_VIEW = false; - public final static String VIEW_5_NAME = "Mock View"; - public final static String VIEW_5_INTERNAL_NAME = "mock_view"; - public final static Long VIEW_5_CONTAINER_ID = CONTAINER_2_ID; - public final static Long VIEW_5_DATABASE_ID = DATABASE_3_ID; - public final static Boolean VIEW_5_PUBLIC = true; - public final static Boolean VIEW_5_SCHEMA_PUBLIC = true; - public final static String VIEW_5_QUERY = "SELECT `location`, `lat`, `lng` FROM `weather_location` WHERE `location` = 'Albury'"; - public final static String VIEW_5_QUERY_HASH = "120f32478aaff874c25ab32eceb9f00b64cc9d422831046f2f5d43953aca01e7"; - - public final static View VIEW_5 = View.builder() + public static final Long VIEW_5_ID = 5L; + public static final Boolean VIEW_5_INITIAL_VIEW = false; + public static final String VIEW_5_NAME = "Mock View"; + public static final String VIEW_5_INTERNAL_NAME = "mock_view"; + public static final Long VIEW_5_CONTAINER_ID = CONTAINER_2_ID; + public static final Long VIEW_5_DATABASE_ID = DATABASE_3_ID; + public static final Boolean VIEW_5_PUBLIC = true; + public static final Boolean VIEW_5_SCHEMA_PUBLIC = true; + public static final String VIEW_5_QUERY = "SELECT `location`, `lat`, `lng` FROM `weather_location` WHERE `location` = 'Albury'"; + public static final String VIEW_5_QUERY_HASH = "120f32478aaff874c25ab32eceb9f00b64cc9d422831046f2f5d43953aca01e7"; + + public static final View VIEW_5 = View.builder() .id(VIEW_5_ID) .isInitialView(VIEW_5_INITIAL_VIEW) .name(VIEW_5_NAME) @@ -5878,7 +5854,7 @@ public abstract class BaseTest { .columns(null) .build(); - public final static ViewDto VIEW_5_DTO = ViewDto.builder() + public static final ViewDto VIEW_5_DTO = ViewDto.builder() .id(VIEW_5_ID) .isInitialView(VIEW_5_INITIAL_VIEW) .name(VIEW_5_NAME) @@ -5892,7 +5868,7 @@ public abstract class BaseTest { .columns(new LinkedList<>()) .build(); - public final static ViewBriefDto VIEW_5_BRIEF_DTO = ViewBriefDto.builder() + public static final ViewBriefDto VIEW_5_BRIEF_DTO = ViewBriefDto.builder() .id(VIEW_5_ID) .isInitialView(VIEW_5_INITIAL_VIEW) .name(VIEW_5_NAME) @@ -5904,7 +5880,7 @@ public abstract class BaseTest { .queryHash(VIEW_5_QUERY_HASH) .build(); - public final static List<ViewColumn> VIEW_5_COLUMNS = List.of( + public static final List<ViewColumn> VIEW_5_COLUMNS = List.of( ViewColumn.builder() .id(29L) .ordinalPosition(0) @@ -5938,7 +5914,7 @@ public abstract class BaseTest { .view(VIEW_5) .build()); - public final static List<ViewColumnDto> VIEW_5_COLUMNS_DTO = List.of( + public static final List<ViewColumnDto> VIEW_5_COLUMNS_DTO = List.of( ViewColumnDto.builder() .id(29L) .databaseId(DATABASE_3_ID) @@ -5972,8 +5948,8 @@ public abstract class BaseTest { .isNullAllowed(true) .build()); - public final static Long QUERY_1_RESULT_ID = 1L; - public final static List<Map<String, Object>> QUERY_1_RESULT_DTO = new LinkedList<>(List.of( + public static final Long QUERY_1_RESULT_ID = 1L; + public static final List<Map<String, Object>> QUERY_1_RESULT_DTO = new LinkedList<>(List.of( new HashMap<>() {{ put("location", "Albury"); put("lat", -36.0653583); @@ -5984,34 +5960,34 @@ public abstract class BaseTest { put("lng", 150.6517942); }})); - public final static String LICENSE_1_IDENTIFIER = "MIT"; - public final static String LICENSE_1_URI = "https://opensource.org/license/mit/"; + public static final String LICENSE_1_IDENTIFIER = "MIT"; + public static final String LICENSE_1_URI = "https://opensource.org/license/mit/"; - public final static License LICENSE_1 = License.builder() + public static final License LICENSE_1 = License.builder() .identifier(LICENSE_1_IDENTIFIER) .uri(LICENSE_1_URI) .build(); - public final static LicenseDto LICENSE_1_DTO = LicenseDto.builder() + public static final LicenseDto LICENSE_1_DTO = LicenseDto.builder() .identifier(LICENSE_1_IDENTIFIER) .uri(LICENSE_1_URI) .build(); - public final static Long CREATOR_1_ID = 1L; - public final static Long CREATOR_1_QUERY_ID = 1L; - public final static String CREATOR_1_ORCID = "00000-00000-00000"; - public final static String CREATOR_1_AFFIL = "TU Graz"; - public final static String CREATOR_1_AFFIL_ROR = "https://ror.org/04wn28048"; - public final static String CREATOR_1_AFFIL_URI = "https://ror.org/"; - public final static AffiliationIdentifierSchemeType CREATOR_1_AFFIL_TYPE = AffiliationIdentifierSchemeType.ROR; - public final static AffiliationIdentifierSchemeTypeDto CREATOR_1_AFFIL_TYPE_DTO = AffiliationIdentifierSchemeTypeDto.ROR; - public final static String CREATOR_1_FIRSTNAME = "Max"; - public final static String CREATOR_1_LASTNAME = "Mustermann"; - public final static String CREATOR_1_NAME = CREATOR_1_LASTNAME + ", " + CREATOR_1_FIRSTNAME; - public final static Instant CREATOR_1_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant CREATOR_1_MODIFIED = Instant.ofEpochSecond(1541588352L); - - public final static OrcidDto ORCID_1_DTO = OrcidDto.builder() + public static final Long CREATOR_1_ID = 1L; + public static final Long CREATOR_1_QUERY_ID = 1L; + public static final String CREATOR_1_ORCID = "00000-00000-00000"; + public static final String CREATOR_1_AFFIL = "TU Graz"; + public static final String CREATOR_1_AFFIL_ROR = "https://ror.org/04wn28048"; + public static final String CREATOR_1_AFFIL_URI = "https://ror.org/"; + public static final AffiliationIdentifierSchemeType CREATOR_1_AFFIL_TYPE = AffiliationIdentifierSchemeType.ROR; + public static final AffiliationIdentifierSchemeTypeDto CREATOR_1_AFFIL_TYPE_DTO = AffiliationIdentifierSchemeTypeDto.ROR; + public static final String CREATOR_1_FIRSTNAME = "Max"; + public static final String CREATOR_1_LASTNAME = "Mustermann"; + public static final String CREATOR_1_NAME = CREATOR_1_LASTNAME + ", " + CREATOR_1_FIRSTNAME; + public static final Instant CREATOR_1_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant CREATOR_1_MODIFIED = Instant.ofEpochSecond(1541588352L); + + public static final OrcidDto ORCID_1_DTO = OrcidDto.builder() .person(OrcidPersonDto.builder() .name(OrcidNameDto.builder() .givenNames(OrcidValueDto.builder() @@ -6041,201 +6017,201 @@ public abstract class BaseTest { .build()) .build(); - public final static Long CREATOR_2_ID = 2L; - public final static Long CREATOR_2_QUERY_ID = 1L; - public final static String CREATOR_2_ORCID = "00000-00000-00000"; - public final static String CREATOR_2_AFFIL = "TU Wien"; - public final static String CREATOR_2_FIRSTNAME = "Martina"; - public final static String CREATOR_2_LASTNAME = "Mustermann"; - public final static String CREATOR_2_NAME = CREATOR_2_LASTNAME + ", " + CREATOR_2_FIRSTNAME; - public final static Instant CREATOR_2_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant CREATOR_2_MODIFIED = Instant.ofEpochSecond(1541588352L); - - public final static Long CREATOR_3_ID = 3L; - public final static Long CREATOR_3_QUERY_ID = 1L; - public final static String CREATOR_3_ORCID = "00000-00000-00000"; - public final static String CREATOR_3_AFFIL = "TU Graz"; - public final static String CREATOR_3_AFFIL_ROR = "https://ror.org/04wn28048"; - public final static AffiliationIdentifierSchemeType CREATOR_3_AFFIL_SCHEME_TYPE = AffiliationIdentifierSchemeType.ROR; - public final static AffiliationIdentifierSchemeTypeDto CREATOR_3_AFFIL_SCHEME_TYPE_DTO = AffiliationIdentifierSchemeTypeDto.ROR; - public final static String CREATOR_3_AFFIL_URI = "https://ror.org/"; - public final static String CREATOR_3_FIRSTNAME = "Max"; - public final static String CREATOR_3_LASTNAME = "Mustermann"; - public final static String CREATOR_3_NAME = CREATOR_3_LASTNAME + ", " + CREATOR_3_FIRSTNAME; - public final static Instant CREATOR_3_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant CREATOR_3_MODIFIED = Instant.ofEpochSecond(1541588352L); - - public final static Long CREATOR_4_ID = 4L; - public final static Long CREATOR_4_QUERY_ID = 1L; - public final static String CREATOR_4_ORCID = "00000-00000-00000"; - public final static String CREATOR_4_AFFIL = "TU Wien"; - public final static String CREATOR_4_AFFIL_ROR = "https://ror.org/04d836q62"; - public final static String CREATOR_4_AFFIL_URI = "https://ror.org/"; - public final static AffiliationIdentifierSchemeType CREATOR_4_AFFIL_TYPE = AffiliationIdentifierSchemeType.ROR; - public final static AffiliationIdentifierSchemeTypeDto CREATOR_4_AFFIL_TYPE_DTO = AffiliationIdentifierSchemeTypeDto.ROR; - public final static String CREATOR_4_FIRSTNAME = "Martina"; - public final static String CREATOR_4_LASTNAME = "Mustermann"; - public final static String CREATOR_4_NAME = CREATOR_4_LASTNAME + ", " + CREATOR_4_FIRSTNAME; - public final static Instant CREATOR_4_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant CREATOR_4_MODIFIED = Instant.ofEpochSecond(1541588352L); - - public final static Long IDENTIFIER_1_ID = 1L; - public final static Long IDENTIFIER_1_QUERY_ID = null; - public final static Long IDENTIFIER_1_CONTAINER_ID = CONTAINER_1_ID; - public final static Long IDENTIFIER_1_DATABASE_ID = DATABASE_1_ID; - public final static String IDENTIFIER_1_DOI = "10.12345/183"; - public final static Instant IDENTIFIER_1_CREATED = Instant.ofEpochSecond(1641588352L) /* 2022-01-07 20:45:52 */; - public final static Instant IDENTIFIER_1_MODIFIED = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */; - public final static Instant IDENTIFIER_1_EXECUTION = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */; - public final static Integer IDENTIFIER_1_PUBLICATION_MONTH = 5; - public final static Integer IDENTIFIER_1_PUBLICATION_YEAR = 2022; - public final static Integer IDENTIFIER_1_PUBLICATION_DAY = null; - public final static String IDENTIFIER_1_QUERY_HASH = QUERY_1_QUERY_HASH; - public final static String IDENTIFIER_1_RESULT_HASH = QUERY_1_RESULT_HASH; - public final static String IDENTIFIER_1_QUERY = QUERY_1_STATEMENT; - public final static String IDENTIFIER_1_NORMALIZED = QUERY_1_STATEMENT; - public final static Long IDENTIFIER_1_RESULT_NUMBER = QUERY_1_RESULT_NUMBER; - public final static String IDENTIFIER_1_PUBLISHER = "Austrian Government"; - public final static IdentifierType IDENTIFIER_1_TYPE = IdentifierType.DATABASE; - public final static IdentifierTypeDto IDENTIFIER_1_TYPE_DTO = IdentifierTypeDto.DATABASE; - public final static IdentifierStatusType IDENTIFIER_1_STATUS_TYPE = IdentifierStatusType.PUBLISHED; - public final static IdentifierStatusTypeDto IDENTIFIER_1_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; - - public final static Long IDENTIFIER_1_TITLE_1_ID = 1L; - public final static Long IDENTIFIER_1_TITLE_1_IDENTIFIER_ID = IDENTIFIER_1_ID; - public final static String IDENTIFIER_1_TITLE_1_TITLE = "Austrian weather data"; - public final static String IDENTIFIER_1_TITLE_1_TITLE_MODIFY = "Austrian weather some data"; - public final static TitleType IDENTIFIER_1_TITLE_1_TYPE = null; - public final static TitleTypeDto IDENTIFIER_1_TITLE_1_TYPE_DTO = null; - public final static LanguageType IDENTIFIER_1_TITLE_1_LANG = LanguageType.EN; - public final static LanguageTypeDto IDENTIFIER_1_TITLE_1_LANG_DTO = LanguageTypeDto.EN; - - public final static IdentifierTitle IDENTIFIER_1_TITLE_1 = IdentifierTitle.builder() + public static final Long CREATOR_2_ID = 2L; + public static final Long CREATOR_2_QUERY_ID = 1L; + public static final String CREATOR_2_ORCID = "00000-00000-00000"; + public static final String CREATOR_2_AFFIL = "TU Wien"; + public static final String CREATOR_2_FIRSTNAME = "Martina"; + public static final String CREATOR_2_LASTNAME = "Mustermann"; + public static final String CREATOR_2_NAME = CREATOR_2_LASTNAME + ", " + CREATOR_2_FIRSTNAME; + public static final Instant CREATOR_2_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant CREATOR_2_MODIFIED = Instant.ofEpochSecond(1541588352L); + + public static final Long CREATOR_3_ID = 3L; + public static final Long CREATOR_3_QUERY_ID = 1L; + public static final String CREATOR_3_ORCID = "00000-00000-00000"; + public static final String CREATOR_3_AFFIL = "TU Graz"; + public static final String CREATOR_3_AFFIL_ROR = "https://ror.org/04wn28048"; + public static final AffiliationIdentifierSchemeType CREATOR_3_AFFIL_SCHEME_TYPE = AffiliationIdentifierSchemeType.ROR; + public static final AffiliationIdentifierSchemeTypeDto CREATOR_3_AFFIL_SCHEME_TYPE_DTO = AffiliationIdentifierSchemeTypeDto.ROR; + public static final String CREATOR_3_AFFIL_URI = "https://ror.org/"; + public static final String CREATOR_3_FIRSTNAME = "Max"; + public static final String CREATOR_3_LASTNAME = "Mustermann"; + public static final String CREATOR_3_NAME = CREATOR_3_LASTNAME + ", " + CREATOR_3_FIRSTNAME; + public static final Instant CREATOR_3_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant CREATOR_3_MODIFIED = Instant.ofEpochSecond(1541588352L); + + public static final Long CREATOR_4_ID = 4L; + public static final Long CREATOR_4_QUERY_ID = 1L; + public static final String CREATOR_4_ORCID = "00000-00000-00000"; + public static final String CREATOR_4_AFFIL = "TU Wien"; + public static final String CREATOR_4_AFFIL_ROR = "https://ror.org/04d836q62"; + public static final String CREATOR_4_AFFIL_URI = "https://ror.org/"; + public static final AffiliationIdentifierSchemeType CREATOR_4_AFFIL_TYPE = AffiliationIdentifierSchemeType.ROR; + public static final AffiliationIdentifierSchemeTypeDto CREATOR_4_AFFIL_TYPE_DTO = AffiliationIdentifierSchemeTypeDto.ROR; + public static final String CREATOR_4_FIRSTNAME = "Martina"; + public static final String CREATOR_4_LASTNAME = "Mustermann"; + public static final String CREATOR_4_NAME = CREATOR_4_LASTNAME + ", " + CREATOR_4_FIRSTNAME; + public static final Instant CREATOR_4_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant CREATOR_4_MODIFIED = Instant.ofEpochSecond(1541588352L); + + public static final Long IDENTIFIER_1_ID = 1L; + public static final Long IDENTIFIER_1_QUERY_ID = null; + public static final Long IDENTIFIER_1_CONTAINER_ID = CONTAINER_1_ID; + public static final Long IDENTIFIER_1_DATABASE_ID = DATABASE_1_ID; + public static final String IDENTIFIER_1_DOI = "10.12345/183"; + public static final Instant IDENTIFIER_1_CREATED = Instant.ofEpochSecond(1641588352L) /* 2022-01-07 20:45:52 */; + public static final Instant IDENTIFIER_1_MODIFIED = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */; + public static final Instant IDENTIFIER_1_EXECUTION = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */; + public static final Integer IDENTIFIER_1_PUBLICATION_MONTH = 5; + public static final Integer IDENTIFIER_1_PUBLICATION_YEAR = 2022; + public static final Integer IDENTIFIER_1_PUBLICATION_DAY = null; + public static final String IDENTIFIER_1_QUERY_HASH = QUERY_1_QUERY_HASH; + public static final String IDENTIFIER_1_RESULT_HASH = QUERY_1_RESULT_HASH; + public static final String IDENTIFIER_1_QUERY = QUERY_1_STATEMENT; + public static final String IDENTIFIER_1_NORMALIZED = QUERY_1_STATEMENT; + public static final Long IDENTIFIER_1_RESULT_NUMBER = QUERY_1_RESULT_NUMBER; + public static final String IDENTIFIER_1_PUBLISHER = "Austrian Government"; + public static final IdentifierType IDENTIFIER_1_TYPE = IdentifierType.DATABASE; + public static final IdentifierTypeDto IDENTIFIER_1_TYPE_DTO = IdentifierTypeDto.DATABASE; + public static final IdentifierStatusType IDENTIFIER_1_STATUS_TYPE = IdentifierStatusType.PUBLISHED; + public static final IdentifierStatusTypeDto IDENTIFIER_1_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; + + public static final Long IDENTIFIER_1_TITLE_1_ID = 1L; + public static final Long IDENTIFIER_1_TITLE_1_IDENTIFIER_ID = IDENTIFIER_1_ID; + public static final String IDENTIFIER_1_TITLE_1_TITLE = "Austrian weather data"; + public static final String IDENTIFIER_1_TITLE_1_TITLE_MODIFY = "Austrian weather some data"; + public static final TitleType IDENTIFIER_1_TITLE_1_TYPE = null; + public static final TitleTypeDto IDENTIFIER_1_TITLE_1_TYPE_DTO = null; + public static final LanguageType IDENTIFIER_1_TITLE_1_LANG = LanguageType.EN; + public static final LanguageTypeDto IDENTIFIER_1_TITLE_1_LANG_DTO = LanguageTypeDto.EN; + + public static final IdentifierTitle IDENTIFIER_1_TITLE_1 = IdentifierTitle.builder() .id(IDENTIFIER_1_TITLE_1_ID) .title(IDENTIFIER_1_TITLE_1_TITLE) .titleType(IDENTIFIER_1_TITLE_1_TYPE) .language(IDENTIFIER_1_TITLE_1_LANG) .build(); - public final static IdentifierTitleDto IDENTIFIER_1_TITLE_1_DTO = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_1_TITLE_1_DTO = IdentifierTitleDto.builder() .id(IDENTIFIER_1_TITLE_1_ID) .title(IDENTIFIER_1_TITLE_1_TITLE) .titleType(IDENTIFIER_1_TITLE_1_TYPE_DTO) .language(IDENTIFIER_1_TITLE_1_LANG_DTO) .build(); - public final static IdentifierTitleDto IDENTIFIER_1_TITLE_1_DTO_MODIFY = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_1_TITLE_1_DTO_MODIFY = IdentifierTitleDto.builder() .id(IDENTIFIER_1_TITLE_1_ID) .title(IDENTIFIER_1_TITLE_1_TITLE_MODIFY) .titleType(IDENTIFIER_1_TITLE_1_TYPE_DTO) .language(IDENTIFIER_1_TITLE_1_LANG_DTO) .build(); - public final static SaveIdentifierTitleDto IDENTIFIER_1_TITLE_1_CREATE_DTO = SaveIdentifierTitleDto.builder() + public static final SaveIdentifierTitleDto IDENTIFIER_1_TITLE_1_CREATE_DTO = SaveIdentifierTitleDto.builder() .title(IDENTIFIER_1_TITLE_1_TITLE) .titleType(IDENTIFIER_1_TITLE_1_TYPE_DTO) .language(IDENTIFIER_1_TITLE_1_LANG_DTO) .build(); - public final static SaveIdentifierTitleDto IDENTIFIER_1_TITLE_1_UPDATE_DTO = SaveIdentifierTitleDto.builder() + public static final SaveIdentifierTitleDto IDENTIFIER_1_TITLE_1_UPDATE_DTO = SaveIdentifierTitleDto.builder() .title(IDENTIFIER_1_TITLE_1_TITLE_MODIFY) .titleType(IDENTIFIER_1_TITLE_1_TYPE_DTO) .language(IDENTIFIER_1_TITLE_1_LANG_DTO) .build(); - public final static Long IDENTIFIER_1_TITLE_2_ID = 2L; - public final static Long IDENTIFIER_1_TITLE_2_IDENTIFIER_ID = IDENTIFIER_1_ID; - public final static String IDENTIFIER_1_TITLE_2_TITLE = "Österreichische Wetterdaten"; - public final static String IDENTIFIER_1_TITLE_2_TITLE_MODIFY = "Österreichische Wetterdaten übersetzt"; - public final static TitleType IDENTIFIER_1_TITLE_2_TYPE = TitleType.TRANSLATED_TITLE; - public final static TitleTypeDto IDENTIFIER_1_TITLE_2_TYPE_DTO = TitleTypeDto.TRANSLATED_TITLE; - public final static LanguageType IDENTIFIER_1_TITLE_2_LANG = LanguageType.EN; - public final static LanguageTypeDto IDENTIFIER_1_TITLE_2_LANG_DTO = LanguageTypeDto.EN; + public static final Long IDENTIFIER_1_TITLE_2_ID = 2L; + public static final Long IDENTIFIER_1_TITLE_2_IDENTIFIER_ID = IDENTIFIER_1_ID; + public static final String IDENTIFIER_1_TITLE_2_TITLE = "Österreichische Wetterdaten"; + public static final String IDENTIFIER_1_TITLE_2_TITLE_MODIFY = "Österreichische Wetterdaten übersetzt"; + public static final TitleType IDENTIFIER_1_TITLE_2_TYPE = TitleType.TRANSLATED_TITLE; + public static final TitleTypeDto IDENTIFIER_1_TITLE_2_TYPE_DTO = TitleTypeDto.TRANSLATED_TITLE; + public static final LanguageType IDENTIFIER_1_TITLE_2_LANG = LanguageType.EN; + public static final LanguageTypeDto IDENTIFIER_1_TITLE_2_LANG_DTO = LanguageTypeDto.EN; - public final static IdentifierTitle IDENTIFIER_1_TITLE_2 = IdentifierTitle.builder() + public static final IdentifierTitle IDENTIFIER_1_TITLE_2 = IdentifierTitle.builder() .id(IDENTIFIER_1_TITLE_2_ID) .title(IDENTIFIER_1_TITLE_2_TITLE) .titleType(IDENTIFIER_1_TITLE_2_TYPE) .language(IDENTIFIER_1_TITLE_2_LANG) .build(); - public final static IdentifierTitleDto IDENTIFIER_1_TITLE_2_DTO = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_1_TITLE_2_DTO = IdentifierTitleDto.builder() .id(IDENTIFIER_1_TITLE_2_ID) .title(IDENTIFIER_1_TITLE_2_TITLE) .titleType(IDENTIFIER_1_TITLE_2_TYPE_DTO) .language(IDENTIFIER_1_TITLE_2_LANG_DTO) .build(); - public final static IdentifierTitleDto IDENTIFIER_1_TITLE_2_DTO_MODIFY = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_1_TITLE_2_DTO_MODIFY = IdentifierTitleDto.builder() .id(IDENTIFIER_1_TITLE_2_ID) .title(IDENTIFIER_1_TITLE_2_TITLE_MODIFY) .titleType(IDENTIFIER_1_TITLE_2_TYPE_DTO) .language(IDENTIFIER_1_TITLE_2_LANG_DTO) .build(); - public final static SaveIdentifierTitleDto IDENTIFIER_1_TITLE_2_CREATE_DTO = SaveIdentifierTitleDto.builder() + public static final SaveIdentifierTitleDto IDENTIFIER_1_TITLE_2_CREATE_DTO = SaveIdentifierTitleDto.builder() .title(IDENTIFIER_1_TITLE_2_TITLE) .titleType(IDENTIFIER_1_TITLE_2_TYPE_DTO) .language(IDENTIFIER_1_TITLE_2_LANG_DTO) .build(); - public final static SaveIdentifierTitleDto IDENTIFIER_1_TITLE_2_UPDATE_DTO = SaveIdentifierTitleDto.builder() + public static final SaveIdentifierTitleDto IDENTIFIER_1_TITLE_2_UPDATE_DTO = SaveIdentifierTitleDto.builder() .title(IDENTIFIER_1_TITLE_2_TITLE_MODIFY) .titleType(IDENTIFIER_1_TITLE_2_TYPE_DTO) .language(IDENTIFIER_1_TITLE_2_LANG_DTO) .build(); - public final static Long IDENTIFIER_1_DESCRIPTION_1_ID = 1L; - public final static Long IDENTIFIER_1_DESCRIPTION_1_IDENTIFIER_ID = IDENTIFIER_1_ID; - public final static String IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION = "Selecting all from the weather Austrian table"; - public final static String IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION_MODIFY = "Selecting some from the weather Austrian table"; - public final static DescriptionType IDENTIFIER_1_DESCRIPTION_1_TYPE = null; - public final static DescriptionTypeDto IDENTIFIER_1_DESCRIPTION_1_TYPE_DTO = null; - public final static LanguageType IDENTIFIER_1_DESCRIPTION_1_LANG = LanguageType.EN; - public final static LanguageTypeDto IDENTIFIER_1_DESCRIPTION_1_LANG_DTO = LanguageTypeDto.EN; + public static final Long IDENTIFIER_1_DESCRIPTION_1_ID = 1L; + public static final Long IDENTIFIER_1_DESCRIPTION_1_IDENTIFIER_ID = IDENTIFIER_1_ID; + public static final String IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION = "Selecting all from the weather Austrian table"; + public static final String IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION_MODIFY = "Selecting some from the weather Austrian table"; + public static final DescriptionType IDENTIFIER_1_DESCRIPTION_1_TYPE = null; + public static final DescriptionTypeDto IDENTIFIER_1_DESCRIPTION_1_TYPE_DTO = null; + public static final LanguageType IDENTIFIER_1_DESCRIPTION_1_LANG = LanguageType.EN; + public static final LanguageTypeDto IDENTIFIER_1_DESCRIPTION_1_LANG_DTO = LanguageTypeDto.EN; - public final static IdentifierDescription IDENTIFIER_1_DESCRIPTION_1 = IdentifierDescription.builder() + public static final IdentifierDescription IDENTIFIER_1_DESCRIPTION_1 = IdentifierDescription.builder() .id(IDENTIFIER_1_DESCRIPTION_1_ID) .description(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION) .descriptionType(IDENTIFIER_1_DESCRIPTION_1_TYPE) .language(IDENTIFIER_1_DESCRIPTION_1_LANG) .build(); - public final static IdentifierDescriptionDto IDENTIFIER_1_DESCRIPTION_1_DTO = IdentifierDescriptionDto.builder() + public static final IdentifierDescriptionDto IDENTIFIER_1_DESCRIPTION_1_DTO = IdentifierDescriptionDto.builder() .id(IDENTIFIER_1_DESCRIPTION_1_ID) .description(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION) .descriptionType(IDENTIFIER_1_DESCRIPTION_1_TYPE_DTO) .language(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO) .build(); - public final static IdentifierDescriptionDto IDENTIFIER_1_DESCRIPTION_1_DTO_MODIFY = IdentifierDescriptionDto.builder() + public static final IdentifierDescriptionDto IDENTIFIER_1_DESCRIPTION_1_DTO_MODIFY = IdentifierDescriptionDto.builder() .id(IDENTIFIER_1_DESCRIPTION_1_ID) .description(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION_MODIFY) .descriptionType(IDENTIFIER_1_DESCRIPTION_1_TYPE_DTO) .language(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO) .build(); - public final static SaveIdentifierDescriptionDto IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO = SaveIdentifierDescriptionDto.builder() + public static final SaveIdentifierDescriptionDto IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO = SaveIdentifierDescriptionDto.builder() .id(null) .description(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION) .descriptionType(IDENTIFIER_1_DESCRIPTION_1_TYPE_DTO) .language(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO) .build(); - public final static Long IDENTIFIER_1_CREATOR_1_ID = 1L; - public final static String IDENTIFIER_1_CREATOR_1_FIRSTNAME = CREATOR_1_FIRSTNAME; - public final static String IDENTIFIER_1_CREATOR_1_LASTNAME = CREATOR_1_LASTNAME; - public final static String IDENTIFIER_1_CREATOR_1_NAME = CREATOR_1_NAME; - public final static String IDENTIFIER_1_CREATOR_1_ORCID = CREATOR_1_ORCID; - public final static NameIdentifierSchemeType IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE = NameIdentifierSchemeType.ORCID; - public final static NameIdentifierSchemeTypeDto IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE_DTO = NameIdentifierSchemeTypeDto.ORCID; - public final static String IDENTIFIER_1_CREATOR_1_AFFILIATION = CREATOR_1_AFFIL; - public final static String IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER = CREATOR_1_AFFIL_ROR; - public final static AffiliationIdentifierSchemeType IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME = CREATOR_1_AFFIL_TYPE; - public final static AffiliationIdentifierSchemeTypeDto IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_DTO = CREATOR_1_AFFIL_TYPE_DTO; - public final static String IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_URI = CREATOR_1_AFFIL_URI; - - public final static Creator IDENTIFIER_1_CREATOR_1 = Creator.builder() + public static final Long IDENTIFIER_1_CREATOR_1_ID = 1L; + public static final String IDENTIFIER_1_CREATOR_1_FIRSTNAME = CREATOR_1_FIRSTNAME; + public static final String IDENTIFIER_1_CREATOR_1_LASTNAME = CREATOR_1_LASTNAME; + public static final String IDENTIFIER_1_CREATOR_1_NAME = CREATOR_1_NAME; + public static final String IDENTIFIER_1_CREATOR_1_ORCID = CREATOR_1_ORCID; + public static final NameIdentifierSchemeType IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE = NameIdentifierSchemeType.ORCID; + public static final NameIdentifierSchemeTypeDto IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE_DTO = NameIdentifierSchemeTypeDto.ORCID; + public static final String IDENTIFIER_1_CREATOR_1_AFFILIATION = CREATOR_1_AFFIL; + public static final String IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER = CREATOR_1_AFFIL_ROR; + public static final AffiliationIdentifierSchemeType IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME = CREATOR_1_AFFIL_TYPE; + public static final AffiliationIdentifierSchemeTypeDto IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_DTO = CREATOR_1_AFFIL_TYPE_DTO; + public static final String IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_URI = CREATOR_1_AFFIL_URI; + + public static final Creator IDENTIFIER_1_CREATOR_1 = Creator.builder() .id(IDENTIFIER_1_CREATOR_1_ID) .firstname(IDENTIFIER_1_CREATOR_1_FIRSTNAME) .lastname(IDENTIFIER_1_CREATOR_1_LASTNAME) @@ -6249,7 +6225,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_URI) .build(); - public final static CreatorDto IDENTIFIER_1_CREATOR_1_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_1_CREATOR_1_DTO = CreatorDto.builder() .id(IDENTIFIER_1_CREATOR_1_ID) .firstname(IDENTIFIER_1_CREATOR_1_FIRSTNAME) .lastname(IDENTIFIER_1_CREATOR_1_LASTNAME) @@ -6263,7 +6239,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_URI) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_1_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_1_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() .id(null) .firstname(IDENTIFIER_1_CREATOR_1_FIRSTNAME) .lastname(IDENTIFIER_1_CREATOR_1_LASTNAME) @@ -6276,15 +6252,15 @@ public abstract class BaseTest { .affiliationIdentifierScheme(IDENTIFIER_1_CREATOR_1_AFFILIATION_IDENTIFIER_SCHEME_DTO) .build(); - public final static Long FUNDER_1_ID = 1L; - public final static String FUNDER_1_NAME = "European Commission"; - public final static String FUNDER_1_IDENTIFIER = "https://doi.org/10.13039/501100000780"; - public final static String FUNDER_1_IDENTIFIER_ID_ONLY = "10.13039/501100000780"; - public final static IdentifierFunderType FUNDER_1_IDENTIFIER_TYPE = IdentifierFunderType.CROSSREF_FUNDER_ID; - public final static IdentifierFunderTypeDto FUNDER_1_IDENTIFIER_TYPE_DTO = IdentifierFunderTypeDto.CROSSREF_FUNDER_ID; - public final static String FUNDER_1_AWARD_TITLE = "Institutionalizing global genetic-resource commons. Global Strategies for accessing and using essential public knowledge assets in the life science"; + public static final Long FUNDER_1_ID = 1L; + public static final String FUNDER_1_NAME = "European Commission"; + public static final String FUNDER_1_IDENTIFIER = "https://doi.org/10.13039/501100000780"; + public static final String FUNDER_1_IDENTIFIER_ID_ONLY = "10.13039/501100000780"; + public static final IdentifierFunderType FUNDER_1_IDENTIFIER_TYPE = IdentifierFunderType.CROSSREF_FUNDER_ID; + public static final IdentifierFunderTypeDto FUNDER_1_IDENTIFIER_TYPE_DTO = IdentifierFunderTypeDto.CROSSREF_FUNDER_ID; + public static final String FUNDER_1_AWARD_TITLE = "Institutionalizing global genetic-resource commons. Global Strategies for accessing and using essential public knowledge assets in the life science"; - public final static IdentifierFunder IDENTIFIER_1_FUNDER_1 = IdentifierFunder.builder() + public static final IdentifierFunder IDENTIFIER_1_FUNDER_1 = IdentifierFunder.builder() .id(FUNDER_1_ID) .funderName(FUNDER_1_NAME) .funderIdentifier(FUNDER_1_IDENTIFIER) @@ -6292,7 +6268,7 @@ public abstract class BaseTest { .awardTitle(FUNDER_1_AWARD_TITLE) .build(); - public final static IdentifierFunderDto IDENTIFIER_1_FUNDER_1_DTO = IdentifierFunderDto.builder() + public static final IdentifierFunderDto IDENTIFIER_1_FUNDER_1_DTO = IdentifierFunderDto.builder() .id(FUNDER_1_ID) .funderName(FUNDER_1_NAME) .funderIdentifier(FUNDER_1_IDENTIFIER) @@ -6300,14 +6276,14 @@ public abstract class BaseTest { .awardTitle(FUNDER_1_AWARD_TITLE) .build(); - public final static SaveIdentifierFunderDto IDENTIFIER_1_FUNDER_1_CREATE_DTO = SaveIdentifierFunderDto.builder() + public static final SaveIdentifierFunderDto IDENTIFIER_1_FUNDER_1_CREATE_DTO = SaveIdentifierFunderDto.builder() .funderName(FUNDER_1_NAME) .funderIdentifier(FUNDER_1_IDENTIFIER) .funderIdentifierType(FUNDER_1_IDENTIFIER_TYPE_DTO) .awardTitle(FUNDER_1_AWARD_TITLE) .build(); - public final static DataCiteBody<DataCiteDoi> IDENTIFIER_1_DATA_CITE = DataCiteBody.<DataCiteDoi>builder() + public static final DataCiteBody<DataCiteDoi> IDENTIFIER_1_DATA_CITE = DataCiteBody.<DataCiteDoi>builder() .data(DataCiteData.<DataCiteDoi>builder() .type("dois") .attributes(DataCiteDoi.builder() @@ -6316,7 +6292,7 @@ public abstract class BaseTest { .build()) .build(); - public final static Identifier IDENTIFIER_1 = Identifier.builder() + public static final Identifier IDENTIFIER_1 = Identifier.builder() .id(IDENTIFIER_1_ID) .queryId(IDENTIFIER_1_QUERY_ID) .titles(new LinkedList<>(List.of(IDENTIFIER_1_TITLE_1, IDENTIFIER_1_TITLE_2))) @@ -6343,7 +6319,7 @@ public abstract class BaseTest { .status(IDENTIFIER_1_STATUS_TYPE) .build(); - public final static Identifier IDENTIFIER_1_WITH_DOI = Identifier.builder() + public static final Identifier IDENTIFIER_1_WITH_DOI = Identifier.builder() .id(IDENTIFIER_1_ID) .queryId(IDENTIFIER_1_QUERY_ID) .descriptions(new LinkedList<>(List.of(IDENTIFIER_1_DESCRIPTION_1))) @@ -6369,7 +6345,7 @@ public abstract class BaseTest { .status(IDENTIFIER_1_STATUS_TYPE) .build(); - public final static IdentifierDto IDENTIFIER_1_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_1_DTO = IdentifierDto.builder() .id(IDENTIFIER_1_ID) .databaseId(DATABASE_1_ID) .queryId(IDENTIFIER_1_QUERY_ID) @@ -6393,7 +6369,7 @@ public abstract class BaseTest { .status(IDENTIFIER_1_STATUS_TYPE_DTO) .build(); - public final static IdentifierBriefDto IDENTIFIER_1_BRIEF_DTO = IdentifierBriefDto.builder() + public static final IdentifierBriefDto IDENTIFIER_1_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_1_ID) .databaseId(DATABASE_1_ID) .queryId(IDENTIFIER_1_QUERY_ID) @@ -6405,7 +6381,7 @@ public abstract class BaseTest { .status(IDENTIFIER_1_STATUS_TYPE_DTO) .build(); - public final static CreateIdentifierDto IDENTIFIER_1_CREATE_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_1_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_1_DATABASE_ID) .type(IDENTIFIER_1_TYPE_DTO) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) @@ -6422,7 +6398,7 @@ public abstract class BaseTest { .funders(new LinkedList<>(List.of(IDENTIFIER_1_FUNDER_1_CREATE_DTO))) .build(); - public final static CreateIdentifierDto IDENTIFIER_1_CREATE_WITH_DOI_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_1_CREATE_WITH_DOI_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_1_DATABASE_ID) .type(IDENTIFIER_1_TYPE_DTO) .doi(IDENTIFIER_1_DOI) @@ -6439,7 +6415,7 @@ public abstract class BaseTest { .funders(new LinkedList<>(List.of(IDENTIFIER_1_FUNDER_1_CREATE_DTO))) .build(); - public final static IdentifierSaveDto IDENTIFIER_1_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_1_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_1_ID) .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(new LinkedList<>(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO))) @@ -6454,7 +6430,7 @@ public abstract class BaseTest { .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .build(); - public final static IdentifierSaveDto IDENTIFIER_1_SAVE_MODIFY_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_1_SAVE_MODIFY_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_1_ID) .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(new LinkedList<>(List.of())) // <<< @@ -6469,89 +6445,89 @@ public abstract class BaseTest { .licenses(new LinkedList<>(List.of())) // <<< .build(); - public final static Long IDENTIFIER_5_ID = 5L; - public final static Long IDENTIFIER_5_QUERY_ID = QUERY_2_ID; - public final static Long IDENTIFIER_5_CONTAINER_ID = CONTAINER_2_ID; - public final static Long IDENTIFIER_5_DATABASE_ID = DATABASE_2_ID; - public final static String IDENTIFIER_5_DOI = "10.12345/13/50BBFCFE08A12"; - public final static Instant IDENTIFIER_5_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant IDENTIFIER_5_MODIFIED = Instant.ofEpochSecond(1541588352L); - public final static Instant IDENTIFIER_5_EXECUTION = Instant.ofEpochSecond(1541588352L); - public final static Integer IDENTIFIER_5_PUBLICATION_DAY = 14; - public final static Integer IDENTIFIER_5_PUBLICATION_MONTH = 7; - public final static Integer IDENTIFIER_5_PUBLICATION_YEAR = 2022; - public final static String IDENTIFIER_5_QUERY_HASH = QUERY_2_QUERY_HASH; - public final static String IDENTIFIER_5_RESULT_HASH = QUERY_2_RESULT_HASH; - public final static String IDENTIFIER_5_QUERY = QUERY_2_STATEMENT; - public final static String IDENTIFIER_5_NORMALIZED = QUERY_2_STATEMENT; - public final static Long IDENTIFIER_5_RESULT_NUMBER = QUERY_2_RESULT_NUMBER; - public final static String IDENTIFIER_5_PUBLISHER = "Australian Government"; - public final static IdentifierType IDENTIFIER_5_TYPE = IdentifierType.SUBSET; - public final static IdentifierTypeDto IDENTIFIER_5_TYPE_DTO = IdentifierTypeDto.SUBSET; - public final static IdentifierStatusType IDENTIFIER_5_STATUS_TYPE = IdentifierStatusType.DRAFT; - public final static IdentifierStatusTypeDto IDENTIFIER_5_STATUS_TYPE_DTO = IdentifierStatusTypeDto.DRAFT; - public final static UUID IDENTIFIER_5_CREATED_BY = USER_2_ID; - - public final static Long IDENTIFIER_5_TITLE_1_ID = 3L; - public final static Long IDENTIFIER_5_TITLE_1_IDENTIFIER_ID = IDENTIFIER_5_ID; - public final static String IDENTIFIER_5_TITLE_1_TITLE = "Australische Wetterdaten"; - public final static LanguageType IDENTIFIER_5_TITLE_1_LANG = LanguageType.DE; - public final static LanguageTypeDto IDENTIFIER_5_TITLE_1_LANG_DTO = LanguageTypeDto.DE; - public final static TitleType IDENTIFIER_5_TITLE_1_TYPE = TitleType.SUBTITLE; - public final static TitleTypeDto IDENTIFIER_5_TITLE_1_TYPE_DTO = TitleTypeDto.SUBTITLE; - - public final static IdentifierTitle IDENTIFIER_5_TITLE_1 = IdentifierTitle.builder() + public static final Long IDENTIFIER_5_ID = 5L; + public static final Long IDENTIFIER_5_QUERY_ID = QUERY_2_ID; + public static final Long IDENTIFIER_5_CONTAINER_ID = CONTAINER_2_ID; + public static final Long IDENTIFIER_5_DATABASE_ID = DATABASE_2_ID; + public static final String IDENTIFIER_5_DOI = "10.12345/13/50BBFCFE08A12"; + public static final Instant IDENTIFIER_5_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant IDENTIFIER_5_MODIFIED = Instant.ofEpochSecond(1541588352L); + public static final Instant IDENTIFIER_5_EXECUTION = Instant.ofEpochSecond(1541588352L); + public static final Integer IDENTIFIER_5_PUBLICATION_DAY = 14; + public static final Integer IDENTIFIER_5_PUBLICATION_MONTH = 7; + public static final Integer IDENTIFIER_5_PUBLICATION_YEAR = 2022; + public static final String IDENTIFIER_5_QUERY_HASH = QUERY_2_QUERY_HASH; + public static final String IDENTIFIER_5_RESULT_HASH = QUERY_2_RESULT_HASH; + public static final String IDENTIFIER_5_QUERY = QUERY_2_STATEMENT; + public static final String IDENTIFIER_5_NORMALIZED = QUERY_2_STATEMENT; + public static final Long IDENTIFIER_5_RESULT_NUMBER = QUERY_2_RESULT_NUMBER; + public static final String IDENTIFIER_5_PUBLISHER = "Australian Government"; + public static final IdentifierType IDENTIFIER_5_TYPE = IdentifierType.SUBSET; + public static final IdentifierTypeDto IDENTIFIER_5_TYPE_DTO = IdentifierTypeDto.SUBSET; + public static final IdentifierStatusType IDENTIFIER_5_STATUS_TYPE = IdentifierStatusType.DRAFT; + public static final IdentifierStatusTypeDto IDENTIFIER_5_STATUS_TYPE_DTO = IdentifierStatusTypeDto.DRAFT; + public static final UUID IDENTIFIER_5_CREATED_BY = USER_2_ID; + + public static final Long IDENTIFIER_5_TITLE_1_ID = 3L; + public static final Long IDENTIFIER_5_TITLE_1_IDENTIFIER_ID = IDENTIFIER_5_ID; + public static final String IDENTIFIER_5_TITLE_1_TITLE = "Australische Wetterdaten"; + public static final LanguageType IDENTIFIER_5_TITLE_1_LANG = LanguageType.DE; + public static final LanguageTypeDto IDENTIFIER_5_TITLE_1_LANG_DTO = LanguageTypeDto.DE; + public static final TitleType IDENTIFIER_5_TITLE_1_TYPE = TitleType.SUBTITLE; + public static final TitleTypeDto IDENTIFIER_5_TITLE_1_TYPE_DTO = TitleTypeDto.SUBTITLE; + + public static final IdentifierTitle IDENTIFIER_5_TITLE_1 = IdentifierTitle.builder() .id(IDENTIFIER_5_TITLE_1_ID) .title(IDENTIFIER_5_TITLE_1_TITLE) .language(IDENTIFIER_5_TITLE_1_LANG) .titleType(IDENTIFIER_5_TITLE_1_TYPE) .build(); - public final static IdentifierTitleDto IDENTIFIER_5_TITLE_1_DTO = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_5_TITLE_1_DTO = IdentifierTitleDto.builder() .id(IDENTIFIER_5_TITLE_1_ID) .title(IDENTIFIER_5_TITLE_1_TITLE) .language(IDENTIFIER_5_TITLE_1_LANG_DTO) .titleType(IDENTIFIER_5_TITLE_1_TYPE_DTO) .build(); - public final static SaveIdentifierTitleDto IDENTIFIER_5_TITLE_1_CREATE_DTO = SaveIdentifierTitleDto.builder() + public static final SaveIdentifierTitleDto IDENTIFIER_5_TITLE_1_CREATE_DTO = SaveIdentifierTitleDto.builder() .title(IDENTIFIER_5_TITLE_1_TITLE) .language(IDENTIFIER_5_TITLE_1_LANG_DTO) .titleType(IDENTIFIER_5_TITLE_1_TYPE_DTO) .build(); - public final static Long IDENTIFIER_5_DESCRIPTION_1_ID = 2L; - public final static Long IDENTIFIER_5_DESCRIPTION_1_IDENTIFIER_ID = IDENTIFIER_5_ID; - public final static String IDENTIFIER_5_DESCRIPTION_1_DESCRIPTION = "Alle Wetterdaten in Australien"; - public final static LanguageType IDENTIFIER_5_DESCRIPTION_1_LANG = LanguageType.DE; - public final static LanguageTypeDto IDENTIFIER_5_DESCRIPTION_1_LANG_DTO = LanguageTypeDto.DE; - public final static DescriptionType IDENTIFIER_5_DESCRIPTION_1_TYPE = DescriptionType.ABSTRACT; - public final static DescriptionTypeDto IDENTIFIER_5_DESCRIPTION_1_TYPE_DTO = DescriptionTypeDto.ABSTRACT; + public static final Long IDENTIFIER_5_DESCRIPTION_1_ID = 2L; + public static final Long IDENTIFIER_5_DESCRIPTION_1_IDENTIFIER_ID = IDENTIFIER_5_ID; + public static final String IDENTIFIER_5_DESCRIPTION_1_DESCRIPTION = "Alle Wetterdaten in Australien"; + public static final LanguageType IDENTIFIER_5_DESCRIPTION_1_LANG = LanguageType.DE; + public static final LanguageTypeDto IDENTIFIER_5_DESCRIPTION_1_LANG_DTO = LanguageTypeDto.DE; + public static final DescriptionType IDENTIFIER_5_DESCRIPTION_1_TYPE = DescriptionType.ABSTRACT; + public static final DescriptionTypeDto IDENTIFIER_5_DESCRIPTION_1_TYPE_DTO = DescriptionTypeDto.ABSTRACT; - public final static IdentifierDescription IDENTIFIER_5_DESCRIPTION_1 = IdentifierDescription.builder() + public static final IdentifierDescription IDENTIFIER_5_DESCRIPTION_1 = IdentifierDescription.builder() .id(IDENTIFIER_5_DESCRIPTION_1_ID) .description(IDENTIFIER_5_DESCRIPTION_1_DESCRIPTION) .language(IDENTIFIER_5_DESCRIPTION_1_LANG) .descriptionType(IDENTIFIER_5_DESCRIPTION_1_TYPE) .build(); - public final static IdentifierDescriptionDto IDENTIFIER_5_DESCRIPTION_1_DTO = IdentifierDescriptionDto.builder() + public static final IdentifierDescriptionDto IDENTIFIER_5_DESCRIPTION_1_DTO = IdentifierDescriptionDto.builder() .id(IDENTIFIER_5_DESCRIPTION_1_ID) .description(IDENTIFIER_5_DESCRIPTION_1_DESCRIPTION) .language(IDENTIFIER_5_DESCRIPTION_1_LANG_DTO) .descriptionType(IDENTIFIER_5_DESCRIPTION_1_TYPE_DTO) .build(); - public final static SaveIdentifierDescriptionDto IDENTIFIER_5_DESCRIPTION_1_CREATE_DTO = SaveIdentifierDescriptionDto.builder() + public static final SaveIdentifierDescriptionDto IDENTIFIER_5_DESCRIPTION_1_CREATE_DTO = SaveIdentifierDescriptionDto.builder() .id(null) .description(IDENTIFIER_5_DESCRIPTION_1_DESCRIPTION) .language(IDENTIFIER_5_DESCRIPTION_1_LANG_DTO) .descriptionType(IDENTIFIER_5_DESCRIPTION_1_TYPE_DTO) .build(); - public final static Long IDENTIFIER_5_CREATOR_1_ID = 2L; + public static final Long IDENTIFIER_5_CREATOR_1_ID = 2L; - public final static Creator IDENTIFIER_5_CREATOR_1 = Creator.builder() + public static final Creator IDENTIFIER_5_CREATOR_1 = Creator.builder() .id(IDENTIFIER_5_CREATOR_1_ID) .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) @@ -6564,7 +6540,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_1_AFFIL_URI) .build(); - public final static CreatorDto IDENTIFIER_5_CREATOR_1_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_5_CREATOR_1_DTO = CreatorDto.builder() .id(IDENTIFIER_5_CREATOR_1_ID) .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) @@ -6577,7 +6553,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_1_AFFIL_URI) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) .creatorName(CREATOR_1_NAME) @@ -6586,7 +6562,7 @@ public abstract class BaseTest { .affiliation(CREATOR_1_AFFIL) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_1_MODIFY_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_1_MODIFY_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) .creatorName(CREATOR_1_NAME) @@ -6595,9 +6571,9 @@ public abstract class BaseTest { .affiliation(CREATOR_1_AFFIL) .build(); - public final static Long IDENTIFIER_5_CREATOR_2_ID = 3L; + public static final Long IDENTIFIER_5_CREATOR_2_ID = 3L; - public final static Creator IDENTIFIER_5_CREATOR_2 = Creator.builder() + public static final Creator IDENTIFIER_5_CREATOR_2 = Creator.builder() .id(IDENTIFIER_5_CREATOR_2_ID) .firstname(CREATOR_2_FIRSTNAME) .lastname(CREATOR_2_LASTNAME) @@ -6607,7 +6583,7 @@ public abstract class BaseTest { .affiliation(CREATOR_2_AFFIL) .build(); - public final static CreatorDto IDENTIFIER_5_CREATOR_2_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_5_CREATOR_2_DTO = CreatorDto.builder() .id(IDENTIFIER_5_CREATOR_2_ID) .firstname(CREATOR_2_FIRSTNAME) .lastname(CREATOR_2_LASTNAME) @@ -6617,7 +6593,7 @@ public abstract class BaseTest { .affiliation(CREATOR_2_AFFIL) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_2_CREATE_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_2_CREATE_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_2_FIRSTNAME) .lastname(CREATOR_2_LASTNAME) .creatorName(CREATOR_2_NAME) @@ -6626,7 +6602,7 @@ public abstract class BaseTest { .affiliation(CREATOR_2_AFFIL) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_2_MODIFY_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_5_CREATOR_2_MODIFY_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_2_FIRSTNAME) .lastname(CREATOR_2_LASTNAME) .creatorName(CREATOR_2_NAME) @@ -6635,7 +6611,7 @@ public abstract class BaseTest { .affiliation(CREATOR_2_AFFIL) .build(); - public final static Identifier IDENTIFIER_5 = Identifier.builder() + public static final Identifier IDENTIFIER_5 = Identifier.builder() .id(IDENTIFIER_5_ID) .queryId(IDENTIFIER_5_QUERY_ID) .descriptions(new LinkedList<>(List.of(IDENTIFIER_5_DESCRIPTION_1))) @@ -6660,7 +6636,7 @@ public abstract class BaseTest { .status(IDENTIFIER_5_STATUS_TYPE) .build(); - public final static IdentifierDto IDENTIFIER_5_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_5_DTO = IdentifierDto.builder() .id(IDENTIFIER_5_ID) .databaseId(DATABASE_2_ID) .queryId(IDENTIFIER_5_QUERY_ID) @@ -6683,7 +6659,7 @@ public abstract class BaseTest { .creators(new LinkedList<>(List.of(IDENTIFIER_5_CREATOR_1_DTO, IDENTIFIER_5_CREATOR_2_DTO))) .build(); - public final static IdentifierBriefDto IDENTIFIER_5_BRIEF_DTO = IdentifierBriefDto.builder() + public static final IdentifierBriefDto IDENTIFIER_5_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_5_ID) .databaseId(DATABASE_2_ID) .queryId(IDENTIFIER_5_QUERY_ID) @@ -6694,15 +6670,15 @@ public abstract class BaseTest { .type(IDENTIFIER_5_TYPE_DTO) .build(); - public final static Long RELATED_IDENTIFIER_5_ID = 1L; - public final static Long RELATED_IDENTIFIER_5_IDENTIFIER_ID = 2L; - public final static String RELATED_IDENTIFIER_5_VALUE = "10.5281/zenodo.6637333"; - public final static RelatedType RELATED_IDENTIFIER_5_TYPE = RelatedType.DOI; - public final static RelatedTypeDto RELATED_IDENTIFIER_5_TYPE_DTO = RelatedTypeDto.DOI; - public final static RelationType RELATED_IDENTIFIER_5_RELATION_TYPE = RelationType.CITES; - public final static RelationTypeDto RELATED_IDENTIFIER_5_RELATION_TYPE_DTO = RelationTypeDto.CITES; + public static final Long RELATED_IDENTIFIER_5_ID = 1L; + public static final Long RELATED_IDENTIFIER_5_IDENTIFIER_ID = 2L; + public static final String RELATED_IDENTIFIER_5_VALUE = "10.5281/zenodo.6637333"; + public static final RelatedType RELATED_IDENTIFIER_5_TYPE = RelatedType.DOI; + public static final RelatedTypeDto RELATED_IDENTIFIER_5_TYPE_DTO = RelatedTypeDto.DOI; + public static final RelationType RELATED_IDENTIFIER_5_RELATION_TYPE = RelationType.CITES; + public static final RelationTypeDto RELATED_IDENTIFIER_5_RELATION_TYPE_DTO = RelationTypeDto.CITES; - public final static RelatedIdentifier IDENTIFIER_1_RELATED_IDENTIFIER_1 = RelatedIdentifier.builder() + public static final RelatedIdentifier IDENTIFIER_1_RELATED_IDENTIFIER_1 = RelatedIdentifier.builder() .id(RELATED_IDENTIFIER_5_ID) .identifier(IDENTIFIER_5) .type(RELATED_IDENTIFIER_5_TYPE) @@ -6710,19 +6686,19 @@ public abstract class BaseTest { .value(RELATED_IDENTIFIER_5_VALUE) .build(); - public final static SaveRelatedIdentifierDto IDENTIFIER_1_RELATED_IDENTIFIER_5_CREATE_DTO = SaveRelatedIdentifierDto.builder() + public static final SaveRelatedIdentifierDto IDENTIFIER_1_RELATED_IDENTIFIER_5_CREATE_DTO = SaveRelatedIdentifierDto.builder() .value(RELATED_IDENTIFIER_5_VALUE) .type(RELATED_IDENTIFIER_5_TYPE_DTO) .relation(RELATED_IDENTIFIER_5_RELATION_TYPE_DTO) .build(); - public final static CreateIdentifierDto IDENTIFIER_5_CREATE_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_5_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_5_DATABASE_ID) .publicationYear(IDENTIFIER_5_PUBLICATION_YEAR) .publisher(IDENTIFIER_5_PUBLISHER) .build(); - public final static IdentifierSaveDto IDENTIFIER_5_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_5_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_5_ID) .queryId(IDENTIFIER_5_QUERY_ID) .databaseId(IDENTIFIER_5_DATABASE_ID) @@ -6738,84 +6714,84 @@ public abstract class BaseTest { .type(IDENTIFIER_5_TYPE_DTO) .build(); - public final static Long IDENTIFIER_6_ID = 6L; - public final static Long IDENTIFIER_6_QUERY_ID = QUERY_3_ID; - public final static Long IDENTIFIER_6_CONTAINER_ID = CONTAINER_3_ID; - public final static Long IDENTIFIER_6_DATABASE_ID = DATABASE_3_ID; - public final static String IDENTIFIER_6_DOI = null; - public final static Instant IDENTIFIER_6_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant IDENTIFIER_6_MODIFIED = Instant.ofEpochSecond(1541588352L); - public final static Instant IDENTIFIER_6_EXECUTION = Instant.ofEpochSecond(1541588352L); - public final static Integer IDENTIFIER_6_PUBLICATION_DAY = 14; - public final static Integer IDENTIFIER_6_PUBLICATION_MONTH = 7; - public final static Integer IDENTIFIER_6_PUBLICATION_YEAR = 2022; - public final static String IDENTIFIER_6_QUERY_HASH = QUERY_3_QUERY_HASH; - public final static String IDENTIFIER_6_RESULT_HASH = QUERY_3_RESULT_HASH; - public final static String IDENTIFIER_6_QUERY = QUERY_3_STATEMENT; - public final static String IDENTIFIER_6_NORMALIZED = QUERY_3_STATEMENT; - public final static Long IDENTIFIER_6_RESULT_NUMBER = QUERY_3_RESULT_NUMBER; - public final static String IDENTIFIER_6_PUBLISHER = "Norwegian Government"; - public final static IdentifierType IDENTIFIER_6_TYPE = IdentifierType.SUBSET; - public final static IdentifierTypeDto IDENTIFIER_6_TYPE_DTO = IdentifierTypeDto.SUBSET; - public final static IdentifierStatusType IDENTIFIER_6_STATUS_TYPE = IdentifierStatusType.PUBLISHED; - public final static IdentifierStatusTypeDto IDENTIFIER_6_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; - - public final static Long IDENTIFIER_6_TITLE_1_ID = 4L; - public final static Long IDENTIFIER_6_TITLE_1_IDENTIFIER_ID = IDENTIFIER_6_ID; - public final static String IDENTIFIER_6_TITLE_1_TITLE = "Norwegian weather data"; - public final static String IDENTIFIER_6_TITLE_1_TITLE_MODIFY = "Norwegian weather some data"; - public final static LanguageType IDENTIFIER_6_TITLE_1_LANG = LanguageType.EN; - public final static LanguageTypeDto IDENTIFIER_6_TITLE_1_LANG_DTO = LanguageTypeDto.EN; - - public final static IdentifierTitle IDENTIFIER_6_TITLE_1 = IdentifierTitle.builder() + public static final Long IDENTIFIER_6_ID = 6L; + public static final Long IDENTIFIER_6_QUERY_ID = QUERY_3_ID; + public static final Long IDENTIFIER_6_CONTAINER_ID = CONTAINER_3_ID; + public static final Long IDENTIFIER_6_DATABASE_ID = DATABASE_3_ID; + public static final String IDENTIFIER_6_DOI = null; + public static final Instant IDENTIFIER_6_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant IDENTIFIER_6_MODIFIED = Instant.ofEpochSecond(1541588352L); + public static final Instant IDENTIFIER_6_EXECUTION = Instant.ofEpochSecond(1541588352L); + public static final Integer IDENTIFIER_6_PUBLICATION_DAY = 14; + public static final Integer IDENTIFIER_6_PUBLICATION_MONTH = 7; + public static final Integer IDENTIFIER_6_PUBLICATION_YEAR = 2022; + public static final String IDENTIFIER_6_QUERY_HASH = QUERY_3_QUERY_HASH; + public static final String IDENTIFIER_6_RESULT_HASH = QUERY_3_RESULT_HASH; + public static final String IDENTIFIER_6_QUERY = QUERY_3_STATEMENT; + public static final String IDENTIFIER_6_NORMALIZED = QUERY_3_STATEMENT; + public static final Long IDENTIFIER_6_RESULT_NUMBER = QUERY_3_RESULT_NUMBER; + public static final String IDENTIFIER_6_PUBLISHER = "Norwegian Government"; + public static final IdentifierType IDENTIFIER_6_TYPE = IdentifierType.SUBSET; + public static final IdentifierTypeDto IDENTIFIER_6_TYPE_DTO = IdentifierTypeDto.SUBSET; + public static final IdentifierStatusType IDENTIFIER_6_STATUS_TYPE = IdentifierStatusType.PUBLISHED; + public static final IdentifierStatusTypeDto IDENTIFIER_6_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; + + public static final Long IDENTIFIER_6_TITLE_1_ID = 4L; + public static final Long IDENTIFIER_6_TITLE_1_IDENTIFIER_ID = IDENTIFIER_6_ID; + public static final String IDENTIFIER_6_TITLE_1_TITLE = "Norwegian weather data"; + public static final String IDENTIFIER_6_TITLE_1_TITLE_MODIFY = "Norwegian weather some data"; + public static final LanguageType IDENTIFIER_6_TITLE_1_LANG = LanguageType.EN; + public static final LanguageTypeDto IDENTIFIER_6_TITLE_1_LANG_DTO = LanguageTypeDto.EN; + + public static final IdentifierTitle IDENTIFIER_6_TITLE_1 = IdentifierTitle.builder() .id(IDENTIFIER_6_TITLE_1_ID) .title(IDENTIFIER_6_TITLE_1_TITLE) .language(IDENTIFIER_6_TITLE_1_LANG) .build(); - public final static IdentifierTitleDto IDENTIFIER_6_TITLE_1_DTO = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_6_TITLE_1_DTO = IdentifierTitleDto.builder() .id(IDENTIFIER_6_TITLE_1_ID) .title(IDENTIFIER_6_TITLE_1_TITLE) .language(IDENTIFIER_6_TITLE_1_LANG_DTO) .build(); - public final static IdentifierTitleDto IDENTIFIER_6_TITLE_1_DTO_MODIFY = IdentifierTitleDto.builder() + public static final IdentifierTitleDto IDENTIFIER_6_TITLE_1_DTO_MODIFY = IdentifierTitleDto.builder() .id(IDENTIFIER_6_TITLE_1_ID) .title(IDENTIFIER_6_TITLE_1_TITLE_MODIFY) .language(IDENTIFIER_6_TITLE_1_LANG_DTO) .build(); - public final static SaveIdentifierTitleDto IDENTIFIER_6_TITLE_1_CREATE_DTO = SaveIdentifierTitleDto.builder() + public static final SaveIdentifierTitleDto IDENTIFIER_6_TITLE_1_CREATE_DTO = SaveIdentifierTitleDto.builder() .title(IDENTIFIER_6_TITLE_1_TITLE_MODIFY) .language(IDENTIFIER_6_TITLE_1_LANG_DTO) .build(); - public final static Long IDENTIFIER_6_DESCRIPTION_1_ID = 3L; - public final static Long IDENTIFIER_6_DESCRIPTION_1_IDENTIFIER_ID = IDENTIFIER_6_ID; - public final static String IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION = "Selecting all from the weather Norwegian table"; - public final static String IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION_MODIFY = "Selecting some from the weather Norwegian table"; - public final static LanguageType IDENTIFIER_6_DESCRIPTION_1_LANG = LanguageType.EN; - public final static LanguageTypeDto IDENTIFIER_6_DESCRIPTION_1_LANG_DTO = LanguageTypeDto.EN; + public static final Long IDENTIFIER_6_DESCRIPTION_1_ID = 3L; + public static final Long IDENTIFIER_6_DESCRIPTION_1_IDENTIFIER_ID = IDENTIFIER_6_ID; + public static final String IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION = "Selecting all from the weather Norwegian table"; + public static final String IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION_MODIFY = "Selecting some from the weather Norwegian table"; + public static final LanguageType IDENTIFIER_6_DESCRIPTION_1_LANG = LanguageType.EN; + public static final LanguageTypeDto IDENTIFIER_6_DESCRIPTION_1_LANG_DTO = LanguageTypeDto.EN; - public final static IdentifierDescription IDENTIFIER_6_DESCRIPTION_1 = IdentifierDescription.builder() + public static final IdentifierDescription IDENTIFIER_6_DESCRIPTION_1 = IdentifierDescription.builder() .id(IDENTIFIER_6_DESCRIPTION_1_ID) .description(IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION) .language(IDENTIFIER_6_DESCRIPTION_1_LANG) .build(); - public final static IdentifierDescriptionDto IDENTIFIER_6_DESCRIPTION_1_DTO = IdentifierDescriptionDto.builder() + public static final IdentifierDescriptionDto IDENTIFIER_6_DESCRIPTION_1_DTO = IdentifierDescriptionDto.builder() .id(IDENTIFIER_6_DESCRIPTION_1_ID) .description(IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION) .language(IDENTIFIER_6_DESCRIPTION_1_LANG_DTO) .build(); - public final static IdentifierDescriptionDto IDENTIFIER_6_DESCRIPTION_1_DTO_MODIFY = IdentifierDescriptionDto.builder() + public static final IdentifierDescriptionDto IDENTIFIER_6_DESCRIPTION_1_DTO_MODIFY = IdentifierDescriptionDto.builder() .id(IDENTIFIER_6_DESCRIPTION_1_ID) .description(IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION_MODIFY) .language(IDENTIFIER_6_DESCRIPTION_1_LANG_DTO) .build(); - public final static SaveIdentifierDescriptionDto IDENTIFIER_6_DESCRIPTION_1_CREATE_DTO = SaveIdentifierDescriptionDto.builder() + public static final SaveIdentifierDescriptionDto IDENTIFIER_6_DESCRIPTION_1_CREATE_DTO = SaveIdentifierDescriptionDto.builder() .id(null) .description(IDENTIFIER_6_DESCRIPTION_1_DESCRIPTION_MODIFY) .language(IDENTIFIER_6_DESCRIPTION_1_LANG_DTO) @@ -6823,7 +6799,7 @@ public abstract class BaseTest { private final static Long IDENTIFIER_6_CREATOR_1_ID = 4L; - public final static Creator IDENTIFIER_6_CREATOR_1 = Creator.builder() + public static final Creator IDENTIFIER_6_CREATOR_1 = Creator.builder() .id(IDENTIFIER_6_CREATOR_1_ID) .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) @@ -6836,7 +6812,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_1_AFFIL_URI) .build(); - public final static CreatorDto IDENTIFIER_6_CREATOR_1_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_6_CREATOR_1_DTO = CreatorDto.builder() .id(IDENTIFIER_6_CREATOR_1_ID) .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) @@ -6849,7 +6825,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_1_AFFIL_URI) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_6_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_6_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) .creatorName(CREATOR_1_NAME) @@ -6860,7 +6836,7 @@ public abstract class BaseTest { .affiliationIdentifierScheme(CREATOR_1_AFFIL_TYPE_DTO) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_6_CREATOR_1_MODIFY_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_6_CREATOR_1_MODIFY_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) .creatorName(CREATOR_1_NAME) @@ -6873,7 +6849,7 @@ public abstract class BaseTest { private final static Long IDENTIFIER_6_CREATOR_2_ID = 5L; - public final static Creator IDENTIFIER_6_CREATOR_2 = Creator.builder() + public static final Creator IDENTIFIER_6_CREATOR_2 = Creator.builder() .id(IDENTIFIER_6_CREATOR_2_ID) .firstname(CREATOR_2_FIRSTNAME) .lastname(CREATOR_2_LASTNAME) @@ -6883,7 +6859,7 @@ public abstract class BaseTest { .affiliation(CREATOR_2_AFFIL) .build(); - public final static CreatorDto IDENTIFIER_6_CREATOR_2_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_6_CREATOR_2_DTO = CreatorDto.builder() .id(IDENTIFIER_6_CREATOR_2_ID) .firstname(CREATOR_2_FIRSTNAME) .lastname(CREATOR_2_LASTNAME) @@ -6895,7 +6871,7 @@ public abstract class BaseTest { private final static Long IDENTIFIER_6_CREATOR_3_ID = 6L; - public final static Creator IDENTIFIER_6_CREATOR_3 = Creator.builder() + public static final Creator IDENTIFIER_6_CREATOR_3 = Creator.builder() .id(IDENTIFIER_6_CREATOR_3_ID) .firstname(CREATOR_3_FIRSTNAME) .lastname(CREATOR_3_LASTNAME) @@ -6908,7 +6884,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_3_AFFIL_URI) .build(); - public final static CreatorDto IDENTIFIER_6_CREATOR_3_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_6_CREATOR_3_DTO = CreatorDto.builder() .id(IDENTIFIER_6_CREATOR_3_ID) .firstname(CREATOR_3_FIRSTNAME) .lastname(CREATOR_3_LASTNAME) @@ -6921,7 +6897,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_3_AFFIL_URI) .build(); - public final static Identifier IDENTIFIER_6 = Identifier.builder() + public static final Identifier IDENTIFIER_6 = Identifier.builder() .id(IDENTIFIER_6_ID) .queryId(IDENTIFIER_6_QUERY_ID) .descriptions(new LinkedList<>(List.of(IDENTIFIER_6_DESCRIPTION_1))) @@ -6947,7 +6923,7 @@ public abstract class BaseTest { .status(IDENTIFIER_6_STATUS_TYPE) .build(); - public final static IdentifierDto IDENTIFIER_6_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_6_DTO = IdentifierDto.builder() .id(IDENTIFIER_6_ID) .databaseId(DATABASE_3_ID) .queryId(IDENTIFIER_6_QUERY_ID) @@ -6972,7 +6948,7 @@ public abstract class BaseTest { .build(); - public final static IdentifierBriefDto IDENTIFIER_6_BRIEF_DTO = IdentifierBriefDto.builder() + public static final IdentifierBriefDto IDENTIFIER_6_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_6_ID) .databaseId(DATABASE_3_ID) .queryId(IDENTIFIER_6_QUERY_ID) @@ -6984,13 +6960,13 @@ public abstract class BaseTest { .status(IDENTIFIER_6_STATUS_TYPE_DTO) .build(); - public final static CreateIdentifierDto IDENTIFIER_6_CREATE_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_6_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_6_DATABASE_ID) .publicationYear(IDENTIFIER_6_PUBLICATION_YEAR) .publisher(IDENTIFIER_6_PUBLISHER) .build(); - public final static IdentifierSaveDto IDENTIFIER_6_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_6_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_6_ID) .databaseId(IDENTIFIER_6_DATABASE_ID) .queryId(IDENTIFIER_6_QUERY_ID) @@ -7005,23 +6981,23 @@ public abstract class BaseTest { .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .build(); - public final static Long IDENTIFIER_7_ID = 7L; - public final static Long IDENTIFIER_7_DATABASE_ID = DATABASE_4_ID; - public final static String IDENTIFIER_7_DOI = null; - public final static Instant IDENTIFIER_7_CREATED = Instant.ofEpochSecond(1641588352L); - public final static Instant IDENTIFIER_7_MODIFIED = Instant.ofEpochSecond(1541588352L); - public final static Instant IDENTIFIER_7_EXECUTION = Instant.ofEpochSecond(1541588352L); - public final static Integer IDENTIFIER_7_PUBLICATION_DAY = 14; - public final static Integer IDENTIFIER_7_PUBLICATION_MONTH = 7; - public final static Integer IDENTIFIER_7_PUBLICATION_YEAR = 2022; - public final static Long IDENTIFIER_7_RESULT_NUMBER = 2L; - public final static String IDENTIFIER_7_PUBLISHER = "Swedish Government"; - public final static IdentifierType IDENTIFIER_7_TYPE = IdentifierType.DATABASE; - public final static IdentifierTypeDto IDENTIFIER_7_TYPE_DTO = IdentifierTypeDto.DATABASE; - public final static IdentifierStatusType IDENTIFIER_7_STATUS_TYPE = IdentifierStatusType.DRAFT; - public final static IdentifierStatusTypeDto IDENTIFIER_7_STATUS_TYPE_DTO = IdentifierStatusTypeDto.DRAFT; - - public final static DataCiteBody<DataCiteDoi> IDENTIFIER_7_DATA_CITE = DataCiteBody.<DataCiteDoi>builder() + public static final Long IDENTIFIER_7_ID = 7L; + public static final Long IDENTIFIER_7_DATABASE_ID = DATABASE_4_ID; + public static final String IDENTIFIER_7_DOI = null; + public static final Instant IDENTIFIER_7_CREATED = Instant.ofEpochSecond(1641588352L); + public static final Instant IDENTIFIER_7_MODIFIED = Instant.ofEpochSecond(1541588352L); + public static final Instant IDENTIFIER_7_EXECUTION = Instant.ofEpochSecond(1541588352L); + public static final Integer IDENTIFIER_7_PUBLICATION_DAY = 14; + public static final Integer IDENTIFIER_7_PUBLICATION_MONTH = 7; + public static final Integer IDENTIFIER_7_PUBLICATION_YEAR = 2022; + public static final Long IDENTIFIER_7_RESULT_NUMBER = 2L; + public static final String IDENTIFIER_7_PUBLISHER = "Swedish Government"; + public static final IdentifierType IDENTIFIER_7_TYPE = IdentifierType.DATABASE; + public static final IdentifierTypeDto IDENTIFIER_7_TYPE_DTO = IdentifierTypeDto.DATABASE; + public static final IdentifierStatusType IDENTIFIER_7_STATUS_TYPE = IdentifierStatusType.DRAFT; + public static final IdentifierStatusTypeDto IDENTIFIER_7_STATUS_TYPE_DTO = IdentifierStatusTypeDto.DRAFT; + + public static final DataCiteBody<DataCiteDoi> IDENTIFIER_7_DATA_CITE = DataCiteBody.<DataCiteDoi>builder() .data(DataCiteData.<DataCiteDoi>builder() .type("dois") .attributes(DataCiteDoi.builder() @@ -7032,7 +7008,7 @@ public abstract class BaseTest { private final static Long IDENTIFIER_7_CREATOR_1_ID = 6L; - public final static Creator IDENTIFIER_7_CREATOR_1 = Creator.builder() + public static final Creator IDENTIFIER_7_CREATOR_1 = Creator.builder() .id(IDENTIFIER_7_CREATOR_1_ID) .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) @@ -7045,7 +7021,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_1_AFFIL_URI) .build(); - public final static CreatorDto IDENTIFIER_7_CREATOR_1_DTO = CreatorDto.builder() + public static final CreatorDto IDENTIFIER_7_CREATOR_1_DTO = CreatorDto.builder() .id(IDENTIFIER_7_CREATOR_1_ID) .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) @@ -7058,7 +7034,7 @@ public abstract class BaseTest { .affiliationIdentifierSchemeUri(CREATOR_1_AFFIL_URI) .build(); - public final static IdentifierDto IDENTIFIER_7_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_7_DTO = IdentifierDto.builder() .id(IDENTIFIER_7_ID) .databaseId(DATABASE_4_ID) .descriptions(new LinkedList<>()) @@ -7079,7 +7055,7 @@ public abstract class BaseTest { .status(IDENTIFIER_7_STATUS_TYPE_DTO) .build(); - public final static SaveIdentifierCreatorDto IDENTIFIER_7_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() + public static final SaveIdentifierCreatorDto IDENTIFIER_7_CREATOR_1_CREATE_DTO = SaveIdentifierCreatorDto.builder() .firstname(CREATOR_1_FIRSTNAME) .lastname(CREATOR_1_LASTNAME) .creatorName(CREATOR_1_NAME) @@ -7089,13 +7065,13 @@ public abstract class BaseTest { .affiliationIdentifier(CREATOR_1_AFFIL_ROR) .build(); - public final static CreateIdentifierDto IDENTIFIER_7_CREATE_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_7_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_7_DATABASE_ID) .publicationYear(IDENTIFIER_7_PUBLICATION_YEAR) .publisher(IDENTIFIER_7_PUBLISHER) .build(); - public final static IdentifierSaveDto IDENTIFIER_7_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_7_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_7_ID) .databaseId(IDENTIFIER_7_DATABASE_ID) .descriptions(new LinkedList<>()) @@ -7110,29 +7086,29 @@ public abstract class BaseTest { .type(IDENTIFIER_7_TYPE_DTO) .build(); - public final static Long IDENTIFIER_2_ID = 2L; - public final static Long IDENTIFIER_2_DATABASE_ID = DATABASE_1_ID; - public final static String IDENTIFIER_2_DOI = null; - public final static Instant IDENTIFIER_2_CREATED = Instant.ofEpochSecond(1651588352L); - public final static Instant IDENTIFIER_2_MODIFIED = Instant.ofEpochSecond(1551588352L); - public final static Instant IDENTIFIER_2_EXECUTION = Instant.ofEpochSecond(1551588352L); - public final static Integer IDENTIFIER_2_PUBLICATION_DAY = 10; - public final static Integer IDENTIFIER_2_PUBLICATION_MONTH = 7; - public final static Integer IDENTIFIER_2_PUBLICATION_YEAR = 2023; - public final static String IDENTIFIER_2_QUERY_HASH = QUERY_1_QUERY_HASH; - public final static String IDENTIFIER_2_RESULT_HASH = QUERY_1_RESULT_HASH; - public final static String IDENTIFIER_2_QUERY = QUERY_1_STATEMENT; - public final static Long IDENTIFIER_2_QUERY_ID = QUERY_1_ID; - public final static String IDENTIFIER_2_NORMALIZED = QUERY_1_STATEMENT; - public final static Long IDENTIFIER_2_RESULT_NUMBER = QUERY_1_RESULT_NUMBER; - public final static String IDENTIFIER_2_PUBLISHER = "Swedish Government"; - public final static IdentifierType IDENTIFIER_2_TYPE = IdentifierType.SUBSET; - public final static IdentifierTypeDto IDENTIFIER_2_TYPE_DTO = IdentifierTypeDto.SUBSET; - public final static IdentifierStatusType IDENTIFIER_2_STATUS_TYPE = IdentifierStatusType.PUBLISHED; - public final static IdentifierStatusTypeDto IDENTIFIER_2_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; - public final static UUID IDENTIFIER_2_CREATED_BY = USER_1_ID; - - public final static CreateIdentifierDto IDENTIFIER_2_CREATE_DTO = CreateIdentifierDto.builder() + public static final Long IDENTIFIER_2_ID = 2L; + public static final Long IDENTIFIER_2_DATABASE_ID = DATABASE_1_ID; + public static final String IDENTIFIER_2_DOI = null; + public static final Instant IDENTIFIER_2_CREATED = Instant.ofEpochSecond(1651588352L); + public static final Instant IDENTIFIER_2_MODIFIED = Instant.ofEpochSecond(1551588352L); + public static final Instant IDENTIFIER_2_EXECUTION = Instant.ofEpochSecond(1551588352L); + public static final Integer IDENTIFIER_2_PUBLICATION_DAY = 10; + public static final Integer IDENTIFIER_2_PUBLICATION_MONTH = 7; + public static final Integer IDENTIFIER_2_PUBLICATION_YEAR = 2023; + public static final String IDENTIFIER_2_QUERY_HASH = QUERY_1_QUERY_HASH; + public static final String IDENTIFIER_2_RESULT_HASH = QUERY_1_RESULT_HASH; + public static final String IDENTIFIER_2_QUERY = QUERY_1_STATEMENT; + public static final Long IDENTIFIER_2_QUERY_ID = QUERY_1_ID; + public static final String IDENTIFIER_2_NORMALIZED = QUERY_1_STATEMENT; + public static final Long IDENTIFIER_2_RESULT_NUMBER = QUERY_1_RESULT_NUMBER; + public static final String IDENTIFIER_2_PUBLISHER = "Swedish Government"; + public static final IdentifierType IDENTIFIER_2_TYPE = IdentifierType.SUBSET; + public static final IdentifierTypeDto IDENTIFIER_2_TYPE_DTO = IdentifierTypeDto.SUBSET; + public static final IdentifierStatusType IDENTIFIER_2_STATUS_TYPE = IdentifierStatusType.PUBLISHED; + public static final IdentifierStatusTypeDto IDENTIFIER_2_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; + public static final UUID IDENTIFIER_2_CREATED_BY = USER_1_ID; + + public static final CreateIdentifierDto IDENTIFIER_2_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_2_DATABASE_ID) .queryId(IDENTIFIER_2_QUERY_ID) .type(IDENTIFIER_2_TYPE_DTO) @@ -7140,7 +7116,7 @@ public abstract class BaseTest { .publisher(IDENTIFIER_2_PUBLISHER) .build(); - public final static Identifier IDENTIFIER_2 = Identifier.builder() + public static final Identifier IDENTIFIER_2 = Identifier.builder() .id(IDENTIFIER_2_ID) .queryId(IDENTIFIER_2_QUERY_ID) .descriptions(new LinkedList<>()) @@ -7167,7 +7143,7 @@ public abstract class BaseTest { .status(IDENTIFIER_2_STATUS_TYPE) .build(); - public final static IdentifierDto IDENTIFIER_2_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_2_DTO = IdentifierDto.builder() .id(IDENTIFIER_2_ID) .queryId(IDENTIFIER_2_QUERY_ID) .databaseId(IDENTIFIER_2_DATABASE_ID) @@ -7191,7 +7167,7 @@ public abstract class BaseTest { .status(IDENTIFIER_2_STATUS_TYPE_DTO) .build(); - public final static IdentifierBriefDto IDENTIFIER_2_BRIEF_DTO = IdentifierBriefDto.builder() + public static final IdentifierBriefDto IDENTIFIER_2_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_2_ID) .queryId(IDENTIFIER_2_QUERY_ID) .databaseId(IDENTIFIER_2_DATABASE_ID) @@ -7203,7 +7179,7 @@ public abstract class BaseTest { .status(IDENTIFIER_2_STATUS_TYPE_DTO) .build(); - public final static IdentifierSaveDto IDENTIFIER_2_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_2_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_2_ID) .databaseId(IDENTIFIER_2_DATABASE_ID) .queryId(IDENTIFIER_2_QUERY_ID) @@ -7219,29 +7195,29 @@ public abstract class BaseTest { .queryId(QUERY_1_ID) .build(); - public final static Long IDENTIFIER_3_ID = 3L; - public final static Long IDENTIFIER_3_DATABASE_ID = DATABASE_1_ID; - public final static Long IDENTIFIER_3_VIEW_ID = VIEW_1_ID; - public final static String IDENTIFIER_3_DOI = null; - public final static Instant IDENTIFIER_3_CREATED = Instant.ofEpochSecond(1651588352L); - public final static Instant IDENTIFIER_3_MODIFIED = Instant.ofEpochSecond(1551588352L); - public final static Instant IDENTIFIER_3_EXECUTION = Instant.ofEpochSecond(1551588352L); - public final static Integer IDENTIFIER_3_PUBLICATION_DAY = 10; - public final static Integer IDENTIFIER_3_PUBLICATION_MONTH = 7; - public final static Integer IDENTIFIER_3_PUBLICATION_YEAR = 2023; - public final static String IDENTIFIER_3_QUERY_HASH = VIEW_1_QUERY_HASH; - public final static String IDENTIFIER_3_RESULT_HASH = null; - public final static String IDENTIFIER_3_QUERY = VIEW_1_QUERY; - public final static String IDENTIFIER_3_NORMALIZED = VIEW_1_QUERY; - public final static Long IDENTIFIER_3_RESULT_NUMBER = null; - public final static String IDENTIFIER_3_PUBLISHER = "Polish Government"; - public final static IdentifierType IDENTIFIER_3_TYPE = IdentifierType.VIEW; - public final static IdentifierTypeDto IDENTIFIER_3_TYPE_DTO = IdentifierTypeDto.VIEW; - public final static IdentifierStatusType IDENTIFIER_3_STATUS_TYPE = IdentifierStatusType.PUBLISHED; - public final static IdentifierStatusTypeDto IDENTIFIER_3_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; - public final static UUID IDENTIFIER_3_CREATED_BY = USER_1_ID; - - public final static Identifier IDENTIFIER_3 = Identifier.builder() + public static final Long IDENTIFIER_3_ID = 3L; + public static final Long IDENTIFIER_3_DATABASE_ID = DATABASE_1_ID; + public static final Long IDENTIFIER_3_VIEW_ID = VIEW_1_ID; + public static final String IDENTIFIER_3_DOI = null; + public static final Instant IDENTIFIER_3_CREATED = Instant.ofEpochSecond(1651588352L); + public static final Instant IDENTIFIER_3_MODIFIED = Instant.ofEpochSecond(1551588352L); + public static final Instant IDENTIFIER_3_EXECUTION = Instant.ofEpochSecond(1551588352L); + public static final Integer IDENTIFIER_3_PUBLICATION_DAY = 10; + public static final Integer IDENTIFIER_3_PUBLICATION_MONTH = 7; + public static final Integer IDENTIFIER_3_PUBLICATION_YEAR = 2023; + public static final String IDENTIFIER_3_QUERY_HASH = VIEW_1_QUERY_HASH; + public static final String IDENTIFIER_3_RESULT_HASH = null; + public static final String IDENTIFIER_3_QUERY = VIEW_1_QUERY; + public static final String IDENTIFIER_3_NORMALIZED = VIEW_1_QUERY; + public static final Long IDENTIFIER_3_RESULT_NUMBER = null; + public static final String IDENTIFIER_3_PUBLISHER = "Polish Government"; + public static final IdentifierType IDENTIFIER_3_TYPE = IdentifierType.VIEW; + public static final IdentifierTypeDto IDENTIFIER_3_TYPE_DTO = IdentifierTypeDto.VIEW; + public static final IdentifierStatusType IDENTIFIER_3_STATUS_TYPE = IdentifierStatusType.PUBLISHED; + public static final IdentifierStatusTypeDto IDENTIFIER_3_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; + public static final UUID IDENTIFIER_3_CREATED_BY = USER_1_ID; + + public static final Identifier IDENTIFIER_3 = Identifier.builder() .id(IDENTIFIER_3_ID) .viewId(IDENTIFIER_3_VIEW_ID) .descriptions(new LinkedList<>()) @@ -7268,7 +7244,7 @@ public abstract class BaseTest { .status(IDENTIFIER_3_STATUS_TYPE) .build(); - public final static IdentifierDto IDENTIFIER_3_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_3_DTO = IdentifierDto.builder() .id(IDENTIFIER_3_ID) .databaseId(IDENTIFIER_3_DATABASE_ID) .viewId(IDENTIFIER_3_VIEW_ID) @@ -7292,7 +7268,7 @@ public abstract class BaseTest { .status(IDENTIFIER_3_STATUS_TYPE_DTO) .build(); - public final static IdentifierBriefDto IDENTIFIER_3_BRIEF_DTO = IdentifierBriefDto.builder() + public static final IdentifierBriefDto IDENTIFIER_3_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_3_ID) .databaseId(IDENTIFIER_3_DATABASE_ID) .viewId(IDENTIFIER_3_VIEW_ID) @@ -7304,7 +7280,7 @@ public abstract class BaseTest { .status(IDENTIFIER_3_STATUS_TYPE_DTO) .build(); - public final static CreateIdentifierDto IDENTIFIER_3_CREATE_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_3_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_3_DATABASE_ID) .viewId(IDENTIFIER_3_VIEW_ID) .type(IDENTIFIER_3_TYPE_DTO) @@ -7312,7 +7288,7 @@ public abstract class BaseTest { .publisher(IDENTIFIER_3_PUBLISHER) .build(); - public final static IdentifierSaveDto IDENTIFIER_3_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_3_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_3_ID) .databaseId(IDENTIFIER_3_DATABASE_ID) .viewId(IDENTIFIER_3_VIEW_ID) @@ -7327,26 +7303,26 @@ public abstract class BaseTest { .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .build(); - public final static Long IDENTIFIER_4_ID = 4L; - public final static Long IDENTIFIER_4_DATABASE_ID = DATABASE_1_ID; - public final static Long IDENTIFIER_4_TABLE_ID = TABLE_1_ID; - public final static String IDENTIFIER_4_DOI = null; - public final static Instant IDENTIFIER_4_CREATED = Instant.ofEpochSecond(1751588352L); - public final static Instant IDENTIFIER_4_MODIFIED = Instant.ofEpochSecond(1551588352L); - public final static Instant IDENTIFIER_4_EXECUTION = Instant.ofEpochSecond(1551588352L); - public final static Integer IDENTIFIER_4_PUBLICATION_DAY = 10; - public final static Integer IDENTIFIER_4_PUBLICATION_MONTH = 7; - public final static Integer IDENTIFIER_4_PUBLICATION_YEAR = 2023; - public final static String IDENTIFIER_4_RESULT_HASH = null; - public final static Long IDENTIFIER_4_RESULT_NUMBER = null; - public final static String IDENTIFIER_4_PUBLISHER = "Example Publisher"; - public final static IdentifierType IDENTIFIER_4_TYPE = IdentifierType.TABLE; - public final static IdentifierTypeDto IDENTIFIER_4_TYPE_DTO = IdentifierTypeDto.TABLE; - public final static IdentifierStatusType IDENTIFIER_4_STATUS_TYPE = IdentifierStatusType.PUBLISHED; - public final static IdentifierStatusTypeDto IDENTIFIER_4_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; - public final static UUID IDENTIFIER_4_CREATED_BY = USER_1_ID; - - public final static Identifier IDENTIFIER_4 = Identifier.builder() + public static final Long IDENTIFIER_4_ID = 4L; + public static final Long IDENTIFIER_4_DATABASE_ID = DATABASE_1_ID; + public static final Long IDENTIFIER_4_TABLE_ID = TABLE_1_ID; + public static final String IDENTIFIER_4_DOI = null; + public static final Instant IDENTIFIER_4_CREATED = Instant.ofEpochSecond(1751588352L); + public static final Instant IDENTIFIER_4_MODIFIED = Instant.ofEpochSecond(1551588352L); + public static final Instant IDENTIFIER_4_EXECUTION = Instant.ofEpochSecond(1551588352L); + public static final Integer IDENTIFIER_4_PUBLICATION_DAY = 10; + public static final Integer IDENTIFIER_4_PUBLICATION_MONTH = 7; + public static final Integer IDENTIFIER_4_PUBLICATION_YEAR = 2023; + public static final String IDENTIFIER_4_RESULT_HASH = null; + public static final Long IDENTIFIER_4_RESULT_NUMBER = null; + public static final String IDENTIFIER_4_PUBLISHER = "Example Publisher"; + public static final IdentifierType IDENTIFIER_4_TYPE = IdentifierType.TABLE; + public static final IdentifierTypeDto IDENTIFIER_4_TYPE_DTO = IdentifierTypeDto.TABLE; + public static final IdentifierStatusType IDENTIFIER_4_STATUS_TYPE = IdentifierStatusType.PUBLISHED; + public static final IdentifierStatusTypeDto IDENTIFIER_4_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; + public static final UUID IDENTIFIER_4_CREATED_BY = USER_1_ID; + + public static final Identifier IDENTIFIER_4 = Identifier.builder() .id(IDENTIFIER_4_ID) .tableId(IDENTIFIER_4_TABLE_ID) .descriptions(new LinkedList<>()) @@ -7370,7 +7346,7 @@ public abstract class BaseTest { .status(IDENTIFIER_4_STATUS_TYPE) .build(); - public final static IdentifierDto IDENTIFIER_4_DTO = IdentifierDto.builder() + public static final IdentifierDto IDENTIFIER_4_DTO = IdentifierDto.builder() .id(IDENTIFIER_4_ID) .databaseId(IDENTIFIER_4_DATABASE_ID) .tableId(IDENTIFIER_4_TABLE_ID) @@ -7391,7 +7367,7 @@ public abstract class BaseTest { .status(IDENTIFIER_4_STATUS_TYPE_DTO) .build(); - public final static IdentifierBriefDto IDENTIFIER_4_BRIEF_DTO = IdentifierBriefDto.builder() + public static final IdentifierBriefDto IDENTIFIER_4_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_4_ID) .databaseId(IDENTIFIER_4_DATABASE_ID) .tableId(IDENTIFIER_4_TABLE_ID) @@ -7403,13 +7379,13 @@ public abstract class BaseTest { .status(IDENTIFIER_4_STATUS_TYPE_DTO) .build(); - public final static CreateIdentifierDto IDENTIFIER_4_CREATE_DTO = CreateIdentifierDto.builder() + public static final CreateIdentifierDto IDENTIFIER_4_CREATE_DTO = CreateIdentifierDto.builder() .databaseId(IDENTIFIER_4_DATABASE_ID) .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR) .publisher(IDENTIFIER_4_PUBLISHER) .build(); - public final static IdentifierSaveDto IDENTIFIER_4_SAVE_DTO = IdentifierSaveDto.builder() + public static final IdentifierSaveDto IDENTIFIER_4_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_4_ID) .databaseId(IDENTIFIER_4_DATABASE_ID) .tableId(IDENTIFIER_4_TABLE_ID) @@ -7424,36 +7400,36 @@ public abstract class BaseTest { .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .build(); - public final static String VIRTUAL_HOST_NAME = "fda"; - public final static String VIRTUAL_HOST_DESCRIPTION = "FAIR Data Austria"; - public final static String VIRTUAL_HOST_TAGS = ""; + public static final String VIRTUAL_HOST_NAME = "fda"; + public static final String VIRTUAL_HOST_DESCRIPTION = "FAIR Data Austria"; + public static final String VIRTUAL_HOST_TAGS = ""; - public final static CreateVirtualHostDto VIRTUAL_HOST_CREATE_DTO = CreateVirtualHostDto.builder() + public static final CreateVirtualHostDto VIRTUAL_HOST_CREATE_DTO = CreateVirtualHostDto.builder() .name(VIRTUAL_HOST_NAME) .description(VIRTUAL_HOST_DESCRIPTION) .tags(VIRTUAL_HOST_TAGS) .build(); - public final static ExchangeUpdatePermissionsDto VIRTUAL_HOST_EXCHANGE_UPDATE_DTO = ExchangeUpdatePermissionsDto.builder() + public static final ExchangeUpdatePermissionsDto VIRTUAL_HOST_EXCHANGE_UPDATE_DTO = ExchangeUpdatePermissionsDto.builder() .exchange(DATABASE_1_EXCHANGE) .read(".*") .write(".*") .build(); - public final static GrantVirtualHostPermissionsDto VIRTUAL_HOST_GRANT_DTO = GrantVirtualHostPermissionsDto.builder() + public static final GrantVirtualHostPermissionsDto VIRTUAL_HOST_GRANT_DTO = GrantVirtualHostPermissionsDto.builder() .read(".*") .write(".*") .configure(".*") .build(); - public final static Long BANNER_MESSAGE_1_ID = 1L; - public final static String BANNER_MESSAGE_1_MESSAGE = "Next maintenance in 7 days!"; - public final static BannerMessageType BANNER_MESSAGE_1_TYPE = BannerMessageType.INFO; - public final static BannerMessageTypeDto BANNER_MESSAGE_1_TYPE_DTO = BannerMessageTypeDto.INFO; - public final static Instant BANNER_MESSAGE_1_START = Instant.ofEpochSecond(1684577786L) /* 2022-12-23 22:00:00 (UTC) */; - public final static Instant BANNER_MESSAGE_1_END = null; + public static final Long BANNER_MESSAGE_1_ID = 1L; + public static final String BANNER_MESSAGE_1_MESSAGE = "Next maintenance in 7 days!"; + public static final BannerMessageType BANNER_MESSAGE_1_TYPE = BannerMessageType.INFO; + public static final BannerMessageTypeDto BANNER_MESSAGE_1_TYPE_DTO = BannerMessageTypeDto.INFO; + public static final Instant BANNER_MESSAGE_1_START = Instant.ofEpochSecond(1684577786L) /* 2022-12-23 22:00:00 (UTC) */; + public static final Instant BANNER_MESSAGE_1_END = null; - public final static BannerMessage BANNER_MESSAGE_1 = BannerMessage.builder() + public static final BannerMessage BANNER_MESSAGE_1 = BannerMessage.builder() .id(BANNER_MESSAGE_1_ID) .message(BANNER_MESSAGE_1_MESSAGE) .type(BANNER_MESSAGE_1_TYPE) @@ -7461,7 +7437,7 @@ public abstract class BaseTest { .displayEnd(BANNER_MESSAGE_1_END) .build(); - public final static BannerMessageDto BANNER_MESSAGE_1_DTO = BannerMessageDto.builder() + public static final BannerMessageDto BANNER_MESSAGE_1_DTO = BannerMessageDto.builder() .id(BANNER_MESSAGE_1_ID) .message(BANNER_MESSAGE_1_MESSAGE) .type(BANNER_MESSAGE_1_TYPE_DTO) @@ -7469,28 +7445,28 @@ public abstract class BaseTest { .displayEnd(BANNER_MESSAGE_1_END) .build(); - public final static BannerMessageCreateDto BANNER_MESSAGE_1_CREATE_DTO = BannerMessageCreateDto.builder() + public static final BannerMessageCreateDto BANNER_MESSAGE_1_CREATE_DTO = BannerMessageCreateDto.builder() .message(BANNER_MESSAGE_1_MESSAGE) .type(BANNER_MESSAGE_1_TYPE_DTO) .displayStart(BANNER_MESSAGE_1_START) .displayEnd(BANNER_MESSAGE_1_END) .build(); - public final static BannerMessageUpdateDto BANNER_MESSAGE_1_UPDATE_DTO = BannerMessageUpdateDto.builder() + public static final BannerMessageUpdateDto BANNER_MESSAGE_1_UPDATE_DTO = BannerMessageUpdateDto.builder() .message(BANNER_MESSAGE_1_MESSAGE) .type(BannerMessageTypeDto.WARNING) .displayStart(BANNER_MESSAGE_1_START) .displayEnd(BANNER_MESSAGE_1_END) .build(); - public final static Long BANNER_MESSAGE_2_ID = 2L; - public final static String BANNER_MESSAGE_2_MESSAGE = "No operation on Christmas 2022!"; - public final static BannerMessageType BANNER_MESSAGE_2_TYPE = BannerMessageType.ERROR; - public final static BannerMessageTypeDto BANNER_MESSAGE_2_TYPE_DTO = BannerMessageTypeDto.ERROR; - public final static Instant BANNER_MESSAGE_2_START = Instant.ofEpochSecond(1671836400L) /* 2022-12-23 22:00:00 (UTC) */; - public final static Instant BANNER_MESSAGE_2_END = Instant.ofEpochSecond(1672009200L) /* 2022-12-25 22:00:00 (UTC) */; + public static final Long BANNER_MESSAGE_2_ID = 2L; + public static final String BANNER_MESSAGE_2_MESSAGE = "No operation on Christmas 2022!"; + public static final BannerMessageType BANNER_MESSAGE_2_TYPE = BannerMessageType.ERROR; + public static final BannerMessageTypeDto BANNER_MESSAGE_2_TYPE_DTO = BannerMessageTypeDto.ERROR; + public static final Instant BANNER_MESSAGE_2_START = Instant.ofEpochSecond(1671836400L) /* 2022-12-23 22:00:00 (UTC) */; + public static final Instant BANNER_MESSAGE_2_END = Instant.ofEpochSecond(1672009200L) /* 2022-12-25 22:00:00 (UTC) */; - public final static BannerMessage BANNER_MESSAGE_2 = BannerMessage.builder() + public static final BannerMessage BANNER_MESSAGE_2 = BannerMessage.builder() .id(BANNER_MESSAGE_2_ID) .message(BANNER_MESSAGE_2_MESSAGE) .type(BANNER_MESSAGE_2_TYPE) @@ -7498,14 +7474,14 @@ public abstract class BaseTest { .displayEnd(BANNER_MESSAGE_2_END) .build(); - public final static BannerMessageCreateDto BANNER_MESSAGE_2_CREATE_DTO = BannerMessageCreateDto.builder() + public static final BannerMessageCreateDto BANNER_MESSAGE_2_CREATE_DTO = BannerMessageCreateDto.builder() .message(BANNER_MESSAGE_2_MESSAGE) .type(BANNER_MESSAGE_2_TYPE_DTO) .displayStart(BANNER_MESSAGE_2_START) .displayEnd(BANNER_MESSAGE_2_END) .build(); - public final static Database DATABASE_1 = Database.builder() + public static final Database DATABASE_1 = Database.builder() .id(DATABASE_1_ID) .created(Instant.now().minus(1, HOURS)) .lastModified(Instant.now()) @@ -7534,7 +7510,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .build(); - public final static DatabaseDto DATABASE_1_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_1_DTO = DatabaseDto.builder() .id(DATABASE_1_ID) .isPublic(DATABASE_1_PUBLIC) .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC) @@ -7548,7 +7524,7 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); - public final static DatabaseDto DATABASE_1_PRIVILEGED_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_1_PRIVILEGED_DTO = DatabaseDto.builder() .id(DATABASE_1_ID) .isPublic(DATABASE_1_PUBLIC) .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC) @@ -7564,7 +7540,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static DatabaseBriefDto DATABASE_1_BRIEF_DTO = DatabaseBriefDto.builder() + public static final DatabaseBriefDto DATABASE_1_BRIEF_DTO = DatabaseBriefDto.builder() .id(DATABASE_1_ID) .isPublic(DATABASE_1_PUBLIC) .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC) @@ -7573,7 +7549,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>(List.of(IDENTIFIER_1_BRIEF_DTO, IDENTIFIER_2_BRIEF_DTO, IDENTIFIER_3_BRIEF_DTO, IDENTIFIER_4_BRIEF_DTO))) .build(); - public final static DatabaseAccess DATABASE_1_USER_1_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_1_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7581,14 +7557,14 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccessDto DATABASE_1_USER_1_READ_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_1_USER_1_READ_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.READ) .hdbid(DATABASE_1_ID) .huserid(USER_1_ID) .user(USER_1_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_1_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7596,7 +7572,7 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccess DATABASE_1_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7604,7 +7580,7 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccess DATABASE_1_USER_2_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_2_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7612,14 +7588,14 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccessDto DATABASE_1_USER_2_READ_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_1_USER_2_READ_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.READ) .hdbid(DATABASE_1_ID) .huserid(USER_2_ID) .user(USER_2_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_1_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7627,14 +7603,14 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccessDto DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_OWN) .hdbid(DATABASE_1_ID) .huserid(USER_2_ID) .user(USER_2_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_1_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7642,14 +7618,14 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccessDto DATABASE_1_USER_2_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_1_USER_2_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_1_ID) .huserid(USER_2_ID) .user(USER_2_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_1_USER_3_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_3_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7657,7 +7633,7 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccess DATABASE_1_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7665,7 +7641,7 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccess DATABASE_1_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_1_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_1_ID) .database(DATABASE_1) @@ -7673,14 +7649,29 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccessDto DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_1_ID) .huserid(USER_3_ID) .user(USER_3_BRIEF_DTO) .build(); - public final static Database DATABASE_2 = Database.builder() + public static final DatabaseAccess DATABASE_1_USER_4_READ_ACCESS = DatabaseAccess.builder() + .type(AccessType.READ) + .hdbid(DATABASE_1_ID) + .database(DATABASE_1) + .huserid(USER_4_ID) + .user(USER_4) + .build(); + + public static final DatabaseAccessDto DATABASE_1_USER_4_READ_ACCESS_DTO = DatabaseAccessDto.builder() + .type(AccessTypeDto.READ) + .hdbid(DATABASE_1_ID) + .huserid(USER_4_ID) + .user(USER_4_BRIEF_DTO) + .build(); + + public static final Database DATABASE_2 = Database.builder() .id(DATABASE_2_ID) .created(DATABASE_2_CREATED) .lastModified(Instant.now()) @@ -7704,7 +7695,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .build(); - public final static DatabaseDto DATABASE_2_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_2_DTO = DatabaseDto.builder() .id(DATABASE_2_ID) .isPublic(DATABASE_2_PUBLIC) .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC) @@ -7719,7 +7710,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static DatabaseDto DATABASE_2_PRIVILEGED_DTO = DatabaseDto.builder() + public static final DatabaseDto DATABASE_2_PRIVILEGED_DTO = DatabaseDto.builder() .id(DATABASE_2_ID) .isPublic(DATABASE_2_PUBLIC) .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC) @@ -7734,7 +7725,7 @@ public abstract class BaseTest { .lastRetrieved(Instant.now()) .build(); - public final static DatabaseBriefDto DATABASE_2_BRIEF_DTO = DatabaseBriefDto.builder() + public static final DatabaseBriefDto DATABASE_2_BRIEF_DTO = DatabaseBriefDto.builder() .id(DATABASE_2_ID) .isPublic(DATABASE_2_PUBLIC) .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC) @@ -7744,7 +7735,7 @@ public abstract class BaseTest { .ownerId(USER_2_ID) .build(); - public final static DatabaseAccess DATABASE_2_USER_1_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_1_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7752,7 +7743,7 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccess DATABASE_2_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7760,7 +7751,7 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccess DATABASE_2_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7768,7 +7759,7 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccess DATABASE_2_USER_2_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_2_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7776,13 +7767,13 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccessDto DATABASE_2_USER_2_READ_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_2_USER_2_READ_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.READ) .hdbid(DATABASE_2_ID) .huserid(USER_2_ID) .build(); - public final static DatabaseAccess DATABASE_2_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7790,7 +7781,7 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccess DATABASE_2_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7798,14 +7789,14 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccessDto DATABASE_2_USER_2_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_2_USER_2_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_2_ID) .huserid(USER_2_ID) .user(USER_2_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_2_USER_3_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_3_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7813,14 +7804,14 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccessDto DATABASE_2_USER_3_READ_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_2_USER_3_READ_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.READ) .hdbid(DATABASE_2_ID) .huserid(USER_3_ID) .user(USER_3_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_2_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7828,7 +7819,7 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccess DATABASE_2_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_2_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_2_ID) .database(DATABASE_2) @@ -7836,7 +7827,7 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static Database DATABASE_3 = Database.builder() + public static final Database DATABASE_3 = Database.builder() .id(DATABASE_3_ID) .created(Instant.now().minus(1, HOURS)) .lastModified(Instant.now()) @@ -7860,7 +7851,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) /* IDENTIFIER_6 */ .build(); - public final static DatabaseAccess DATABASE_3_USER_1_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_1_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7868,14 +7859,14 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccessDto DATABASE_3_USER_1_READ_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_3_USER_1_READ_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.READ) .hdbid(DATABASE_3_ID) .huserid(USER_1_ID) .user(USER_1_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_3_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7883,14 +7874,14 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccessDto DATABASE_3_USER_1_WRITE_OWN_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_3_USER_1_WRITE_OWN_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_OWN) .hdbid(DATABASE_3_ID) .huserid(USER_1_ID) .user(USER_1_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_3_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7898,14 +7889,14 @@ public abstract class BaseTest { .user(USER_1) .build(); - public final static DatabaseAccessDto DATABASE_3_USER_1_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_3_USER_1_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_3_ID) .huserid(USER_1_ID) .user(USER_1_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_3_USER_2_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_2_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7913,7 +7904,7 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccess DATABASE_3_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7921,7 +7912,7 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccess DATABASE_3_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7929,7 +7920,7 @@ public abstract class BaseTest { .user(USER_2) .build(); - public final static DatabaseAccess DATABASE_3_USER_3_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_3_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7937,14 +7928,14 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccessDto DATABASE_3_USER_3_READ_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_3_USER_3_READ_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.READ) .hdbid(DATABASE_3_ID) .huserid(USER_3_ID) .user(USER_3_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_3_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7952,14 +7943,14 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccessDto DATABASE_3_USER_3_WRITE_OWN_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_3_USER_3_WRITE_OWN_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_OWN) .hdbid(DATABASE_3_ID) .huserid(USER_3_ID) .user(USER_3_BRIEF_DTO) .build(); - public final static DatabaseAccess DATABASE_3_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_3_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_3_ID) .database(DATABASE_3) @@ -7967,14 +7958,14 @@ public abstract class BaseTest { .user(USER_3) .build(); - public final static DatabaseAccessDto DATABASE_3_USER_3_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() + public static final DatabaseAccessDto DATABASE_3_USER_3_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_3_ID) .huserid(USER_3_ID) .user(USER_3_BRIEF_DTO) .build(); - public final static Identifier IDENTIFIER_7 = Identifier.builder() + public static final Identifier IDENTIFIER_7 = Identifier.builder() .id(IDENTIFIER_7_ID) .descriptions(new LinkedList<>()) .titles(new LinkedList<>()) @@ -7997,7 +7988,7 @@ public abstract class BaseTest { .status(IDENTIFIER_7_STATUS_TYPE) .build(); - public final static Database DATABASE_4 = Database.builder() + public static final Database DATABASE_4 = Database.builder() .id(DATABASE_4_ID) .created(Instant.now().minus(4, HOURS)) .lastModified(Instant.now()) @@ -8020,72 +8011,72 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .build(); - public final static DatabaseAccess DATABASE_4_USER_1_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_1_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_1_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_1_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_1_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_2_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_2_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_2_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_2_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_2_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_3_READ_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_3_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_3_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_3_ID) .build(); - public final static DatabaseAccess DATABASE_4_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() + public static final DatabaseAccess DATABASE_4_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_ALL) .hdbid(DATABASE_4_ID) .database(DATABASE_4) .huserid(USER_3_ID) .build(); - public final static List<IdentifierDto> VIEW_1_DTO_IDENTIFIERS = List.of(IDENTIFIER_3_DTO); + public static final List<IdentifierDto> VIEW_1_DTO_IDENTIFIERS = List.of(IDENTIFIER_3_DTO); - public final static Constraints TABLE_1_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_1_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8096,7 +8087,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_1_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_1_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8107,7 +8098,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_2_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>(List.of("`mintemp` > 0"))) .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder() .id(1L) @@ -8136,7 +8127,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_2_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_2_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>(List.of("`mintemp` > 0"))) .foreignKeys(new LinkedList<>(List.of(ForeignKeyDto.builder() .id(1L) @@ -8165,7 +8156,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_3_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_3_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8176,7 +8167,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_3_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_3_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8187,7 +8178,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_4_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_4_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8198,7 +8189,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_4_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_4_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8209,7 +8200,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_5_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_5_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8220,7 +8211,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_5_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_5_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8231,7 +8222,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_6_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_6_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>(List.of())) .uniques(new LinkedList<>()) @@ -8242,7 +8233,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_6_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_6_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8253,7 +8244,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_7_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_7_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder() .id(8L) @@ -8291,7 +8282,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ForeignKeyDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_0_DTO = ForeignKeyDto.builder() + public static final ForeignKeyDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_0_DTO = ForeignKeyDto.builder() .id(2L) .name("fk_name_id") .onDelete(ReferenceTypeDto.NO_ACTION) @@ -8306,11 +8297,11 @@ public abstract class BaseTest { .onUpdate(ReferenceTypeDto.NO_ACTION) .build(); - public final static ForeignKeyBriefDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_BRIEF_0_DTO = ForeignKeyBriefDto.builder() + public static final ForeignKeyBriefDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_BRIEF_0_DTO = ForeignKeyBriefDto.builder() .id(2L) .build(); - public final static ForeignKeyDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_1_DTO = ForeignKeyDto.builder() + public static final ForeignKeyDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_1_DTO = ForeignKeyDto.builder() .id(3L) .name("fk_zoo_id") .onDelete(ReferenceTypeDto.NO_ACTION) @@ -8325,11 +8316,11 @@ public abstract class BaseTest { .onUpdate(ReferenceTypeDto.NO_ACTION) .build(); - public final static ForeignKeyBriefDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_BRIEF_1_DTO = ForeignKeyBriefDto.builder() + public static final ForeignKeyBriefDto TABLE_7_CONSTRAINTS_FOREIGN_KEY_BRIEF_1_DTO = ForeignKeyBriefDto.builder() .id(3L) .build(); - public final static ConstraintsDto TABLE_7_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_7_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>(List.of(TABLE_7_CONSTRAINTS_FOREIGN_KEY_0_DTO, TABLE_7_CONSTRAINTS_FOREIGN_KEY_1_DTO))) @@ -8341,7 +8332,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static Constraints TABLE_8_CONSTRAINTS = Constraints.builder() + public static final Constraints TABLE_8_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8352,7 +8343,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ConstraintsDto TABLE_8_CONSTRAINTS_DTO = ConstraintsDto.builder() + public static final ConstraintsDto TABLE_8_CONSTRAINTS_DTO = ConstraintsDto.builder() .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .uniques(new LinkedList<>()) @@ -8363,7 +8354,7 @@ public abstract class BaseTest { .build()))) .build(); - public final static ExportResourceDto EXPORT_RESOURCE_DTO = ExportResourceDto.builder() + public static final ExportResourceDto EXPORT_RESOURCE_DTO = ExportResourceDto.builder() .filename("68b329da9893e34099c7d8ad5cb9c940") .resource(new InputStreamResource(InputStream.nullInputStream())) .build(); diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index 6284708cc1..4e3f996802 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -18,7 +18,7 @@ jwt = "~=1.3" testcontainers-opensearch = "*" pytest = "*" rdflib = "*" -dbrepo = {path = "./lib/dbrepo-1.7.0.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.6.4.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 4fc5ec3cab..87013913cd 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "30aa6fefdbdbb9f57d58ebc8660eee64445a831cea44c6ca1fa605f2a2e1adc3" + "sha256": "c22580f5873b7bd3fc1edb71c84b7269ae79da6a2554225fe8d95cab6af9f14d" }, "pipfile-spec": 6, "requires": { @@ -369,9 +369,9 @@ }, "dbrepo": { "hashes": [ - "sha256:f25d5adbd618bf2906578e671af2bf3bcc24d738ef8bc791c220e7e5b714e2f7" + "sha256:a518aee79540d9e302b161e7e10072f50730489da19368f00a1e68204009ce44" ], - "path": "./lib/dbrepo-1.7.0.tar.gz" + "path": "./lib/dbrepo-1.6.4.tar.gz" }, "docker": { "hashes": [ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.4-py3-none-any.whl b/dbrepo-search-service/init/lib/dbrepo-1.6.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..d083b0bafc937528fdcc09634c41132578cbf345 GIT binary patch literal 30969 zcmWIWW@Zs#U|`^2u$hw=$)ez5xrLd5A&r}X0VJA|RFqnfukV;!Sm2zKnVMIkS5P@M zEVui%g}}de@rEp3G9IkqJLGhBOnA5K&Y{xDY1_m3_<EB3W$vDuq<u2;`~CSUw?CfN ze0VK>(U~5(v&Q*C+S)65JY+Yfg>Fp0wf5`j$Uptl7DX3Fiui~GmIQ2Ssad~aQcGCR zgY!JvhnHNqFl${_u}flv+uVw^Q$hl-yi>1U6<MZzv{Ce<<ElxsQvRtevoc<Dq_xd_ z<ASn}-=>%6o&DIdM{rO1fA1@^#IEJ-V_ENQb?0}x|LjzjMt|wnEj~K>i+uI6H+L-3 zcpQ=)G4=lH=yPi}o7cV0G5fsV-(BX#0>f?hoYYQl5}P+u;{m&|`-Yf@?;f9PV-B0Y zKPPePUUuc(5l^lJFlnD#xaia;gB2zzAqV6f7c-vP+Oq%eLUlLBqn(<XUgfVkwcNhT zd=;7?a%A@66WS-&T$0c2kIgrK`Rifc?w$1&N*|`LvE5;_Fi6M!eN0+#a>!iC*Z&W6 zKD%Jt`rxF>CpYst={Hkr+@{JcH8c0^u-fP6lJNL+LlIMX#RAjqVa9sKr{-3<F$L(k z2y3WwIsN_hZ+rP^hPKk%SEjVz$qEg>ll`jVP4wEpos(uals;m-P!OK#{iHqQ=M+Ef zdGB6n<%$H)R`Yn^$R+b?mcq^@>UJE?cW3-bsrOG=^rBW)V~^T#<|UfKXO?8HnJCYs zD_T%l=lA)~r#8+0)6*2gKC6W){t-Ce5ZUpS>0aH3?%A97Ci}9<tX+C#NiKiTg3jl9 zyH}pg`}O<T$CG}G8ow%aJa#`QI_GVg`GLY~wtUtx_r5>>`|joISN+HOSq*rdW^vA6 zsekxE+~>@m+BWBP|LrRrtor<?@5=70sf~Fr7dHR8nZw+lDyL%8*0)uB{qZAr^X|<W zbAK*c|8v#7;${85C!04-Z<+i4rSZNWNs+${=RMIeE))BIrY}UqLidb=W~uMHeYwR< zS^ZD*IJj7?7g{iX+q`4q_PB<xivk00+_tMOGqS$SnwGa<i}J17w<=PV@7pdibolhn zHSV3df90}Q^VS$!R^K{vkUP2L)E%)87T34=#LhWz&;9Y2tzCtcnx{<K?umR%{MKpI zx05@q_0(Q9hlk&#?p|52m^bd6$g|D+O4!O1AH_R7`6hGqZKU|_MZU|N6JNexnR4s# zL-rF>^KVF=T<TV3nw8dR_3m5Y#EK+l#+yZ_j^yfhxSy>28oB<r+t0W!J72usdHU$_ zZC8HJIZ}IwO*+?+>q*)51*%brf8;km`#Q7i?!BwUmvr6M&gZ#SW_J3IY9W8pr0c0m zldtPJGO0WcT5S6}9+Au6&a;l<eWTkU&&<GJ&ViE4eG5xU;JLguG&lRU0VtOjvUtf9 z9Np!p*~qiWEcNdN6>p<s2?-*<A7xBc4WD%R>wW)8Z;uq-ede8V_ipj|y<JaRL)ez^ zMU-AzfBbR0u50l#qti1^%sSunPW9ycUPaDy4W0nrcg7rLUe6}viHc3S&?NY0dP3q1 z5vi=(nVH|NwWwZ+JwIiV7Drairlqq~w+Fq65PP@e)XJGW`cA8a4;RT~?%-hE+J1WV z`FCeNHtgB8qwKzAmap+@^PU5z)p*|>{!=H&dg1eBH^sB+W_gQzwY-hFniL*}WLInv zy!-3Nv3n&35<mW*m5Vl7F-14pBW2$7L+)xu6^Uv5W??&iZ`<^;;kf*4UZ3gw2`Q7i zr$~7voZ5MI#il}u5Gf(8gzg0wmrc#)tlx8)d2z#|15-qHey&>3by3${mT^)~MX5-p z;!M%1>(}1q?CePYy!+{+#C?h%qNmBl$OULlTckey#wCeRwPT<1C$5+y=ltTU57T;+ zZ)qDsKXHccnSQHhwTS7*UD{0C_t~Zh?>H>0yYs44!OVbnN0=`$KMlIlSQNfDAl%$M zevz5m%D|o1UND$k*PXB}G|~H~Qs}MH==k!rv-&K$?=BNoGnmeFdy|$#_?%Al*Qx50 zWETtfPdnfpbjMM~_@IwWyVTEh%hy)F;OSo}w=e&~(;JI#9^c`<w*Nne-u_>Qf2?@_ zW3pKEYE9FXvwKrA4lP{mn3F9~AHT-DY+dxN#c?wB5%Ldo#8->;U4Hk#M6r(LQ?YII z+2#Gl+*ekV2h8HB@krej_djaQI~}jZc2=P~HMY-rSsR)XP-c2_t&si0)&5yerXN>H z?R@E(b9u(Q?Q04Gs=2q<YNWhrV0u$@FL>g^%yX-M-x80ApW1Qg+PCwQcW?gfl<=r+ zf!zOVU*;5+FkfL(icNK2cIi{}hUr$fOT7+l;TL(c$?ANOuEhMUix&AL-)|Ov$M$_n zp--$CSIE1SjIHNYcXcjIXZtr#(}#UI*Y)-Hj@VZ%sbW90?#Br$y||>^^A2wgSoE3U zp2YP^zTL_~do#arth3*1_&i8#qglw;4_Q*HL)V?y|4l{rvs3#zxy9cFQWF{fGb1uo z)GXJich7bxS7|aZ80=w0t~P^GixC;>t!;MkZI7b+f3*d|-cIz=IJJA{o)E`vdp4Op zKa%}E^44vYYCTD%Hl=e42aY;N%{}+u_VVX>2N_r#m=>t4I;F<RvrF38_O7k%UE70M zvg$L1kC~f0mV8!PVE=eZz4!a0*L5NmivMwMsyiDvYpK4N=boZ#aZjpO9)7p?o6-B< zM-H!jdA9m~_ojq%`SJJGU(~)Iovu;o82#fqXVme{^RFeo`I(;Bu&Bp8Y<*_$-cp0l zn`dnQ{riybm)kOHH!Jk9#L5TkI%a<{^3CGUDxH&8eh%)M#1UNeFS;SVE!HN!(s4y> zrFi<S_xAe>KHUFaSS0(yuIt8C`8@@K>e^2}FZVf6e<rY~e&SJ1_xgX)Y(EZn|2A>f z=KZnSCR*u*8UMY;yN4vg<JwkMmUer7S?6qWG~d;&Y3mM$leq@&zt(TI=(-Sdpz>oA z@Ao&iyqhie?dHf+<7T=oTW|XDl4Z}=z*jY<jpr<_{{52vA-5=6<P!IPp8eq(zI&zb z<k^&-u$_Lm_Vc^n--AC%J&T{EdLnw~jJ0W*&yH7?eR*`WyYj_SO&)(Y_Fq$MtfYER zJbx;r`CaCgMDXh~kFRR=d+@uOpNpNKD|;vX-0Syt333H?bK+yH*4Nb-7ss_KJ_|_j zxO01@@pq-?QkI&hWb}QKpPPM<5xL9eDYKS=@$LU;ea;2Vmsd8YnHyh{as6k-S0LQP zEfAB)68`*s-2Wf{&h9?Fa<Xxmk<_1(!ha9%u9iP%xFW}{_@DVXPQj15UXu>E^C(}i zJN{>;>Q9-^9bTI%%%}P}K77Mk`EQDiLWj*#+2d7?G4m|npIr0d(9F+Lx_fMn=(?ZQ ziJm`i&YcR$U7z3e2cI%m7S*daXV%-l=0NEDsK*C)bqn9G=!(~?)N=i7b8tr8vEYU; zHuGL^+eFN`yHI?`hr&Y-tUgYvzGGj}u~_0er&rTa+sr2)IYm;w`|T-s_t>UT?|$5z zn3z4HYb@P8#dI24177)TxG=-AyusMNacPi<Uf<;hYEJvEee!s@%YV9OpWRuLzNyX) z?3W8S{^$_csrdWC4#nLkcO0yKWYy<fH}}qmi-&gZ;##Dzd)F+6h0}hfT{28NEOV?_ zKjv7b**2S$#TPG~aof0brlWnywTZ=l<d^(>$$e8R=FE{dMH~OkH1wN)cR`Mko{y<c zVZ~=<*{&H)q5(f@WKK(FJ3Pz}XMK7+TwL6K|NjqC&JWM3PDu#-_u%NyoBs0Wj=TF! z5L$Nix6=iO-RruT7*8Bc=8m-%3lNy66Ke2M{9*%lo_y?cbK$o;k4ntY`EcmL`U)wP zihGHIJ}QP2y=o-xu;&WwKe4V<{)c(ZM86BGO?V$NE_itQhsVPgyN^V#4|KA;b?{NX zWU$!b50fU;Dmy9Jme$QYaDH+BoWCD>s}00ser0#s$a|j;KF<Fv(y}`#)W|(tL62p2 zoqsBCXxOjNLwjQw&hGFmT*bGC<we5o6Ek1bbh68GC~hx_OD^yGQs})$!PTrdVUt8{ z|5^qcjR>npcFe5jG_9vT>bG%N$Iki5eUfWo{iEqoJ-v<92d?k$@wP}deCGVgVgG>_ zQ%zNw-4137H}l0?exF_Nqrm=xKAVY^$Jd1)9cvfFuZnBnUeBKTPU41S|5bPW8J`+! zgBiurb=%(ysm+rKJ=B+UQBK=;^W~FQG}Nb<7yR6Qlk4`$hg0XTzs41J=vr6Pqs0O9 zkH38(`EY+v!{x^+KeQj-7CiIz=nLy7sv3!p4<yz~hL#<hGh=JTk(wl(V~zIqJC_wa zklhlueJ_Lh=9AtV&RtCZ6H>pcii3AmXXCqon<`INvi<80v45B1c}>~<)M-_X(~~{C zbiSoJEnn|#-%(Kdalhulr-$le!gh0gzMWh3^}T+k%+8+17M8M`>eKJ&{hiTumEmW= z6^5|l@cNynJ9tu89mtv%u~tB7;s4iq%x;qoAI>%YQC&Z`k}*!a>RkQb8c%lJegC-Q z6fIK(Pp)-upLsB0>S5*tp-EdAG7aWGe#$SlcmBqm96FO0u!i+{SGCT3@*&-HKI`I# z`Yv_akEA?{<Ch-F+QDtn^ufPq<rmLbzcW5fC8uLPe4EC?X<^DSNhDD1sME%46+WE@ zPM&1Y`4qs+a>~dw?9uXbvsoDrx!##O{n0}vmLIX}Uluj)4`H0P@09w6OA^a?BTIy= zIil0dtK>Nu!&=fWJ~3@PwY)3ft@dBuhUbe+dnyuZPEWYPC>#G-k~yKdqe`41Sm5e` zkb<i@7hPYSIo^}3r5W3#eVX0()T>n?<~Mw7wWjgSx^q9Jd~U_-2P_xn3UC^QsaU+_ z{xf01qwGBuvpHt^w&-o-mvfu*V4?_LaQcx>iIbAQo_cKNx0n_=t1@z4+}XnOhj%@i zJ^lWR_vNy`zqg27lbax2#(CM&ht1gfk=S~L8XX@sh6Q4;?(eV3G;aNRvbS{EmZpvO z7zCSowHb|__oud<4eNU^pZlYPG2uA-vj*|DkFuY#AN_h3pFR7hSxdy<BbM`+8zfF2 z_#mgVujZ}KjD_>P?B?k2eZf{+9n!y{-st#jp|t7xWw*p02|WvaZ^aYjdu0OWYQO)x zS|Z)ur+Usl(dccU>A*Hsz@bs>NWbi+88aOgpDN*c8NXwz#kG#@e|3*lY_gmjo}T{P zK5pKAyG<K68cdwAGjW#ZAESwiN3?F`@YOCjzo3p+sri!kqwCt0k1TJpuQjp!ENg!0 zS?tRjb6;%V<FYq1#@OoW&KH`iOzhNug=9;eJGN@=Ubc%L@)o+j;wa?3KB4JPo@Djv zhK_utRf&qf%@3~&S$@5r^T!F}RKd)tQ(kFJ=5m=b_12N4=lBnAVZAc>=!pV{o;ATo z^X!TR-X~>dC7=427xE$EMYQY#!3OrAn}PYwCcjzD3if+5ZTXS$e(isi-8G7i)1s`o z4jlL=khw9kbj!q965?tfr{x#TG%0G-R9O;gHtC<pzrttxBp=pEa=!QVeffRU+AqOn z@6_Gi%b(q0uqWz%@+Bo_wQDmcbt`;&X;5OM9B(!G`~O&5an9+kj$sdsYSxNPKe+ka zbB%q%RucSE+IJr<ey~4Vf9v_MgDngR{4)e5f2^1hz;o{141u=905zYZauPLrxoR>` zA6~LL!Fksq#lv;NcP8!4iTL<qYSbe0X|GRZT~jV;arM7<w_i|JiA6W-)Pu?F*FMI7 zD^+5U&q?esGv#V6$$R{^;%BwAS?z^Y8+0Gpe3Fi;;Oa<J`()#&(ABe3$IP(jZuiP& zg?B#lpS!HPss3BCkuUoj$6dh_Tg_#YtSpZdpX0X-v%k*qL@uu3>Rl~^gERU!es4@a zas6z?_DKP<`ma{X&p!5g=I+<izM2&T3ry^cWXb2WHfihV(6ZT~D3|)b&fuqK<c)Nz zqux(b);vFM?yMP_cjHT!e~Nc<_%yp6f0h>A+#{^rl(=F6!?f8Qx+y!2M5>Sf;hyZQ z_jCU`=cli8r$`7E+3pI_2sXZYVY0XD;hTOvB}=nRFKyvm@B8hU-0%DQ|Cmc_iaiYX z>o-Z`y%;gMW&Qu7ZcUogUOjL>-gV{GE#YMsH^~3iR8`q{`u5uu85^t(uI(#ROP4<v zpZn$L)9m|68$VtZ=d=?$7X8B2d}sOLdc7u<vt5i@3)6RIExj47(`2B~<iIYd{&|7K zgG~pm{&eo~jLNsv=ym<H>W;v{wL4C_)unms7hg)9({5*Yi-T)_!ncinyQcIj3dzX{ z9xfJPGxrWiQNHhOcUXOA0Z+77=kzY?Pfm=DZz>y`<BL2pjJFrD_=yN^Si#{fX~xvE zPx!S~bj)tI_O};Xw{so(?R!3J@mjlecMkmJKb0uhurh|Lb7MQ#<G<~j&DVR+yO%D! zyPW@k**V@@H)E@WukFnGpqY47??{#T28NXe3StT~d-Q(BcNt8t4?HqMd*4-ul%J0$ zAATCYOe=f$sdBZ4F`w$6TUR(s%$XAU%hW=2&Z%E}+0XZW+q6sa<^`<_3cNdAm(O4g z-=n|wTjR3}8=vgFVN#N|BZTe3ja~Ka*@C^L^ClWqDAlzymfYriKJBiiWjEjNiRTYA zy<W8RQ-JxLY@7X4|AargWgNu9mJ}@cCWkXt;P>p8H~Wu%Rl9ZL@7u7OT0+}Aq=Qx; zvQy_)(K%K+=c9D#w!5lRPMs~ine#)o%<=TTcY0#mZuSb^ycxG!W~!q39ahmZ>xB1r z*0N?EJ1}bz|Eh2Ik1k%t8@}oPy*AU++p<`0>4oiHTk-pe<J)6<?|O(Y-gR`+hLuGv z5=9p+-+tf0YjF6iyxiTCQy;ItsggC+O9=53y_i*@c+T@?_%Xc`1+^w+YKM+ac*Dvb zH}Q<b$#zD4jpV+kk|!73JX5)4?x`xZ=eA78nnmv9TJ~=gb@|Yh9+9QL(#P=E+ZkW} zzId_GSa37b5C5|q4<@fT#WrD1P!@B*_3k#tJ^Fu~LXXJhUv6HzK{@?IsZjl~8&!qv zIft%Ze_~S^z*e5$D}U~+?Jc`oCGT%22Q+R!cPjq*(!6W`mZk*ymDimOTz6#R<SE;O zc1d;LZfsWOZCuUbE*6#$acgP#YZ?A4F{{->_u04JUjA7%s&d=$tP@32mP<Q}KODFb zUh!#>@43^pNv2G}&sZeRex1Jmic48Q$pdX!=G^>dlO23cVLy75X9*g*cdty{!F+@_ z%I>X{rHEUFKV!=`F8-{8#&cN~uYWt`f?LzvwJwsmw=Qnq`mUzsxAfPqy8^p5vAOO) zBwUg8$lc0VIOvJ$=XqtmW)E*UOW)&QysM<t;AN)w*JG;x^t?-}Cmj#1*LZYY^!}}* zYzO9R>c@O`dcJVE^@f@#w|QQ7Z|8qmnO9u8=Wp-<&DLP&?)55tR|FETp5SKe?y_L+ zT(I=TSCPAsw?&R#FU`D~*^=(MoHfu=k@t~}^;X;0$Eu8&uax}J7SjmvNR4lvTHd@w zaTc51tm>0fFEzzCd0pNTYPt2b%8sM4Ma_S-jg>v_8BS_ui4hc^#V%Bznxgsh@LFGi z(rqSo3#4uKE=-%3)#z4HvB<I|X>q0BD*b9#ZHZkuY(h*IEkxFs1!qn_volwB-h?CZ z&u0p|2V6e3n{~GJW2@a0e7Jo|&#qe0D0b{^#?R+76HS&&Y6|vDn7=7KV##iYS-O)g z_D5c7Qk(y$f{%NRO8<-QIcfKLi{I3*+Vn=0(S6gW-nNnrU)l=J-ik1qllbRw>1`p0 zbkE06U+yi+vHE;VzODM`2}No3*XK{Gl{}9O)75BS%C0i?@T7~LYC5O8CrEv`t}?fA z=Ijgdq7%0!HQhXZ=3{e-Y}I#<Cr%r0IaTb^*)!=^#f?)ZPJVhX+@Ptq_=w5Y3-{RW ztIw}f4zOoTveG|2&ArIX?)}$`*2dQF&o0{WL0zbK1Cw`B@=ZnNyq$bIW(mx4iS=Wc zzWc-cD+~4hU#k1Kz|%VX??UaQ@V^^bt-5Cv>s~Kwc5K@!x<1hQz}-)!GZKn#KA++( zJH57S-<MlQ`>IcGoxUmh-up+VZ@hh<{&lIs-LIcs-+d-xXZ>x_o}BGnFU;O8OguH? z#;b{P=O@`7X_BsvdbE7q!v$f<Ct5w%{EiWgjw}qD{>JFq&B-QG<xi{basU6cxkRb^ z;=9cJ9~-S}v)NDIHgEG+;pd+y{muCed-rd9&y}g4KfOB_ecLKOn;~Dfd-^txYx|nN zuT}XXeki`H?t(*|cIfYio@?C~^1RA_6H<F|S-w=HXO%+z)T6@pJ>O?uyrDToKRfZF z08g!iaVTeLz}60dq77VpVUFL!7!$YheR{ECU%mgcoCmvm9`nE2Eyl_IHCLhD>Qyzn zioIa1-`ii`1TTb%@-=(*U)sgHK}pp6z220n&Z=jXZ`n=vI-B~kZ4_6H?aky6Jv;M9 zi^2DEC8f9T^c2b7d6Ak>*SB`T_PY7Y-m}!3`tW!?-Zw)sq=qjoso)Fq3~{Yje+_gk zTz|h5)d;%Y&U$d8*%rABkNv6*T^#!_J>4&KJEZvb;v?mj{fBFges-u|Xnk&a!>^t@ zKP*zyxsz0xmfqgV_Na<8M}FyNm5A9(zjv&4cDSOk#k}Y6p?P5kx+^9vtW2{uV-u7L z-oPMUw=k}p^Vnkl$?{+4UAfWKvt&;~`-Yu<@|oMWK9#abI($`brt@`i-o-_HW(H69 z_qtbxO7`{k-j{8c6=Yo7CbRYSfh<YC#XgzgKkc4QI+QwpR#nl|_j8Zm@?gDIzk&B* z?>^>SiA(>QaztA8wp=x+33+0w*SWX!7L)V-o6EwMhAx-nX6?H2T4{Ik>M5*kNe3L1 zHT)e`c&v^oK4LX3xX$^gC|5rFKhwB5txR`v=D(R8Xz1hHaBNrcjaP<T(Yac(n}c`q zx%O!!e^t5~TGG_GP4mK$M&9siOR9SP-em=~^pu3w3Lm|rr<2(^eSYV?-0RyXnQZ(~ znWEHj>CR;HxHbLNk-a&`%$7vhRz5hhdHdGz6DF^Jb8P>2CRsSP-Zd_3_KLk%%QXX* zh?WPcU+;UhyCi+XwF{Or7G89_UJ&?pinw>ZFT=a(k1E&9+jg(J-Zt&O#KR|V|0chk zA~@IWcD`uz>$&BRe=Jn_{^rNUiQg97?Bb}tm}_<G?~N-ui#ucQZ%b<7+sB+6wmZi1 za^_bq*ZfN<nXYqRT$;qWNB@gSuEw+n#tRC#xi>zU$LZ3zwSw#Cv0ogVQAf9P^fiZY zE3NQ9lAZo?>1qFv_j(gWG>=|8*|kk~)l=W4=jKg4_BO)x?E<6kkFR?EP5&n*_<i~8 zvVfR99GM<Jwf{tf$IQqLULwAqZ^zfI79lzemw%f$uYMdoWl4qG$J)xUZx_W*Z451W zC1<sW?bD4np&F^{BYEG>eb`i4{jE#7V*BSV?E`FO{qc#>+TD{sZK*vQ&sggAudBjz z?fUqAYa*p$&bhSpO?h%~it0_y$=g3lr3lZv)ocE&=UA#8&tl11K_Ta9>(^!8ndQ{H zc9lTgef7i{rbXx8uWVn$T>q2v@!9-F(>v@x_HX6?Yk2C(GPY#`=`}&$(-NZ$zOUpi zS<_piaCQ%mSWoGx?X#^za<5J~Vl`({)1IEQ3+3w%tv%Ij7c{AM>bIGtqMLFfn|^T0 z<b^6ZeO)ut_I8>Hvn9vm9MMA;v$Q8{aHw7!*lPI3M8{O{;W9Jzh09kz((o`!nR`<s zSbh7wTS6|E3jQ#8<o-JJcW>v?3Xz}(PZ~=<+-s9%2>vEp%20bL{zBuCZBrLWdY#+Q z^XAr~WfP)RQ~X^YUE0T~uz2DpHzWCud2bC>FHg0baZUeLnLz5F>g9{hd^qv)c{#KH zEv=r?xOx|#HaS-L(|g|dei8k!Rj^KKg5ux5I(xSSacJFK`oyL^ZRRp*9h1Ue!c$FB ztr==ni<v}Q-ETx6HvZz!ZN)F^*S)GXYRawt^H#4v{n^fw71J)B((J>&iHY?<5A!_# z6E_6+8y(737I}X6X}sOHpv1qs<;&(adtTW!smYV=zUu$?A8xF8*xz%j=;;-s?n$p6 z)lJr@Hjd)@F>6UcU2?5;_ZlttlP%!_6B(a!Z4FJ&pBw3^d8>cNKA}kuT;|2fGGCq9 z8)?3DQtKDf;+I!B->%Lz{Pyx%^%^s;ze|f^m0R7<$o5RJV}2N2Eh3kHB60n!=)*VT z7bMP~744jvkyqC5^Ku^3$M2r;(<f{Zu3dXj&Wddc$AqpA{+CVnwO#%lG3T1MagMi3 zZteVr&r7ca>Ls~+_t+}k`=UB-($|z(?UFGZN~^>(5~g2e{Ip3)ZVd;=yQwZMp}+2) zd~NH>&Q-fp_NMBLg)=W?B+RgR8<KZ7Lt*U_AH_ejk|g%mgt)$%B{R{}on=j_k#J-2 z)$UydODCimh)uMg*~55b#;Lx=i%(5sDEB$qb!k&(k4)>UOa0qe6I_2t3#J)+sO<B) zVB`0vB+0_uil;^R^4{wT7OdI+j0J4R-fG+D8rAVEQLspO6c~H|R_a9?KL3S|qLQX> z7W7^_khG_{!?tzbyKV1Zv%D^yxx(r3k9iJJr|#vqOcyz3m$Gci*}aTH!8sYXpDmrS zq0P^GWy~uHOU<d-b1(T$*NJF661TR~!Tm$=vHdHSPLN(Z*(k1h{XM6Zk2lG>ZGL#& zOYLqE$CEg_U%Y3FS6L@|WQnoYZSr3GZ*u9kvd|EZ8<je*m3&$gzW$0hsw}bKM_okj z$uCpxO^?>P6(`&mrMu%+y7b$RM((Nw64I`=42vetJXB>mBmY)lt+P;a=Ksg)k88JU zzvwPZc*5(LoE+<yz3PHX{HDx<+gOda=GiudGT9d%I4Y$i9@sE5z0E9t<*~V(D_?*5 z_P1OjUhY?mX~U7LR%}B3d{y^u`klXg@SV@eeAy?eNjvmDmv*Qz+-?0I<rY}FbFSC! zB97GbgLj(uX&>B`JT?3Rv$RLX3byT63dNY%ctjT^ZERf^{own~rWGevTPX6!=?ckh zefP&#YC@>uL`|lzlNzrqTrS+ZOqpX-kFm<SKb0-|x)Yx}&z0-QJ1)Ne`=KpD1rjbV zxLkMK-ykq~!J><5dwr^yvt}&azJyyrZMKNs*Av|NtJlm8pFaKhd%gR6>eW9APxSiu zNN}0eCyD6W8jOr{7HRMr@qB%sac7&;buEA6bk5%oT>d&{*xDa!KYn^bK{dnEij`sJ zx}Sv-v%e-gP5E?MHSqO<b1P=4{PkIN<l(yqQMWs9N++f@UX`1_wy<e_Z_S@FhDi=O zzl>C-f7Dy@SLOW*JC4Vh$9lKaNmq8AsomjI`nIO?cB1nVE{^B%Yof1)taqL8K#?Ww z>AR$J3@X7&bFB>Xrrl`_FucXCc{**w(SMVF2Kx9Jq#ae&T;*Q>@tpdGkGt2**nFJp z|C?sxpOzhee(2d+&B*gVS~9zxQAzIV{A&h&=}(@sxc;*`7IZ$gN3O&2n0}3-TAbgl zc?ahBy6>`nQrD}dI{6>Rj02BKTkSt_oM6`5CcgNl=e8($dx3PtKjxOdj4sXlD85`s z#wN)<+s63xBW)cXwFVxkxaZvA3G*NA`*bm1FVr-L>2mxh)4&;dOX`?43+xw#TxOhc zQEx7X$0W7R9b0GCIz7LnpeY)%)9+A)pT*s$>+Pl%-4MM$L-N6-|Ff5eZuq!JK3MCg z$i`<`i#DWAN?Xp&oF%}s(Lf{VU2<Z=@n3ty*pAvs7^z)6?DgMnX*ZL=vpsJ8dXJX1 z3ECf3bKNI2&1%N2(9Pmf@u`I;%0GKlw|6-(w!G2)+-s%qR8&#dBU<WX!lcdHi<uHO zwMc0cdVSL54Ac~ry5!K*9>P4K#PecFSXH|8;cZg|v+bPSozCkleSEn4f#u6d5>Yo! z>^d1Z%PBG?v&hYGZ&&>OL))f0d%XE?apb^a%fg?X$4i$?exTMR{6S3b1n;si?Sg_f zgZr)}+LCb>zbl1KvkR}#u8LH<vZ&=$;`8%Tt2cc*FSbL{d;Zbaeckm_tYQ*%3R;&* zhS`U4ORdnq`}T|A)ewocCtKpo?Y!3{T)JEyr{!wg{-x{evhG-^)pE0+mKB>u6s)^& zEN6O{&Y!KD&%bF)ToSST!o5xFSK1m&eqMeonDIeI))v9f^=nQ%a?+lWo^17V?e_$> z&A&f{?(4dfd9}yy*fVt}>n-aS-$=W@sdO(-aO;;DUr&Yh&AGC+ch|CKQ+c;;N%x3V zcy`Z7G|*Z4SX+jC&y4dg_O1IHlveY{eAoLM?;_L>a(%mEu<>_pgpFzGo`n%@izaN$ z{2W<0T~qnl8AB^2XTDvx=18)~p1qZG>8kV;U5}0Ki_%3iEvIy~-ji}W9CSvN>su4& zlWz5;2`gs{3OxG9`7D*S)|)?duYmupsoImHzGx_Hn!)od&SRVJ2N(bEhGyGcW?x|2 zv|MiIwu&k0d&&Ym7DTa5)0_9I;+^W|l9;NkTX&d0`@o=de@@t5?|({+PKPJwTu)j3 zq_(-i%fHOhb$4;bdjqYlb7GY5#^1SR^>M$<(+Rt#Og(;A?On;KoPH_86<Z24`yKCE zzs+on6m9hSy{?vFRb$^br3KAP=Qi=ap7?W8_B54!!W+$4S!7+^CS12~aW4^)bDWuR z;Ka34SG<%rOg$GbdCzP4KJNc-AGVok@3%hCwvDy8-n6^@&V_9gF1&Bs*4m(Wb#+xm zwer`f=%t%3-;wY1x@#<3ej)B$*{$sF?z_yd#!GYGlGN%sH~pmDYu&GN-qn4b##(${ z{eXS=-qe@P3%d_{E^Q5b8h9=DA<M7u?KMnn+ZPrvDOSqIZgJZ@?WwTcUY%pNwref; z@G_fw$=xXd2_Z+kO3mYr{h28iVj;5r^(nuM@JWmU|Ctm1iOH48Klrb|fAhR6QR{Cx zSsRH29ov6dwX$$|MDCxrH~v{Q1$}p{$qiDKNV>7z*15Ox<;Eq`RAn-9YOD^wN;Ud7 z|FQ9ei;vfNSq1PKG>C?}+;M+fuYKvA_Dj)^-@<&>Us|Mn>FRpN@FVsyAGHIYl{YJf zuQ-4I#F<<3v-Vy6)}iq8WwdI0*DmI;E46-6+x|OkW!<y)<&AsYSH&*8o7|Qgf3QrQ zYuj|Dt+T(Zp1>)0Q7%+9D}JI_L0835&rM5w`@Och#2Z;DJbGVnP5aN)K+Y|fzkS{D z>UvMeskUnqR!a7in;ZRZi|lRrnBo34?9;if?YXhHnKm?b9n-z|r&#zU^G{V(_AN{+ zz9>}jEm}VHFQ;_w+Z49ic`1*}QnoOrzt8(My+PW8;liqkUsV|7GIKH~#;d&KQM<k} zX~LCF{y!Yg<<uQBUCNwruWqaUi}p6AB^NvPO;dC!Q_hf^&+PCeZO#S0)sjUUax-eb zX4OvL*SPl!cfdNU$^@R<N501GzN9j@vt*xNLw)Rz^{Ezz1H@8J2iI^v+J2w8wtYk5 z>HzbuDH%n6@n3)KZ&`F!`~RfS|9p>sn_o7&E)pp)RWS6ln#RFx?2UhIXR(=B%t$-E zF|W0xxL<2t^U4APQNCq|@_buoE&N@QWM}NHIDMs?a|BoFi{IYNH<Y~>_AIL1AYyj; zSk#*%K^lj*v0HNG>a<4f<gCsWlo9#vSST*JJ^AQf!}P@bVxhL6<*6@zpZ2?<TpHze z(Qd`%vs*TbSqCmpy<ruwyp(@?g5FP){eFR!OJqA2Bz3<H`zd5?mHuhYkuS-LuPnvu zYfdxo{$jgd)$2td!)F^$hiO8po4<T;o++%Pf3~1L`RWO`E9*|AFDMJ;<eXR$a3c4e z>k<ZO-%tm;TDkit9m*yrWC=R-iu2z5l=1A3Vgpz4!8xr8K^zX%4qJ_?f4MH)yv;=M z#)^|uI1<#iG_8tHyL^1YHO0p_KRVpgZT=aQ6}`!i+eqkX`|itKkMCPLb2$9psQFE( zx$4wD;c48Vw}pNy7YK?xf7I4}D(c6onu|U6H|$e3n{JT0K5t_J%O4RwQAeIR7O$1N z7C$zL-`vzY|KeZSIh%g)yfwdNYnwK~K*e;EhslBcn^lVwT&L-r*eSAj{lD)&R$u)X z{_kmcy~W>G?U&c<{mU;|lAx<LVatMtx8G)D?0I=qDdKLsphf?+n=h_NK2$%{AosX{ z$#40^>1@v(3~b$>-FETFoqncwTKbmOk7s#9G}-HpyPcF=&3-CP_Td$W?z1WSUr)cN z@4NqFasR5dKGvB(f&*^4vDLQkE5B-S?Vs7@kRIPd75o2*OWQfm2v^+FRZ+BYU1*-1 z#EIWGF0h2U<OFcawuy!dY)#~KUM3o-9y4wG?NyIou*GONJTOpQyvu+iJ6M13uD-MX z8D*6-zeW50D~gxN-nZ7+uTt}9NTtrpi_s2RhW(N34%2OOf6w^j@9h8dv5C{neaAn4 zdg#r4`pXkXpGo&7&z<es=T+TXYxgesfoAuwS~cUD8P#2#=7D83JbSv<W!vUIlGd~I zxcE`}QvU4hUzh&enfs#RlXBmo>RH)SjTW*?oiF0L8hq{l`8zAW_DuOEeDS=$($*ht zALEj2m@|^wwuhIldGN+n-nb@KBc*qN*PGre#^HO*e4~T+3jOtrF?-s%V~R`JoJ(<Q z`n*K~&oYTsud~RJmgG@6uQlCuh47YRK2BxxKm4^gf9<EExM`2`OVh72&TQ4?%goR^ zdXmw?_SY2dA5x-iKc0*Ii{V{7<^F4xeY`bNJR6t&o|v>rpzWR8;wb@_&wlcAHoJ4H z@0d);vY7ox?|kBZ__zOR7u(^LE3?WbB=d$iPBVAjQ@-l)h8r5Um)+A}$am9WeNFz{ zL?#hG`&osY^;`EHPjQ{gU3KilU(YJu#P+sbeQU&bo;ozAO>nhN{@RJU_N||-gKZ+d zuw3<B_Lo)Wjk3?>snctoxi9`y^z7V`X6I06A5W(y)xK{P?LGT{NuNHsVv0mvn&zC0 zBdbd<JdU6FWbwlff_1lB&D~!Gt`s^kpIf=7UCxTX`O2?8@ptDpwk)XQPnh7<b6YP* zZhi6E#Q}z&LuRHg(~Dl$K1=n=#RMg@zcJr#R)*c(c6!CM$`T*-FSBirPxv<7c)7wG zGdYjr>2r^5@m%hi&r^Hdt+g-rM2NZAoc{3RfnqvLHebEZn<%V&nD27fd(zjrtdSiz zKD`t-P@ck8@H#ov<B^qmZ1<0a?^|YAJbaMBu#ly~Ex&%wCHBlGkFVN(67ou7RRfJ^ zDa?*6ONu|uCLg)YL39u6JT8rm&A;Z|5e|^?(L7XpUV8sh`_~Dadta!j->%KSY0em8 z{{2Ym*0_y3W~^Kuc*SA$w{`FDzCLhe_G*h$(@GbrarC&yCz@{kZFgb!CUN^!meQY! zN_o}Rbh>&U_uu1s?aZ?$rW2m)l!Q91UNME?{w$jlX*_4m8{YHEg{AS>=+~JsD5~F7 zt!MCF{$+)x=&dipM=q@9i^*jOm_IKi;K|giTT`6Pc@`w~#R=V>{U?Ll`&=T!vAV5n zYRgO+k1a2g4oJ;jq?I6lVSVKUhq#ME`qw<ZHh0h8x7%WWNVuh=i_c1~E8CnN^IrV- z^6by^XD6gxQ%;duw72H#-P@njD!7#{rc~5yyvh)DWF_aUm^{`yT1A;N+%g<io;|I4 zI_TyP&Go)B^_GU7yP5LZ@_5bVg)e{CIaoi`J8*Ev*=3?$(|2szXwqzXdq-cUzMn|w zd#(E`bzi4-F}}Xkzw*k8bw9$CR~{3Ly81M}%WYM5+>ETM^P%-u4xKESb=q#}(wCp~ zgBQle{Bt#wjs3V*%u4M;>^IG~UeoJm&MLZOT6g_Wus~<t!&6t(ZpEB7O^w{P*{J!= z=GeZF+U;#m9?R8A>qxqMOSrG;ul4NTrFlMUny2xHbgq2dabao6a!b#$O9wjnv=&d9 zz?SKu)y5b+@xjzCKfy}JU9MSHUS2D2zj4TXtEPE0vwZ%W8=jZiyHf<%J;mQm)SIiE zQhdI9MJ!j^%ty+KN0;32T<`rfLQ((po}ZJ>ojLHx#W1aDAJc}nCuR5Ov9CXU@O9CL zT{2MSr-;3J>in}F{V)1(NM?_L^|wP;cq}rXwPeah8+8b`ty})P{GiB(Zx0$aK9V{1 zH%K8hevZCq%f_v@x1F2L)TZbhG~>kj$8{^W{`))ekntksDHWm7DX*TfzB{O5JtL($ zW76CWFE?*iIIq4kDN>zxVQTJ*>VPe&8SNLhnq_@+y&HCUn{scqv(b`Et#@qq#VNiD zTlT6jzov3i+=-&+77XW3Pwgx#Dot78DJ|yvW23sfFPp^s1HP6CrK^8<Y=2QuIj<tg zNpI~*?es67$~_yzOeNZ!3+>!L&b{y^NxUgqdTPy)M3d*r-<~XfsJyng{HV{K-)$*s zM?(XI>h7gQudg|Mb<<t-$cVeCzom0_<fSFI*5%l-Dn2=3*lg>lofdWM%*@vnCw=+0 zmdy_9$=WBs@LGP7+|MgNmni&XiDAerSP`-Q?zYPtL>+$XIT=q7Epm`<@zq{G=_#+S zz=5vsf?@8AZ^A9oR;Jppf9YQMpTA)5bRoHD)k&h$r85_Qbz3D`8gy)>pQO6H^wD+G z<}Gs+u8HAW-Elc?#q93=@x?hlTqoU^sg(%IbSg|xo%1&2MAOTjMOQX){apV+Z`&Fx zALZFLwR_mzuYS_ad#EeH^H=sq&D+PSEbFG_Pdpf1pkS?W`=`OO)N99=pSv;V_hbFN z*>$e!xuG5le0lY9rHvORbA;aA{5xPup7OKXVXd(}TdSTv+UPJ<Z(F!!7{`owE~DFe zo1&*&G})DMU=hQVr_T##tY7r$jP2EXGp)94{WUwHA-qy(0>fshoiP=!Tpb^BCOOX) zd=dKm;iH*5J{9~wYw9l@<}GK;rO~J$_U0>#3j@=igx>Az^a7IR&Nw^eoN}X$Q1!xv zmsW4l-1*?omxsQsn(Dtr=QYMZV^*z8_c|H;#j-qMifqh<-3DCVTznViGOq0P*T|k{ z)3I~&VJ;Twrz-;&HFPcSG_sC;`a9%|{q*{mdukY$uK53pwZ!C?UV_7hZ;=Na9B<5A zy<6t(GiHw8A2Oz2+%ow<t!%~NO-onROFjNuAAqvO!8(Lv$5|!@1|~KJ1~CQ(2Iv-t z(1M)#1Q=iZRm?Arz+wcpq8VCj;brSVpdjk{uksV2)d6_b~TGrR)kWV`!J>rq)g z<<ft<$WQK@z9rUeT=Ki{++O!^9sMOn2U4dQPGmikzceq5YxdN-tB$Ku_?BG(Eq=Zt zwx7Gnit}dh*-6%#LDO7UhFF>wR)_}9m6(<se>hZSMJ!ML{*dfG^(X%xWN$qmm^~|U ze*wceG4smj-M^nIH2B-)id?eUCemrf9yzN{fQ55;)ZyfVs<wA5yOPE4y#9KpzW4~Y z_78^B5<)YdFHPVy6%&t}VcE3t-er0I2#<;xYt0QJ&vN=$v^Qya-&=5LLI7hmOD~(o zbs@hVrY_;&peLdSu05Q$BB|tjAU}hr+Z^jIXT_PNg%M)u+oIm3b-&EAjL%^U$O;MV z);rVx`sU%JPuXdgXS5v1kF;X?)Z(>~+3J{_;lx8_D|~u%-}dB1U$;CyO_np}%?;Kq zEXUX7`m*0jW;%VyKvP5A;OLZTcdEYi9TRzcQDZS%{EOEY#0rx*`!Wu?EzSO;kt(*b zT+zEd#nPFFTk}G&Wdhf3S>ZEp$|kza<Fm79|IaD;E%C?QrE=TFSDo^RQcSXDS(3+d z@`6iZ=$CheUyChgZoAYX+gj&-N%^XX_MTYBvlk0Xc6_^k(5y84{vF;aY_ArrG4q-> z^ZJSVArZfu4lsF@@7uQMR$(U3)~xhXb03CZ+Ii%v*pdRy9X=ZEbJX0`^bU#63gWbF ztCoJ07ccvf{|Q3`*DfC+>m8XVPcENoYFu-mHZ#6;UVdQgGMmdE-#WE@kK6B?cz<r} z-w#K=&UQ9i`t7jv)UM;=3u6}?KlG}u#L}Z!YAbKo?W@Oc+_HV8v(tC^gp4IxmTnKr zth?sDFxV?uSH16D{`TwNvPuqil{aQyJ||H$DYCWu#j^h;)^hjk>NCWJSN2@G(A{6U z|6bI*_o44gblq#O|Bd*6@cPE`H4E+?=DT<L)+UaBOo$BNq7WX*z`(%31R@w17=#cR zAU-}bFS8^*Uaz2%nE|&Bq%4zIkg1PD*QPk1sNNmZn{Eg*Fto-pFbE>-0qII9$=55W zd}|Y3eB12W`+uUdY9?n|#m_zG_x+@C?Shn3No%{61N|oVv^!6n&@xNBRpG71{<_9y zW}!VDON6#t?~dJnf`zZ(9s7ZUirYP9_+-*&FO77PNq0ExJZA~BdDo*WzL_!`ySZ~d z-<`6=L`6K>u+4sF+yf)G8B$x8s(eV*@7xq%I{Q!k%~^8%Cbw38(@cHo-+a_Dp|E*A zTiX%OKir(P7QgbQ1o<E2k9AAi=x^~N_Q9nLSD{yIU$i~-^m6>fz3+Z7__1}y^UFsY z{%dZ!zp6g#@O_rN9Ut!=ynOY+OI`2DYa6OQAAZe0ef{Cn*Z2LcD*9Sg_O<Hkx3AyY z<?Ul*|9vv}@&6#deEpBi2?BcCPCTrc82|HtyuO^Co}PnN^Zj|j%HH4ei&oX|VJeC_ zuiRsq`Nw0?YDRgMwVXHATHdZcdu9E$3Ht1(6lG7{&X_Wd&HQU&poR3N-knAKg${d@ zFCN|V!=Y>DP9@3fEr(m)bfq2OmpNs2biU{=>!8PdzpNsy*FAg^aYl6KLbK1po-BtJ z9en;vA#Rna$`oeHh7B2i58tow^SD&|CVN53>omt#9NwB90&ZMeK0iEk$1e6W+iZLL z0&B+N+Qn>nvHHD}AFpR*|Gn|dQ-g&mw@+oUC!2O%{j#{FAd!2KS<N@8u1{OyWR~8^ z+v!kpWr}5c&SBGP(;G($7u=e$U43EnyP$~c><_uVPqDc^GwH0e%0gvVNA{(^XJke# zacWbY#UHcYM8W!zwWP9V<%VmO4_3^7>=In;CTqEqOL~4qf50=FzK*5|W)qwX)~I$& zduOye``Urbxe0pdQW;;Scj%qoQ+RAjw%2UEg2l1NRKvF9WF89Y{H$_Y##6jw_uWek zP67FiUBdn=R&BITZ`)jWOS35Us>)Tz1nI1c|1BSXoK?N{eTmPO$BD|Xm~QP-<n7B1 z*l9Y)<o9L6hV5MMn3tb5K6Q}m&l9h<IpT)jr2al<Gn%U;ar;=*Bv--syQWbtESeK{ zm*3nMe9ckJ?YYpaWENdl$$KJGqWuE&#LYV+b@(nt?^wNoFDbWi;p}T}ue5jso~eGh z@Nl;Ji|3Bg(`6n_4{zM3&0KNcSpHp3-_#vP=iczR+>*Cx%7%3}u0B0@SJC5mby`Vb zvC(?1l>gC-+}#hX*5}zaA$4}kYv*?bYghJW#kKI<sOA!`KRmm>X|5$-#n)G&f4bBr zHMFsPG&7IAvu&U5K|SBcvo?S3(x3KE`|9DH40m~K%%wWy-gz>f`5e~6yy3g|X|uUU zfA5s|JLkd_i#xw&EpNz6{AqZ9A=_<lgW#99d*p-vl*t?`iF)wB;jKl&tZys56JN=A z9@<jFuYT-cjX;@}kgRXd(goLV@9xamX+CY$$CJKY-xivhPm_1~+~$^7bY@{UAK&`# zH?RFUT(C=`YuyyL<Gup<U2?bo+zqqU{5dJ9KkIDt6`rFnW>)5|P3JOFu{(Q+Del{< zz)jmFtYgpQUpb-BS9a9m;$pYXc}YE%@#kGuTO^&DHg)F~o(sm!#&ff_rcPdTXVcOh zmzuJ(=NX^X<#{N^J;R&DZBFK~vmB0*C*CTyPrZ{kJw@;R;cH28ui0jsl}z8>x15_< zYP;i`q}yMUZ0F2cbg{p3irS5=zBMybF00GM&ziU^`|z|4Hfkce+e}YKA1w^~Xk#3{ z&2abRn8!1Bz6d_M>1nej?|YAytD2YRKl-<2{lnFNbB<o&4OrXlWy(`g^f8miKe}dD z>vH#yW7YwO)88-$7hDuj*?G#9heKcQ*i_CRN95)njBu1cyu7-i>X5oXbGMU0!kpE| zYFn1CUlDX*pW_?n2Z_x#GqMdX@%&CW$9v9_<&>Gn%>pL>>QuE$E+05w+)<e8{2+g^ z(*a(aw--bj&k4MgVbqnoRK#6k*QRyigg~>u!_4+6XA`G!r2piY5HG4y@I=vFdBV(g zqusUq67x3ZGu9f~ot)4X;{PDC-(UH``Q%dtOHV!$PWT{rSVqS_$c?}1!~Rth6quRp z7|WV&q>2PM9$?AiEV5=hq3hIF-@M%Z1Lv0wuC_gmuXKZK*?!+yRD17$(vHKbAJ|^p zQJfomA+W(}7wbPc(fUh{6Q@NV_}=luXGZG-o$VjKboiSec+0nQFXP%b0ouY3%KGp4 zG2EB?=nEzsnyRNfVA=3q@HfkoP3}8=7!J!BMl3MwlG@BLNofh|ouDVzn05wC>1N#$ zu;eIHl*XkbMz&Q34f}(?e3zEk9{f1P$Ms)b^FI3x@69(%x1ZwLG(|4ZYx{!z?pN;X ze)!N~bBAf4`;qM|-hLM*<tLtVH&y@eeZ>~eJ@!iPw<p;4XV`8(a8bFaggfqQMTqz8 zm@6MRD>x>!Yd+u>xF4cdpS6)imUYEq%@5)V^}#z^Rvi`Iz}`{I_NVp4eVz)A&?^j{ zEgGGYHzGUA%qFjvI#<a&<?Vz`k{5)Obd4wEbzGY3c!k3-OQ-QR%g(usR~3V7+3zVo zspXSUdip-WRxs+k%!<AVuPh_{Tdr+xQeUPd@t|AazKn{*LYC(ZwoY%vJ~&KlKk8v~ zRL-u^EcwbarXSrC_p`cOmRS6fNkw8Y%lm|L%;zfE|Hw|*Z{1*{@I>O*wpIKp^$sWR zH$LIl_*uT-?D-XERTKOLehXQ6O<1hzpvJM2$zz$Br-EafPz+;P+l}x8*3S3B59m7Q zg*P-Rwuxr6E({9;a}&~i)?O}hUbZb@foNM)<jJ)npUl~71RohYda*3s!qhk85l7AB zh573kCTV(XkZZe^%=}Gc<Lw9aD{pZ$s{~DH;hp3WD75Vk|Fhfi6+yGrH@ps6d-=dc zHp@+pLYiKO+V+KfWt^*dDYMxoc*=6#J<Ct*<`wb@Y%(jDt+YLRftB;B>kKm$pGc*h zESP5M@{LFNx9x`yEjD+U=lXj*x4rPQrDPwwr_Ev&Hw9z<RI|3_x^{cp3(s4;E1z&$ ze9CF|0|hQT@(iCkCde}$4nOiiu;jO?_O@wSf_mpyeqC(vB(uv|$E3^oPUysmYnBxJ zJ{MvaHQ)NwC(kKecbt+go2;1s@ajDAs-yE}%(u+6d-gWL^+dz`8inn~ACmju&tELE zS>?Bh?S|F!>(g#JF8Ouu&|Yc#b^CfJ-#srg?eCf>J?BZg9z6_NR-rfl-_P@>C(KWd zE!<dG>G6o!Gsx@4|Gz~uxx7wEe+qi#Q)0e!$>)$ZE7mEOWP=<mc{Z%hi}v#DpZeQn zSIf8b%K;De>rKjkTWMqK`F(ClrbV^Kirz!}C#`B)R4DdSmh+=-LrBro8xaxp(S2*V zUWc4m%g3-=-EZ23Z8A?b&;G$@zc?>yqPKy`p=&&Gk)i4=pUVZ0O{r4J+HvYi<(c3e zO<Ruf?3lM@%VuZi5`n^ZSr3Bsb(v2w++)*|lRr7pw0EBxW2VGihCD}KCtjlt+wE^U zdt~moxFoz4>e#Vwg7dtp|8tIJzJ4m#+i`e$`vkYWMb8zOXD(V3_~Ph9cfQQ_*c8EB z=D-<0j+9jIS>BVE;cz+md9Bg5t#|!STZ*4w{_ggx@6QW(FBhuTK1=18E+qf*Q@}CN z^@)<AZ#mRk)~w?8YFM;*^_c}}Ki-xnUwvs^k+<i1*CqvlnIC@aEQ!4Gp6Qiq54+3x z=9}W`3K#XR=CiC0|JqZhs(ZK2d%g$%>+j_Y6dc_o89i?|N~O-f?XcHMVbT1}du}Z; ziJdN6;QdAJs>hV@>oc64oXst*Y#ipA2Z*p-jD2$A#4^eE5oLEKCEpjCX}Nu8($DCF ztBTJZ?br~RTX~>#^~<u9jWQ?a2>n@niM!z2LwhY-({|>LA4iWI4dN5pe>Cv0MxN6C z_KLSoo8|fMd+BGW=iM);6k4|H<PYuD?nhK&rG*<_ZhgMe;Z(+2|JqaEs?J>6YN&PN zt$X(82CI|ly{|X2EKV#5S2T$}UcWBtzYy=#!}X4rHOv3}-kGqU@xSi9Z7Pi`bo6)@ zUVS?6j>77<$FqW;L~nNa(omFb;QdBR)@pa>Phrj#RW6Swu8y0`Dq^z0?YL&XTh_mC z3gxyNqNjU_lwXcYT=^og`tJnJ_At|2=X);~?)sbCcGXCk|5oLmZIwA*Y+r8u`&l@< z+2l#_t9BQQ%Ig}3ge&!xe%zb-UM=(XzFjL;S#y4JIazGY@*s2V7m*T|LLsNtx@b?y zpH6$$D66Plnq}Ibe<k|ti|Ug)iasS<u9#&7Z1wS8YZ19Q_rC477M{m1o>;D$x7&Ju z#K$GKyRy~<{faf|GUqT_c6j{)Rr%6s%;v6aqMTmm?q1(`zWmjH%P;lwod3tp`6+$6 zKiYPe26J6y`MZak*7ki4kJvJ)=(D!b^U$)z=~Lt`?)$Xr<uZk;UDtNcJKmGwWw|6_ z)s(|miYGUT`*<ly&w3p)<)Zml<?_tlpe)ft<|(bLlf+kUv3Fm${PSUTmwUlCzZ(6X z=(DD*IAWLaOAGyP=XJWf%LN5__zF_C%)6em<LHUA-gmldnrb2^X4M@KeY2*zJG#im z)1i=6Igqn_ZAfzWiX&$ySNR@SP#4K}b()xa@k!mq*-nq#o~F;A79H`*+O9Ilw^Hw; z!&#Ng6KpF^taK3*I_8yMRw=Wi=(cK7_&Lv5KJ}&Z`ZbSidgk`){U#0Ju)<G%6%LDI zI#v{}_^|HXtKVtyTYI#1w0$|lle1=@-kBKveOYq!wl%BGm^hd;Yn2*8M5TF)J3_a4 zcFR>~o(T^=Y_`7J^39Q6i8qE@G{wFhX<>P<^mO&T)t4)qi*Fpc>(_bLYVmb$50%gI zp&~4%0e{?W&p-Vv!@9XeO6lL?dG*^<WJ^9-A2nLF&{Re@W$vrCyq2v>jmQ4T@9zlv z!G3$q)HR~b^(nWH%!v2S^u2Q;+-Xyu%7P!Ekp+=Lx^<!5wv%+fc}%r`^yhNYzn5Om zP94>scJ6FS_m87uB1d8sJFRET`k!EVS-<GaXZ=MHUzeN;;d+vKHEr#jiK;x=9I9br z(t&mvD_-rW6ra-H88)pyV(t5P%buN?bGvVi>E;_+)-p^5TGn|Dmjy&7u*x|eP0EY@ zyw#8Me#a$^%PSlOJO#grg~ZNYeesf1mhlPZYs+RhHXh(vHC;0~($e^{**f0H$>xPO zd9-I0iLAOWdAeFen_Y7CCm+MJdw0e}c3Yk+(vR;ut$r{r-EdlP!vCb%&S%bkH(g;_ zxsLgs?%C?>jqA==PM@GImCjpyU($OwL-FL0ubhWm)q`|*bveFPH2=*hzSi{k#2s6| zt!>)4)Y5GFvzjHD37*?j6l;nnu2x`Yl6~@bmX!G7(xWNsHmdmst1x-GCYfLE$t+9v z_1-2Tm$6{B5W@mh$9ThE_adU$w&$*U61h;-{Nd@sQ(tAWF2(2^%{D!@g=e?N5pA=) z0LE?WERSC6aMoTw@!s2=jn7P+mOlGEiRY-9|MUe64j()9?y^p+S-7+8n0KVAPK-m% zkpuGTs}dr1JWbjwGt+YGY71|hMHhFP++VvkwX^BGq;Clq1A}M7zNWUL1zTs#+Vx9J zTCDrfw3<CkjhrF+m$?j2mnPibAeU|3dMvbZ$D{05965Jybi6LnuU~p<p3b_)4U#p6 zj#s}IotzcZTD&l0-yHAvV)7pq&U9^4+C1TzU!L^gl@s(?OjDO`*cz4NdPghgs+s#_ z%NZ>*BoB0K?{D$!h`b$MdgJaKWd#cXlatO8R~WR4Ij{YGWZhMCWb<hQ{X^G<|JmQ~ zSzhp$hyCWGrN_&&gZKSrKV0Q=WD~D)=F6+c@^3HRqF<zb^Kx6@vUz=vlnq0#{dnfH z_aeK=_jzvVf=c4?c5TPJ_R6w9KYDNSO2(rl30ce<is$36zBUwem_MO<V%$%*m#2;0 zCkuTtbqQE)WL(F6)RJcpkN07N%PZId^?D6g9Pz)CJKJr?0~VGu%5giMKA)l>k#nL! ze&Y_+e=omX5B7W&9~O4uX4vBM!P{rVom=4lvA1u5|HTK-&$=7`O}Q~+`lU;of4Wa! zuz1q%37p4loK8JX4z60J>8Z5IFzNA;OF<K(G_9lkHoaJxdiAoo@9k+^%*TE|JDl<` zb#ubR`Cd`pwf!sVs=aP17W7Zm34Lm}{nM%jHQN;$YioFtCSN=t9=6uBo5^~nROZ@) zlUGhE6A<wgk7$aXx$S++4_TF;vR{7Kc6|IDsAQ+Gb$Q@z_lTCI+Ye6J9HRd}RQSgk z=i};rJAV0#)Xn?*QFy_c@U1V(L-J3>#N6Zkxs9vA=iJtYgpI4%7N<vMi>{W6nP>4j zKJZrQ#w%eNw@kOCZ_H6=kSJCcDc4;tuQI)T@{#jv-p+GPjf?&=WqDF`!lyH@IVJwi zdXW0(&76GJx!>05x&P8Ho;ZEOl_0f0)%n#@+YP2Js(l-@CgxlG%CGkCUwhX?Pn!5j zeN)oD;;ynyF~6hp=lR7~&ab?FSHHvCZr3Z$-O2~O+2y}yst0Ui4vW{Z{k}Wt!%5eV zuBSFJHilaMy1pXrMcBsvyrtK_R$DimsD8I$?}aCOst+C051se6vA0Mye$QU%x2y6# z8yz}pKff~cr@}q%-BWF{YTxVVFSm}^`e1fg=p=<h-xje=nsfDG(%QGCQFYd9`u6|X zRla_ume{4NHQ5#7%ddt6SITJZdt6>rJ0WiR`Pe;blhrTWzTc{QZ~M+mY~h7*FYntQ zF<x`(zO}Ey(Nxi<x#jCSnx*1H48y-&nj{%jH^EPMmC+XEWK*LjOBXyhI{)?a`+^(i zYHW}47cSkPI?48PYjRJ>DYGuwb=Pb{wcTQ8Cnwv6&VL=$zCE1xQXc<<(jUf5p?bVa zf3V5gZ;9w#wlb~3qR7ZYAfqh$QuN7G*OL-^dT(*Yt~-|baBt4_L#ciOal)NO`)=K^ zpS|4rXH)cawcCGo+)Vtn|A_kG6V6wAUxzhCpLmsBBXMrE{wvWrwlROWQ3ns-Ud)|) zi-CcmfRTYglmR~84jKkb%}dTtNiEVVs7#%3I`4=AkL&lE)~TUNt}E{LxZN$ks5i^? z7Qe#55*sdw#?3SK>#KZT5#?>uvc7hmqP!*N9AoySF-iPoUJ{YBJ#KL^zismWG~?)x z6;o!3Pd4TeJlvsncKLOK%}1|XQ~OmbW4Dg~Zg-QA@8z85(=Rv`HSWDr$h5|a>%M|I z%TB=s0r!tF_O&m6uJzfiYeCKwMTMv>2C-%~Z)$3f=ZJT&)7z|fDJ>?3-)8RmxU31< zb2UW5W^B~m`OomKeq?XUrey)IO;hjf-7@#r<a60Nm;e9nm($vN*<Al>>n}#sz{ow< zc;p}>1H&FR1_lYVz^F)0Ehx#%&nwm|s9ZY5H}AHAK<jrq)`y|HGx#sW3hdY|l5s~S z!KW{QNyS~Yy|485xqz?>BCM+0Z%Is&zi+;O3!|6e`3N^JR{4_;71K}2^M!XSS9{6t zf74_0`|rNL|11`tG~c>W$$X#0^L9pKH8baB84)HGvKNi4oH_0H7fZ12xcxSVdB4aR zP9?c@`wAl6ug{KKDPYtzyT||6%{gk!oh@@`uVS`!`H-kBXutASL-C}tpZf2%TMLOw zT+O+-r^?RTwe|L=V`cl;75B|&eB^h@cGbz!J^O>~DxVvyt!}<*za=J%NAW_o{wsA3 z=BFKbcW*K_|2p>6<M_Agqc*ZLKeesgcl<l2WXOMwY=y1IQkIuC@EkvS`+k`6y_h9? z4|uP1d)bu}w4Ylr;@6*oi6>iv5BNrKXMS7WJ$>ubN`|Zi*(X2WrXO9@n7YT6@zu@S zOSE6xwLMmO{^*-f#Hxc^OLUJ$Ox}JVfAKoeS-HNM`{pvpt$HE+x>7Mu&fE8@cNg2e zx$hhLil1Ei&{8Iy?O8TK&ogjlPe}N!r>7$?#noJ!`QJ&(@U_7Ii{TN<`+6D^4)a}G zR=wNYYipR^@r7-D-#^P7o0h$jb9$p~W?g-32hxE%QQ5vxe*}2!a`+h-Vs#i8<lxb+ zYp7?YXQG#qSzMx<nU|KY@8jw0>KE*KH!8aL_A$}A@9S?AEep<MTQ=7uQ~G)5#wTrS zoikl_=BZ6?SKXknoo&MjJ%z5nUu~!FZCsL4{wvIPnW^WSo1341n)`mvQSOgB_q*z! zo-6debfwkuIGfK;?5C98DtYw!=WC}wzGaKIuz&pe`ucsFof+mle`klU|MvTD%q6qp z<n8OF?w#6O)yVyR{rkG8?xU}~_Uw&})qOwReD&6f@?v$nHS4(x%WJF4i@!e9t&6=7 z9De%i-@BjM`G4?o{>ai>7qZscwxKBR-=S>d&+4-{w@>y}j#9NYJmATm8m*oZ-g&7+ zbiL5ljY%b|1j4>v3rX&b7mpLMi_SEU*em(5T5;}*0`JhyvyN**Pde>m`gyJA_S_$S zGo<V?D$Y$wUcKvKgnqKWh_-M2hN|7tEjP<gaRqRSy?Utd#NtiQ)&I->?wM1p-8NT- zC1=-GA+fUPsuQ;rgB@~HmDhQG=@d$CXIFVUb%LrVXH<jagGl{j2bkj=*UIGcvdON= z<WgMAB`+1U>%ip)+mpi&Zo0H(?aMtX{}<eNop`*c;_%Ljbe)$M`?r}37@k~p@!>&t zWBpV&_rga`@t=Y=hi_x}9{E8?YoYbOaz!>}FHXPX&-aM@>(ohb)wbRl`oiYU_1>rF zw8J|7`d$2Z@b{MWDmQngev?|vxg;jzLd%`UWxL!xx2`)lYwsr2u6;kgeSNQ=Y0dmB z@i4pN;|FXTtbQ@vNtwzm<oLv`G@&J^SzG;*vF+s3^=6NKVh%+8nLao6SzP=73u^qk zqyndjR@PK7z7pJWl~0s$Z}eLkR-2=e>Wn*|s$99YA(~T@<K<O3_o)2PwQE|Re#!O~ z``;41W!a?y6VFIdnKipNNuCs$(6Y$5IiqBCVflx}#$Pua|4_6=(PAmn>-Ia!j&VHp z0WE*le=Xbc#d^omK*^drIsaG}7OdL!hVPH;j^rE-`>gD!9~<wS<lDl>$rO0evL>jl zVNt%+|BYfn8!A0w3~d)oFD&u#m>rkwBpGy0zL<L=Lwdt{b@p=?x&3|}c=0xX?|I&8 zE#0F9FFq&Nn|!;>sqyBa_oW#H9Ll;&8{Qo<Ok&#b^3TSoNX7{^9(Pap3V*Ucyp-vp z2=j(1c2iQ0v^L}=uvJ(bl8)w*yOt7W$rBNM!pSjO{}B`40=d-NhtF*gSRi|7j`*X= z-TT5fd{$NoPX0FiBv<&USL_=eH49}3m|OQT+<Cl*_s`3{D%%_bYLsQI)-MiOQ^4O- z*CBUI>rU65)}0&fzbu;G$Y_z>AjL2<^J=qNc#=qSX3abfRxvZP8YaPeXDiJr6C<8Z zY4%Wj?S12n$rO<dKKZ5WyXXA+Bht_8cXjd?{UaNH?)hpkYwvrHJ?o{ywgw&l6S8-U zh-QYkmD}nyS$q@N@2VT!VOzxdc**3oyLkMrGq`M<rYhR0w0h#j73y9KOQ)=yeEq)C zl;2YI*B&3Y6bLrEtuJ*!J!ZwyKz<RkkDNyfp3d}`kaELp3s+se*H0zyF2=z72d?=x z<eKL(Sld*v+;hC>I%{&3ooI&gp^w5*f_r?PzPp(<QCQR^^_JY@+QkQEn9g{V`RP;Y z)wnZ{W~Rl7UH{E-dV`1QgobMj65=mfdvi4UzKLBgb+J2kE;>Fz?1@|W$$*UI2bZQO z{@(rQW{}86?fcCCysa3OUa^UrJ7_vag>6z2En+ucaqX!9pJ{nWgp=2*iT^mu?8EHR zv?pdib<;PJnCaq}mb*o|;7(CV$kWW@(>`3fe4@XlVx`H-;|VP<Bb{vy1;(sDeX)mc z()Ov}gq`O5zR?KKd-`RY@|*Sm7x{^a=iQW=uI8|Qo2GRB>d!YOt^GerZOTp@I3G0c zPD4lk+l$MR*iYq%91#w1bM@f!dj5NfO3AD3f{&IT%=Kpe_N=J4#oXJTZPEJYkJfvv zF1Wq@<B!J3&aWqqUOoQmW}2G!W|^s?A)XT@Jrr6R&K-HwA<kgg63le?^;L#xoDbPA zTo0-4jah7b*Zb3+X5q)jryr<#BPOk0JmG9XMPxMVd=r7)?7>PC=7$vD|NpRU;q4~T z3CXs{K5|}CwRnG=cMYqy(}HikEe`$n8_vaK$<{vZbiKFzsfm4(;l!ttWzSD3J|tFl zLEf1Ct{2PQ|IF`W4j5hKpOJ8(h^JAhv8hjbk@v;Vk;d;CW7!j}e=g{F%G$c3->kIP zhQF&Ji=pmkJ!4>x><vRfcALO&YbGS9&EfGqV8^xl)V}-;cTHq1=C0|v@ibIhdgZ}; ze{#w!HYjnPTq|9;x%o}0UzG37$Y_W87cOeZX2s9@A^uM2R>Eb?ctOU04HI3${7?6Z zw=fsBzh14o;=D@!syX+Q`qy!6&C{D^`pf>C6W;``WGk!G3(;YYd8+?>6rM|e?+)3Z zw0+yLozqhcY}_*4p7{Tfw9$7}{+@S*S#E1!v>sE!#sxKxSln0qkU0?On{ae){?^HJ zj4YoE^ojntC=|?U=yP=0L<x=H47b{4EpEzBXXsZph8C6{5OICq8Zl8%U>nyyo`d3R zxi4+-Un9Y_Z)UgkRR6YTTS~S0IdAp_aufux=NTVdoE{;!lO<C*$BgMjpp4?;#{cFU zmHcm~={@vUh@2RuXyn1QHcazdQLfaB&K>*M-&6^|dege+$>ctP%;+oPS0C3g-&ysr zgColFYwumfe{*F*f@&?^sq9;BB=zl1O7*7)YJr(=7H_D3zOe78K+`wJatZZ2w!3nw zTXslX(h!dRt}E%han8$gsoOS(GOI)gRuo@56kN_AB`dFY+ahlU)1m`B-d8t%xEQOT z6UJ2;JaHl?*G0vpv+bq(70$gV=2`h;`V8sC=@T4Jg|>0%hDh3|&6;d{j&EhbM^8WR zuU9gzsy2mv*`NRC!qv@J&;I@N_AAe%_k{}8$+v#mPAE$M{p99U#{)BcEH~=>)D{+v z^5?XhBKmcP=8G$lo0T*?=X_2}vRNT$^uh53$I<CGOofZ@9ZG-eb&$<SN>z4S@Xsmt z^gVBK9pNym6}~dX@p#JXl!cxlJJU;l*s*{1oba^LR@Q+tR(;OFNjrT-KZNYtcy#5| z)CW~Jr=0%ImcAxLK9x(5;|0UbNQDbw`X48>znIPUy!e8F^2Pw6Sr>lGmM3<^FHbx7 z$M;EN^h=8;&2mbn>rVtMd-dav(h)14w9gxJPOLgqAN{8MQ^%PlELZoo?o$!w+P06` z{Ym<wI<Di=p-XpV<uK>Yb@5>kd-uP|y5F#uN2X08p>6X?m&;l&X3k*0@zLVn4FmtX z(Q`}#Uuku0yR=~*=Yfk4w2N7}K0ZGYdTinxw`*33JJTg<q~6ZmX_RDmGj`(2^BKWQ zwyazkX=8J->&fMvGrUyzx1U>9>Df5>_9{=&zBSV6Cta2r_NgV$ys=WIlu5X~#`|pF ze$EGRrW+m1#pSJ5Eb5!HOfGS8Q1WkYq0QWrEbd##Y(9}QV`}flc`~u8%lfV5_={$| z%Kh~6bN%I6m9t#4(ijgb&Da(8@Y}@e>(4ZFKYGi1b$ai^WjvS5yx+=B6AU`r8^AYb zl}J2GqEw3BM`^>|4;VEg47a&Nzj&$ff#1$~g>rEJsxu1n8qB4RtXjLJW_`(>>L0rs z>={Mam>vm;8Oy~=I-P6OEH6`TY5Ojo<r9C%v@NGFPfU{6Z|{`a12gyi=dk)I@vPnX z0$Z>1k|kzWSKW7eo8P}-f%ON@X(dIPB6XJ^eKpBq4r99)c!+VYcGBg>$+sr|%sH{_ zfq6XdxhV|WuFQY_$jdrw?uSd;#N-?6n_~G4ITx*(&1}BmN@a5Q)P#mT9%sF0HHn@~ zwEG?#^p&af=)!}A-Lvd_AD`|l)-PPgI>A1A&Cw!TVSAlxr%Mgq9e?__-(3FP(c?$& z-c2gqzbCGH_U=DX|DMf_SW_ofAHQy0!@G=qjCDs|uJBgB*rFY3rsgZ@QXC{%@QT4# zZ)TU2QZ?7cgfqXN{{8)$Y0bW>oiTfNN3Z)=_4o4ESNjC)WAE?%E4U@*&xV@)d;ZUK zdU5wtUFqIu*V)D5j=g=vC-d#$-$#CT>UQkj8yR1`_37<HZ24ji|K-fCmb`W_H@+k4 zcbL^C-8bL#Qn6J5@5R>sfIq57&OTdelUu@PAt+~lU~5^+n{!jFww>g8^>5zPWgCCG zzRom0z47~W%Njnlqpt6_-g(iccYb<ACF_Oxc?z}>Y&BOeY!EJK@w1lR+A>>*V}YW) zWJ%WTjD+~5yL2AqmK#bwJ$CYZ`s2S%olNJxNbgm2azB+@C@1({_s}%veT@%Zl>Mox zGpO=A#m<-7bXv++`gbS8&aiDo)^i^|e)Yl2p~~{WSFZQhHs4P7&`{V`Gqr)GEqzyo z;`3IvmSZ!eU-UlCI$i!O;%M^PW6_TvyG>tX>DD9pQ~GXYdfJXz{yci~_6qYyJ=`dL zm~pr1vRkj!=F8SKEz0>7_h^cM<-v}w>p|v=pJu7du6iT1bD>hjGhcx{tOp*PeS1(^ zo4v8Qu!H4qg~0RFBZ<4#$eF}Wy7uoY?+J$dmJdbE;^!ql+>O!kTEm&q+OTKGXC={B zI+}LxChYRR{PoAC4>w<LJK%JBuAvR<QqSj4HqA|2ci?uGYXwt)yVR+5AvGQIjxUh= z%O_I4>g|WClS~AXH=8+@Cz|!ncM{C6Y~9d&X8QW52R1YG_wB#L=$PF6aq-P$^&@Lj zOeAg^3(q;{p1-BUw@g~da{GR<g^KI`OEsDt)OhLbqkeahii`i`MLIlxd?c#XVvX&R z4;Am5ock(cw%64Q>ppNL9J@O6;?6C)ih&B(FLr6pb<e(>J9EAavzl{w-&rmG!0yXC zKR$bK(#`4uqwa(psgr-~x{vjkxy4#EtPc;52tU7<&3(UqUjD<0Pwnq7;LeO<=&1Uz zUjNDZcMtQIoU*&8dhq^VaXpPc*&>%SofceW+jPuH+OB1#+eE9MQLC2~F>$e|SU3M; z%hwcjdG=;{e7fL|45Npu?<%qgFI@Hh*CxLzJ-u~4-`juebC|Z+@yB~T*3#EkmRT(j z7vOaGxL9tV^@&quW#-*GAMrIj@BgSYWmZ)fLjjYR8K3@&ADQ;*yc&Mzi|#l~QA~ci ztve%4zN>IY)ZG<dPI29xz~(EXH>a`4WQQBiyu`IL?$!L79v|S#VI%wg@!qG0_GZhR zU!vH)<tbnO8cT^wsgLy8fBX*p<5bl=&wcxv{g)owd8}HKKC8`t;(h@wy$_8)&OLql zT|?=MG6ze{zCS-~E>zt8X*Oknp<Boj3#HP(Y0j68EG2KYI!trs_<nwG(J#3jzq4xp z3WY3FjX!i@{v)}6bB#qN_g?Y4UvS8~`A_3=i68$x_A`G}+q`z_tQ7)Hb2503@W`ya z-6v4sz_~!D<aqwKpP8PIUcdVi^Z7pmVt5ABPnYw`S9K6$V0hrnz#xyipYH1#;^^WS z;&?aaebH^VN&n9+pOO6T+7nq$uc9P%uPIh;lak+^nlx?7wdqAm-zXX=r1K_iFmA|r zch&al)x8JoZkB#O!=S)$Dk}e#oy=*`*$NjfU#_ped-;U)#LpeiYyPM&><xLTY0c?Z zb-hN}FLKKjrQp4vrayk*`k^#GFvl$Bz2D8F{>49L-hKCJtJlq`F<CqARIfEln)6ZA zX8*a*XXf~+-F|B}VI$|KByCrz4+al@x-8rHOzpbs4DqNLov}Gg**;a5nLJ(ve`|Xk zv+T{<32r;OlQ%vzvP}K^D_^;+{QNzpw|2i1ov%0R#{K{PtIPh|x)hBd=AN%Ng6%K& zv}Yf@GuglLoG15@3X`P$&oddF64l+^<LkdAicFs@wmg-2Y53$Ldbw&(KbJa{PycMr zZMJt`!gKTM;+uEhJo~k2@2;7fe;<9?aaKS7xw-iF=M|MM<*{eP%0J)q|6Z|l@`J(y zdM-M_GY_lzT&U!)`Q@inn|95{^M>1pDNhwv#=PiFwCRmlap^=*;>JsB984R#wstu@ zEvUSr(0SfPNXJQ!`_J6M!%8WxE;&1sxdo$=j&JA-JDPQNU$R!4zR<hi#EpWP|19gK z<{8SY%31z2Yp(HD-`2DPS^|@P_7xgg{0xuU@3{W;$(pmpY-iS(urs~v$}1|WYBAjS zh;#Q6)#x*#np{m~niBk-tDf^6Vf}7)LUYH(TnDb?NG8`OQL4(vwtk2gx^;!4ygR(x zr0KZR)|)G~I9{|pu+1nwx@uZu!``4-KTdJY)!cBwOL{4zY3ZHvE5Ek59%d`b@LaL> zf^xuqHeKalqpkntHpXn6(ERa1EpOI0u}Krsq~|$Za8!1%^ATJpyI6T!EVmGMgy7oq znZ0@^b2Vo$Y;9yY=dm_T*LaD<X^AECIAtFRHRt#JOZ7OdB``lUU~<C5*)m&NteCet z^?aVv_$6qG!jgcdSKq@{eyqKbQWxktpSMBmpZE9n($$Uj8oSvgMLnW7@2WNB==9$p zojJkr#&tI-XFj)Y*>n4@{EQTiV-QztVJi6Sd%4M2H))~igvIg6m#(<S6fIWbRC@5_ zs;~3J%o!poRvc_Pp_blH+?2u-_}z~F6gzwE!l4CMIJP`XW)RGou-Uw?CZ_A@stYCZ zD@+CZTXxQVI{)C2ThWhSo{MAND#rOUb<I__I-ct`t+A%E!fW(Qf3SRK^9~pKZkjeH z(opE;#eED?TcjQ_Y(J}FwM8jyu0>cv;s*B}d(>yFTfr?<xgqkjf~~Z(nbM>=Pj|mD z{J1CdSF(0S?n9-w9gozb%APh&*m&10nlHok?Y8|71zGm6dwi{#`Qt}O_j2Vkd>Jnk z%a@&sE<Ej?E+B3b(w43rS>Z8Bs$yR9I#tiAchXDPHW+^F%r|<#!r{Qh{CyM4htAAt zoDZG|Ta+%^cKGn6T>?>d4PtUE&If1KU0zi1HZRihrHMvV<j-E+osP;LnkFtg#HwT? zmiBJkp|VoCwqW<Phr5(B8ZQ-}s1z{VQZXS#=!L0*)AQv%4Q^Au-EWv;JbjnBc}LPU zaW<U^TaG0bPMu(U=y8#1aKzeN<F|h<^{oFGS0S}=S;gFvi_vq=WlByLHDx*(Hb+46 zdP<>&`K^0y857?exPPf%<%Vj6?5$`nfyx)XZcYcT81id!n#Jb$|Ik$nta3WqzV?|+ z@U+7&bHy%y*=kf$@*$Axj^&=?Vyg8XCH~W&C{J`Q^6ffxYSO&6-+Z}wA;tS-HqT}f zo0Mi{bW|v57I&81`iWaF^>xHPFWRE;bh#K$b`<B*zwVopWM3qfDVkmApT^W8+uUKt z|8HJfTg3i5$@?8IKU!$C_P}8!#`f!6lTLDM-TH*{=Hsx(pEVn|DwRehy@-uHB{)?f zuy5zeITOF6xb-i)73Q;cJ!id^oaD4r4;4lZ{*dgIJ6k5Cr5A0?d|G8<eL$}Dz!V7~ zvx4%d%?Ew*FUEF8zCI;c+OpC1^~y}vr(C9P5fV<eTRyct+S&X%Uz2Hj@VXyQTDRyk z=U?C8I{D;=fY!zYM$;GWJV$pqP4#`D)f2OH%I*V80+%mo@asOd;O2g|y#-<Ytd9Rb zD=rRvKPBnoyniVxBE&6@z4vXF+{UIho#~B`!p;R}m}jqCf4!_s`Cm|jtl9~;6%O`d z>k<|Q7Jq(sph9TFe8FW(*3Xyjun9`-KGekdoO!NmW_$GY&7BM(2eO({Bu*vxxAbwU zGyY)HWGFi4!Y7n7%e3X0$}O)WNh`gMr#P~yG{+xr5c<l+owW6_=RWD<Q3uR99ez5t z&S>CUBzc|Rfvv`r*T2a>{e}8kjyrztksDd06iN$PbRIqkcq)3MyH%uZoyCIC^{02A z+F(>3@bS{41<c0+dR~XU`8+Er-%_pn|M4i<1CNzXUp%-l<c#eSmbPBqoOYefMk_L9 zPpK>HddA-rP&C=`)#eozZhLr6`lw7WdsDA?Npo&=>$Jj?qH27x!9TL!Nw}tzzTWvD za#}*Q<I)6^CA>Xr`>q;16#A0%{_PDDkJ%kpw+0;hDYB^DFvh!!Yh&Ar7utb}vv=;5 zYhX(|QL!lKp^;rnrbAY0scXNvd`8}tG7Fhq4Y`pM_MBf6oz<=Nd8bXnW{J1ULJv!I zEO}wPRH%68CY_I>$LDKu>~1@^!0X7`C^zloV=57M;#P1Snf=W=f+wBx{w$|w8ci;1 za*UWef1TZ87^qxjFV>*B{bsMk^`gwn+}f${{*>+gXV&tkaZc-+-(q)LrtJIqz~-WO z-BkYFQ{DwGKbt4P6>!@(`tdR5I~;Xi++wmAS0w$FFKu76p4m+NYhQ|kPVSF&U3<>H z;3$l$dUIV;UEcBJ60er~8!{LjXS@*<l>f6fsv~88ZPLOsjULvkyuyTHZikpVMPzq| zGMTP9YH7D@p4=fxX1gsyng=F@?~qTqf2}z|O~|Fuacf-CmQ{6swy+%1yl<+#=l%Bt zm&wypd&O@Xtnrdu)4cI~^6XA2Uy)PRGZ)F;dgpMN=VP<t&Jxuny=&)+at20J^%sj= zv$&+h-Y)<1*V1dR7QW)O$mLqtyl~RQQxDu;d=#~kuzW9-7}3x2=t3a-k3;<DwZE4e zZO~oA_m6KW+n<mVH_{mWyJz%@h>A?`E&Q!fC(T%L&+kfEdoIW49TOHSvfaP5FJ@uC z+LitLcFvv~|4q@N=9Fi=1mB%o5nQEf;=g~3I`QhmjcIBg=VeuDUpF@Me(0#;o?6)L zXPRK}wBp@G$8)UdT`6VFTee;d{&K-_U9|DsDuu_aQJoLiPCs6E+2DJIs4GJPlkoC+ zx$i31l>~Wixa@Uyu}y8fe^|BKZPD~^(hGf#g~qtN*sw~#p;~t7?w<X3rX9Ytb=~UK zPpy_n$bax)iVAoc{gf$Dwzu%}?x5+K-};3c+!zk9TxZ-JefyQv<2Q+=SKhQZOv_z4 z<!r`^pR1O!D(%YqHb+0$<?h?Lxl=PIx(oh`PQDwp{S9AMowr|;|HlmzuTElYEqy!n zRZ32`>qL*mNsmvr*mi$rJa_G9+~4*jUCl%0`yG7dp7XjJxT03q@6u64>upWduXZLZ z_gJkp;S{UYn@tWYFE+dlP!uZuy*8gS`l!(A*1cMb7jMeiKF_+ZM0e*c$#q@UJEXVX zHD0E6@SOu^<a?><dfp`yTl?~gj|RLBspRjS5-KonVSs1zw;MO#X=|TxTl#H<(*A{u zuFhR^GtRYjm+ygh!486LQ*`YZnHL@@<5(MDJt61o=`!ChaoMY`-CDsOz5Hz#k7b4# zkM5SZYyR>3mOLr@F!jbd$$6@&-t8+aa}(^ZYaMSt9UO9Mx_4@KE|0Xf)_p@+q1DS8 zO43|Z-W=4~72U3N_mEiW%{F_F-8#A90h=c$zn#M#v{cuwbAz&L;2{mxWk<WRtMA=j zBgsE!;ob&;ca5_S7R0SCR&o`z->w??wna?zDc=#@Gud+dpLoBOdb4!gjaVrEf#*yu zYuw!a8?*NY|Cno{yDlp@<KuLvU6*56OxQ{~C$#x6F-$mgQQ;Ba7A6ZF7DkJ!Tf5wB zIy2_lSG@oFtL)}l<*B9KUs4a~Em?R;qTMp-o7e}t6Zzp*(K}n8o-;FAVce`*Vy!dL zG{7*bG}C?Rp;#TGt72?B*mI0zvqG=TKUDT--b9{_=eac3*vD?Tx#)b|EWNbuWk&bT zy^Fhl=l;g+mw(n&)tc{)*)Y4Z_RsTYqO;@vANpsodmlrD##@&Y>TiC{{>G<zbnl8X zo`6c7xy%Lf?&UezuAZ#x?B+;0yeQwid-Z9-jMr5*yX#En$NsPR`RvoLyd(Ew&Yh2E zzJ7UrTKMMO@h3#$&%RryFJ6|Dd22zb_1xw|@7FIYE~~cRzc(@_YD=R3e_@-M&9$iq zT9yP`Tm9T}w;^vcb8q(4%+6FHP8GK7qtPelt@a7D=HGC)D4D@}k;JT*Zc?WL+*&u~ z%)jyE$usR2R~FhOT+GWVx&3K7<DYk-4KC|c;!m}-<)?KxNE|q7qW(|EcgK_fVfl*i zs_Pd|eO5o6&{4Vf>6ETeCC0sNNfuhmQ{1ZECD!^qPXC*kz$h}WQMJhPz>FEOiT0~Y z|2>a9QF!U(g%aQG|8HjOpU$@N<@JzKrB1=?o=TS=NbkF4|Jg~a?#c=&E2EhQZqDgj zDN+!lq3|Y9hRLqFt&#m%-;VP-H@MqsAAIcHW^C4x6cxd`+<jIr-=wO*V|xz8O<WmV zr~9wGbOu}hxpNhIfij(&_%;M--8!{o_4U7k2Rcp_%qez}Sb2c=XpCCxw#aGfg%iUb z^iTSuJUO$Xs?9HO`t(#62?Lug={gf;@jhZ(`)Na`JO89Mxg>KpHo0dlPuf@BF}f@F zE%v}N#b;(yrkxi#ad8Wimg(~9-N%Ho?0sac-qe4wxU=|o!P+TrUj-lES8UOKPK4qA zv8G4TElH1NEMK@`_L-dM`>xMrZ*IJ?#NyYryem<rDs}!oy296aRb$K#8gz)Z*<Na? zU1Yy&SA>~zZ6w3Ku;?{0x!nsyG*0f{=CCz?)&cKmL54*!k*{|=cC%VjFx~J$_``WW z)Kwzp`fW1~ygG5s%*ocw2cyD|naxjFu(7Z$MSOdTc&EfEuiq*mN`c1%g|16?b?lp= zx%3X7a_hCLncJ)l8)cMCcCECQk=T0PbDA~#u3OS~7q)2KoPPAmwzR9JKVm;!dn+;h zx_F23u4CQS@8{pUcSw2je+$>(1$ja#O>?FDSM>)x&Oh?%+k=~WHSgwmBs@8`{o8K8 zv!C1=ufNhc_$GPvx4^3}JC}MW9ai}0D6q*hr!$y?$!5X-ch{fIU^@`}CS#}0{?Es} zA`gas-+IpL0Gqg0ZP+>a(j#2^Z`kunmKLw@O=PHRY;}AY`swMa?NT)_XPkA2H?=<D zKmXK0_N-qKZ3=aajYl3F+_?AlTy~SqLbl0oh1N)FvqZZI&pB@+@ljdSJFxf4MHiRJ z#?36h4w%TkNzi+ltaoRANr7|K2{VZuIcGmwaQ@!ez3FYZ>B${@*DWqy$_=?X;lOU$ zn!42Y8SxwXk8L@+er~_@<L<1jANED|y=wlS(_lWu_|xI{ub0%sb~c_~R#?vS^t8^* zU1cn-KQ0AD2TTl&Roc2lPw#%VZgu;^pNi(c?`X4!2V}?U>mA>))KAEN<qEz;3-iO# z>fza}+tuwpZdg}$__@~7`VBsxS})GqA@1~M<CD2P50q}G<ygjwCOlwRsUW-T?8#Sd z;p<kd_o?3R_&!YA=8*LL^Xm=P<h8UW#{UUBE4R1%Z`_aRLT6t*ozM1GlCOAX*9)&_ zobhZoXPx#aHZp9OQ04Pp_9Ij2spA)mdO~>5&3~s>c;xuH%tW=voW1Qc|Ava?E&IJa zYUy|Ojm>j}B>$&fe!(>F$igTyefgJjlYNdTyYg;leC8SAmRQa>Nr%VUHZ^{;;cw3; zHSe!kPi?H6qjWv5Z0|pVnC<KR9W(cSm&mDD`ZKM$t>kGg_q($9F$ee0V?Tbpy8li} zMEXN!ZmC6wXXhR8Jg~38NAfw#>+RLS%XX((oL(d9mw&Ka{DD{BU+;k8*YDDDc3Py` z&l40E53Q4!e|y{6A9>R|gT1nZ-`KheB>l~fcpNV9xq(qSS!<Q}gD1;Hf?H0W?N3)f z`1$d(^)vsRh`wGXXr_MXS!saxw(Pq+>rVK-PhyXBXj`7gvgOylZ}}U)R>jL!TwGf& zyxZL3kjt%imVX@rAI`0PcKzUV%WKyUe&(FwEOT7!1WWbQtG6UWnf`LLu|Bi4{(YDE z-Mz|#q2B4ceI{9_T&q?4Cl>Q)uJ~=`@4us8)CoOTHoyFSaw5OrVe2cGlUp7>KWV@q zS<lLrwP4*b!Ao)P54ZD2)H2+8|JQi4Vq35Ig0DSoSsQ+pzgIgncdy)5--8kMi^?r7 zO03s2Ia|Nk`_IM+58W$bp6|VPUa7n|UnRNP=tyMV?wQ9VIes@7J`mlp;75U1O=MnG z$?m6$Gn#eIujRZUs2vvj^6Q+!Ial@g4)7bZ7Q9&V-Zj}%mR;%2<_Z4<&hSS*J(H7h z`^4&lEWMHc&RaxHSiiC4VpeulAkXU?tj$wT+`pW6@3Ap+zQ_C2l5a&R-#h=?)!8X| zl$EhqM*a((bMU){-R{e+65lvB^DdIudEor=?+cqaBGn99G`p5*Y>-xYxL$$d2D3j` z;&Sy6EoCX&qu)ImP6#F+*Kf-Ai<8-(@@A?+s+hOgj@sfH7KR`B|2NOd`S<PqG#+b9 zHkG3{E`EG@@#4jeu^+$A-tO@1$9tvEe*|Vu-rs$un>nT7!tUoP_1`*W=QjjQN}4<? zer@i#HLerxIm|e9`^G#|%gu#m?bpQr&X2so;kd%hpypct)K}%Q#l{I|C4BnQ|EgY3 zn3|FqDKh1qBU{<G`RC_!+F0wlS|^?NvTi(mepXZ6wY^Gp^A-j^H1-oc@3x}*ztk>W z_Am*5)8ZpH-WM)@KXuve`^QiGl)PpBlFRAHAvb=HhV?AV7o4eMzj^1$<LEcfE-nek zKXdPbg_S4YjP_O1>Yr{rh+X3Jd8y(5qb=!0pF%lU>-3I!RK4NgZ+|*z!>s#@ezsrN z<_VBd4yv7y6s`AGe1&ebo|h~e!-@UOZXf<CTzCDYTfT4mo>KYk*~)dwlF_>*t!Hhy zV5!@eao2QjRp?pH>vgkB1<Tf6Dr$f1<F@6;Qrp-TRYgN(jz786nzPupdoKP~HhqTI zsuK5miE1lqj5n4`erhWI-lei&zGmNa$K3SUcTC<L2nmxjbN<Nh?|Y$b%aMcJ(d)au zIA%>1+EL38;my7Cv+ob(n0niVix2Ja_>j`%S6G-Z<!fEMLqbc@i>RkbE3dda3-4W_ zc>7k9hu1OomA{-BvTF-A>oQmh9bNfVw^%x{`t#|dcYnWp`{wV{uSegWee>(xXT^<G z&*};-_s`q6bIZbwyXvfCb?)6eqn~53W}Uv?`S;HY%$J?7%m4MPe|yQ#uV)`=o}Tvo z{=G8~|K-Q+u~`|L^C9T&p7Y+7fBiTAy!-ddDcwBr(lz()$KCbOpQk5iv|P#greDT~ zjrq)Kysk}F3-q>&?vGk~r&=dL^r@m$Od97jYmQjg4O}<cZ+=}pTi+$*U03w#=l|UH z6tn&psWRY6_^2I||DgWJ(>B`^vU5)gtqYe-;G2Et1JB|=O&d%VgI<eRE@_B+AHPwj zoB3PbEVmoIsl^^?PT}WfIq%%1Z_lG0pl1L7-O-EN4_e(<IV{hx{NIaz>qYH-K5$>y zJA?7+um3k5ahmw=tNr=u$rFW(|5;H7pV#&McpSsPz!1&Az#xNr@HyPW)zydfpdr^` z10L23vCA*q;4$J{xa9}a(r8V^nXx~%Fe<Y~$`$?IxBYK}miC^v%VsV&xx~z+pEz%) z;xECptskG3`F=Oy`(nmjX;xY4e%F5HVe1Ud`)7_@cF%I^n&*OaTmooFJTaQ7j+23b zft`VYK?S#~O7aWhb5hGvbM#6oO1wR_ymU`IXF?lYU*YuRdMOhFgE0#OgDh^Nf?S>b zgIv~LI=N|<g9Ph?zqMkwvW-o3HU&5wWSl9I;=J&#)~O3TOrO5&TzO>5%IJ5WnBxEb zw`7;sa_T<s85X4K>v6B=Me|C1L+uXxvc8JL>eu&eP=BZLGJ5xnk}0cB{d&RPrQEjL zCG_epev`+?HW*E@`;ea#Yj)N=$37?9a%1b-sY`ZC-u&IRdcAh^f$2ZBwlS%G{-B_r zy42<)5BKpq!o?ncWhWn6x=E0IiEPCCdnwEAJ?;K&^763l#3yyJip%RSc$wMeA96UM zc*1U{u5Y(QJu~ZtncbVCPd>1)tD5~YF(W$hVQ$QXRjEh0Jowk0E7izeVHoh>-##f< z&v_<+Uz|RAT+OMP`emhb^9f@kc@FN@JGqbU7#)nc+$w)=XLt4d+?gLQcV>Qy*S#a6 z&%<%f<XWQs8#%N3ot@pjJ*|~}T{f>w#ZOi&c%>H~xKGMhNB#4MsY*XL9#~TK&@8I> z#T>KBEu!XaA>q+i^-i}pdZlt))HUm@I=*}f>zsoHi@xw*ljqExq_jSMkK46N?Gxg! zuydSmKPu8D!B)51d!p%M2OZxNxtn9RMe9G4?1=cs&+))R=A-hQE4&_`f<Nvw5;<G4 zRsHqsUr$9i`-CR{zEnTu;-ty9drldLMSVS8b!zvP6ISLa;g92$1us~audNg={baf{ zU0d_Y+P*VP*-|0b#V*FO?^y6XkvB}&s-AVP;p>!5`_8{vUu~(fuemn%a+v?s6HjNR ze>);{{PdmOXRWW?J(837wy-7l`>NK+hUFD&B^;7ce)Q#VNiAKX`f|m~+3IUMkDNG` z6(+~`X=}q9F<B2Ti&N<h+dDFOzlz8R7r%V3e&)7_jPFegt;02cSOUBmnM9aD7oT!q zy$%(6Y68QOMi2{natO-hsK_Q@yJ``n4}_OAK4XTjh4w8hLEICEY(f;4yX8Q-L3l}{ zIXm10l$+*|O#of$ihkk=NH+*CX?$z|Hz5@D{1ap|upJr!(htH*8lM=$%|JQ~0-t`+ z5fUK1AiShe%ml6<v?d&f8Jn;iC;`$B!b=)`P|biGFM;j^^o8gktsuOlG1vpe35aFs z=tiI~-v((1;U$d;o~TA3FXl!zB?`-GV2}wQyrePQ8)gcwwZZ6Sq0d-?%mLvgjsK%? zngyG`L^lk*1_Bub!b=)!3UL|+u8+`7La#MIrhxF0Mxi2{CZW_J=q9399w5^|cuQj} bZWAF@Nq{#i8%QZ110TaRW(Ee{QV<US?`Zyw literal 0 HcmV?d00001 diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.4.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.6.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..87e9a503ebc621238ebe7efca15f2bdf0a6e1a85 GIT binary patch literal 40698 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 Bo(KQ{ literal 0 HcmV?d00001 diff --git a/dbrepo-search-service/lib/dbrepo-1.6.4-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.6.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..d083b0bafc937528fdcc09634c41132578cbf345 GIT binary patch literal 30969 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 bZWAF@Nq{#i8%QZ110TaRW(Ee{QV<US?`Zyw literal 0 HcmV?d00001 diff --git a/dbrepo-search-service/lib/dbrepo-1.6.4.tar.gz b/dbrepo-search-service/lib/dbrepo-1.6.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..87e9a503ebc621238ebe7efca15f2bdf0a6e1a85 GIT binary patch literal 40698 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 Bo(KQ{ literal 0 HcmV?d00001 diff --git a/dbrepo-ui/composables/authentication-service.ts b/dbrepo-ui/composables/authentication-service.ts deleted file mode 100644 index 39f6cc5a3f..0000000000 --- a/dbrepo-ui/composables/authentication-service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {jwtDecode} from 'jwt-decode' - -export const useAuthenticationService = (): any => { - - function isExpiredToken(token: string): boolean { - if (!token) { - return false - } - return tokenToExpiryDate(token) < Date.now() - } - - function tokenToExpiryDate(token: string): number { - if (!token) { - return -1 - } - const exp: number = jwtDecode<Token>(token).exp - if (exp) { - return exp * 1000 - } - return -1 - } - - return {isExpiredToken, tokenToExpiryDate} -} diff --git a/dbrepo-ui/composables/axios-instance.ts b/dbrepo-ui/composables/axios-instance.ts index ca7a7b111c..cd3737f2bf 100644 --- a/dbrepo-ui/composables/axios-instance.ts +++ b/dbrepo-ui/composables/axios-instance.ts @@ -16,7 +16,7 @@ export const useAxiosInstance = () => { baseURL: config.public.api.client }); instance.interceptors.request.use((config) => { - const { loggedIn, user, login, logout } = useOidcAuth() + const { loggedIn, user } = useOidcAuth() if (!loggedIn) { return config } diff --git a/dbrepo-ui/composables/user-service.ts b/dbrepo-ui/composables/user-service.ts index 3425dbaa5c..b90ee34033 100644 --- a/dbrepo-ui/composables/user-service.ts +++ b/dbrepo-ui/composables/user-service.ts @@ -1,5 +1,3 @@ -import {jwtDecode} from 'jwt-decode' -import axios from 'axios' import {axiosErrorToApiError} from '@/utils' export const useUserService = (): any => { @@ -80,36 +78,6 @@ export const useUserService = (): any => { }) } - async function refreshToken(refreshToken: string): Promise<KeycloakOpenIdTokenDto> { - console.debug('refresh user token') - return new Promise<KeycloakOpenIdTokenDto>((resolve, reject) => { - const config = useRuntimeConfig() - const instance = axios.create({ - timeout: 90_000, - params: {}, - baseURL: config.public.api.client - }) - instance.put<KeycloakOpenIdTokenDto>('/api/user/token', {refresh_token: refreshToken}) - .then((response) => { - console.info('Refreshed user token') - const userStore = useUserStore() - // eslint-disable-next-line camelcase - const {access_token, refresh_token} = response.data - userStore.setToken(access_token) - userStore.setRefreshToken(refresh_token) - resolve(response.data) - }).catch((error) => { - console.error('Failed to refresh user token', error) - reject(axiosErrorToApiError(error)) - }) - }) - } - - function tokenToRoles(token: string): string[] { - const data: Token = jwtDecode<Token>(token) - return data.realm_access.roles || [] - } - function nameIdentifierToNameIdentifierScheme(nameIdentifier: string) { if (nameIdentifier.includes('orcid.org')) { return 'ORCID' diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index a26c6d2539..85be5cd6b0 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -141,12 +141,13 @@ </v-form> <v-main> <v-container> - <slot /> <JumboBox v-if="error" :title="$t(errorCodeKey(error).title, { resource })" :subtitle="$t(errorCodeKey(error).subtitle)" :text="$t(errorCodeKey(error).text, { resource })" /> + <slot + v-else /> </v-container> </v-main> </v-app> diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index 07ac0163ef..d17da2341d 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -794,11 +794,11 @@ }, "firstname": { "label": "Given Name", - "hint": "" + "hint": "Managed by your identity provider: {provider}" }, "lastname": { "label": "Family Name", - "hint": "" + "hint": "Managed by your identity provider: {provider}" }, "affiliation": { "label": "Affiliation Identifier", @@ -834,8 +834,12 @@ "settings": { "subpages": { "authentication": { - "title": "User Password", - "subtitle": "Update the user password used for basic authentication with all interfaces", + "title": "API Password", + "subtitle": "Update the user password used for authentication with all interfaces (e.g. HTTP API, AMQP API, MQTT API)", + "setup": { + "text": "Finish your account setup by setting the", + "action": "API Password" + }, "password": { "label": "Password", "hint": "Required" diff --git a/dbrepo-ui/pages/user/authentication.vue b/dbrepo-ui/pages/user/authentication.vue index 50008d3c5d..912c1878c4 100644 --- a/dbrepo-ui/pages/user/authentication.vue +++ b/dbrepo-ui/pages/user/authentication.vue @@ -61,7 +61,7 @@ </template> <script setup> -const { loggedIn } = useOidcAuth() +const { loggedIn, user } = useOidcAuth() </script> <script> import UserToolbar from '@/components/user/UserToolbar.vue' @@ -113,11 +113,20 @@ export default { const userService = useUserService() userService.updatePassword(this.cacheUser.uid, {'password': this.password}) .then(() => { + const user = Object.assign({}, this.cacheUser) + user.setup_finished = true + this.cacheStore.setUser(user) + // fixme [mweise]: currently nuxt-oidc-auth cannot refresh the session correctly const toast = useToastInstance() toast.success(this.$t('success.user.password')) this.loadingUpdate = false }) - .catch(() => { + .catch(({code, message}) => { + const toast = useToastInstance() + if (typeof code !== 'string') { + return + } + toast.error(message) this.loadingUpdate = false }) .finally(() => { diff --git a/dbrepo-ui/pages/user/info.vue b/dbrepo-ui/pages/user/info.vue index 8674c57e2d..9c8dbf873d 100644 --- a/dbrepo-ui/pages/user/info.vue +++ b/dbrepo-ui/pages/user/info.vue @@ -74,24 +74,24 @@ <v-col md="6"> <v-text-field v-model="model.firstname" - :disabled="!canModifyInformation" + :disabled="!canModifyInformation || identityProvider" clearable persistent-hint :variant="inputVariant" :label="$t('pages.user.subpages.info.firstname.label')" - :hint="$t('pages.user.subpages.info.firstname.hint')" /> + :hint="identityProvider ? $t('pages.user.subpages.info.firstname.hint', { provider: identityProvider }) : ''" /> </v-col> </v-row> <v-row dense> <v-col md="6"> <v-text-field v-model="model.lastname" - :disabled="!canModifyInformation" + :disabled="!canModifyInformation || identityProvider" clearable persistent-hint :variant="inputVariant" :label="$t('pages.user.subpages.info.lastname.label')" - :hint="$t('pages.user.subpages.info.lastname.hint')" /> + :hint="identityProvider ? $t('pages.user.subpages.info.lastname.hint', { provider: identityProvider }) : ''" /> </v-col> </v-row> <v-row dense> @@ -191,6 +191,12 @@ export default { cacheUser () { return this.cacheStore.getUser }, + identityProvider () { + if (!this.cacheUser || !('identity_provider' in this.cacheUser)) { + return false + } + return this.cacheUser.identity_provider + }, canModifyInformation () { if (!this.roles) { return false diff --git a/dbrepo-upload-service/pom.xml b/dbrepo-upload-service/pom.xml index 9a5531c0be..7e4f27586e 100644 --- a/dbrepo-upload-service/pom.xml +++ b/dbrepo-upload-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-upload-service</artifactId> <name>dbrepo-upload-service</name> - <version>1.7.0</version> + <version>1.6.4</version> <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/</url> <developers> diff --git a/docker-compose.yml b/docker-compose.yml index 9176f6404a..94b5fc30a6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -96,7 +96,7 @@ services: KEYCLOAK_DATABASE_NAME: "${AUTH_DB_NAME:-keycloak}" KEYCLOAK_DATABASE_USER: "${AUTH_DB_USERNAME:-keycloak}" KEYCLOAK_DATABASE_PASSWORD: "${AUTH_DB_PASSWORD:-dbrepo}" - METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}/api/user" + METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" healthcheck: diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index b6fa24359a..9418fa7c66 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -7,14 +7,14 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.7.0" -appVersion: "1.7.0" +version: "1.6.4" +appVersion: "1.6.4" keywords: - dbrepo maintainers: - name: Martin Weise email: martin.weise@tuwien.ac.at -home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/ +home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/ icon: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo-ui/public/favicon.png dependencies: - name: opensearch diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 086b635a63..88051e6035 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -1,17 +1,17 @@ # DBRepo Helm chart -[DBRepo](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/) is a database repository system that +[DBRepo](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/) is a database repository system that allows researchers to ingest data into a central, versioned repository through common interfaces. ## TL;DR Download the sample [ -`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.7/helm-charts/dbrepo/values.yaml?inline=true) +`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.6/helm-charts/dbrepo/values.yaml?inline=true) for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.7.0" +helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.6.4" ``` ## Prerequisites @@ -28,7 +28,7 @@ helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.7.0" +helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.6.4" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the @@ -68,7 +68,7 @@ The command removes all the Kubernetes components associated with the chart and | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | `metadatadb.enabled` | Enable the Metadata datadb. | `true` | | `metadatadb.host` | The hostname for the microservices. | `metadata-db` | -| `metadatadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | +| `metadatadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | | `metadatadb.rootUser.user` | The root username. | `root` | | `metadatadb.rootUser.password` | The root user password. | `dbrepo` | | `metadatadb.db.name` | The database name. | `dbrepo` | @@ -101,7 +101,7 @@ The command removes all the Kubernetes components associated with the chart and | Name | Description | Value | | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | `datadb.host` | The hostname for the microservices. | `data-db` | -| `datadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | +| `datadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | | `datadb.rootUser.user` | The root username. | `root` | | `datadb.rootUser.password` | The root user password. | `dbrepo` | | `datadb.db.name` | The database name. | `dbrepo` | diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index a23243d39509ec3821219e5799a25740c93e2ca1..7b332886dd5aca385115460c47692fdef8522e0b 100644 GIT binary patch delta 6759 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 bsAxagTAc?h<fSgns5CiEU5#y<638$B;Od`~ delta 6755 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 CmX)ml diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 18a0ec69c7..d5260781df 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -33,7 +33,7 @@ metadatadb: fullnameOverride: metadata-db ## @param metadatadb.host The hostname for the microservices. host: metadata-db - ## @param metadatadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/data-db/#data + ## @param metadatadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" rootUser: ## @param metadatadb.rootUser.user The root username. @@ -118,7 +118,7 @@ authservice: setupJob: image: ## @skip authservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.6.4 ## @param authservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param authservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -162,7 +162,7 @@ datadb: fullnameOverride: data-db ## @param datadb.host The hostname for the microservices. host: data-db - ## @param datadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/data-db/#data + ## @param datadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" rootUser: ## @param datadb.rootUser.user The root username. @@ -401,7 +401,7 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.6.4 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context @@ -462,7 +462,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.4 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context @@ -559,7 +559,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.4 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context @@ -645,7 +645,7 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.6.4 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context @@ -692,7 +692,7 @@ searchservice: init: image: ## @skip searchservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.6.4 ## @param searchservice.init.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -753,7 +753,7 @@ storageservice: init: image: ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.4 s3: ## @param storageservice.init.s3.endpoint The S3-capable endpoint the microservice connects to. endpoint: http://storage-service-s3:8333 @@ -862,7 +862,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.7.0 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.4 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param ui.podSecurityContext.enabled Enable pods' Security Context diff --git a/install.sh b/install.sh index 6de016007f..c5f130f5b7 100644 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/bash # preset -VERSION="1.7.0" +VERSION="1.6.4" MIN_CPU=8 MIN_RAM=4 MIN_MAP_COUNT=262144 diff --git a/lib/python/README.md b/lib/python/README.md index d4599caee8..443787cbb4 100644 --- a/lib/python/README.md +++ b/lib/python/README.md @@ -48,17 +48,17 @@ client.import_table_data(database_id=7, table_id=13, file_name_or_data_frame=df) ## Supported Features & Best-Practices - Manage user - account ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/#create-user-account)) + account ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/#create-user-account)) - Manage - databases ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/usage-overview/#create-database)) + databases ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/usage-overview/#create-database)) - Manage database access & - visibility ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/#create-database)) + visibility ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/#create-database)) - Import - dataset ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/#import-dataset)) + dataset ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/#import-dataset)) - Create persistent - identifiers ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/#assign-database-pid)) + identifiers ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/#assign-database-pid)) - Execute - queries ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/#export-subset)) + queries ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/#export-subset)) - Get data from tables/views/subsets ## Configure diff --git a/lib/python/docs/index.rst b/lib/python/docs/index.rst index 137dde40c6..6c0c17e375 100644 --- a/lib/python/docs/index.rst +++ b/lib/python/docs/index.rst @@ -6,13 +6,13 @@ Pandas `DataFrame <https://pandas.pydata.org/docs/reference/api/pandas.DataFrame provides an object-oriented API as well as low-level access to DBRepo services. .. note:: - The SDK has been implemented and documented for DBRepo version 1.7.0, earlier versions may be supported but are not tested for compatibility. + The SDK has been implemented and documented for DBRepo version 1.6.4, earlier versions may be supported but are not tested for compatibility. Quickstart ---------- Find numerous quickstart examples on -the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/api/>`_. +the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/>`_. AMQP API Client ----------- diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index 65d9c7e3d9..b956d6afd0 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.7.0" +version = "1.6.4" description = "DBRepo Python Library" keywords = [ "DBRepo", @@ -34,7 +34,7 @@ requires = [ build-backend = "setuptools.build_meta" [project.urls] -Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/" -Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/python/" +Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/" +Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/python/" Issues = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues" Source = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/" \ No newline at end of file diff --git a/lib/python/setup.py b/lib/python/setup.py index 4fff48185b..53f4832404 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,9 +2,9 @@ from distutils.core import setup setup(name="dbrepo", - version="1.7.0", + version="1.6.4", description="A library for communicating with DBRepo", - url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/", + url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/", author="Martin Weise", license="Apache-2.0", author_email="martin.weise@tuwien.ac.at", diff --git a/mkdocs.yml b/mkdocs.yml index 536eed294e..5ec3a92799 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: Database Repository -site_url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/ +site_url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/ repo_url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services repo_name: fda-services site_author: Research Unit Data Science, Technische Universität Wien @@ -120,9 +120,9 @@ markdown_extensions: custom_icons: - .docs/overrides/.icons extra: - homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/ + homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/ version: - default: 1.7 + default: 1.6 provider: mike social: - icon: simple/artifacthub diff --git a/sonar-project.properties b/sonar-project.properties index 0d25b112d7..e118258889 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77 sonar.host.url=https://s39.datalab.tuwien.ac.at # project -sonar.projectVersion=1.7.0 +sonar.projectVersion=1.6.4 # general sonar.qualitygate.wait=true sonar.projectCreation.mainBranchName=master diff --git a/versions.json b/versions.json index 95ca2a62a6..b42a3dfd7d 100644 --- a/versions.json +++ b/versions.json @@ -1,9 +1,4 @@ [ - { - "version": "1.7", - "title": "1.7", - "aliases": [] - }, { "version": "1.6", "title": "1.6", -- GitLab