From 9e038ec8ef21179f4c2f31ccb00fcf02b21311b7 Mon Sep 17 00:00:00 2001 From: Ivan Subotic <400790+subotic@users.noreply.github.com> Date: Fri, 1 Jul 2022 12:25:13 +0200 Subject: [PATCH] refactor(triplestore): ZIO-fying triplestore service (DSP-904) (#2059) --- Makefile | 15 +- build.sbt | 15 +- ...ger-and-fuseki-implementation-to-zlayer.md | 20 + .../src/main/scala/dsp/api/main/MainApp.scala | 8 +- .../src/main/scala/dsp/errors/Errors.scala | 12 +- project/Dependencies.scala | 18 +- webapi/src/main/resources/application.conf | 151 +-- webapi/src/main/resources/logback.xml | 3 + .../knora/webapi/app/ApplicationActor.scala | 112 +- .../scala/org/knora/webapi/app/LiveCore.scala | 4 +- .../scala/org/knora/webapi/app/Main.scala | 55 +- .../org/knora/webapi/config/AppConfig.scala | 21 +- .../GenerateContributorsFile.scala | 124 -- .../scala/org/knora/webapi/core/Core.scala | 7 +- .../scala/org/knora/webapi/core/Logging.scala | 13 +- .../knora/webapi/feature/FeatureFactory.scala | 438 ------- .../http/handler/KnoraExceptionHandler.scala | 2 +- .../groupsmessages/GroupsMessagesADM.scala | 29 +- .../listsmessages/ListsMessagesADM.scala | 37 +- .../PermissionsMessagesADM.scala | 9 - .../ProjectsMessagesADM.scala | 32 +- .../sipimessages/SipiMessagesADM.scala | 3 - .../storesmessages/StoresMessagesADM.scala | 5 +- .../usersmessages/UsersMessagesADM.scala | 37 - .../TriplestoreMessages.scala | 61 +- .../util/ConstructResponseUtilV2.scala | 19 - .../webapi/messages/util/MessageUtil.scala | 3 +- .../messages/util/PermissionUtilADM.scala | 4 - .../webapi/messages/util/ResponderData.scala | 2 +- .../webapi/messages/util/UserUtilADM.scala | 4 - .../webapi/messages/util/ValueUtilV1.scala | 12 +- .../messages/util/rdf/RdfFeatureFactory.scala | 51 +- .../messages/util/rdf/RdfFormatUtil.scala | 2 + .../util/rdf/jenaimpl/JenaFormatUtil.scala | 4 +- .../util/rdf/jenaimpl/JenaModel.scala | 4 +- .../util/rdf/rdf4jimpl/RDF4JFormatUtil.scala | 175 --- .../util/rdf/rdf4jimpl/RDF4JModel.scala | 398 ------ .../rdf/rdf4jimpl/RDF4JShaclValidator.scala | 90 -- .../GravsearchQueryOptimisationFactory.scala | 31 +- ...GravsearchToCountPrequeryTransformer.scala | 8 +- ...cificGravsearchToPrequeryTransformer.scala | 8 +- .../ckanmessages/CkanMessagesV1.scala | 3 - .../ontologymessages/OntologyMessagesV1.scala | 11 +- .../projectmessages/ProjectMessagesV1.scala | 15 +- .../resourcemessages/ResourceMessagesV1.scala | 27 +- .../standoffmessages/StandoffMessagesV1.scala | 9 +- .../usermessages/UserMessagesV1.scala | 12 +- .../valuemessages/ValueMessagesV1.scala | 21 +- .../v2/responder/KnoraRequestV2.scala | 7 +- .../v2/responder/KnoraResponseV2.scala | 9 +- .../listsmessages/ListsMessagesV2.scala | 9 +- .../ontologymessages/OntologyMessagesV2.scala | 102 +- .../resourcemessages/ResourceMessagesV2.scala | 61 +- .../searchmessages/SearchMessagesV2.scala | 15 - .../standoffmessages/StandoffMessagesV2.scala | 14 +- .../valuemessages/ValueMessagesV2.scala | 735 +++++------ .../knora/webapi/responders/Responder.scala | 2 +- .../webapi/responders/ResponderManager.scala | 2 +- .../responders/admin/GroupsResponderADM.scala | 637 +++++----- .../responders/admin/ListsResponderADM.scala | 500 +++----- .../admin/PermissionsResponderADM.scala | 200 ++- .../admin/ProjectsResponderADM.scala | 168 +-- .../responders/admin/SipiResponderADM.scala | 22 +- .../responders/admin/StoresResponderADM.scala | 15 +- .../responders/admin/UsersResponderADM.scala | 189 +-- .../responders/v1/CkanResponderV1.scala | 30 +- .../responders/v1/OntologyResponderV1.scala | 31 +- .../responders/v1/ProjectsResponderV1.scala | 41 +- .../responders/v1/ResourcesResponderV1.scala | 595 ++++----- .../responders/v1/StandoffResponderV1.scala | 26 +- .../responders/v1/UsersResponderV1.scala | 74 +- .../responders/v1/ValuesResponderV1.scala | 197 +-- .../responders/v2/ListsResponderV2.scala | 16 +- .../responders/v2/OntologyResponderV2.scala | 167 +-- .../responders/v2/ResourcesResponderV2.scala | 261 ++-- .../v2/ResponderWithStandoffV2.scala | 7 +- .../responders/v2/SearchResponderV2.scala | 59 +- .../responders/v2/StandoffResponderV2.scala | 49 +- .../responders/v2/ValuesResponderV2.scala | 36 +- .../webapi/responders/v2/ontology/Cache.scala | 6 +- .../v2/ontology/Cardinalities.scala | 12 +- .../v2/ontology/OntologyHelpers.scala | 44 +- .../knora/webapi/routing/Authenticator.scala | 72 +- .../knora/webapi/routing/HealthRoute.scala | 77 +- .../org/knora/webapi/routing/KnoraRoute.scala | 24 +- .../knora/webapi/routing/RejectingRoute.scala | 3 +- .../knora/webapi/routing/RouteUtilADM.scala | 16 +- .../knora/webapi/routing/RouteUtilV1.scala | 6 +- .../knora/webapi/routing/RouteUtilV2.scala | 43 +- .../webapi/routing/SwaggerApiDocsRoute.scala | 3 +- .../knora/webapi/routing/VersionRoute.scala | 3 +- .../webapi/routing/admin/GroupsRouteADM.scala | 78 +- .../webapi/routing/admin/ListsRouteADM.scala | 9 +- .../routing/admin/PermissionsRouteADM.scala | 11 +- .../routing/admin/ProjectsRouteADM.scala | 235 ++-- .../webapi/routing/admin/SipiRouteADM.scala | 10 +- .../webapi/routing/admin/StoreRouteADM.scala | 7 +- .../webapi/routing/admin/UsersRouteADM.scala | 270 ++-- .../admin/lists/DeleteListItemsRouteADM.scala | 30 +- .../admin/lists/OldListsRouteADMFeature.scala | 155 +-- .../admin/lists/UpdateListItemsRouteADM.scala | 38 +- .../CreatePermissionRouteADM.scala | 25 +- .../DeletePermissionRouteADM.scala | 13 +- .../permissions/GetPermissionsRouteADM.scala | 44 +- .../UpdatePermissionRouteADM.scala | 43 +- .../webapi/routing/v1/AssetsRouteV1.scala | 3 +- .../routing/v1/AuthenticationRouteV1.scala | 23 +- .../knora/webapi/routing/v1/CkanRouteV1.scala | 9 +- .../webapi/routing/v1/ListsRouteV1.scala | 13 +- .../webapi/routing/v1/ProjectsRouteV1.scala | 21 +- .../routing/v1/ResourceTypesRouteV1.scala | 60 +- .../webapi/routing/v1/ResourcesRouteV1.scala | 51 +- .../webapi/routing/v1/SearchRouteV1.scala | 13 +- .../webapi/routing/v1/StandoffRouteV1.scala | 9 +- .../webapi/routing/v1/UsersRouteV1.scala | 35 +- .../webapi/routing/v1/ValuesRouteV1.scala | 38 +- .../routing/v2/AuthenticationRouteV2.scala | 12 +- .../webapi/routing/v2/ListsRouteV2.scala | 120 +- .../webapi/routing/v2/OntologiesRouteV2.scala | 446 +++---- .../webapi/routing/v2/ResourcesRouteV2.scala | 357 +++--- .../webapi/routing/v2/SearchRouteV2.scala | 91 +- .../webapi/routing/v2/StandoffRouteV2.scala | 15 +- .../webapi/routing/v2/ValuesRouteV2.scala | 40 +- .../knora/webapi/settings/KnoraSettings.scala | 118 -- .../org/knora/webapi/store/StoreManager.scala | 90 -- .../CacheServiceManager.scala | 6 +- .../api/CacheService.scala | 2 +- .../api/CacheServiceExceptions.scala | 2 +- .../config/CacheServiceConfig.scala | 2 +- .../impl/CacheServiceInMemImpl.scala | 8 +- .../impl/CacheServiceRedisImpl.scala | 12 +- .../serialization/CacheSerialization.scala | 2 +- .../settings/CacheServiceSettings.scala | 2 +- .../store/iiif/impl/IIIFServiceSipiImpl.scala | 12 +- .../triplestore/RdfDataObjectFactory.scala | 19 - .../triplestore/TriplestoreManager.scala | 86 -- .../TriplestoreServiceManager.scala | 96 ++ .../triplestore/api/TriplestoreService.scala | 177 +++ .../triplestore/defaults/DefaultRdfData.scala | 81 ++ .../http/HttpTriplestoreConnector.scala | 1105 ---------------- .../TriplestoreServiceHttpConnectorImpl.scala | 1110 +++++++++++++++++ .../upgrade/RepositoryUpdatePlan.scala | 25 +- .../upgrade/RepositoryUpdater.scala | 250 ++-- .../upgrade/plugins/UpgradePluginPR1307.scala | 5 +- .../upgrade/plugins/UpgradePluginPR1322.scala | 5 +- .../upgrade/plugins/UpgradePluginPR1367.scala | 5 +- .../upgrade/plugins/UpgradePluginPR1372.scala | 5 +- .../upgrade/plugins/UpgradePluginPR1615.scala | 5 +- .../upgrade/plugins/UpgradePluginPR1746.scala | 7 +- .../upgrade/plugins/UpgradePluginPR1921.scala | 7 +- .../upgrade/plugins/UpgradePluginPR2018.scala | 5 +- .../upgrade/plugins/UpgradePluginPR2079.scala | 5 +- .../upgrade/plugins/UpgradePluginPR2081.scala | 5 +- .../org/knora/webapi/util/ActorUtil.scala | 11 +- webapi/src/test/resources/logback-test.xml | 3 + .../org/knora/webapi/AsyncCoreSpec.scala | 222 ---- .../scala/org/knora/webapi/CoreSpec.scala | 201 +-- .../test/scala/org/knora/webapi/E2ESpec.scala | 210 ++-- .../org/knora/webapi/ExampleCoreSpec.scala | 35 - .../org/knora/webapi/ITKnoraLiveSpec.scala | 191 +-- .../org/knora/webapi/IntegrationSpec.scala | 139 --- .../test/scala/org/knora/webapi/R2RSpec.scala | 115 +- .../knora/webapi/TestContainerFuseki.scala | 36 - .../org/knora/webapi/TestContainerRedis.scala | 32 - .../org/knora/webapi/TestContainersAll.scala | 81 -- .../org/knora/webapi/TestProbeMaker.scala | 38 - .../scala/org/knora/webapi/UnitSpec.scala | 46 - .../config/AppConfigForTestContainers.scala | 63 +- ... => AppConfigForTestContainersZSpec.scala} | 8 +- ...pConfigSpec.scala => AppConfigZSpec.scala} | 6 +- .../webapi/e2e/FeatureToggleR2RSpec.scala | 363 ------ .../knora/webapi/e2e/v1/SipiV1R2RSpec.scala | 25 +- .../knora/webapi/e2e/v2/ValuesV2R2RSpec.scala | 25 +- .../it/v2/KnoraSipiIntegrationV2ITSpec.scala | 2 +- .../listsmessages/ListsMessagesADMSpec.scala | 1 - .../PermissionsMessagesADMSpec.scala | 25 - .../util/ConstructResponseUtilV2Spec.scala | 84 +- .../messages/util/rdf/JsonLDUtilSpec.scala | 13 +- .../util/rdf/KnoraResponseV2Spec.scala | 15 +- .../messages/util/rdf/RdfFormatUtilSpec.scala | 14 +- .../messages/util/rdf/RdfModelSpec.scala | 19 +- .../util/rdf/ShaclValidatorSpec.scala | 23 +- .../rdf/jenaimpl/JenaFormatUtilSpec.scala | 15 - .../rdf/jenaimpl/JenaJsonLDUtilSpec.scala | 15 - .../jenaimpl/JenaKnoraResponseV2Spec.scala | 15 - .../util/rdf/jenaimpl/JenaModelSpec.scala | 14 - .../rdf/jenaimpl/JenaShaclValidatorSpec.scala | 15 - .../rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala | 15 - .../rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala | 15 - .../rdf4jimpl/RDF4JKnoraResponseV2Spec.scala | 15 - .../util/rdf/rdf4jimpl/RDF4JModelSpec.scala | 14 - .../rdf4jimpl/RDF4JShaclValidatorSpec.scala | 15 - ...searchToCountPrequeryTransformerSpec.scala | 14 +- ...cGravsearchToPrequeryTransformerSpec.scala | 89 +- ...hangePropertyGuiElementRequestV2Spec.scala | 10 +- .../ResourcesMessagesV2Spec.scala | 4 - .../webapi/models/filemodels/FileModels.scala | 4 - .../models/filemodels/FileModelsSpec.scala | 3 +- .../standoffmodels/StandoffModels.scala | 5 +- .../webapi/other/v1/DrawingsGodsV1Spec.scala | 6 - .../admin/GroupsResponderADMSpec.scala | 13 - .../admin/ListsResponderADMSpec.scala | 46 - .../admin/PermissionsResponderADMSpec.scala | 23 - .../admin/ProjectsResponderADMSpec.scala | 39 +- .../admin/SipiResponderADMSpec.scala | 2 - .../admin/UsersResponderADMSpec.scala | 80 +- .../v1/OntologyResponderV1Spec.scala | 4 - .../v1/ProjectsResponderV1Spec.scala | 7 - .../v1/ResourcesResponderV1Spec.scala | 47 +- .../responders/v1/UsersResponderV1Spec.scala | 20 +- .../responders/v1/ValuesResponderV1Spec.scala | 95 +- .../responders/v2/ListsResponderV2Spec.scala | 2 - .../v2/OntologyResponderV2Spec.scala | 168 +-- .../v2/ResourcesResponderV2Spec.scala | 96 +- .../responders/v2/SearchResponderV2Spec.scala | 13 - .../v2/StandoffResponderV2Spec.scala | 4 +- .../responders/v2/ValuesResponderV2Spec.scala | 143 +-- .../responders/v2/ontology/CacheSpec.scala | 60 +- .../DeleteCardinalitiesFromClassSpec.scala | 45 +- .../webapi/routing/AuthenticatorSpec.scala | 9 - .../CacheServiceManagerSpec.scala | 4 +- .../config/RedisTestConfig.scala | 4 +- .../impl/CacheInMemImplZSpec.scala} | 21 +- .../impl/CacheRedisImplZSpec.scala} | 23 +- .../CacheSerializationZSpec.scala} | 5 +- .../store/iiif/impl/IIIFServiceMockImpl.scala | 10 +- .../triplestore/AllTriplestoreSpec.scala | 303 ----- .../HttpTriplestoreConnectorSpec.scala | 30 - .../TriplestoreServiceManagerSpec.scala | 259 ++++ ...lestoreServiceHttpConnectorImplZSpec.scala | 53 + .../plugins/UpgradePluginPR1307Spec.scala | 2 +- .../plugins/UpgradePluginPR1322Spec.scala | 2 +- .../plugins/UpgradePluginPR1367Spec.scala | 4 +- .../plugins/UpgradePluginPR1372Spec.scala | 2 +- .../plugins/UpgradePluginPR1615Spec.scala | 2 +- .../plugins/UpgradePluginPR1746Spec.scala | 4 +- .../plugins/UpgradePluginPR1921Spec.scala | 4 +- .../plugins/UpgradePluginPR2018Spec.scala | 2 +- .../plugins/UpgradePluginPR2079Spec.scala | 4 +- .../plugins/UpgradePluginPR2081Spec.scala | 4 +- .../upgrade/plugins/UpgradePluginSpec.scala | 10 +- .../testcontainers/FusekiTestContainer.scala | 13 +- .../testcontainers/RedisTestContainer.scala | 6 +- .../testcontainers/SipiTestContainer.scala | 13 +- .../testservices/TestActorSystemService.scala | 51 + .../testservices/TestClientService.scala | 16 +- .../webapi/util/ApacheLuceneSupportSpec.scala | 138 -- .../util/ApacheLuceneSupportZSpec.scala | 144 +++ .../webapi/util/Base64UrlCheckDigitSpec.scala | 57 - .../util/Base64UrlCheckDigitZSpec.scala | 60 + .../webapi/util/cache/CacheUtilSpec.scala | 4 +- 251 files changed, 5964 insertions(+), 10847 deletions(-) create mode 100644 docs/architecture/decisions/0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer.md delete mode 100644 webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/CacheServiceManager.scala (96%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/api/CacheService.scala (97%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/api/CacheServiceExceptions.scala (90%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/config/CacheServiceConfig.scala (72%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/impl/CacheServiceInMemImpl.scala (97%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/impl/CacheServiceRedisImpl.scala (96%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/serialization/CacheSerialization.scala (95%) rename webapi/src/main/scala/org/knora/webapi/store/{cacheservice => cache}/settings/CacheServiceSettings.scala (91%) delete mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/RdfDataObjectFactory.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManager.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/api/TriplestoreService.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/defaults/DefaultRdfData.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImpl.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/ExampleCoreSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/UnitSpec.scala rename webapi/src/test/scala/org/knora/webapi/config/{AppConfigForTestContainersSpec.scala => AppConfigForTestContainersZSpec.scala} (74%) rename webapi/src/test/scala/org/knora/webapi/config/{AppConfigSpec.scala => AppConfigZSpec.scala} (81%) delete mode 100644 webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModelSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModelSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala rename webapi/src/test/scala/org/knora/webapi/store/{cacheservice => cache}/CacheServiceManagerSpec.scala (94%) rename webapi/src/test/scala/org/knora/webapi/store/{cacheservice => cache}/config/RedisTestConfig.scala (81%) rename webapi/src/test/scala/org/knora/webapi/store/{cacheservice/impl/CacheInMemImplSpec.scala => cache/impl/CacheInMemImplZSpec.scala} (86%) rename webapi/src/test/scala/org/knora/webapi/store/{cacheservice/impl/CacheRedisImplSpec.scala => cache/impl/CacheRedisImplZSpec.scala} (83%) rename webapi/src/test/scala/org/knora/webapi/store/{cacheservice/serialization/CacheSerializationSpec.scala => cache/serialization/CacheSerializationZSpec.scala} (87%) delete mode 100644 webapi/src/test/scala/org/knora/webapi/store/triplestore/AllTriplestoreSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/store/triplestore/HttpTriplestoreConnectorSpec.scala create mode 100644 webapi/src/test/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManagerSpec.scala create mode 100644 webapi/src/test/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImplZSpec.scala create mode 100644 webapi/src/test/scala/org/knora/webapi/testservices/TestActorSystemService.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportSpec.scala create mode 100644 webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportZSpec.scala delete mode 100644 webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitSpec.scala create mode 100644 webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitZSpec.scala diff --git a/Makefile b/Makefile index 00d763a32f..d41b20fff1 100644 --- a/Makefile +++ b/Makefile @@ -203,7 +203,20 @@ test-repository-upgrade: build init-db-test-minimal ## runs DB upgrade integrati .PHONY: test test: build ## runs all tests - sbt -v +test + sbt -v "schemaApi/test" + sbt -v "schemaCore/test" + sbt -v "schemaRepo/test" + sbt -v "schemaRepoEventStoreService/test" + sbt -v "schemaRepoSearchService/test" + sbt -v "shared/test" + sbt -v "sipi/test" + sbt -v "userCore/test" + sbt -v "userHandler/test" + sbt -v "userInterface/test" + sbt -v "userRepo/test" + sbt -v "valueObjects/test" + sbt -v "webapi/test" + ################################# ## Database Management diff --git a/build.sbt b/build.sbt index 4b5100aa27..ca96ad750f 100644 --- a/build.sbt +++ b/build.sbt @@ -105,7 +105,8 @@ lazy val webapi: Project = Project(id = "webapi", base = file("webapi")) .settings( name := "webapi", resolvers ++= Seq( - Resolver.bintrayRepo("hseeberger", "maven") + Resolver.bintrayRepo("hseeberger", "maven"), + "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots" ), libraryDependencies ++= Dependencies.webapiLibraryDependencies ) @@ -143,9 +144,9 @@ lazy val webapi: Project = Project(id = "webapi", base = file("webapi")) logLevel := Level.Info, run / javaOptions := webapiJavaRunOptions, javaAgents += Dependencies.aspectjweaver, - fork := true, // run tests in a forked JVM - Test / testForkedParallel := false, // run forked tests in parallel - Test / parallelExecution := false, // run non-forked tests in parallel + Test / fork := true, // run tests in a forked JVM + Test / testForkedParallel := false, // not run forked tests in parallel + Test / parallelExecution := false, // not run non-forked tests in parallel // Global / concurrentRestrictions += Tags.limit(Tags.Test, 1), // restrict the number of concurrently executing tests in all projects Test / javaOptions ++= Seq("-Dconfig.resource=fuseki.conf") ++ webapiJavaTestOptions, // Test / javaOptions ++= Seq("-Dakka.log-config-on-start=on"), // prints out akka config @@ -236,6 +237,7 @@ lazy val apiMain = project .settings( name := "dsp-api-main", libraryDependencies ++= Dependencies.dspApiMainLibraryDependencies, + resolvers += "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots", testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) .dependsOn(schemaCore, schemaRepo, schemaApi) @@ -257,6 +259,7 @@ lazy val schemaApi = project .settings( name := "schemaApi", libraryDependencies ++= Dependencies.schemaApiLibraryDependencies, + resolvers += "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots", testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) .dependsOn(schemaCore) @@ -266,6 +269,7 @@ lazy val schemaCore = project .settings( name := "schemaCore", libraryDependencies ++= Dependencies.schemaCoreLibraryDependencies, + resolvers += "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots", testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) @@ -274,6 +278,7 @@ lazy val schemaRepo = project .settings( name := "schemaRepo", libraryDependencies ++= Dependencies.schemaRepoLibraryDependencies, + resolvers += "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots", testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) .dependsOn(schemaCore) @@ -283,6 +288,7 @@ lazy val schemaRepoEventStoreService = project .settings( name := "schemaRepoEventstoreService", libraryDependencies ++= Dependencies.schemaRepoEventStoreServiceLibraryDependencies, + resolvers += "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots", testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) .dependsOn(schemaRepo) @@ -292,6 +298,7 @@ lazy val schemaRepoSearchService = project .settings( name := "dsp-schema-repo-search-service", libraryDependencies ++= Dependencies.schemaRepoSearchServiceLibraryDependencies, + resolvers += "Sonatype" at "https://oss.sonatype.org/content/repositories/snapshots", testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) .dependsOn(schemaRepo) diff --git a/docs/architecture/decisions/0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer.md b/docs/architecture/decisions/0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer.md new file mode 100644 index 0000000000..9096ab7901 --- /dev/null +++ b/docs/architecture/decisions/0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer.md @@ -0,0 +1,20 @@ +# 4. Change Triplestore Service Manager and Fuseki implementation to ZLayer + +Date: 2022-05-23 + +## Status + +Accepted + +## Context + +Both `org.knora.webapi.store.triplestore.TriplestoreServiceManager` and `org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl` +where implemented as Akka-Actors. + +## Decision + +As part of the move from `Akka` to `ZIO`, it was decided that the `TriplestoreServiceManager` and the `TriplestoreServiceHttpConnectorImpl` is refactored using ZIO. + +## Consequences + +The usage from other actors stays the same. The actor messages and responses don't change. diff --git a/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala b/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala index 78ed04e8b1..547f51f58a 100644 --- a/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala +++ b/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala @@ -6,13 +6,13 @@ import zio.Console.printLine import zio._ object MainApp extends ZIOAppDefault { - val effect: ZIO[Console with SchemaRepo, Nothing, Unit] = + val effect: ZIO[SchemaRepo, Nothing, Unit] = for { profile <- SchemaRepo.lookup("user1").orDie - _ <- printLine(profile).orDie - _ <- printLine(42).orDie + // _ <- printLine(profile).orDie + // _ <- printLine(42).orDie } yield () - val mainApp: ZIO[Any, Nothing, Unit] = effect.provide(Console.live ++ SchemaRepoLive.layer) + val mainApp: ZIO[Any, Nothing, Unit] = effect.provide(SchemaRepoLive.layer) def run: ZIO[Any, Nothing, Unit] = mainApp } diff --git a/dsp-shared/src/main/scala/dsp/errors/Errors.scala b/dsp-shared/src/main/scala/dsp/errors/Errors.scala index ba09c0d3c9..8be4ef9d72 100644 --- a/dsp-shared/src/main/scala/dsp/errors/Errors.scala +++ b/dsp-shared/src/main/scala/dsp/errors/Errors.scala @@ -292,12 +292,15 @@ object TriplestoreConnectionException { * @param message a description of the error. * @param cause the original exception representing the cause of the error, if any. */ -case class TriplestoreTimeoutException(message: String, cause: Option[Throwable] = None) +final case class TriplestoreTimeoutException(message: String, cause: Option[Throwable] = None) extends TriplestoreException(message, cause) object TriplestoreTimeoutException { def apply(message: String, e: Throwable, log: Logger): TriplestoreTimeoutException = TriplestoreTimeoutException(message, Some(ExceptionUtil.logAndWrapIfNotSerializable(e, log))) + + def apply(message: String, cause: Throwable): TriplestoreTimeoutException = + TriplestoreTimeoutException(message, Some(cause)) } /** @@ -334,12 +337,15 @@ object TriplestoreInternalException { * @param message a description of the error. * @param cause the original exception representing the cause of the error, if any. */ -case class TriplestoreResponseException(message: String, cause: Option[Throwable] = None) +final case class TriplestoreResponseException(message: String, cause: Option[Throwable] = None) extends TriplestoreException(message, cause) object TriplestoreResponseException { def apply(message: String, e: Throwable, log: Logger): TriplestoreResponseException = TriplestoreResponseException(message, Some(ExceptionUtil.logAndWrapIfNotSerializable(e, log))) + + def apply(message: String): TriplestoreResponseException = + TriplestoreResponseException(message) } /** @@ -373,7 +379,7 @@ object InvalidApiJsonException { } /** - * Indicates that during caching with [[org.knora.webapi.store.cacheservice.api.CacheService]] something went wrong. + * Indicates that during caching with [[org.knora.webapi.store.cache.api.CacheService]] something went wrong. * * @param message a description of the error. */ diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 9a080eccb4..a9af56d0bf 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -20,12 +20,12 @@ object Dependencies { val jenaVersion = "4.4.0" val metricsVersion = "4.0.1" val scalaVersion = "2.13.8" - val ZioVersion = "2.0.0-RC6" + val ZioVersion = "2.0.0" val ZioHttpVersion = "2.0.0-RC4" val ZioJsonVersion = "0.3.0-RC3" - val ZioConfigVersion = "3.0.0-RC9" - val ZioSchemaVersion = "0.2.0-RC5" - val ZioLoggingVersion = "2.0.0-RC9" + val ZioConfigVersion = "3.0.1" + val ZioSchemaVersion = "0.2.0" + val ZioLoggingVersion = "2.0.0" val ZioZmxVersion = "2.0.0-RC4" val ZioPreludeVersion = "1.0.0-RC13" @@ -36,11 +36,12 @@ object Dependencies { val zioJson = "dev.zio" %% "zio-json" % ZioJsonVersion val zioPrelude = "dev.zio" %% "zio-prelude" % ZioPreludeVersion val zioLogging = "dev.zio" %% "zio-logging" % ZioLoggingVersion + val zioLoggingSlf4j = "dev.zio" %% "zio-logging-slf4j" % ZioLoggingVersion val zioConfig = "dev.zio" %% "zio-config" % ZioConfigVersion val zioConfigMagnolia = "dev.zio" %% "zio-config-magnolia" % ZioConfigVersion val zioConfigTypesafe = "dev.zio" %% "zio-config-typesafe" % ZioConfigVersion - val zioTest = "dev.zio" %% "zio-test" % ZioVersion - val zioTestSbt = "dev.zio" %% "zio-test-sbt" % ZioVersion + val zioTest = "dev.zio" %% "zio-test" % "2.0.0" + val zioTestSbt = "dev.zio" %% "zio-test-sbt" % "2.0.0" // akka val akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion // Scala 3 compatible @@ -100,8 +101,8 @@ object Dependencies { val akkaTestkit = "com.typesafe.akka" %% "akka-testkit" % akkaVersion // Scala 3 compatible val gatlingHighcharts = "io.gatling.highcharts" % "gatling-charts-highcharts" % "3.7.6" val gatlingTestFramework = "io.gatling" % "gatling-test-framework" % "3.7.6" - val scalaTest = "org.scalatest" %% "scalatest" % "3.2.2" // Scala 3 compatible - val testcontainers = "org.testcontainers" % "testcontainers" % "1.16.3" + val scalaTest = "org.scalatest" %% "scalatest" % "3.2.12" // Scala 3 compatible + val testcontainers = "org.testcontainers" % "testcontainers" % "1.17.2" // found/added by the plugin but deleted anyway val commonsLang3 = "org.apache.commons" % "commons-lang3" % "3.12.0" @@ -152,6 +153,7 @@ object Dependencies { zioHttp, zioJson, zioLogging, + zioLoggingSlf4j, zioMacros, zioPrelude, zioTest % Test, diff --git a/webapi/src/main/resources/application.conf b/webapi/src/main/resources/application.conf index 5bd2576be6..8ae05a850b 100644 --- a/webapi/src/main/resources/application.conf +++ b/webapi/src/main/resources/application.conf @@ -264,36 +264,7 @@ akka-http-cors { } app { - feature-toggles { - jena-rdf-library { - description = "Use the Jena API for RDF processing. If turned off, use the RDF4J API." - - available-versions = [ 1 ] - default-version = 1 - enabled-by-default = yes - override-allowed = yes - - developer-emails = [ - "Benjamin Geer " - ] - } - - gravsearch-dependency-optimisation { - description = "Optimise Gravsearch queries by reordering query patterns according to their dependencies." - - available-versions = [ 1 ] - default-version = 1 - enabled-by-default = yes - override-allowed = yes - expiration-date = "2021-12-01T00:00:00Z" - - developer-emails = [ - "Sepideh Alassi " - "Benjamin Geer " - ] - } - } - + shacl { # The directory that SHACL shapes are loaded from. shapes-dir = "../test_data/shacl" @@ -541,131 +512,11 @@ app { reload-on-start = false // ignored if "memory" as it will always reload - # This data is automatically loaded during resetting of the triple store content initiated - # through the `ResetTriplestoreContent` message. The main usage is in unit testing, where - # we want a known state of the triple store data. If additional triples need to be loaded, - # then a list of `RdfDataObject` instances containing the path and the name of the named graph - # can be supplied to the `ResetTriplestoreContent` message. - default-rdf-data = [ - { - path = "knora-ontologies/knora-admin.ttl" - name = "http://www.knora.org/ontology/knora-admin" - } - { - path = "knora-ontologies/knora-base.ttl" - name = "http://www.knora.org/ontology/knora-base" - } - { - path = "knora-ontologies/standoff-onto.ttl" - name = "http://www.knora.org/ontology/standoff" - } - { - path = "knora-ontologies/standoff-data.ttl" - name = "http://www.knora.org/data/standoff" - } - { - path = "knora-ontologies/salsah-gui.ttl" - name = "http://www.knora.org/ontology/salsah-gui" - } - { - path = "test_data/all_data/admin-data.ttl" - name = "http://www.knora.org/data/admin" - } - { - path = "test_data/all_data/permissions-data.ttl" - name = "http://www.knora.org/data/permissions" - } - { - path = "test_data/all_data/system-data.ttl" - name = "http://www.knora.org/data/0000/SystemProject" - } - { - path = "test_data/ontologies/anything-onto.ttl" - name = "http://www.knora.org/ontology/0001/anything" - } - { - path = "test_data/ontologies/something-onto.ttl" - name = "http://www.knora.org/ontology/0001/something" - } - { - path = "test_data/ontologies/images-onto.ttl" - name = "http://www.knora.org/ontology/00FF/images" - } - { - path = "test_data/ontologies/beol-onto.ttl" - name = "http://www.knora.org/ontology/0801/beol" - } - { - path = "test_data/ontologies/biblio-onto.ttl" - name = "http://www.knora.org/ontology/0801/biblio" - } - { - path = "test_data/ontologies/incunabula-onto.ttl" - name = "http://www.knora.org/ontology/0803/incunabula" - } - { - path = "test_data/ontologies/dokubib-onto.ttl" - name = "http://www.knora.org/ontology/0804/dokubib" - } - { - path = "test_data/ontologies/webern-onto.ttl" - name = "http://www.knora.org/ontology/0806/webern" - } - ] - - # This data is loaded if the `webapi` server is started with the `loadDemoData` flag, which initiates - # sending of `ResetTriplestoreContent` with a list of `RdfDataObject` instances containing this data. - # The result will be a triplestore containing `default-rdf-data` and `rdf-data` - rdf-data = [ - { - path = "test_data/ontologies/incunabula-onto.ttl" - name = "http://www.knora.org/ontology/0803/incunabula" - } - { - path = "test_data/demo_data/incunabula-demo-data.ttl" - name = "http://www.knora.org/data/incunabula" - } - { - path = "test_data/ontologies/images-onto.ttl" - name = "http://www.knora.org/ontology/00FF/images" - } - { - path = "test_data/demo_data/images-demo-data.ttl" - name = "http://www.knora.org/data/00FF/images" - } - - ] - // If true, the time taken by each SPARQL query is logged at DEBUG level. To see these messages, // set loglevel = "DEBUG" above, and // // in logback.xml. profile-queries = false - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Fake triplestore settings - // - // The application can generate a fake triplestore, consisting of SPARQL queries and responses saved in - // text files (in fake-triplestore-query-dir). This is useful for: - // - // * measuring the response time of the application minus the response time of the triplestore. - // - // * debugging SPARQL queries, because you can open the generated queries in a text editor and copy and paste - // them into something like GraphDB Workbench to experiment with them. - // - // * benchmarking triplestores, because you can feed the whole fake triplestore file structure to RDFBench. - // - // To generate a fake triplestore, set fake-triplestore to "prepare", start the application, and run one or more - // API operations. The fake triplestore will contain all the SPARQL queries and responses involved in those - // operations. - // - // To have the application use the fake triplestore, set fake-triplestore to "use", and restart the application. - // The entire contents of the fake triplestore will be loaded when the application starts, and all SPARQL queries - // will simply be hashtable lookups in this in-memory data. - // - // To just use a real triplestore, set fake-triplestore to "off". - fake-triplestore = "off" - fake-triplestore-data-dir = "src/main/resources/query-log" } cache-service { diff --git a/webapi/src/main/resources/logback.xml b/webapi/src/main/resources/logback.xml index ecb556fdeb..09c6a2c9b8 100644 --- a/webapi/src/main/resources/logback.xml +++ b/webapi/src/main/resources/logback.xml @@ -33,6 +33,9 @@ + + + diff --git a/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala b/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala index 03a1439c32..857db02030 100644 --- a/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala +++ b/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala @@ -22,12 +22,14 @@ import akka.stream.Materializer import akka.util.Timeout import ch.megard.akka.http.cors.scaladsl.CorsDirectives import ch.megard.akka.http.cors.scaladsl.settings.CorsSettings -import com.typesafe.scalalogging.LazyLogging +import com.typesafe.scalalogging.Logger import org.knora.webapi.config.AppConfig import org.knora.webapi.core.LiveActorMaker -import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import dsp.errors.InconsistentRepositoryDataException +import dsp.errors.MissingLastModificationDateOntologyException +import dsp.errors.SipiException +import dsp.errors.UnexpectedMessageException +import dsp.errors.UnsupportedValueException import org.knora.webapi.http.directives.DSPApiDirectives import org.knora.webapi.http.version.ServerVersion import org.knora.webapi.messages.ResponderRequest._ @@ -53,9 +55,8 @@ import org.knora.webapi.settings.KnoraDispatchers import org.knora.webapi.settings.KnoraSettings import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.settings._ -import org.knora.webapi.store.StoreManager -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.settings.CacheServiceSettings import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.util.ActorUtil.future2Message import org.knora.webapi.util.cache.CacheUtil @@ -66,6 +67,10 @@ import scala.concurrent.Future import scala.concurrent.duration._ import scala.util.Failure import scala.util.Success +import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceRequest +import org.knora.webapi.messages.store.sipimessages.IIIFRequest +import org.knora.webapi.util.ActorUtil +import org.knora.webapi.store.triplestore.TriplestoreServiceManager /** * This is the first actor in the application. All other actors are children @@ -78,15 +83,15 @@ import scala.util.Success class ApplicationActor( cacheServiceManager: CacheServiceManager, iiifServiceManager: IIIFServiceManager, + triplestoreManager: TriplestoreServiceManager, appConfig: AppConfig ) extends Actor with Stash - with LazyLogging with AroundDirectives with Timers { implicit val system: ActorSystem = context.system - val log = logger + val log: Logger = Logger(this.getClass()) log.debug("entered the ApplicationManager constructor") @@ -100,11 +105,6 @@ class ApplicationActor( */ implicit val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(system.settings.config) - /** - * The default feature factory configuration, which is used during startup. - */ - val defaultFeatureFactoryConfig: FeatureFactoryConfig = new KnoraSettingsFeatureFactoryConfig(knoraSettings) - /** * Provides the actor materializer (akka-http) */ @@ -130,15 +130,6 @@ class ApplicationActor( */ val responderManager: ResponderManager = ResponderManager(responderData) - /** - * The actor that forwards messages to actors that deal with persistent storage. - */ - lazy val storeManager: ActorRef = context.actorOf( - Props(new StoreManager(self, cacheServiceManager, iiifServiceManager, appConfig) with LiveActorMaker) - .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = StoreManagerActorName - ) - /** * Route data. */ @@ -249,16 +240,6 @@ class ApplicationActor( self ! CreateCaches() case AppStates.CachesReady => - self ! SetAppState(AppStates.UpdatingSearchIndex) - - case AppStates.UpdatingSearchIndex => - if (ignoreRepository) { - self ! SetAppState(AppStates.SearchIndexReady) - } else { - self ! UpdateSearchIndex() - } - - case AppStates.SearchIndexReady => self ! SetAppState(AppStates.LoadingOntologies) case AppStates.LoadingOntologies => @@ -332,7 +313,7 @@ class ApplicationActor( /* check repository request */ case CheckTriplestore() => - storeManager ! CheckTriplestoreRequest() + self ! CheckTriplestoreRequest() /* check repository response */ case CheckTriplestoreResponse(status, message) => @@ -350,7 +331,7 @@ class ApplicationActor( } case UpdateRepository() => - storeManager ! UpdateRepositoryRequest() + self ! UpdateRepositoryRequest() case RepositoryUpdatedResponse(message) => log.info(message) @@ -361,16 +342,9 @@ class ApplicationActor( CacheUtil.createCaches(knoraSettings.caches) self ! SetAppState(AppStates.CachesReady) - case UpdateSearchIndex() => - storeManager ! SearchIndexUpdateRequest() - - case SparqlUpdateResponse() => - self ! SetAppState(AppStates.SearchIndexReady) - /* load ontologies request */ case LoadOntologies() => self ! LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -398,11 +372,13 @@ class ApplicationActor( log.warn("Redis server not running. Please start it.") timers.startSingleTimer("CheckCacheService", CheckCacheService, 5.seconds) - // Forward messages to the responder manager and the store manager. - case responderMessage: KnoraRequestV1 => future2Message(sender(), responderManager.receive(responderMessage), log) - case responderMessage: KnoraRequestV2 => future2Message(sender(), responderManager.receive(responderMessage), log) - case responderMessage: KnoraRequestADM => future2Message(sender(), responderManager.receive(responderMessage), log) - case storeMessage: StoreRequest => storeManager forward storeMessage + // Forward messages to the responder manager and the different store managers. + case msg: KnoraRequestV1 => future2Message(sender(), responderManager.receive(msg), log) + case msg: KnoraRequestV2 => future2Message(sender(), responderManager.receive(msg), log) + case msg: KnoraRequestADM => future2Message(sender(), responderManager.receive(msg), log) + case msg: CacheServiceRequest => ActorUtil.zio2Message(sender(), cacheServiceManager.receive(msg), appConfig) + case msg: IIIFRequest => ActorUtil.zio2Message(sender(), iiifServiceManager.receive(msg), appConfig) + case msg: TriplestoreRequest => ActorUtil.zio2Message(sender(), triplestoreManager.receive(msg), appConfig) case akka.actor.Status.Failure(ex: Exception) => ex match { @@ -537,7 +513,7 @@ class ApplicationActor( */ private def printBanner(): Unit = { - var msg = + val logo = """ | ____ ____ ____ _ ____ ___ | | _ \/ ___|| _ \ / \ | _ \_ _| @@ -546,38 +522,28 @@ class ApplicationActor( | |____/|____/|_| /_/ \_\_| |___| """.stripMargin - msg += "\n" - msg += s"DSP-API Server started: http://${knoraSettings.internalKnoraApiHost}:${knoraSettings.internalKnoraApiPort}\n" - msg += "------------------------------------------------\n" - - defaultFeatureFactoryConfig.makeToggleSettingsString match { - case Some(toggleSettingsString) => msg += s"Default feature toggle settings: $toggleSettingsString\n" - case None => () - } + log.info(logo) + log.info( + s"DSP-API Server started: http://${knoraSettings.internalKnoraApiHost}:${knoraSettings.internalKnoraApiPort}" + ) if (allowReloadOverHTTPState | knoraSettings.allowReloadOverHTTP) { - msg += "WARNING: Resetting DB over HTTP is turned ON.\n" - msg += "------------------------------------------------\n" + log.warn("Resetting DB over HTTP is turned ON") } // which repository are we using - msg += s"DB-Name: ${knoraSettings.triplestoreDatabaseName}\t DB-Type: ${knoraSettings.triplestoreType}\n" - msg += s"DB-Server: ${knoraSettings.triplestoreHost}\t\t DB Port: ${knoraSettings.triplestorePort}\n" + log.info(s"DB-Name: ${knoraSettings.triplestoreDatabaseName}\t DB-Type: ${knoraSettings.triplestoreType}") + log.info(s"DB-Server: ${knoraSettings.triplestoreHost}\t\t DB Port: ${knoraSettings.triplestorePort}") if (printConfigState | knoraSettings.printExtendedConfig) { - - msg += s"DB User: ${knoraSettings.triplestoreUsername}\n" - msg += s"DB Password: ${knoraSettings.triplestorePassword}\n" - - msg += s"Swagger Json: ${knoraSettings.externalKnoraApiBaseUrl}/api-docs/swagger.json\n" - msg += s"Webapi internal URL: ${knoraSettings.internalKnoraApiBaseUrl}\n" - msg += s"Webapi external URL: ${knoraSettings.externalKnoraApiBaseUrl}\n" - msg += s"Sipi internal URL: ${knoraSettings.internalSipiBaseUrl}\n" - msg += s"Sipi external URL: ${knoraSettings.externalSipiBaseUrl}\n" + log.info(s"DB User: ${knoraSettings.triplestoreUsername}") + log.info(s"DB Password: ${knoraSettings.triplestorePassword}") + + log.info(s"Swagger Json: ${knoraSettings.externalKnoraApiBaseUrl}/api-docs/swagger.json") + log.info(s"Webapi internal URL: ${knoraSettings.internalKnoraApiBaseUrl}") + log.info(s"Webapi external URL: ${knoraSettings.externalKnoraApiBaseUrl}") + log.info(s"Sipi internal URL: ${knoraSettings.internalSipiBaseUrl}") + log.info(s"Sipi external URL: ${knoraSettings.externalSipiBaseUrl}") } - - msg += "================================================\n" - - println(msg) } } diff --git a/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala b/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala index aa7c200b96..b34281bf1c 100644 --- a/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala +++ b/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala @@ -16,7 +16,7 @@ import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.settings._ import scala.concurrent.ExecutionContext -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.cache.settings.CacheServiceSettings /** * The applications actor system. @@ -55,7 +55,7 @@ trait LiveCore extends Core { * sequences. */ lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)) + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig)) .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), name = APPLICATION_MANAGER_ACTOR_NAME ) diff --git a/webapi/src/main/scala/org/knora/webapi/app/Main.scala b/webapi/src/main/scala/org/knora/webapi/app/Main.scala index d88b5d40ad..e5ab602721 100644 --- a/webapi/src/main/scala/org/knora/webapi/app/Main.scala +++ b/webapi/src/main/scala/org/knora/webapi/app/Main.scala @@ -10,10 +10,13 @@ import org.knora.webapi.auth.JWTService import org.knora.webapi.config.AppConfig import org.knora.webapi.core.Logging import org.knora.webapi.messages.app.appmessages.AppStart -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater import zio._ import java.util.concurrent.TimeUnit @@ -25,36 +28,53 @@ import java.util.concurrent.TimeUnit */ object Main extends scala.App with LiveCore { + /** + * The effect layers which will be used to run the managers effect. + * Can be overriden in specs that need other implementations. + */ + lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, + AppConfig.live, + JWTService.layer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + Logging.slf4j + ) + /** * Unsafely creates a `Runtime` from a `ZLayer` whose resources will be * allocated immediately, and not released until the `Runtime` is shut down or * the end of the application. */ - val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) + lazy val runtime = + Unsafe.unsafe { implicit u => + Runtime.unsafe.fromLayer(effectLayers ++ Runtime.removeDefaultLoggers) + } // The effect for building a cache service manager, a IIIF service manager, and AppConfig. val managers = for { csm <- ZIO.service[CacheServiceManager] iiifsm <- ZIO.service[IIIFServiceManager] + tssm <- ZIO.service[TriplestoreServiceManager] appConfig <- ZIO.service[AppConfig] - } yield (csm, iiifsm, appConfig) + } yield (csm, iiifsm, tssm, appConfig) /** * Create both managers by unsafe running them. */ - val (cacheServiceManager, iiifServiceManager, appConfig) = - runtime - .unsafeRun( - managers - .provide( - CacheServiceInMemImpl.layer, - CacheServiceManager.layer, - AppConfig.live, - IIIFServiceManager.layer, - IIIFServiceSipiImpl.layer, - JWTService.layer - ) - ) + val (cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig) = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + managers + ) + .getOrElse(c => throw FiberFailure(c)) + } /** * Start server initialisation @@ -71,6 +91,7 @@ object Main extends scala.App with LiveCore { import scala.concurrent.duration._ val terminate: Future[Terminated] = system.terminate() Await.result(terminate, Duration(30.toLong, TimeUnit.SECONDS)) + runtime.shutdown0() }) ) diff --git a/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala b/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala index f3facfbebc..e7454b35db 100644 --- a/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala +++ b/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala @@ -8,6 +8,7 @@ import scala.concurrent.duration import typesafe._ import magnolia._ +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject /** * Represents (eventually) the complete configuration as defined in application.conf. @@ -90,11 +91,29 @@ final case class Triplestore( host: String, queryTimeout: String, updateTimeout: String, - autoInit: Boolean + autoInit: Boolean, + profileQueries: Boolean, + fuseki: Fuseki ) { + val queryTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(queryTimeout)) val updateTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(updateTimeout)) } +/** + * Fuseki specific configuration. + * + * @param port + * @param repositoryName + * @param username + * @param password + */ +final case class Fuseki( + port: Int, + repositoryName: String, + username: String, + password: String +) + /** * Loads the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading * the Typesafe-Config format. diff --git a/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala b/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala deleted file mode 100644 index c2a9176bee..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.contributors - -import dsp.errors.AssertionException -import org.knora.webapi.messages.twirl.Contributor -import org.knora.webapi.util.FileUtil -import org.rogach.scallop.ScallopConf -import org.rogach.scallop.ScallopOption -import spray.json.JsArray -import spray.json.JsNull -import spray.json.JsNumber -import spray.json.JsObject -import spray.json.JsString -import spray.json.JsValue -import spray.json.JsonParser - -import java.net.URL -import java.net.URLConnection -import java.nio.file.Path -import java.nio.file.Paths -import scala.io.Source - -/** - * Generates the file Contributors.md, using the GitHub API. - */ -object GenerateContributorsFile extends App { - - // Configuration - - val contributorsUrl = "https://api.github.com/repos/dasch-swiss/knora-api/contributors" - val defaultOutputFile = "Contributors.md" - - // Command-line args - - private val conf = new GenerateContributorsFileConf(args.toIndexedSeq) - private val token = conf.token.toOption - private val outputFile: Path = Paths.get(conf.output()) - - // Get the list of contributors. - - val contributorsJson = getFromGitHubApi(contributorsUrl) - - val contributors: Vector[Contributor] = contributorsJson.asInstanceOf[JsArray].elements.map { - case elem: JsObject => - Contributor( - login = elem.fields("login").asInstanceOf[JsString].value, - apiUrl = elem.fields("url").asInstanceOf[JsString].value, - htmlUrl = elem.fields("html_url").asInstanceOf[JsString].value, - contributions = elem.fields("contributions").asInstanceOf[JsNumber].value.toInt - ) - - case other => throw AssertionException(s"Expected JsObject, got $other") - } - - // Get the names of the contributors. - - val contributorsWithNames: Seq[Contributor] = contributors.map { contributor => - val userJson = getFromGitHubApi(contributor.apiUrl) - - val userName = userJson.asJsObject.fields("name") match { - case JsString(value) => Some(value) - case JsNull => None - case other => throw AssertionException(s"Unexpected JSON type $other") - } - - contributor.copy( - name = userName - ) - } - - // Sort them by number of contributions. - val contributorsSorted = contributorsWithNames.sortBy(_.contributions).reverse - - // Generate Markdown. - val contributorsText: String = - org.knora.webapi.messages.twirl.queries.util.txt.generateContributorsMarkdown(contributorsSorted).toString - - // Write Contributors.md. - FileUtil.writeTextFile(file = outputFile, content = contributorsText) - - /** - * Makes an HTTP GET connection to the GitHub API. - * - * @param url a GitHub API URL. - * @return the response, parsed as JSON. - */ - private def getFromGitHubApi(url: String): JsValue = { - val connection: URLConnection = new URL(url).openConnection - - token match { - case Some(tokenStr) => - connection.setRequestProperty("Authorization", s"token $tokenStr") - - case None => () - } - - val responseStr: String = Source.fromInputStream(connection.getInputStream).mkString - - // Parse the JSON response. - - JsonParser(responseStr) - } - - /** - * Parses command-line arguments. - */ - private class GenerateContributorsFileConf(arguments: Seq[String]) extends ScallopConf(arguments) { - banner(s""" - |Generates a file listing the contributors to Knora. - | - |Usage: org.knora.webapi.util.GenerateContributorsFile [ -t TOKEN ] [ -o OUTPUT ] - """.stripMargin) - - val token: ScallopOption[String] = opt[String](descr = "GitHub API token") - val output: ScallopOption[String] = - opt[String](descr = s"Output Turtle file (defaults to $defaultOutputFile)", default = Some(defaultOutputFile)) - verify() - } - -} diff --git a/webapi/src/main/scala/org/knora/webapi/core/Core.scala b/webapi/src/main/scala/org/knora/webapi/core/Core.scala index 16988d02f8..b832652ecf 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/Core.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/Core.scala @@ -10,8 +10,9 @@ import akka.actor.ActorSystem import akka.stream.Materializer import org.knora.webapi.config.AppConfig import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cache.CacheServiceManager import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.triplestore.TriplestoreServiceManager import scala.concurrent.ExecutionContext @@ -31,7 +32,11 @@ trait Core { val cacheServiceManager: CacheServiceManager + val triplestoreServiceManager: TriplestoreServiceManager + val appConfig: AppConfig + val runtime: zio.Runtime[Any] + val appActor: ActorRef } diff --git a/webapi/src/main/scala/org/knora/webapi/core/Logging.scala b/webapi/src/main/scala/org/knora/webapi/core/Logging.scala index ffc9eb7c65..dae38ed101 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/Logging.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/Logging.scala @@ -4,6 +4,7 @@ import zio.LogLevel import zio.logging.LogFormat._ import zio.logging._ import zio.ZLayer +import zio.logging.backend.SLF4J object Logging { val logFormat = "[correlation-id = %s] %s" @@ -12,6 +13,11 @@ object Logging { val textFormat: LogFormat = timestamp.fixed(32).color(LogColor.BLUE) |-| level.highlight.fixed(14) |-| line.highlight + val colored: LogFormat = + label("timestamp", timestamp.fixed(32)).color(LogColor.BLUE) |-| + label("level", level).highlight |-| + label("message", quoted(line)).highlight + val fromDebug: ZLayer[Any, Nothing, Unit] = { console( logLevel = LogLevel.Debug, @@ -22,8 +28,13 @@ object Logging { val fromInfo: ZLayer[Any, Nothing, Unit] = { console( logLevel = LogLevel.Info, - format = textFormat + format = colored ) } + val slf4jFormat = line + + val slf4j = + SLF4J.slf4j(LogLevel.Debug, slf4jFormat, _ => "zio-slf4j-logger") + } diff --git a/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala b/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala deleted file mode 100644 index 220a726a98..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala +++ /dev/null @@ -1,438 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.feature - -import akka.http.scaladsl.model.HttpHeader -import akka.http.scaladsl.model.HttpResponse -import akka.http.scaladsl.model.headers.RawHeader -import akka.http.scaladsl.server.RequestContext -import dsp.errors.BadRequestException -import dsp.errors.FeatureToggleException -import org.knora.webapi.settings.KnoraSettings.FeatureToggleBaseConfig -import org.knora.webapi.settings.KnoraSettingsImpl - -import scala.annotation.tailrec -import scala.util.Failure -import scala.util.Success -import scala.util.Try -import scala.util.control.Exception._ - -/** - * A tagging trait for module-specific factories that produce implementations of features. - */ -trait FeatureFactory - -/** - * A tagging trait for classes that implement features returned by feature factories. - */ -trait Feature - -/** - * A tagging trait for case objects representing feature versions. - */ -trait Version - -/** - * A trait representing the state of a feature toggle. - */ -sealed trait FeatureToggleState - -/** - * Indicates that a feature toggle is off. - */ -case object ToggleStateOff extends FeatureToggleState - -/** - * Indicates that a feature toggle is on. - * - * @param version the configured version of the toggle. - */ -case class ToggleStateOn(version: Int) extends FeatureToggleState - -/** - * Represents a feature toggle state, for use in match-case expressions. - */ -sealed trait MatchableState[+T] - -/** - * A matchable object indicating that a feature toggle is off. - */ -case object Off extends MatchableState[Nothing] - -/** - * A matchable object indicating that a feature toggle is on. - * - * @param versionObj a case object representing the enabled version of the toggle. - * @tparam T the type of the case object. - */ -case class On[T <: Version](versionObj: T) extends MatchableState[T] - -/** - * Represents a feature toggle. - * - * @param featureName the name of the feature toggle. - * @param state the state of the feature toggle. - */ -case class FeatureToggle(featureName: String, state: FeatureToggleState) { - - /** - * Returns `true` if this toggle is enabled. - */ - def isEnabled: Boolean = - state match { - case ToggleStateOn(_) => true - case ToggleStateOff => false - } - - /** - * Returns a [[MatchableState]] indicating the state of this toggle, for use in match-case expressions. - * - * @param versionObjects case objects representing the supported versions of the feature, in ascending - * order by version number. - * @tparam T a sealed trait implemented by the version objects. - * @return one of the objects in `versionObjects`, or [[Off]]. - */ - def getMatchableState[T <: Version](versionObjects: T*): MatchableState[T] = - state match { - case ToggleStateOn(version) => - if (version < 1) { - // Shouldn't happen; this error should have been caught already. - throw FeatureToggleException(s"Invalid version number $version for toggle $featureName") - } - - if (versionObjects.size < version) { - // The caller didn't pass enough version objects. - throw FeatureToggleException(s"Not enough version objects for $featureName") - } - - // Return the version object whose position in the sequence corresponds to the configured version. - // This relies on the fact that version numbers must be an ascending sequence of consecutive - // integers starting from 1. - On(versionObjects(version - 1)) - - case ToggleStateOff => Off - } -} - -object FeatureToggle { - - /** - * The name of the HTTP request header containing feature toggles. - */ - val REQUEST_HEADER: String = "X-Knora-Feature-Toggles" - val REQUEST_HEADER_LOWERCASE: String = REQUEST_HEADER.toLowerCase - - /** - * The name of the HTTP response header that lists configured feature toggles. - */ - val RESPONSE_HEADER: String = REQUEST_HEADER - val RESPONSE_HEADER_LOWERCASE: String = REQUEST_HEADER_LOWERCASE - - /** - * Constructs a default [[FeatureToggle]] from a [[FeatureToggleBaseConfig]]. - * - * @param baseConfig a feature toggle's base configuration. - * @return a [[FeatureToggle]] representing the feature's default setting. - */ - def fromBaseConfig(baseConfig: FeatureToggleBaseConfig): FeatureToggle = - FeatureToggle( - featureName = baseConfig.featureName, - state = if (baseConfig.enabledByDefault) { - ToggleStateOn(baseConfig.defaultVersion) - } else { - ToggleStateOff - } - ) - - /** - * Constructs a feature toggle from non-base configuration. - * - * @param featureName the name of the feature. - * @param isEnabled `true` if the feature should be enabled. - * @param maybeVersion the version of the feature that should be used. - * @param baseConfig the base configuration of the toggle. - * @return a [[FeatureToggle]] for the toggle. - */ - def apply( - featureName: String, - isEnabled: Boolean, - maybeVersion: Option[Int], - baseConfig: FeatureToggleBaseConfig - ): FeatureToggle = { - if (!baseConfig.overrideAllowed) { - throw BadRequestException(s"Feature toggle $featureName cannot be overridden") - } - - for (version: Int <- maybeVersion) { - if (!baseConfig.availableVersions.contains(version)) { - throw BadRequestException(s"Feature toggle $featureName has no version $version") - } - } - - val state: FeatureToggleState = (isEnabled, maybeVersion) match { - case (true, Some(definedVersion)) => ToggleStateOn(definedVersion) - case (false, None) => ToggleStateOff - case (true, None) => - throw BadRequestException(s"You must specify a version number to enable feature toggle $featureName") - case (false, Some(_)) => - throw BadRequestException(s"You cannot specify a version number when disabling feature toggle $featureName") - } - - FeatureToggle( - featureName = featureName, - state = state - ) - } -} - -/** - * An abstract class representing configuration for a [[FeatureFactory]] from a particular - * configuration source. - * - * @param maybeParent if this [[FeatureFactoryConfig]] has no setting for a particular - * feature toggle, it delegates to its parent. - */ -abstract class FeatureFactoryConfig(protected val maybeParent: Option[FeatureFactoryConfig]) { - - /** - * Gets the base configuration for a feature toggle. - * - * @param featureName the name of the feature. - * @return the toggle's base configuration. - */ - protected[feature] def getBaseConfig(featureName: String): FeatureToggleBaseConfig - - /** - * Gets the base configurations of all feature toggles. - */ - protected[feature] def getAllBaseConfigs: Set[FeatureToggleBaseConfig] - - /** - * Returns a feature toggle in the configuration source of this [[FeatureFactoryConfig]]. - * - * @param featureName the name of a feature. - * @return the configuration of the feature toggle in this [[FeatureFactoryConfig]]'s configuration - * source, or `None` if the source contains no configuration for that feature toggle. - */ - protected[feature] def getLocalConfig(featureName: String): Option[FeatureToggle] - - /** - * Returns a string giving the state of all feature toggles. - */ - def makeToggleSettingsString: Option[String] = { - // Convert each toggle to its string representation. - val enabledToggles: Set[String] = getAllBaseConfigs.map { baseConfig: FeatureToggleBaseConfig => - val featureToggle: FeatureToggle = getToggle(baseConfig.featureName) - - val toggleStateStr: String = featureToggle.state match { - case ToggleStateOn(version) => s":$version=on" - case ToggleStateOff => s"=off" - } - - s"${featureToggle.featureName}$toggleStateStr" - } - - // Are any toggles enabled? - if (enabledToggles.nonEmpty) { - // Yes. Return a header. - Some(enabledToggles.mkString(",")) - } else { - // No. Don't return a header. - None - } - } - - /** - * Returns an [[HttpHeader]] giving the state of all feature toggles. - */ - def makeHttpResponseHeader: Option[HttpHeader] = - makeToggleSettingsString.map { settingsStr: String => - RawHeader(FeatureToggle.RESPONSE_HEADER, settingsStr) - } - - /** - * Adds an [[HttpHeader]] to an [[HttpResponse]] indicating which feature toggles are enabled. - */ - def addHeaderToHttpResponse(httpResponse: HttpResponse): HttpResponse = - makeHttpResponseHeader match { - case Some(header) => httpResponse.withHeaders(header) - case None => httpResponse - } - - /** - * Returns a feature toggle, taking into account the base configuration - * and the parent configuration. - * - * @param featureName the name of the feature. - * @return the feature toggle. - */ - @tailrec - final def getToggle(featureName: String): FeatureToggle = { - // Get the base configuration for the feature. - val baseConfig: FeatureToggleBaseConfig = getBaseConfig(featureName) - - // Do we represent the base configuration? - maybeParent match { - case None => - // Yes. Return our setting. - FeatureToggle.fromBaseConfig(baseConfig) - - case Some(parent) => - // No. Can the default setting be overridden? - if (baseConfig.overrideAllowed) { - // Yes. Do we have a setting for this feature? - getLocalConfig(featureName) match { - case Some(setting) => - // Yes. Return our setting. - setting - - case None => - // We don't have a setting for this feature. Delegate to the parent. - parent.getToggle(featureName) - } - } else { - // The default setting can't be overridden. Return it. - FeatureToggle.fromBaseConfig(baseConfig) - } - } - } -} - -/** - * A [[FeatureFactoryConfig]] that reads configuration from the application's configuration file. - * - * @param knoraSettings a [[KnoraSettingsImpl]] representing the configuration in the application's - * configuration file. - */ -class KnoraSettingsFeatureFactoryConfig(knoraSettings: KnoraSettingsImpl) extends FeatureFactoryConfig(None) { - private val baseConfigs: Map[String, FeatureToggleBaseConfig] = knoraSettings.featureToggles.map { baseConfig => - baseConfig.featureName -> baseConfig - }.toMap - - override protected[feature] def getBaseConfig(featureName: String): FeatureToggleBaseConfig = - baseConfigs.getOrElse(featureName, throw BadRequestException(s"No such feature: $featureName")) - - override protected[feature] def getAllBaseConfigs: Set[FeatureToggleBaseConfig] = - baseConfigs.values.toSet - - override protected[feature] def getLocalConfig(featureName: String): Option[FeatureToggle] = - Some(FeatureToggle.fromBaseConfig(getBaseConfig(featureName))) -} - -/** - * An abstract class for feature factory configs that don't represent the base configuration. - * - * @param parent the parent config. - */ -abstract class OverridingFeatureFactoryConfig(parent: FeatureFactoryConfig) extends FeatureFactoryConfig(Some(parent)) { - protected val featureToggles: Map[String, FeatureToggle] - - override protected[feature] def getBaseConfig(featureName: String): FeatureToggleBaseConfig = - parent.getBaseConfig(featureName) - - override protected[feature] def getAllBaseConfigs: Set[FeatureToggleBaseConfig] = - parent.getAllBaseConfigs - - override protected[feature] def getLocalConfig(featureName: String): Option[FeatureToggle] = - featureToggles.get(featureName) -} - -object RequestContextFeatureFactoryConfig { - // Strings that we accept as Boolean true values. - val TRUE_STRINGS: Set[String] = Set("true", "yes", "on") - - // Strings that we accept as Boolean false values. - val FALSE_STRINGS: Set[String] = Set("false", "no", "off") -} - -/** - * A [[FeatureFactoryConfig]] that reads configuration from a header in an HTTP request. - * - * @param requestContext the HTTP request context. - * @param parent the parent [[FeatureFactoryConfig]]. - */ -class RequestContextFeatureFactoryConfig(requestContext: RequestContext, parent: FeatureFactoryConfig) - extends OverridingFeatureFactoryConfig(parent) { - import FeatureToggle._ - import RequestContextFeatureFactoryConfig._ - - private def invalidHeaderValue: Nothing = throw BadRequestException(s"Invalid value for header $REQUEST_HEADER") - - // Read feature toggles from an HTTP header. - protected override val featureToggles: Map[String, FeatureToggle] = Try { - // Was the feature toggle header submitted? - requestContext.request.headers.find(_.lowercaseName == REQUEST_HEADER_LOWERCASE) match { - case Some(featureToggleHeader: HttpHeader) => - // Yes. Parse it into comma-separated key-value pairs, each representing a feature toggle. - val toggleSeq: Seq[(String, FeatureToggle)] = featureToggleHeader.value - .split(',') - .map { headerValueItem: String => - headerValueItem.split('=').map(_.trim) match { - case Array(featureNameAndVersionStr: String, isEnabledStr: String) => - val featureNameAndVersion: Array[String] = featureNameAndVersionStr.split(':').map(_.trim) - val featureName: String = featureNameAndVersion.head - - // Accept the boolean values that are accepted in application.conf. - val isEnabled: Boolean = if (TRUE_STRINGS.contains(isEnabledStr.toLowerCase)) { - true - } else if (FALSE_STRINGS.contains(isEnabledStr.toLowerCase)) { - false - } else { - throw BadRequestException(s"Invalid boolean '$isEnabledStr' in feature toggle $featureName") - } - - val maybeVersion: Option[Int] = featureNameAndVersion.drop(1).headOption.map { versionStr: String => - allCatch - .opt(versionStr.toInt) - .getOrElse( - throw BadRequestException(s"Invalid version number '$versionStr' in feature toggle $featureName") - ) - } - - featureName -> FeatureToggle( - featureName = featureName, - isEnabled = isEnabled, - maybeVersion = maybeVersion, - baseConfig = parent.getBaseConfig(featureName) - ) - - case _ => invalidHeaderValue - } - } - .toSeq - - if (toggleSeq.size > toggleSeq.map(_._1).toSet.size) { - throw BadRequestException(s"You cannot set the same feature toggle more than once per request") - } - - toggleSeq.toMap - - case None => - // No feature toggle header was submitted. - Map.empty[String, FeatureToggle] - } - } match { - case Success(parsedToggles) => parsedToggles - - case Failure(ex) => - ex match { - case badRequest: BadRequestException => throw badRequest - case _ => invalidHeaderValue - } - } -} - -/** - * A [[FeatureFactoryConfig]] with a fixed configuration, to be used in tests. - * - * @param testToggles the toggles to be used. - */ -class TestFeatureFactoryConfig(testToggles: Set[FeatureToggle], parent: FeatureFactoryConfig) - extends OverridingFeatureFactoryConfig(parent) { - protected override val featureToggles: Map[String, FeatureToggle] = testToggles.map { setting => - setting.featureName -> setting - }.toMap -} diff --git a/webapi/src/main/scala/org/knora/webapi/http/handler/KnoraExceptionHandler.scala b/webapi/src/main/scala/org/knora/webapi/http/handler/KnoraExceptionHandler.scala index d54c37ad08..f92db4b411 100644 --- a/webapi/src/main/scala/org/knora/webapi/http/handler/KnoraExceptionHandler.scala +++ b/webapi/src/main/scala/org/knora/webapi/http/handler/KnoraExceptionHandler.scala @@ -57,7 +57,7 @@ object KnoraExceptionHandler extends LazyLogging { val uri = request.uri val url = uri.path.toString - logger.error(s"Unable to run route $url", ise) + logger.error(s"Internal Server Exception: Unable to run route $url", ise) if (url.startsWith("/v1")) { complete(exceptionToJsonHttpResponseV1(ise, settingsImpl)) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala index 76143feb9b..5ccada44c5 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala @@ -8,7 +8,6 @@ package org.knora.webapi.messages.admin.responder.groupsmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -101,54 +100,44 @@ sealed trait GroupsResponderRequestADM extends KnoraRequestADM /** * Get all information about all groups. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ -case class GroupsGetADM(featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends GroupsResponderRequestADM +case class GroupsGetADM(requestingUser: UserADM) extends GroupsResponderRequestADM /** * Get all information about all groups. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ -case class GroupsGetRequestADM(featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends GroupsResponderRequestADM +case class GroupsGetRequestADM(requestingUser: UserADM) extends GroupsResponderRequestADM /** * Get everything about a single group identified through its IRI. A successful response will be * an [[Option[GroupADM] ]], which will be `None` if the group was not found. * * @param groupIri IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ -case class GroupGetADM(groupIri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends GroupsResponderRequestADM +case class GroupGetADM(groupIri: IRI, requestingUser: UserADM) extends GroupsResponderRequestADM /** * Get everything about a single group identified through its IRI. The response will be a * [[GroupGetResponseADM]], or an error if the group was not found. * * @param groupIri IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ -case class GroupGetRequestADM(groupIri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends GroupsResponderRequestADM +case class GroupGetRequestADM(groupIri: IRI, requestingUser: UserADM) extends GroupsResponderRequestADM /** * Get everything about a multiple groups identified by their IRIs. The response will be a * [[Set[GroupGetResponseADM] ]], or an error if one or more groups was not found. * * @param groupIris the IRIs of the groups being requested. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ case class MultipleGroupsGetRequestADM( groupIris: Set[IRI], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends GroupsResponderRequestADM @@ -156,23 +145,19 @@ case class MultipleGroupsGetRequestADM( * Returns all members of the group identified by iri. * * @param groupIri IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ -case class GroupMembersGetRequestADM(groupIri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends GroupsResponderRequestADM +case class GroupMembersGetRequestADM(groupIri: IRI, requestingUser: UserADM) extends GroupsResponderRequestADM /** * Requests the creation of a new group. * * @param createRequest the [[GroupCreatePayloadADM]] information for creating the new group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class GroupCreateRequestADM( createRequest: GroupCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends GroupsResponderRequestADM @@ -182,14 +167,12 @@ case class GroupCreateRequestADM( * * @param groupIri the IRI of the group to be updated. * @param changeGroupRequest the data which needs to be update. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class GroupChangeRequestADM( groupIri: IRI, changeGroupRequest: GroupUpdatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends GroupsResponderRequestADM @@ -199,14 +182,12 @@ case class GroupChangeRequestADM( * * @param groupIri the IRI of the group to be deleted. * @param changeGroupRequest the data which needs to be update. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class GroupChangeStatusRequestADM( groupIri: IRI, changeGroupRequest: ChangeGroupApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends GroupsResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala index 8d945f18f0..e507a7e8ce 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala @@ -8,7 +8,6 @@ package org.knora.webapi.messages.admin.responder.listsmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM @@ -160,12 +159,10 @@ sealed trait ListsResponderRequestADM extends KnoraRequestADM * Requests a list of all lists or the lists inside a project. A successful response will be a [[ListsGetResponseADM]] * * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ListsGetRequestADM( projectIri: Option[IRI] = None, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ListsResponderRequestADM @@ -173,44 +170,36 @@ case class ListsGetRequestADM( * Requests a node (root or child). A successful response will be a [[ListItemGetResponseADM]] * * @param iri the IRI of the node (root or child). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class ListGetRequestADM(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ListsResponderRequestADM +case class ListGetRequestADM(iri: IRI, requestingUser: UserADM) extends ListsResponderRequestADM /** * Request basic information about a node (root or child). A successful response will be a [[NodeInfoGetResponseADM]] * * @param iri the IRI of the list node. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class ListNodeInfoGetRequestADM(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ListsResponderRequestADM +case class ListNodeInfoGetRequestADM(iri: IRI, requestingUser: UserADM) extends ListsResponderRequestADM /** * Requests the path from the root node of a list to a particular node. A successful response will be * a [[NodePathGetResponseADM]]. * * @param iri the IRI of the node. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class NodePathGetRequestADM(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ListsResponderRequestADM +case class NodePathGetRequestADM(iri: IRI, requestingUser: UserADM) extends ListsResponderRequestADM /** * Requests the creation of a new list. * * @param createRootNode the [[ListRootNodeCreatePayloadADM]] information used for creating the root node of the list. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user creating the new list. * @param apiRequestID the ID of the API request. */ case class ListRootNodeCreateRequestADM( createRootNode: ListRootNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -220,14 +209,12 @@ case class ListRootNodeCreateRequestADM( * * @param listIri the IRI of the node to be updated (root or child ). * @param changeNodeRequest the data which needs to be update. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class NodeInfoChangeRequestADM( listIri: IRI, changeNodeRequest: ListNodeChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -236,13 +223,11 @@ case class NodeInfoChangeRequestADM( * Request the creation of a new list node, root or child. * * @param createChildNodeRequest the new node information. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the ID of the API request. */ case class ListChildNodeCreateRequestADM( createChildNodeRequest: ListChildNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -252,14 +237,12 @@ case class ListChildNodeCreateRequestADM( * * @param nodeIri the IRI of the node whose name should be updated. * @param changeNodeNameRequest the payload containing the new name. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class NodeNameChangeRequestADM( nodeIri: IRI, changeNodeNameRequest: NodeNameChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -269,14 +252,12 @@ case class NodeNameChangeRequestADM( * * @param nodeIri the IRI of the node whose name should be updated. * @param changeNodeLabelsRequest the payload containing the new labels. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class NodeLabelsChangeRequestADM( nodeIri: IRI, changeNodeLabelsRequest: NodeLabelsChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -286,14 +267,12 @@ case class NodeLabelsChangeRequestADM( * * @param nodeIri the IRI of the node whose name should be updated. * @param changeNodeCommentsRequest the payload containing the new comments. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class NodeCommentsChangeRequestADM( nodeIri: IRI, changeNodeCommentsRequest: NodeCommentsChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -303,14 +282,12 @@ case class NodeCommentsChangeRequestADM( * * @param nodeIri the IRI of the node whose position should be updated. * @param changeNodePositionRequest the payload containing the new comments. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class NodePositionChangeRequestADM( nodeIri: IRI, changeNodePositionRequest: ChangeNodePositionApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -319,12 +296,10 @@ case class NodePositionChangeRequestADM( * Requests deletion of a node (root or child). A successful response will be a [[ListDeleteResponseADM]] * * @param nodeIri the IRI of the node (root or child). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ListItemDeleteRequestADM( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ListsResponderRequestADM @@ -333,22 +308,18 @@ case class ListItemDeleteRequestADM( * Requests checks if a list is unused and can be deleted. A successful response will be a [[CanDeleteListResponseADM]] * * @param iri the IRI of the list node (root or child). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class CanDeleteListRequestADM(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ListsResponderRequestADM +case class CanDeleteListRequestADM(iri: IRI, requestingUser: UserADM) extends ListsResponderRequestADM /** * Requests deletion of all list node comments. A successful response will be a [[ListNodeCommentsDeleteADM]] * * @param iri the IRI of the list node (root or child). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ListNodeCommentsDeleteRequestADM( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ListsResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala index fac884df1c..1227091568 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.ForbiddenException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM @@ -216,14 +215,12 @@ sealed trait PermissionsResponderRequestADM extends KnoraRequestADM * @param groupIris the groups the user is member of. * @param isInProjectAdminGroups the projects for which the user is member of the ProjectAdmin group. * @param isInSystemAdminGroup the flag denoting users membership in the SystemAdmin group. - * @param featureFactoryConfig the feature factory configuration. */ case class PermissionDataGetADM( projectIris: Seq[IRI], groupIris: Seq[IRI], isInProjectAdminGroups: Seq[IRI], isInSystemAdminGroup: Boolean, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends PermissionsResponderRequestADM { @@ -235,13 +232,11 @@ case class PermissionDataGetADM( * A successful response will be a [[PermissionsForProjectGetResponseADM]]. * * @param projectIri the project for which the permissions are queried. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiation the request. * @param apiRequestID the API request ID. */ case class PermissionsForProjectGetRequestADM( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends PermissionsResponderRequestADM { @@ -449,13 +444,11 @@ case class AdministrativePermissionForProjectGroupGetRequestADM(projectIri: IRI, * Create a single [[AdministrativePermissionADM]]. * * @param createRequest the API create request payload. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the API request ID. */ case class AdministrativePermissionCreateRequestADM( createRequest: CreateAdministrativePermissionAPIRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends PermissionsResponderRequestADM { @@ -700,13 +693,11 @@ case class DefaultObjectAccessPermissionsStringForPropertyGetADM( * Create a single [[DefaultObjectAccessPermissionADM]]. * * @param createRequest the create request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the API request ID. */ case class DefaultObjectAccessPermissionCreateRequestADM( createRequest: CreateDefaultObjectAccessPermissionAPIRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends PermissionsResponderRequestADM { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala index 753936e114..3be6313175 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala @@ -13,7 +13,6 @@ import org.knora.webapi.annotation.ServerUnique import dsp.errors.BadRequestException import dsp.errors.DataConversionException import dsp.errors.OntologyConstraintException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM @@ -165,33 +164,27 @@ sealed trait ProjectsResponderRequestADM extends KnoraRequestADM * Get all information about all projects in form of [[ProjectsGetResponseADM]]. The ProjectsGetRequestV1 returns either * something or a NotFound exception if there are no projects found. Administration permission checking is performed. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class ProjectsGetRequestADM(featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ProjectsResponderRequestADM +case class ProjectsGetRequestADM(requestingUser: UserADM) extends ProjectsResponderRequestADM /** * Get all information about all projects in form of a sequence of [[ProjectADM]]. Returns an empty sequence if * no projects are found. Administration permission checking is skipped. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class ProjectsGetADM(featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ProjectsResponderRequestADM +case class ProjectsGetADM(requestingUser: UserADM) extends ProjectsResponderRequestADM /** * Get info about a single project identified either through its IRI, shortname or shortcode. The response is in form * of [[ProjectGetResponseADM]]. External use. * * @param identifier the IRI, email, or username of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -200,12 +193,10 @@ case class ProjectGetRequestADM( * of [[ProjectADM]]. Internal use only. * * @param identifier the IRI, email, or username of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectGetADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -213,12 +204,10 @@ case class ProjectGetADM( * Returns all users belonging to a project identified either through its IRI, shortname or shortcode. * * @param identifier the IRI, email, or username of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectMembersGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -226,34 +215,28 @@ case class ProjectMembersGetRequestADM( * Returns all admin users of a project identified either through its IRI, shortname or shortcode. * * @param identifier the IRI, email, or username of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectAdminMembersGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM /** * Returns all unique keywords for all projects. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class ProjectsKeywordsGetRequestADM(featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ProjectsResponderRequestADM +case class ProjectsKeywordsGetRequestADM(requestingUser: UserADM) extends ProjectsResponderRequestADM /** * Returns all keywords for a project identified through IRI. * * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectKeywordsGetRequestADM( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -261,13 +244,11 @@ case class ProjectKeywordsGetRequestADM( * Return project's RestrictedView settings. A successful response will be a [[ProjectRestrictedViewSettingsADM]] * * @param identifier the identifier of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ @ApiMayChange case class ProjectRestrictedViewSettingsGetADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -275,13 +256,11 @@ case class ProjectRestrictedViewSettingsGetADM( * Return project's RestrictedView settings. A successful response will be a [[ProjectRestrictedViewSettingsGetResponseADM]]. * * @param identifier the identifier of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ @ApiMayChange case class ProjectRestrictedViewSettingsGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -289,12 +268,10 @@ case class ProjectRestrictedViewSettingsGetRequestADM( * Requests all the data in the project. A successful response will be a [[ProjectDataGetResponseADM]]. * * @param projectIdentifier the identifier of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectDataGetRequestADM( projectIdentifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ProjectsResponderRequestADM @@ -302,13 +279,11 @@ case class ProjectDataGetRequestADM( * Requests the creation of a new project. * * @param createRequest the [[ProjectCreatePayloadADM]] information for the creation of a new project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the ID of the API request. */ case class ProjectCreateRequestADM( createRequest: ProjectCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ProjectsResponderRequestADM @@ -324,7 +299,6 @@ case class ProjectCreateRequestADM( case class ProjectChangeRequestADM( projectIri: IRI, changeProjectRequest: ChangeProjectApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ProjectsResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala index acb462e1f7..1c139f2071 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala @@ -6,7 +6,6 @@ package org.knora.webapi.messages.admin.responder.sipimessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM @@ -27,13 +26,11 @@ sealed trait SipiResponderRequestADM extends KnoraRequestADM * * @param projectID the project shortcode. * @param filename the name of the file belonging to the file value to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the profile of the user making the request. */ case class SipiFileInfoGetRequestADM( projectID: String, filename: String, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SipiResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala index 8b406eb99e..21950ba9f1 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala @@ -6,7 +6,6 @@ package org.knora.webapi.messages.admin.responder.storesmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject @@ -25,12 +24,10 @@ sealed trait StoreResponderRequestADM extends KnoraRequestADM * @param rdfDataObjects a sequence of [[RdfDataObject]] objects containing the path to the data and the name of * the named graph into which the data should be loaded. * @param prependDefaults should a default set of [[RdfDataObject]]s be prepended. The default is `false`. - * @param featureFactoryConfig the feature factory configuration. */ case class ResetTriplestoreContentRequestADM( rdfDataObjects: Seq[RdfDataObject], - prependDefaults: Boolean = false, - featureFactoryConfig: FeatureFactoryConfig + prependDefaults: Boolean = false ) extends StoreResponderRequestADM case class ResetTriplestoreContentResponseADM(message: String) extends KnoraResponseADM with StoresADMJsonProtocol { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala index 4152520911..865fb0e30a 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.DataConversionException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM @@ -128,12 +127,10 @@ sealed trait UsersResponderRequestADM extends KnoraRequestADM * no users are found. Administration permission checking is skipped. * * @param userInformationTypeADM the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user that is making the request. */ case class UsersGetADM( userInformationTypeADM: UserInformationTypeADM = UserInformationTypeADM.Short, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends UsersResponderRequestADM @@ -142,12 +139,10 @@ case class UsersGetADM( * something or a NotFound exception if there are no users found. Administration permission checking is performed. * * @param userInformationTypeADM the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ case class UsersGetRequestADM( userInformationTypeADM: UserInformationTypeADM = UserInformationTypeADM.Short, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends UsersResponderRequestADM @@ -156,13 +151,11 @@ case class UsersGetRequestADM( * * @param identifier the IRI, email, or username of the user to be queried. * @param userInformationTypeADM the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ case class UserGetADM( identifier: UserIdentifierADM, userInformationTypeADM: UserInformationTypeADM = UserInformationTypeADM.Short, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends UsersResponderRequestADM {} @@ -171,13 +164,11 @@ case class UserGetADM( * * @param identifier the IRI, email, or username of the user to be queried. * @param userInformationTypeADM the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ case class UserGetRequestADM( identifier: UserIdentifierADM, userInformationTypeADM: UserInformationTypeADM = UserInformationTypeADM.Short, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends UsersResponderRequestADM {} @@ -185,13 +176,11 @@ case class UserGetRequestADM( * Requests the creation of a new user. * * @param userCreatePayloadADM the [[UserCreatePayloadADM]] information used for creating the new user. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user creating the new user. * @param apiRequestID the ID of the API request. */ case class UserCreateRequestADM( userCreatePayloadADM: UserCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -201,14 +190,12 @@ case class UserCreateRequestADM( * * @param userIri the IRI of the user to be updated. * @param userUpdateBasicInformationPayload the [[UserUpdateBasicInformationPayloadADM]] object containing the data to be updated. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserChangeBasicInformationRequestADM( userIri: IRI, userUpdateBasicInformationPayload: UserUpdateBasicInformationPayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -218,14 +205,12 @@ case class UserChangeBasicInformationRequestADM( * * @param userIri the IRI of the user to be updated. * @param userUpdatePasswordPayload the [[UserUpdatePasswordPayloadADM]] object containing the old and new password. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserChangePasswordRequestADM( userIri: IRI, userUpdatePasswordPayload: UserUpdatePasswordPayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -235,14 +220,12 @@ case class UserChangePasswordRequestADM( * * @param userIri the IRI of the user to be updated. * @param status the [[Status]] containing the new status (true / false). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserChangeStatusRequestADM( userIri: IRI, status: UserStatus, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -252,14 +235,12 @@ case class UserChangeStatusRequestADM( * * @param userIri the IRI of the user to be updated. * @param systemAdmin the [[SystemAdmin]] value object containing the new system admin membership status (true / false). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserChangeSystemAdminMembershipStatusRequestADM( userIri: IRI, systemAdmin: SystemAdmin, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -268,12 +249,10 @@ case class UserChangeSystemAdminMembershipStatusRequestADM( * Requests user's project memberships. * * @param userIri the IRI of the user. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ case class UserProjectMembershipsGetRequestADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends UsersResponderRequestADM @@ -282,14 +261,12 @@ case class UserProjectMembershipsGetRequestADM( * * @param userIri the IRI of the user to be updated. * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserProjectMembershipAddRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -299,14 +276,12 @@ case class UserProjectMembershipAddRequestADM( * * @param userIri the IRI of the user to be updated. * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserProjectMembershipRemoveRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -315,13 +290,11 @@ case class UserProjectMembershipRemoveRequestADM( * Requests user's project admin memberships. * * @param userIri the IRI of the user. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserProjectAdminMembershipsGetRequestADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -331,14 +304,12 @@ case class UserProjectAdminMembershipsGetRequestADM( * * @param userIri the IRI of the user to be updated. * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserProjectAdminMembershipAddRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -348,14 +319,12 @@ case class UserProjectAdminMembershipAddRequestADM( * * @param userIri the IRI of the user to be updated. * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserProjectAdminMembershipRemoveRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -364,12 +333,10 @@ case class UserProjectAdminMembershipRemoveRequestADM( * Requests user's group memberships. * * @param userIri the IRI of the user. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. */ case class UserGroupMembershipsGetRequestADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends UsersResponderRequestADM @@ -378,14 +345,12 @@ case class UserGroupMembershipsGetRequestADM( * * @param userIri the IRI of the user to be updated. * @param groupIri the IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserGroupMembershipAddRequestADM( userIri: IRI, groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM @@ -395,14 +360,12 @@ case class UserGroupMembershipAddRequestADM( * * @param userIri the IRI of the user to be updated. * @param groupIri the IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @param apiRequestID the ID of the API request. */ case class UserGroupMembershipRemoveRequestADM( userIri: IRI, groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends UsersResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala b/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala index 0316cffdf3..06eecb9c8a 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.apache.commons.lang3.StringUtils import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -29,6 +28,9 @@ import scala.util.Success import scala.util.Try import dsp.valueobjects.V2 +import com.typesafe.config.Config +import zio._ + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Messages @@ -61,9 +63,8 @@ case class SparqlSelectRequest(sparql: String) extends TriplestoreRequest * [[SparqlConstructResponse]]. * * @param sparql the SPARQL string. - * @param featureFactoryConfig the feature factory configuration. */ -case class SparqlConstructRequest(sparql: String, featureFactoryConfig: FeatureFactoryConfig) extends TriplestoreRequest +case class SparqlConstructRequest(sparql: String) extends TriplestoreRequest /** * Represents a SPARQL CONSTRUCT query to be sent to the triplestore. The triplestore's will be @@ -73,14 +74,12 @@ case class SparqlConstructRequest(sparql: String, featureFactoryConfig: FeatureF * @param graphIri the named graph IRI to be used in the TriG file. * @param outputFile the file to be written. * @param outputFormat the output file format. - * @param featureFactoryConfig the feature factory configuration. */ case class SparqlConstructFileRequest( sparql: String, graphIri: IRI, outputFile: Path, - outputFormat: QuadFormat, - featureFactoryConfig: FeatureFactoryConfig + outputFormat: QuadFormat ) extends TriplestoreRequest /** @@ -95,10 +94,8 @@ case class SparqlConstructResponse(statements: Map[IRI, Seq[(IRI, String)]]) * [[SparqlExtendedConstructResponse]]. * * @param sparql the SPARQL string. - * @param featureFactoryConfig the feature factory configuration. */ -case class SparqlExtendedConstructRequest(sparql: String, featureFactoryConfig: FeatureFactoryConfig) - extends TriplestoreRequest +case class SparqlExtendedConstructRequest(sparql: String) extends TriplestoreRequest /** * Parses Turtle documents and converts them to [[SparqlExtendedConstructResponse]] objects. @@ -121,11 +118,13 @@ object SparqlExtendedConstructResponse { * @return a [[SparqlExtendedConstructResponse]] representing the document. */ def parseTurtleResponse( - turtleStr: String, - rdfFormatUtil: RdfFormatUtil, - log: Logger - ): Try[SparqlExtendedConstructResponse] = { - val parseTry = Try { + turtleStr: String + ): IO[DataConversionException, SparqlExtendedConstructResponse] = { + + val rdfFormatUtil: RdfFormatUtil = + RdfFeatureFactory.getRdfFormatUtil() + + ZIO.attemptBlocking { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance val statementMap: mutable.Map[SubjectV2, ConstructPredicateObjects] = mutable.Map.empty @@ -202,14 +201,12 @@ object SparqlExtendedConstructResponse { } SparqlExtendedConstructResponse(statementMap.toMap) - } - - parseTry match { - case Success(parsed) => Success(parsed) - case Failure(e) => - log.error(s"Couldn't parse Turtle document:$logDelimiter$turtleStr$logDelimiter, ${e.toString()}") - Failure(DataConversionException("Couldn't parse Turtle document")) - } + }.foldZIO( + failure => + ZIO.logError(s"Couldn't parse Turtle document:$logDelimiter$turtleStr$logDelimiter") *> + ZIO.fail(DataConversionException("Couldn't parse Turtle document")), + ZIO.succeed(_) + ) } } @@ -229,13 +226,11 @@ case class SparqlExtendedConstructResponse( * @param graphIri the IRI of the named graph. * @param outputFile the destination file. * @param outputFormat the output file format. - * @param featureFactoryConfig the feature factory configuration. */ case class NamedGraphFileRequest( graphIri: IRI, outputFile: Path, - outputFormat: QuadFormat, - featureFactoryConfig: FeatureFactoryConfig + outputFormat: QuadFormat ) extends TriplestoreRequest /** @@ -285,7 +280,7 @@ case class SparqlAskResponse(result: Boolean) * @param rdfDataObjects contains a list of [[RdfDataObject]]. * @param prependDefaults denotes if a default set defined in application.conf should be also loaded */ -case class ResetRepositoryContent(rdfDataObjects: Seq[RdfDataObject], prependDefaults: Boolean = true) +case class ResetRepositoryContent(rdfDataObjects: List[RdfDataObject], prependDefaults: Boolean = true) extends TriplestoreRequest /** @@ -308,7 +303,7 @@ case class DropAllRepositoryContentACK() * * @param rdfDataObjects contains a list of [[RdfDataObject]]. */ -case class InsertRepositoryContent(rdfDataObjects: Seq[RdfDataObject]) extends TriplestoreRequest +case class InsertRepositoryContent(rdfDataObjects: List[RdfDataObject]) extends TriplestoreRequest /** * Sent as a response to [[InsertRepositoryContent]] if the request was processed successfully. @@ -367,10 +362,8 @@ case class UpdateRepositoryRequest() extends TriplestoreRequest * Requests that the repository is downloaded to an N-Quads file. A successful response will be a [[FileWrittenResponse]]. * * @param outputFile the output file. - * @param featureFactoryConfig the feature factory configuration. */ -case class DownloadRepositoryRequest(outputFile: Path, featureFactoryConfig: FeatureFactoryConfig) - extends TriplestoreRequest +case class DownloadRepositoryRequest(outputFile: Path) extends TriplestoreRequest /** * Indicates that a file was written successfully. @@ -397,14 +390,6 @@ case class RepositoryUploadedResponse() */ case class RepositoryUpdatedResponse(message: String) extends TriplestoreRequest -/** - * Updates the triplestore's full-text search index. - * - * @param subjectIri if a subject has changed, update the index for that subject. Otherwise, updates - * the index to add any subjects not yet indexed. - */ -case class SearchIndexUpdateRequest(subjectIri: Option[String] = None) extends TriplestoreRequest - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Components of messages diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala index 46e6ec9972..b19537ee04 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala @@ -13,7 +13,6 @@ import org.knora.webapi._ import dsp.errors.AssertionException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotImplementedException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -918,7 +917,6 @@ object ConstructResponseUtilV2 { * @param mappings the mappings needed for standoff conversions and XSL transformations. * @param queryStandoff if `true`, make separate queries to get the standoff for the text value. * @param responderManager the Knora responder manager. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a [[TextValueContentV2]]. */ @@ -930,7 +928,6 @@ object ConstructResponseUtilV2 { mappings: Map[IRI, MappingAndXSLTransformation], queryStandoff: Boolean, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM )(implicit stringFormatter: StringFormatter, @@ -976,7 +973,6 @@ object ConstructResponseUtilV2 { GetRemainingStandoffFromTextValueRequestV2( resourceIri = resourceIri, valueIri = valueObject.subjectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -1118,7 +1114,6 @@ object ConstructResponseUtilV2 { * @param versionDate if defined, represents the requested time in the the resources' version history. * @param responderManager the Knora responder manager. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application's settings. * @param requestingUser the user making the request. * @return a [[LinkValueContentV2]]. @@ -1132,7 +1127,6 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant], appActor: ActorRef, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, requestingUser: UserADM )(implicit @@ -1168,7 +1162,6 @@ object ConstructResponseUtilV2 { appActor = appActor, requestingUser = requestingUser, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, settings = settings ) } yield linkValue.copy( @@ -1190,7 +1183,6 @@ object ConstructResponseUtilV2 { * @param versionDate if defined, represents the requested time in the the resources' version history. * @param responderManager the Knora responder manager. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application's settings. * @param requestingUser the user making the request. * @return a [[ValueContentV2]] representing a value. @@ -1203,7 +1195,6 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant] = None, appActor: ActorRef, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, requestingUser: UserADM )(implicit @@ -1231,7 +1222,6 @@ object ConstructResponseUtilV2 { mappings = mappings, queryStandoff = queryStandoff, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -1348,7 +1338,6 @@ object ConstructResponseUtilV2 { .ask( NodeGetRequestV2( nodeIri = listNodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -1396,7 +1385,6 @@ object ConstructResponseUtilV2 { appActor = appActor, requestingUser = requestingUser, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, settings = settings ) @@ -1427,7 +1415,6 @@ object ConstructResponseUtilV2 { * @param versionDate if defined, represents the requested time in the the resources' version history. * @param responderManager the Knora responder manager. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application's settings. * @param requestingUser the user making the request. * @return a [[ReadResourceV2]]. @@ -1440,7 +1427,6 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant], appActor: ActorRef, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, requestingUser: UserADM )(implicit @@ -1510,7 +1496,6 @@ object ConstructResponseUtilV2 { appActor = appActor, requestingUser = requestingUser, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, settings = settings ) @@ -1586,7 +1571,6 @@ object ConstructResponseUtilV2 { .ask( ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(resourceAttachedToProject)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -1623,7 +1607,6 @@ object ConstructResponseUtilV2 { * @param versionDate if defined, represents the requested time in the the resources' version history. * @param responderManager the Knora responder manager. * @param targetSchema the schema of response. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application's settings. * @param requestingUser the user making the request. * @return a collection of [[ReadResourceV2]] representing the search results. @@ -1638,7 +1621,6 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant], appActor: ActorRef, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, requestingUser: UserADM )(implicit @@ -1661,7 +1643,6 @@ object ConstructResponseUtilV2 { versionDate = versionDate, appActor = appActor, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, settings = settings, requestingUser = requestingUser ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/MessageUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/MessageUtil.scala index 7e86a5058c..cc81bfc777 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/MessageUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/MessageUtil.scala @@ -25,8 +25,7 @@ object MessageUtil { "base64Decoder", "knoraIdUtil", "standoffLinkTagTargetResourceIris", - "knoraSettings", - "featureFactoryConfig" + "knoraSettings" ) /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala index e769f50f27..fea1edec85 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala @@ -12,7 +12,6 @@ import com.typesafe.scalalogging.LazyLogging import org.knora.webapi.IRI import dsp.errors.BadRequestException import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter @@ -725,7 +724,6 @@ object PermissionUtilADM extends LazyLogging { * Given a permission literal, checks that it refers to valid permissions and groups. * * @param permissionLiteral the permission literal. - * @param featureFactoryConfig the feature factory configuration. * @param responderManager a reference to the responder manager. * @param timeout a timeout for `ask` messages. * @param executionContext an execution context for futures. @@ -733,7 +731,6 @@ object PermissionUtilADM extends LazyLogging { */ def validatePermissions( permissionLiteral: String, - featureFactoryConfig: FeatureFactoryConfig, appActor: ActorRef )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[String] = { val stringFormatter = StringFormatter.getGeneralInstance @@ -764,7 +761,6 @@ object PermissionUtilADM extends LazyLogging { .ask( MultipleGroupsGetRequestADM( groupIris = validatedProjectSpecificGroupIris, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/ResponderData.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/ResponderData.scala index 27ba9f8d28..080f86b846 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/ResponderData.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/ResponderData.scala @@ -8,7 +8,7 @@ package org.knora.webapi.messages.util import akka.actor.ActorRef import akka.actor.ActorSystem import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.cache.settings.CacheServiceSettings /** * Data needed to be passed to each responder. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala index b11a8eb029..31b7723b1f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala @@ -11,7 +11,6 @@ import akka.pattern.ask import akka.util.Timeout import org.knora.webapi.IRI import dsp.errors.ForbiddenException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages._ @@ -32,14 +31,12 @@ object UserUtilADM { * @param requestingUser the requesting user. * @param requestedUserIri the IRI of the requested user. * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @return a [[UserADM]] representing the requested user. */ def switchToUser( requestingUser: UserADM, requestedUserIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, appActor: ActorRef )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UserADM] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -60,7 +57,6 @@ object UserUtilADM { UserGetRequestADM( identifier = UserIdentifierADM(maybeIri = Some(requestedUserIri)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/ValueUtilV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/ValueUtilV1.scala index 5f7e0517b3..0c48059965 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/ValueUtilV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/ValueUtilV1.scala @@ -12,7 +12,6 @@ import org.knora.webapi._ import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotImplementedException import dsp.errors.OntologyConstraintException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -44,21 +43,18 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * * @param valueProps a [[GroupedProps.ValueProps]] resulting from querying the `Value`, in which the keys are RDF predicates, * and the values are lists of the objects of each predicate. - * @param featureFactoryConfig the feature factory configuration. * @return a [[ApiValueV1]] representing the `Value`. */ def makeValueV1( valueProps: ValueProps, projectShortcode: String, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ApiValueV1] = { val valueTypeIri = valueProps.literalData(OntologyConstants.Rdf.Type).literals.head valueTypeIri match { - case OntologyConstants.KnoraBase.TextValue => - makeTextValue(valueProps, appActor, featureFactoryConfig, userProfile) + case OntologyConstants.KnoraBase.TextValue => makeTextValue(valueProps, appActor, userProfile) case OntologyConstants.KnoraBase.IntValue => makeIntValue(valueProps, appActor, userProfile) case OntologyConstants.KnoraBase.DecimalValue => makeDecimalValue(valueProps, appActor, userProfile) case OntologyConstants.KnoraBase.BooleanValue => makeBooleanValue(valueProps, appActor, userProfile) @@ -709,7 +705,6 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @param utf8str the string representation. * @param valueProps the properties of the TextValue with standoff. * @param responderManager the responder manager. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the client that is making the request. * @return a [[TextValueWithStandoffV1]]. */ @@ -718,7 +713,6 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { language: Option[String] = None, valueProps: ValueProps, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TextValueWithStandoffV1] = { @@ -741,7 +735,6 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { .ask( GetMappingRequestV2( mappingIri = mappingIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) @@ -785,13 +778,11 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * Converts a [[ValueProps]] into a [[TextValueV1]]. * * @param valueProps a [[ValueProps]] representing the SPARQL query results to be converted. - * @param featureFactoryConfig the feature factory configuration. * @return a [[TextValueV1]]. */ private def makeTextValue( valueProps: ValueProps, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ApiValueV1] = { @@ -811,7 +802,6 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { language = valueHasLanguage, valueProps = valueProps, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala index 414b65d6b2..f19c9ffbc0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala @@ -6,16 +6,13 @@ package org.knora.webapi.messages.util.rdf import dsp.errors.AssertionException -import org.knora.webapi.feature.FeatureFactory -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.util.rdf.jenaimpl._ -import org.knora.webapi.messages.util.rdf.rdf4jimpl._ import org.knora.webapi.settings.KnoraSettingsImpl /** * A feature factory that creates RDF processing tools. */ -object RdfFeatureFactory extends FeatureFactory { +object RdfFeatureFactory { /** * The name of the feature toggle that enables the Jena implementation of the RDF façade. @@ -28,12 +25,6 @@ object RdfFeatureFactory extends FeatureFactory { private val jenaFormatUtil = new JenaFormatUtil(modelFactory = jenaModelFactory, nodeFactory = jenaNodeFactory) private var jenaShaclValidator: Option[JenaShaclValidator] = None - // RDF4J singletons. - private val rdf4jNodeFactory = new RDF4JNodeFactory - private val rdf4jModelFactory = new RDF4JModelFactory(rdf4jNodeFactory) - private val rdf4jFormatUtil = new RDF4JFormatUtil(modelFactory = rdf4jModelFactory, nodeFactory = rdf4jNodeFactory) - private var rdf4jShaclValidator: Option[RDF4JShaclValidator] = None - /** * Initialises the [[RdfFeatureFactory]]. This method must be called once, on application startup. * @@ -49,62 +40,32 @@ object RdfFeatureFactory extends FeatureFactory { nodeFactory = jenaNodeFactory ) ) - - rdf4jShaclValidator = Some( - new RDF4JShaclValidator( - baseDir = settings.shaclShapesDir, - rdfFormatUtil = rdf4jFormatUtil, - nodeFactory = rdf4jNodeFactory - ) - ) } /** * Returns an [[RdfModelFactory]]. * - * @param featureFactoryConfig the feature factory configuration. * @return an [[RdfModelFactory]]. */ - def getRdfModelFactory(featureFactoryConfig: FeatureFactoryConfig): RdfModelFactory = - if (featureFactoryConfig.getToggle(JENA_TOGGLE_NAME).isEnabled) { - jenaModelFactory - } else { - rdf4jModelFactory - } + def getRdfModelFactory(): RdfModelFactory = jenaModelFactory /** * Returns an [[RdfNodeFactory]]. * - * @param featureFactoryConfig the feature factory configuration. * @return an [[RdfNodeFactory]]. */ - def getRdfNodeFactory(featureFactoryConfig: FeatureFactoryConfig): RdfNodeFactory = - if (featureFactoryConfig.getToggle(JENA_TOGGLE_NAME).isEnabled) { - jenaNodeFactory - } else { - rdf4jNodeFactory - } + def getRdfNodeFactory(): RdfNodeFactory = jenaNodeFactory /** * Returns an [[RdfFormatUtil]]. * - * @param featureFactoryConfig the feature factory configuration. * @return an [[RdfFormatUtil]]. */ - def getRdfFormatUtil(featureFactoryConfig: FeatureFactoryConfig): RdfFormatUtil = - if (featureFactoryConfig.getToggle(JENA_TOGGLE_NAME).isEnabled) { - jenaFormatUtil - } else { - rdf4jFormatUtil - } + def getRdfFormatUtil(): RdfFormatUtil = jenaFormatUtil - def getShaclValidator(featureFactoryConfig: FeatureFactoryConfig): ShaclValidator = { + def getShaclValidator(): ShaclValidator = { def notInitialised: Nothing = throw AssertionException("RdfFeatureFactory has not been initialised") - if (featureFactoryConfig.getToggle(JENA_TOGGLE_NAME).isEnabled) { - jenaShaclValidator.getOrElse(notInitialised) - } else { - rdf4jShaclValidator.getOrElse(notInitialised) - } + jenaShaclValidator.getOrElse(notInitialised) } } diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala index 28bf1fbaaa..38f7974401 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala @@ -23,6 +23,8 @@ import scala.util.Failure import scala.util.Success import scala.util.Try +import zio._ + /** * A trait for supported RDF formats. */ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala index b3b520e4b2..d2d1965027 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala @@ -7,7 +7,6 @@ package org.knora.webapi.messages.util.rdf.jenaimpl import org.apache.jena import org.knora.webapi.IRI -import org.knora.webapi.feature.Feature import org.knora.webapi.messages.util.rdf._ import java.io.InputStream @@ -62,8 +61,7 @@ class StreamRDFAsStreamProcessor(streamRDF: jena.riot.system.StreamRDF) extends * An implementation of [[RdfFormatUtil]] that uses the Jena API. */ class JenaFormatUtil(private val modelFactory: JenaModelFactory, private val nodeFactory: JenaNodeFactory) - extends RdfFormatUtil - with Feature { + extends RdfFormatUtil { override def getRdfModelFactory: RdfModelFactory = modelFactory override def getRdfNodeFactory: RdfNodeFactory = nodeFactory diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala index d70239217a..b63b96eb3c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala @@ -8,7 +8,6 @@ package org.knora.webapi.messages.util.rdf.jenaimpl import org.apache.jena import org.knora.webapi.IRI import dsp.errors.RdfProcessingException -import org.knora.webapi.feature.Feature import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.ErrorHandlingMap import org.knora.webapi.messages.util.rdf._ @@ -157,8 +156,7 @@ abstract class JenaContextFactory { */ class JenaModel(private val dataset: jena.query.Dataset, private val nodeFactory: JenaNodeFactory) extends JenaContextFactory - with RdfModel - with Feature { + with RdfModel { import JenaConversions._ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala deleted file mode 100644 index 935e7296a0..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.messages.util.rdf.rdf4jimpl - -import org.eclipse.rdf4j -import org.knora.webapi.IRI -import org.knora.webapi.feature.Feature -import org.knora.webapi.messages.util.rdf._ - -import java.io.InputStream -import java.io.OutputStream -import java.io.StringReader -import java.io.StringWriter -import scala.util.Failure -import scala.util.Success -import scala.util.Try - -/** - * Wraps an [[RdfStreamProcessor]] in an [[rdf4j.rio.RDFHandler]]. - */ -class StreamProcessorAsRDFHandler(streamProcessor: RdfStreamProcessor) extends rdf4j.rio.RDFHandler { - override def startRDF(): Unit = streamProcessor.start() - - override def endRDF(): Unit = streamProcessor.finish() - - override def handleNamespace(prefix: String, namespace: String): Unit = - streamProcessor.processNamespace(prefix, namespace) - - override def handleStatement(statement: rdf4j.model.Statement): Unit = - streamProcessor.processStatement(RDF4JStatement(statement)) - - override def handleComment(comment: String): Unit = {} -} - -/** - * Wraps an [[rdf4j.rio.RDFHandler]] in an [[RdfStreamProcessor]]. - */ -class RDFHandlerAsStreamProcessor(rdfWriter: rdf4j.rio.RDFHandler) extends RdfStreamProcessor { - - import RDF4JConversions._ - - override def start(): Unit = rdfWriter.startRDF() - - override def processNamespace(prefix: String, namespace: IRI): Unit = - rdfWriter.handleNamespace(prefix, namespace) - - override def processStatement(statement: Statement): Unit = - rdfWriter.handleStatement(statement.asRDF4JStatement) - - override def finish(): Unit = rdfWriter.endRDF() -} - -/** - * An implementation of [[RdfFormatUtil]] that uses the RDF4J API. - */ -class RDF4JFormatUtil(private val modelFactory: RDF4JModelFactory, private val nodeFactory: RDF4JNodeFactory) - extends RdfFormatUtil - with Feature { - override def getRdfModelFactory: RdfModelFactory = modelFactory - - override def getRdfNodeFactory: RdfNodeFactory = nodeFactory - - private def rdfFormatToRDF4JFormat(rdfFormat: NonJsonLD): rdf4j.rio.RDFFormat = - rdfFormat match { - case Turtle => rdf4j.rio.RDFFormat.TURTLE - case TriG => rdf4j.rio.RDFFormat.TRIG - case RdfXml => rdf4j.rio.RDFFormat.RDFXML - case NQuads => rdf4j.rio.RDFFormat.NQUADS - } - - override def parseNonJsonLDToRdfModel(rdfStr: String, rdfFormat: NonJsonLD): RdfModel = - new RDF4JModel( - model = rdf4j.rio.Rio.parse( - new StringReader(rdfStr), - "", - rdfFormatToRDF4JFormat(rdfFormat) - ), - nodeFactory = nodeFactory - ) - - override def formatNonJsonLD(rdfModel: RdfModel, rdfFormat: NonJsonLD, prettyPrint: Boolean): String = { - import RDF4JConversions._ - - val stringWriter = new StringWriter - val rdfWriter: rdf4j.rio.RDFWriter = rdf4j.rio.Rio.createWriter(rdfFormatToRDF4JFormat(rdfFormat), stringWriter) - - if (prettyPrint && rdfFormat.supportsPrettyPrinting) { - rdfWriter.getWriterConfig - .set[java.lang.Boolean](rdf4j.rio.helpers.BasicWriterSettings.INLINE_BLANK_NODES, true) - .set[java.lang.Boolean](rdf4j.rio.helpers.BasicWriterSettings.PRETTY_PRINT, prettyPrint) - } - - // Format the RDF. - rdf4j.rio.Rio.write(rdfModel.asRDF4JModel, rdfWriter) - stringWriter.toString - } - - override def parseWithStreamProcessor( - rdfSource: RdfSource, - rdfFormat: NonJsonLD, - rdfStreamProcessor: RdfStreamProcessor - ): Unit = { - // Construct an RDF4J parser for the requested format. - val parser: rdf4j.rio.RDFParser = rdf4j.rio.Rio.createParser(rdfFormatToRDF4JFormat(rdfFormat)) - - // Wrap the RdfStreamProcessor in a StreamProcessorAsRDFHandler and set it as the parser's RDFHandler. - parser.setRDFHandler(new StreamProcessorAsRDFHandler(rdfStreamProcessor)) - - val parseTry: Try[Unit] = Try { - // Parse from the input source. - rdfSource match { - case RdfStringSource(rdfStr) => parser.parse(new StringReader(rdfStr), "") - case RdfInputStreamSource(inputStream) => parser.parse(inputStream, "") - } - } - - rdfSource match { - case RdfInputStreamSource(inputStream) => inputStream.close() - case _ => () - } - - parseTry match { - case Success(_) => () - case Failure(ex) => throw ex - } - } - - override def inputStreamToRdfModel(inputStream: InputStream, rdfFormat: NonJsonLD): RdfModel = { - val parseTry: Try[RdfModel] = Try { - val model: rdf4j.model.Model = rdf4j.rio.Rio.parse( - inputStream, - "", - rdfFormatToRDF4JFormat(rdfFormat) - ) - - new RDF4JModel( - model = model, - nodeFactory = nodeFactory - ) - } - - inputStream.close() - parseTry.get - } - - override def makeFormattingStreamProcessor(outputStream: OutputStream, rdfFormat: NonJsonLD): RdfStreamProcessor = { - // Construct an RDF4J writer for the requested format. - val rdfWriter: rdf4j.rio.RDFWriter = rdf4j.rio.Rio.createWriter(rdfFormatToRDF4JFormat(rdfFormat), outputStream) - - // Wrap it in an RDFHandlerAsStreamProcessor. - new RDFHandlerAsStreamProcessor(rdfWriter) - } - - override def rdfModelToOutputStream(rdfModel: RdfModel, outputStream: OutputStream, rdfFormat: NonJsonLD): Unit = { - import RDF4JConversions._ - - val formatTry: Try[Unit] = Try { - // Construct an RDF4J writer for the requested format. - val rdfWriter: rdf4j.rio.RDFWriter = rdf4j.rio.Rio.createWriter(rdfFormatToRDF4JFormat(rdfFormat), outputStream) - - // Format the RDF. - rdf4j.rio.Rio.write(rdfModel.asRDF4JModel, rdfWriter) - } - - outputStream.close() - - formatTry match { - case Success(_) => () - case Failure(ex) => throw ex - } - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala deleted file mode 100644 index b296d17945..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.messages.util.rdf.rdf4jimpl - -import org.eclipse.rdf4j -import org.knora.webapi.IRI -import dsp.errors.RdfProcessingException -import org.knora.webapi.feature.Feature -import org.knora.webapi.messages.util.ErrorHandlingMap -import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.util.JavaUtil._ - -import scala.collection.mutable.ArrayBuffer -import scala.jdk.CollectionConverters._ - -sealed trait RDF4JNode extends RdfNode { - def rdf4jValue: rdf4j.model.Value - - override def stringValue: String = rdf4jValue.stringValue -} - -sealed trait RDF4JResource extends RDF4JNode with RdfResource { - def resource: rdf4j.model.Resource - - override def rdf4jValue: rdf4j.model.Value = resource -} - -object RDF4JResource { - def fromRDF4J(resource: rdf4j.model.Resource): RDF4JResource = - resource match { - case iri: rdf4j.model.IRI => RDF4JIriNode(iri) - case blankNode: rdf4j.model.BNode => RDF4JBlankNode(blankNode) - case other => throw RdfProcessingException(s"Unexpected resource: $other") - } -} - -case class RDF4JBlankNode(resource: rdf4j.model.BNode) extends RDF4JResource with BlankNode { - override def id: String = resource.getID -} - -case class RDF4JIriNode(resource: rdf4j.model.IRI) extends RDF4JResource with IriNode { - override def iri: IRI = resource.stringValue -} - -sealed trait RDF4JLiteral extends RDF4JNode with RdfLiteral { - def literal: rdf4j.model.Literal - - override def rdf4jValue: rdf4j.model.Value = literal -} - -case class RDF4JDatatypeLiteral(literal: rdf4j.model.Literal) extends RDF4JLiteral with DatatypeLiteral { - override def value: String = literal.getLabel - - override def datatype: IRI = literal.getDatatype.stringValue -} - -case class RDF4JStringWithLanguage(literal: rdf4j.model.Literal) extends RDF4JLiteral with StringWithLanguage { - override def value: String = literal.getLabel - - override def language: String = - literal.getLanguage.toOption.getOrElse(throw RdfProcessingException(s"Literal $literal has no language tag")) -} - -case class RDF4JStatement(statement: rdf4j.model.Statement) extends Statement { - override def subj: RdfResource = - statement.getSubject match { - case resource: rdf4j.model.Resource => RDF4JResource.fromRDF4J(resource) - case other => throw RdfProcessingException(s"Unexpected statement subject: $other") - } - - override def pred: IriNode = RDF4JIriNode(statement.getPredicate) - - override def obj: RdfNode = - statement.getObject match { - case resource: rdf4j.model.Resource => RDF4JResource.fromRDF4J(resource) - - case literal: rdf4j.model.Literal => - if (literal.getLanguage.toOption.isDefined) { - RDF4JStringWithLanguage(literal) - } else { - RDF4JDatatypeLiteral(literal) - } - - case other => throw RdfProcessingException(s"Unexpected statement object: $other") - } - - override def context: Option[IRI] = Option(statement.getContext).map(_.stringValue) -} - -/** - * Provides extension methods for converting between Knora RDF API classes and RDF4J classes - * (see [[https://docs.scala-lang.org/overviews/core/value-classes.html#extension-methods Extension Methods]]). - */ -object RDF4JConversions { - - implicit class ConvertibleRDF4JResource(val self: RdfResource) extends AnyVal { - def asRDF4JResource: rdf4j.model.Resource = - self match { - case rdf4jResource: RDF4JResource => rdf4jResource.resource - case other => throw RdfProcessingException(s"$other is not a RDF4J resource") - } - } - - implicit class ConvertibleRDF4JIri(val self: IriNode) extends AnyVal { - def asRDF4JIri: rdf4j.model.IRI = - self match { - case rdf4jIriNode: RDF4JIriNode => rdf4jIriNode.resource - case other => throw RdfProcessingException(s"$other is not an RDF4J IRI") - } - } - - implicit class ConvertibleRDF4JValue(val self: RdfNode) extends AnyVal { - def asRDF4JValue: rdf4j.model.Value = - self match { - case rdf4jResource: RDF4JNode => rdf4jResource.rdf4jValue - case other => throw RdfProcessingException(s"$other is not an RDF4J value") - } - } - - implicit class ConvertibleRDF4JStatement(val self: Statement) extends AnyVal { - def asRDF4JStatement: rdf4j.model.Statement = - self match { - case rdf4JStatement: RDF4JStatement => rdf4JStatement.statement - case other => throw RdfProcessingException(s"$other is not an RDF4J statement") - } - } - - implicit class ConvertibleRDF4JModel(val self: RdfModel) extends AnyVal { - def asRDF4JModel: rdf4j.model.Model = - self match { - case rdf4JModel: RDF4JModel => rdf4JModel.getModel - case other => throw RdfProcessingException(s"${other.getClass.getName} is not an RDF4J model") - } - } - -} - -/** - * An implementation of [[RdfModel]] that wraps an [[rdf4j.model.Model]]. - * - * @param model the underlying RDF4J model. - */ -class RDF4JModel(private val model: rdf4j.model.Model, private val nodeFactory: RDF4JNodeFactory) - extends RdfModel - with Feature { - - import RDF4JConversions._ - - private val valueFactory: rdf4j.model.ValueFactory = rdf4j.model.impl.SimpleValueFactory.getInstance - - private class StatementIterator(rdf4jIterator: java.util.Iterator[rdf4j.model.Statement]) - extends Iterator[Statement] { - override def hasNext: Boolean = rdf4jIterator.hasNext - - override def next(): Statement = RDF4JStatement(rdf4jIterator.next()) - } - - /** - * Returns the underlying [[rdf4j.model.Model]]. - */ - def getModel: rdf4j.model.Model = model - - override def getNodeFactory: RdfNodeFactory = nodeFactory - - override def addStatement(statement: Statement): Unit = - model.add(statement.asRDF4JStatement) - - override def add(subj: RdfResource, pred: IriNode, obj: RdfNode, context: Option[IRI] = None): Unit = - context match { - case Some(definedContext) => - model.add( - subj.asRDF4JResource, - pred.asRDF4JIri, - obj.asRDF4JValue, - valueFactory.createIRI(definedContext) - ) - - case None => - model.add( - subj.asRDF4JResource, - pred.asRDF4JIri, - obj.asRDF4JValue - ) - } - - override def remove( - subj: Option[RdfResource], - pred: Option[IriNode], - obj: Option[RdfNode], - context: Option[IRI] = None - ): Unit = - context match { - case Some(definedContext) => - model.remove( - subj.map(_.asRDF4JResource).orNull, - pred.map(_.asRDF4JIri).orNull, - obj.map(_.asRDF4JValue).orNull, - valueFactory.createIRI(definedContext) - ) - - case None => - model.remove( - subj.map(_.asRDF4JResource).orNull, - pred.map(_.asRDF4JIri).orNull, - obj.map(_.asRDF4JValue).orNull - ) - } - - override def removeStatement(statement: Statement): Unit = - model.remove( - statement.subj.asRDF4JResource, - statement.pred.asRDF4JIri, - statement.obj.asRDF4JValue, - statement.context.map(definedContext => valueFactory.createIRI(definedContext)).orNull - ) - - override def find( - subj: Option[RdfResource], - pred: Option[IriNode], - obj: Option[RdfNode], - context: Option[IRI] = None - ): Iterator[Statement] = { - val filteredModel: rdf4j.model.Model = context match { - case Some(definedContext) => - model.filter( - subj.map(_.asRDF4JResource).orNull, - pred.map(_.asRDF4JIri).orNull, - obj.map(_.asRDF4JValue).orNull, - valueFactory.createIRI(definedContext) - ) - - case None => - model.filter( - subj.map(_.asRDF4JResource).orNull, - pred.map(_.asRDF4JIri).orNull, - obj.map(_.asRDF4JValue).orNull - ) - } - - new StatementIterator(filteredModel.iterator) - } - - override def contains(statement: Statement): Boolean = - model.contains( - statement.subj.asRDF4JResource, - statement.pred.asRDF4JIri, - statement.obj.asRDF4JValue, - statement.context.map(definedContext => valueFactory.createIRI(definedContext)).orNull - ) - - override def setNamespace(prefix: String, namespace: IRI): Unit = - model.setNamespace(new rdf4j.model.impl.SimpleNamespace(prefix, namespace)) - - override def getNamespaces: Map[String, IRI] = - model.getNamespaces.asScala.map { namespace: rdf4j.model.Namespace => - namespace.getPrefix -> namespace.getName - }.toMap - - override def isEmpty: Boolean = model.isEmpty - - override def getSubjects: Set[RdfResource] = - model.subjects.asScala.toSet.map(resource => RDF4JResource.fromRDF4J(resource)) - - override def isIsomorphicWith(otherRdfModel: RdfModel): Boolean = - model == otherRdfModel.asRDF4JModel - - override def getContexts: Set[IRI] = - model.contexts.asScala.toSet.filter(_ != null).map { context: rdf4j.model.Resource => - context.stringValue - } - - override def asRepository: RdfRepository = - new RDF4JRepository(model) - - override def size: Int = model.size - - override def iterator: Iterator[Statement] = - new StatementIterator(model.iterator) - - override def clear(): Unit = - model.remove(null, null, null) -} - -/** - * An implementation of [[RdfNodeFactory]] that creates RDF4J node implementation wrappers. - */ -class RDF4JNodeFactory extends RdfNodeFactory { - - import RDF4JConversions._ - - private val valueFactory: rdf4j.model.ValueFactory = rdf4j.model.impl.SimpleValueFactory.getInstance - - override def makeBlankNode: BlankNode = - RDF4JBlankNode(valueFactory.createBNode) - - override def makeBlankNodeWithID(id: String): BlankNode = - RDF4JBlankNode(valueFactory.createBNode(id)) - - override def makeIriNode(iri: IRI): IriNode = - RDF4JIriNode(valueFactory.createIRI(iri)) - - override def makeDatatypeLiteral(value: String, datatype: IRI): DatatypeLiteral = - RDF4JDatatypeLiteral(valueFactory.createLiteral(value, valueFactory.createIRI(datatype))) - - override def makeStringWithLanguage(value: String, language: String): StringWithLanguage = - RDF4JStringWithLanguage(valueFactory.createLiteral(value, language)) - - override def makeStatement(subj: RdfResource, pred: IriNode, obj: RdfNode, context: Option[IRI]): Statement = { - val statement: rdf4j.model.Statement = context match { - case Some(definedContext) => - valueFactory.createStatement( - subj.asRDF4JResource, - pred.asRDF4JIri, - obj.asRDF4JValue, - valueFactory.createIRI(definedContext) - ) - - case None => - valueFactory.createStatement( - subj.asRDF4JResource, - pred.asRDF4JIri, - obj.asRDF4JValue - ) - } - - RDF4JStatement(statement) - } -} - -/** - * A factory for creating instances of [[RDF4JModel]]. - */ -class RDF4JModelFactory(private val nodeFactory: RDF4JNodeFactory) extends RdfModelFactory { - override def makeEmptyModel: RDF4JModel = new RDF4JModel( - model = new rdf4j.model.impl.LinkedHashModel, - nodeFactory = nodeFactory - ) -} - -/** - * An [[RdfRepository]] that wraps an [[rdf4j.model.Model]] in an [[rdf4j.repository.sail.SailRepository]]. - * - * @param model the model to be queried. - */ -class RDF4JRepository(model: rdf4j.model.Model) extends RdfRepository { - // Construct an in-memory SailRepository containing the model. - val repository = new rdf4j.repository.sail.SailRepository(new rdf4j.sail.memory.MemoryStore()) - repository.init() - val connection: rdf4j.repository.sail.SailRepositoryConnection = repository.getConnection - connection.add(model) - connection.close() - - override def doSelect(selectQuery: String): SparqlSelectResult = { - // Run the query. - - val connection = repository.getConnection - val tupleQuery: rdf4j.query.TupleQuery = connection.prepareTupleQuery(selectQuery) - val tupleQueryResult: rdf4j.query.TupleQueryResult = tupleQuery.evaluate - - // Convert the query result to a SparqlSelectResponse. - - val header = SparqlSelectResultHeader(tupleQueryResult.getBindingNames.asScala.toSeq) - val rowBuffer = ArrayBuffer.empty[VariableResultsRow] - - while (tupleQueryResult.hasNext) { - val bindings: Iterable[rdf4j.query.Binding] = tupleQueryResult.next.asScala - - val rowMap: Map[String, String] = bindings.map { binding => - binding.getName -> binding.getValue.stringValue - }.toMap - - rowBuffer.append( - VariableResultsRow( - new ErrorHandlingMap[String, String]( - rowMap, - { key: String => - s"No value found for SPARQL query variable '$key' in query result row" - } - ) - ) - ) - } - - tupleQueryResult.close() - connection.close() - - SparqlSelectResult( - head = header, - results = SparqlSelectResultBody(bindings = rowBuffer.toSeq) - ) - } - - override def shutDown(): Unit = - repository.shutDown() -} diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala deleted file mode 100644 index d56a5298ef..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.messages.util.rdf.rdf4jimpl - -import org.eclipse.rdf4j -import org.knora.webapi.messages.util.rdf._ - -import java.nio.file.Path -import scala.util.Failure -import scala.util.Success -import scala.util.Try - -/** - * Performs SHACL validation using RDF4J. - * - * @param baseDir the base directory that SHACL graphs are loaded from. - * @param rdfFormatUtil an [[RdfFormatUtil]]. - * @param nodeFactory an [[RDF4JNodeFactory]]. - */ -class RDF4JShaclValidator(baseDir: Path, rdfFormatUtil: RDF4JFormatUtil, private val nodeFactory: RDF4JNodeFactory) - extends AbstractShaclValidator[rdf4j.model.Model](baseDir, rdfFormatUtil) { - - import RDF4JConversions._ - - override def validateWithShaclGraph(rdfModel: RdfModel, shaclGraph: rdf4j.model.Model): ShaclValidationResult = { - // Make a SailRepository repository that supports SHACL validation. - val shaclSail = new rdf4j.sail.shacl.ShaclSail(new rdf4j.sail.memory.MemoryStore()) - val repository = new rdf4j.repository.sail.SailRepository(shaclSail) - - // Open a connection to the repository and begin a transaction. - val connection: rdf4j.repository.sail.SailRepositoryConnection = repository.getConnection - connection.begin() - - // Add the graph of SHACL shapes. - connection.add(shaclGraph, rdf4j.model.vocabulary.RDF4J.SHACL_SHAPE_GRAPH) - - // Add the default graph of the input model to be validated. - connection.add(rdfModel.asRDF4JModel.filter(null, null, null, null)) - - // Commit the transaction to validate the data. - val validationTry: Try[ShaclValidationResult] = Try { - connection.commit() - ShaclValidationSuccess - } - - // Was an exception thrown? - val validationResultTry: Try[ShaclValidationResult] = validationTry.recoverWith { - // Yes. Was it because the data didn't pass validation? - case repositoryException: rdf4j.repository.RepositoryException => - Option(repositoryException.getCause) match { - case Some(cause: Throwable) => - cause match { - case shaclValidationException: rdf4j.sail.shacl.ShaclSailValidationException => - // Yes. Convert the validation report to an RdfModel and return it. - Success( - ShaclValidationFailure( - new RDF4JModel( - model = shaclValidationException.validationReportAsModel, - nodeFactory = nodeFactory - ) - ) - ) - - case _ => - // No, it was for some other reason. - Failure(repositoryException) - } - - case None => - // No, it was for some other reason. - Failure(repositoryException) - } - - case other: Throwable => - // No, it was for some other reason. - Failure(other) - - } - - connection.close() - repository.shutDown() - validationResultTry.get - } - - override protected def rdfModelToShaclGraph(rdfModel: RdfModel): rdf4j.model.Model = - rdfModel.asRDF4JModel -} diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala index 1b96e43a22..1015219e46 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala @@ -6,9 +6,6 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import org.knora.webapi.ApiV2Schema -import org.knora.webapi.feature.Feature -import org.knora.webapi.feature.FeatureFactory -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.search._ @@ -41,7 +38,7 @@ abstract class GravsearchQueryOptimisationFeature( /** * A feature factory that constructs Gravsearch query optimisation algorithms. */ -object GravsearchQueryOptimisationFactory extends FeatureFactory { +object GravsearchQueryOptimisationFactory { /** * Returns a [[GravsearchQueryOptimisationFeature]] implementing one or more optimisations, depending @@ -49,34 +46,25 @@ object GravsearchQueryOptimisationFactory extends FeatureFactory { * * @param typeInspectionResult the type inspection result. * @param querySchema the query schema. - * @param featureFactoryConfig the feature factory configuration. * @return a [[GravsearchQueryOptimisationFeature]] implementing one or more optimisations. */ def getGravsearchQueryOptimisationFeature( typeInspectionResult: GravsearchTypeInspectionResult, - querySchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig + querySchema: ApiV2Schema ): GravsearchQueryOptimisationFeature = new GravsearchQueryOptimisationFeature( typeInspectionResult: GravsearchTypeInspectionResult, querySchema: ApiV2Schema ) { override def optimiseQueryPatterns(patterns: Seq[QueryPattern]): Seq[QueryPattern] = - if (featureFactoryConfig.getToggle("gravsearch-dependency-optimisation").isEnabled) { - new ReorderPatternsByDependencyOptimisationFeature(typeInspectionResult, querySchema).optimiseQueryPatterns( - new RemoveEntitiesInferredFromPropertyOptimisationFeature(typeInspectionResult, querySchema) - .optimiseQueryPatterns( - new RemoveRedundantKnoraApiResourceOptimisationFeature(typeInspectionResult, querySchema) - .optimiseQueryPatterns(patterns) - ) - ) - } else { + new ReorderPatternsByDependencyOptimisationFeature(typeInspectionResult, querySchema).optimiseQueryPatterns( new RemoveEntitiesInferredFromPropertyOptimisationFeature(typeInspectionResult, querySchema) .optimiseQueryPatterns( new RemoveRedundantKnoraApiResourceOptimisationFeature(typeInspectionResult, querySchema) .optimiseQueryPatterns(patterns) ) - } + ) + } } @@ -90,8 +78,7 @@ object GravsearchQueryOptimisationFactory extends FeatureFactory { class RemoveRedundantKnoraApiResourceOptimisationFeature( typeInspectionResult: GravsearchTypeInspectionResult, querySchema: ApiV2Schema -) extends GravsearchQueryOptimisationFeature(typeInspectionResult, querySchema) - with Feature { +) extends GravsearchQueryOptimisationFeature(typeInspectionResult, querySchema) { /** * If the specified statement has rdf:type with an IRI as object, returns that IRI, otherwise None. @@ -158,8 +145,7 @@ class RemoveRedundantKnoraApiResourceOptimisationFeature( class RemoveEntitiesInferredFromPropertyOptimisationFeature( typeInspectionResult: GravsearchTypeInspectionResult, querySchema: ApiV2Schema -) extends GravsearchQueryOptimisationFeature(typeInspectionResult, querySchema) - with Feature { +) extends GravsearchQueryOptimisationFeature(typeInspectionResult, querySchema) { /** * Performs the optimisation. @@ -242,8 +228,7 @@ class RemoveEntitiesInferredFromPropertyOptimisationFeature( class ReorderPatternsByDependencyOptimisationFeature( typeInspectionResult: GravsearchTypeInspectionResult, querySchema: ApiV2Schema -) extends GravsearchQueryOptimisationFeature(typeInspectionResult, querySchema) - with Feature { +) extends GravsearchQueryOptimisationFeature(typeInspectionResult, querySchema) { /** * Converts a sequence of query patterns into DAG representing dependencies between diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformer.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformer.scala index 838ae67dc3..fe20987fc0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformer.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformer.scala @@ -6,7 +6,6 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import org.knora.webapi.ApiV2Schema -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionResult @@ -21,13 +20,11 @@ import scala.concurrent.ExecutionContext * @param constructClause the CONSTRUCT clause from the input query. * @param typeInspectionResult the result of type inspection of the input query. * @param querySchema the ontology schema used in the input query. - * @param featureFactoryConfig the feature factory configuration. */ class NonTriplestoreSpecificGravsearchToCountPrequeryTransformer( constructClause: ConstructClause, typeInspectionResult: GravsearchTypeInspectionResult, - querySchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig + querySchema: ApiV2Schema ) extends AbstractPrequeryGenerator( constructClause = constructClause, typeInspectionResult = typeInspectionResult, @@ -80,8 +77,7 @@ class NonTriplestoreSpecificGravsearchToCountPrequeryTransformer( GravsearchQueryOptimisationFactory .getGravsearchQueryOptimisationFeature( typeInspectionResult = typeInspectionResult, - querySchema = querySchema, - featureFactoryConfig = featureFactoryConfig + querySchema = querySchema ) .optimiseQueryPatterns(patterns) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformer.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformer.scala index c5dfaf069b..02f6bd6283 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformer.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformer.scala @@ -8,7 +8,6 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import org.knora.webapi._ import dsp.errors.AssertionException import dsp.errors.GravsearchException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionResult @@ -28,14 +27,12 @@ import scala.concurrent.ExecutionContext * @param typeInspectionResult the result of type inspection of the input query. * @param querySchema the ontology schema used in the input query. * @param settings application settings. - * @param featureFactoryConfig the feature factory configuration. */ class NonTriplestoreSpecificGravsearchToPrequeryTransformer( constructClause: ConstructClause, typeInspectionResult: GravsearchTypeInspectionResult, querySchema: ApiV2Schema, - settings: KnoraSettingsImpl, - featureFactoryConfig: FeatureFactoryConfig + settings: KnoraSettingsImpl ) extends AbstractPrequeryGenerator( constructClause = constructClause, typeInspectionResult = typeInspectionResult, @@ -392,8 +389,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformer( GravsearchQueryOptimisationFactory .getGravsearchQueryOptimisationFeature( typeInspectionResult = typeInspectionResult, - querySchema = querySchema, - featureFactoryConfig = featureFactoryConfig + querySchema = querySchema ) .optimiseQueryPatterns(patterns) } diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala index 33a9b4488a..c10f3fb958 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala @@ -6,7 +6,6 @@ package org.knora.webapi.messages.v1.responder.ckanmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.ResponderRequest.KnoraRequestV1 import org.knora.webapi.messages.v1.responder.KnoraResponseV1 @@ -26,14 +25,12 @@ sealed trait CkanResponderRequestV1 extends KnoraRequestV1 * @param projects * @param limit * @param info - * @param featureFactoryConfig the feature factory configuration. * @param userProfile */ case class CkanRequestV1( projects: Option[Seq[String]], limit: Option[Int], info: Boolean, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ) extends CkanResponderRequestV1 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala index bd01bab182..03ebe03ecc 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala @@ -7,7 +7,6 @@ package org.knora.webapi.messages.v1.responder.ontologymessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter @@ -34,11 +33,9 @@ sealed trait OntologyResponderRequestV1 extends KnoraRequestV1 * Requests that all ontologies in the repository are loaded. This message must be sent only once, when the application * starts, before it accepts any API requests. A successful response will be a [[LoadOntologiesResponse]]. * - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. */ -case class LoadOntologiesRequestV1(featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM) - extends OntologyResponderRequestV1 +case class LoadOntologiesRequestV1(userADM: UserADM) extends OntologyResponderRequestV1 /** * Indicates that all ontologies were loaded. @@ -168,12 +165,10 @@ case class CheckSubClassResponseV1(isSubClass: Boolean) * * @param projectIris the IRIs of the projects for which named graphs should be returned. If this set is empty, information * about all ontology named graphs is returned. - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. */ case class NamedGraphsGetRequestV1( projectIris: Set[IRI] = Set.empty[IRI], - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM ) extends OntologyResponderRequestV1 @@ -190,12 +185,10 @@ case class NamedGraphsResponseV1(vocabularies: Seq[NamedGraphV1]) extends KnoraR * Requests all resource classes that are defined in the given named graph. * * @param namedGraph the named graph for which the resource classes shall be returned. - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. */ case class ResourceTypesForNamedGraphGetRequestV1( namedGraph: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM ) extends OntologyResponderRequestV1 @@ -214,12 +207,10 @@ case class ResourceTypesForNamedGraphResponseV1(resourcetypes: Seq[ResourceTypeV * If the named graph is not set, the property types of all named graphs are requested. * * @param namedGraph the named graph to query for or None if all the named graphs should be queried. - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. */ case class PropertyTypesForNamedGraphGetRequestV1( namedGraph: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM ) extends OntologyResponderRequestV1 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala index ad8b90ac63..31df178768 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala @@ -7,7 +7,6 @@ package org.knora.webapi.messages.v1.responder.projectmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestV1 import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v1.responder.usermessages.UserProfileV1 @@ -35,32 +34,26 @@ sealed trait ProjectsResponderRequestV1 extends KnoraRequestV1 * Get all information about all projects in form of [[ProjectsResponseV1]]. The ProjectsGetRequestV1 returns either * something or a NotFound exception if there are no projects found. Administration permission checking is performed. * - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ -case class ProjectsGetRequestV1(featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1]) - extends ProjectsResponderRequestV1 +case class ProjectsGetRequestV1(userProfile: Option[UserProfileV1]) extends ProjectsResponderRequestV1 /** * Get all information about all projects in form of a sequence of [[ProjectInfoV1]]. Returns an empty sequence if * no projects are found. Administration permission checking is skipped. * - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ -case class ProjectsGetV1(featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1]) - extends ProjectsResponderRequestV1 +case class ProjectsGetV1(userProfile: Option[UserProfileV1]) extends ProjectsResponderRequestV1 /** * Get info about a single project identified through its IRI. A successful response will be a [[ProjectInfoResponseV1]]. * * @param iri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param userProfileV1 the profile of the user making the request (optional). */ case class ProjectInfoByIRIGetRequestV1( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfileV1: Option[UserProfileV1] ) extends ProjectsResponderRequestV1 @@ -68,12 +61,10 @@ case class ProjectInfoByIRIGetRequestV1( * Get info about a single project identified through its IRI. A successful response will be an [[Option[ProjectInfoV1] ]]. * * @param iri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param userProfileV1 the profile of the user making the request (optional). */ case class ProjectInfoByIRIGetV1( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfileV1: Option[UserProfileV1] ) extends ProjectsResponderRequestV1 @@ -81,12 +72,10 @@ case class ProjectInfoByIRIGetV1( * Find everything about a single project identified through its shortname. * * @param shortname of the project. - * @param featureFactoryConfig the feature factory configuration. * @param userProfileV1 the profile of the user making the request. */ case class ProjectInfoByShortnameGetRequestV1( shortname: String, - featureFactoryConfig: FeatureFactoryConfig, userProfileV1: Option[UserProfileV1] ) extends ProjectsResponderRequestV1 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala index 24f3182b23..6c4627f3f4 100755 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala @@ -11,7 +11,6 @@ import dsp.errors.BadRequestException import dsp.errors.DataConversionException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.InvalidApiJsonException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -155,24 +154,20 @@ sealed trait ResourcesResponderRequestV1 extends KnoraRequestV1 * Requests a description of a resource. A successful response will be a [[ResourceInfoResponseV1]]. * * @param iri the IRI of the resource to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ -case class ResourceInfoGetRequestV1(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM) - extends ResourcesResponderRequestV1 +case class ResourceInfoGetRequestV1(iri: IRI, userProfile: UserADM) extends ResourcesResponderRequestV1 /** * Requests a full description of a resource, along with its properties, their values, incoming references, and other * information. A successful response will be a [[ResourceFullResponseV1]]. * * @param iri the IRI of the resource to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. * @param getIncoming if `true`, information about incoming references will be included in the response. */ case class ResourceFullGetRequestV1( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM, getIncoming: Boolean = true ) extends ResourcesResponderRequestV1 @@ -181,13 +176,11 @@ case class ResourceFullGetRequestV1( * Requests a [[ResourceContextResponseV1]] describing the context of a resource (i.e. the resources that are part of it). * * @param iri the IRI of the resource to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param resinfo if `true`, the [[ResourceContextResponseV1]] will include a [[ResourceInfoV1]]. */ case class ResourceContextGetRequestV1( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, resinfo: Boolean ) extends ResourcesResponderRequestV1 @@ -196,11 +189,9 @@ case class ResourceContextGetRequestV1( * Requests the permissions for the current user on the given resource. A successful response will be a [[ResourceRightsResponseV1]]. * * @param iri the IRI of the resource to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ -case class ResourceRightsGetRequestV1(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM) - extends ResourcesResponderRequestV1 +case class ResourceRightsGetRequestV1(iri: IRI, userProfile: UserADM) extends ResourcesResponderRequestV1 /** * Requests a search for resources matching the given string. @@ -227,7 +218,6 @@ case class ResourceSearchGetRequestV1( * @param values the properties to add: type and value(s): a Map of propertyIris to ApiValueV1. * @param file a file that has been uploaded to Sipi's temporary storage and should be attached to the resource. * @param projectIri the IRI of the project the resources is added to. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the ID of the API request. */ @@ -237,7 +227,6 @@ case class ResourceCreateRequestV1( values: Map[IRI, Seq[CreateValueV1WithComment]], file: Option[FileValueV1] = None, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV1 @@ -266,14 +255,12 @@ case class OneOfMultipleResourceCreateRequestV1( * * @param resourcesToCreate the collection of requests for creation of new resources. * @param projectIri the IRI of the project the resources are added to. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the ID of the API request. */ case class MultipleResourceCreateRequestV1( resourcesToCreate: Seq[OneOfMultipleResourceCreateRequestV1], projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV1 @@ -307,13 +294,11 @@ case class OneOfMultipleResourcesCreateResponseV1(clientResourceID: String, reso * * @param resourceIri the IRI of the resource. * @param owlClass the IRI of the OWL class to compare the resource's class to. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ case class ResourceCheckClassRequestV1( resourceIri: IRI, owlClass: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ) extends ResourcesResponderRequestV1 @@ -322,14 +307,12 @@ case class ResourceCheckClassRequestV1( * * @param resourceIri the IRI of the resource to be marked as deleted. * @param deleteComment an optional comment explaining why the resource is being marked as deleted. - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. * @param apiRequestID the ID of the API request. */ case class ResourceDeleteRequestV1( resourceIri: IRI, deleteComment: Option[String], - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV1 @@ -433,10 +416,8 @@ case class ResourceCreateResponseV1( * Requests the properties of a given resource. * * @param iri the iri of the given resource. - * @param featureFactoryConfig the feature factory configuration. */ -case class PropertiesGetRequestV1(iri: IRI, featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM) - extends ResourcesResponderRequestV1 +case class PropertiesGetRequestV1(iri: IRI, userProfile: UserADM) extends ResourcesResponderRequestV1 // TODO: refactor PropertiesGetResponseV1 (https://github.com/dhlab-basel/Knora/issues/134#issue-154443186) @@ -454,14 +435,12 @@ case class PropertiesGetResponseV1(properties: PropsGetV1) extends KnoraResponse * * @param resourceIri the IRI of the resource whose label should be changed. * @param label the new value of the label. - * @param featureFactoryConfig the feature factory configuration. * @param userADM the profile of the user making the request. * @param apiRequestID the ID of the API request. */ case class ChangeResourceLabelRequestV1( resourceIri: IRI, label: String, - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV1 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala index 81caa6a368..890b8cdfe7 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala @@ -7,7 +7,6 @@ package org.knora.webapi.messages.v1.responder.standoffmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.ResponderRequest.KnoraRequestV1 import org.knora.webapi.messages.v1.responder.KnoraResponseV1 @@ -29,7 +28,6 @@ sealed trait StandoffResponderRequestV1 extends KnoraRequestV1 * @param xml the mapping in XML. * @param projectIri the IRI of the project the mapping belongs to. * @param mappingName the name of the mapping to be created. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ case class CreateMappingRequestV1( @@ -37,7 +35,6 @@ case class CreateMappingRequestV1( label: String, projectIri: IRI, mappingName: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends StandoffResponderRequestV1 @@ -55,11 +52,9 @@ case class CreateMappingResponseV1(mappingIri: IRI) extends KnoraResponseV1 { * Represents a request to get a mapping from XML elements and attributes to standoff entities. * * @param mappingIri the IRI of the mapping. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ -case class GetMappingRequestV1(mappingIri: IRI, featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM) - extends StandoffResponderRequestV1 +case class GetMappingRequestV1(mappingIri: IRI, userProfile: UserADM) extends StandoffResponderRequestV1 /** * Represents a response to a [[GetMappingRequestV1]]. @@ -78,12 +73,10 @@ case class GetMappingResponseV1( * Represents a request that gets an XSL Transformation represented by a `knora-base:XSLTransformation`. * * @param xsltTextRepresentationIri the IRI of the `knora-base:XSLTransformation`. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ case class GetXSLTransformationRequestV1( xsltTextRepresentationIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ) extends StandoffResponderRequestV1 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala index 5df27c1899..8a55b7eb06 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsADMJsonProtocol import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM import org.knora.webapi.messages.ResponderRequest.KnoraRequestV1 @@ -61,12 +60,10 @@ case class UserDataByIriGetV1(userIri: IRI, short: Boolean = true) extends Users * * @param userIri the IRI of the user to be queried. * @param userProfileType the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. */ case class UserProfileByIRIGetRequestV1( userIri: IRI, userProfileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserProfileV1 ) extends UsersResponderRequestV1 @@ -78,8 +75,7 @@ case class UserProfileByIRIGetRequestV1( */ case class UserProfileByIRIGetV1( userIri: IRI, - userProfileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig + userProfileType: UserProfileType ) extends UsersResponderRequestV1 /** @@ -87,13 +83,11 @@ case class UserProfileByIRIGetV1( * * @param email the email of the user to be queried. * @param userProfileType the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the requesting user's profile. */ case class UserProfileByEmailGetRequestV1( email: String, userProfileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserProfileV1 ) extends UsersResponderRequestV1 @@ -102,12 +96,10 @@ case class UserProfileByEmailGetRequestV1( * * @param email the email of the user to be queried. * @param userProfileType the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. */ case class UserProfileByEmailGetV1( email: String, - userProfileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig + userProfileType: UserProfileType ) extends UsersResponderRequestV1 /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala index 7de76eb34b..4d19237b4c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -215,11 +214,9 @@ sealed trait ValuesResponderRequestV1 extends KnoraRequestV1 * Represents a request for a (current) value. A successful response will be a [[ValueGetResponseV1]]. * * @param valueIri the IRI of the value requested. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ -case class ValueGetRequestV1(valueIri: IRI, featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM) - extends ValuesResponderRequestV1 +case class ValueGetRequestV1(valueIri: IRI, userProfile: UserADM) extends ValuesResponderRequestV1 /** * Represents a request for the details of a reification node describing a direct link between two resources. @@ -228,14 +225,12 @@ case class ValueGetRequestV1(valueIri: IRI, featureFactoryConfig: FeatureFactory * @param subjectIri the IRI of the resource that is the source of the link. * @param predicateIri the IRI of the property that links the two resources. * @param objectIri the IRI of the resource that is the target of the link. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ case class LinkValueGetRequestV1( subjectIri: IRI, predicateIri: IRI, objectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ) extends ValuesResponderRequestV1 @@ -295,7 +290,6 @@ case class ValueVersionHistoryGetResponseV1(valueVersions: Seq[ValueVersionV1]) * @param propertyIri the IRI of the property that should receive the value. * @param value the value to be added. * @param comment an optional comment on the value. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the ID of this API request. */ @@ -305,7 +299,6 @@ case class CreateValueRequestV1( propertyIri: IRI, value: UpdateValueV1, comment: Option[String] = None, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV1 @@ -339,13 +332,11 @@ case class UnverifiedValueV1(newValueIri: IRI, value: UpdateValueV1) * @param resourceIri the IRI of the resource in which the values should have been created. * @param unverifiedValues a [[Map]] of property IRIs to [[UnverifiedValueV1]] objects * describing the values that should have been created for each property. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. */ case class VerifyMultipleValueCreationRequestV1( resourceIri: IRI, unverifiedValues: Map[IRI, Seq[UnverifiedValueV1]], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ) extends ValuesResponderRequestV1 @@ -390,7 +381,6 @@ case class CreateValueV1WithComment(updateValueV1: UpdateValueV1, comment: Optio * @param clientResourceIDsToResourceIris a map of client resource IDs (which may appear in standoff link tags * in values) to the IRIs that will be used for those resources. * @param creationDate an xsd:dateTimeStamp that will be attached to the values. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the user that is creating the values. */ case class GenerateSparqlToCreateMultipleValuesRequestV1( @@ -401,7 +391,6 @@ case class GenerateSparqlToCreateMultipleValuesRequestV1( values: Map[IRI, Seq[CreateValueV1WithComment]], clientResourceIDsToResourceIris: Map[String, IRI], creationDate: Instant, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV1 @@ -430,7 +419,6 @@ case class GenerateSparqlToCreateMultipleValuesResponseV1( * @param valueIri the IRI of the current value. * @param value the new value, or [[None]] if only the value's comment is being changed. * @param comment an optional comment on the value. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the ID of this API request. */ @@ -438,7 +426,6 @@ case class ChangeValueRequestV1( valueIri: IRI, value: UpdateValueV1, comment: Option[String] = None, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV1 @@ -448,14 +435,12 @@ case class ChangeValueRequestV1( * * @param valueIri the IRI of the current value. * @param comment the comment to be added to the new version of the value. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the ID of this API request. */ case class ChangeCommentRequestV1( valueIri: IRI, comment: Option[String], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV1 @@ -477,14 +462,12 @@ case class ChangeValueResponseV1(value: ApiValueV1, comment: Option[String] = No * * @param valueIri the IRI of the value to be marked as deleted. * @param deleteComment an optional comment explaining why the value is being deleted. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the ID of this API request. */ case class DeleteValueRequestV1( valueIri: IRI, deleteComment: Option[String] = None, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV1 @@ -507,13 +490,11 @@ case class DeleteValueResponseV1(id: IRI) extends KnoraResponseV1 { * * @param resourceIri the resource whose files value(s) should be changed. * @param file a file that has been uploaded to Sipi's temporary storage. - * @param featureFactoryConfig the feature factory configuration. */ case class ChangeFileValueRequestV1( resourceIri: IRI, file: FileValueV1, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ) extends ValuesResponderRequestV1 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraRequestV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraRequestV2.scala index 5267bb7318..e8b61d802f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraRequestV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraRequestV2.scala @@ -8,7 +8,6 @@ package org.knora.webapi.messages.v2.responder import akka.actor.ActorRef import com.typesafe.scalalogging.Logger import akka.util.Timeout -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.RdfFeatureFactory @@ -33,9 +32,9 @@ trait KnoraRdfModelRequestV2 { /** * Returns a Turtle representation of the graph. */ - def toTurtle(featureFactoryConfig: FeatureFactoryConfig): String = + def toTurtle(): String = RdfFeatureFactory - .getRdfFormatUtil(featureFactoryConfig) + .getRdfFormatUtil() .format( rdfModel = rdfModel, rdfFormat = Turtle, @@ -57,7 +56,6 @@ trait KnoraJsonLDRequestReaderV2[C] { * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActor a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -67,7 +65,6 @@ trait KnoraJsonLDRequestReaderV2[C] { apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[C] diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraResponseV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraResponseV2.scala index ef3702e07f..1f40d11141 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraResponseV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/KnoraResponseV2.scala @@ -14,7 +14,6 @@ import org.knora.webapi.SchemaOption import org.knora.webapi.SchemaOptions import dsp.errors.AssertionException import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.util.rdf._ @@ -32,14 +31,12 @@ trait KnoraResponseV2 { * @param targetSchema the response schema. * @param schemaOptions the schema options. * @param settings the application settings. - * @param featureFactoryConfig the feature factory configuration. * @return a formatted string representing this response message. */ def format( rdfFormat: RdfFormat, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl ): String } @@ -53,7 +50,6 @@ trait KnoraJsonLDResponseV2 extends KnoraResponseV2 { rdfFormat: RdfFormat, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl ): String = { val targetApiV2Schema = targetSchema match { @@ -76,7 +72,7 @@ trait KnoraJsonLDResponseV2 extends KnoraResponseV2 { case nonJsonLD: NonJsonLD => // Some other format. Convert the JSON-LD document to an RDF model. - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() val rdfModel: RdfModel = jsonLDDocument.toRdfModel(rdfFormatUtil.getRdfModelFactory) // Convert the model to the requested format. @@ -116,7 +112,6 @@ trait KnoraTurtleResponseV2 extends KnoraResponseV2 { rdfFormat: RdfFormat, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl ): String = { if (targetSchema != InternalSchema) { @@ -131,7 +126,7 @@ trait KnoraTurtleResponseV2 extends KnoraResponseV2 { case _ => // Some other format. Parse the Turtle to an RdfModel. - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() val rdfModel: RdfModel = rdfFormatUtil.parseToRdfModel(rdfStr = turtle, rdfFormat = Turtle) // Return the model in the requested format. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/listsmessages/ListsMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/listsmessages/ListsMessagesV2.scala index 7053004f29..b0c09c816c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/listsmessages/ListsMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/listsmessages/ListsMessagesV2.scala @@ -6,7 +6,6 @@ package org.knora.webapi.messages.v2.responder.listsmessages import org.knora.webapi._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter @@ -29,11 +28,9 @@ sealed trait ListsResponderRequestV2 extends KnoraRequestV2 * Requests a list. A successful response will be a [[ListGetResponseV2]] * * @param listIri the IRI of the list (Iri of the list's root node). - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class ListGetRequestV2(listIri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ListsResponderRequestV2 +case class ListGetRequestV2(listIri: IRI, requestingUser: UserADM) extends ListsResponderRequestV2 /** * An abstract trait providing a convenience method for language handling. @@ -189,10 +186,8 @@ case class ListGetResponseV2(list: ListADM, userLang: String, fallbackLang: Stri * Requests a list node. A successful response will be a [[NodeGetResponseV2]] * * @param nodeIri the IRI of the node to retrieve. - * @param featureFactoryConfig the feature factory configuration. */ -case class NodeGetRequestV2(nodeIri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends ListsResponderRequestV2 +case class NodeGetRequestV2(nodeIri: IRI, requestingUser: UserADM) extends ListsResponderRequestV2 /** * Represents a response to a [[NodeGetRequestV2]]. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala index b2dba2e3b3..258ccac0d3 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala @@ -22,7 +22,6 @@ import dsp.errors.{ DataConversionException, InconsistentRepositoryDataException } -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -46,11 +45,9 @@ sealed trait OntologiesResponderRequestV2 extends KnoraRequestV2 { * Requests that all ontologies in the repository are loaded. This message must be sent only once, when the application * starts, before it accepts any API requests. A successful response will be a [[SuccessResponseV2]]. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ -case class LoadOntologiesRequestV2(featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends OntologiesResponderRequestV2 +case class LoadOntologiesRequestV2(requestingUser: UserADM) extends OntologiesResponderRequestV2 /** * Requests the creation of an empty ontology. A successful response will be a [[ReadOntologyV2]]. @@ -61,7 +58,6 @@ case class LoadOntologiesRequestV2(featureFactoryConfig: FeatureFactoryConfig, r * @param label the label of the ontology. * @param comment the optional comment that described the ontology to be created. * @param apiRequestID the ID of the API request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class CreateOntologyRequestV2( @@ -71,7 +67,6 @@ case class CreateOntologyRequestV2( label: String, comment: Option[String] = None, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -87,7 +82,6 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActor a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[CreateOntologyRequestV2]] representing the input. @@ -97,7 +91,6 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateOntologyRequestV2] = @@ -105,7 +98,6 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -113,7 +105,6 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): CreateOntologyRequestV2 = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -139,7 +130,6 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology label = label, comment = comment, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -149,12 +139,10 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology * Checks whether an ontology can be deleted. A successful response will be a [[CanDoResponseV2]]. * * @param ontologyIri the ontology IRI. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class CanDeleteOntologyRequestV2( ontologyIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -170,7 +158,6 @@ case class DeleteOntologyRequestV2( ontologyIri: SmartIri, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -390,7 +377,6 @@ case class CreatePropertyRequestV2( propertyInfoContent: PropertyInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -406,7 +392,6 @@ object CreatePropertyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateProperty * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[CreatePropertyRequestV2]] representing the input. @@ -416,7 +401,6 @@ object CreatePropertyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateProperty apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreatePropertyRequestV2] = @@ -424,7 +408,6 @@ object CreatePropertyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateProperty fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -432,7 +415,6 @@ object CreatePropertyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateProperty private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): CreatePropertyRequestV2 = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -475,7 +457,6 @@ object CreatePropertyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateProperty propertyInfoContent = propertyInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -493,7 +474,6 @@ case class CreateClassRequestV2( classInfoContent: ClassInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -509,7 +489,6 @@ object CreateClassRequestV2 extends KnoraJsonLDRequestReaderV2[CreateClassReques * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[CreateClassRequestV2]] representing the input. @@ -519,7 +498,6 @@ object CreateClassRequestV2 extends KnoraJsonLDRequestReaderV2[CreateClassReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateClassRequestV2] = @@ -527,7 +505,6 @@ object CreateClassRequestV2 extends KnoraJsonLDRequestReaderV2[CreateClassReques fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -535,7 +512,6 @@ object CreateClassRequestV2 extends KnoraJsonLDRequestReaderV2[CreateClassReques private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): CreateClassRequestV2 = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -557,7 +533,6 @@ object CreateClassRequestV2 extends KnoraJsonLDRequestReaderV2[CreateClassReques classInfoContent = classInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -575,7 +550,6 @@ case class AddCardinalitiesToClassRequestV2( classInfoContent: ClassInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -591,7 +565,6 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return an [[AddCardinalitiesToClassRequestV2]] representing the input. @@ -601,7 +574,6 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[AddCardinalitiesToClassRequestV2] = @@ -609,7 +581,6 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -617,7 +588,6 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): AddCardinalitiesToClassRequestV2 = { // Get the class definition and the ontology's last modification date from the JSON-LD. @@ -637,7 +607,6 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa classInfoContent = classInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -647,12 +616,10 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa * Checks whether the cardinalities of a class can be replaced. A successful response will be a [[CanDoResponseV2]]. * * @param classIri the class IRI. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class CanChangeCardinalitiesRequestV2( classIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -668,7 +635,6 @@ case class ChangeCardinalitiesRequestV2( classInfoContent: ClassInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -684,7 +650,6 @@ object ChangeCardinalitiesRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeCar * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[ChangeCardinalitiesRequestV2]] representing the input. @@ -694,7 +659,6 @@ object ChangeCardinalitiesRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeCar apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeCardinalitiesRequestV2] = @@ -702,7 +666,6 @@ object ChangeCardinalitiesRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeCar fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -710,7 +673,6 @@ object ChangeCardinalitiesRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeCar private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): ChangeCardinalitiesRequestV2 = { val inputOntologiesV2 = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -722,7 +684,6 @@ object ChangeCardinalitiesRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeCar classInfoContent = classInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -741,7 +702,6 @@ final case class CanDeleteCardinalitiesFromClassRequestV2( classInfoContent: ClassInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -758,7 +718,6 @@ object CanDeleteCardinalitiesFromClassRequestV2 * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[DeleteCardinalitiesFromClassRequestV2]] representing the input. @@ -768,7 +727,6 @@ object CanDeleteCardinalitiesFromClassRequestV2 apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CanDeleteCardinalitiesFromClassRequestV2] = @@ -776,7 +734,6 @@ object CanDeleteCardinalitiesFromClassRequestV2 fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -784,7 +741,6 @@ object CanDeleteCardinalitiesFromClassRequestV2 private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): CanDeleteCardinalitiesFromClassRequestV2 = { val inputOntology = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -796,7 +752,6 @@ object CanDeleteCardinalitiesFromClassRequestV2 classInfoContent = classInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -815,7 +770,6 @@ final case class DeleteCardinalitiesFromClassRequestV2( classInfoContent: ClassInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -831,7 +785,6 @@ object DeleteCardinalitiesFromClassRequestV2 extends KnoraJsonLDRequestReaderV2[ * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[DeleteCardinalitiesFromClassRequestV2]] representing the input. @@ -841,7 +794,6 @@ object DeleteCardinalitiesFromClassRequestV2 extends KnoraJsonLDRequestReaderV2[ apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteCardinalitiesFromClassRequestV2] = @@ -849,7 +801,6 @@ object DeleteCardinalitiesFromClassRequestV2 extends KnoraJsonLDRequestReaderV2[ fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -857,7 +808,6 @@ object DeleteCardinalitiesFromClassRequestV2 extends KnoraJsonLDRequestReaderV2[ private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): DeleteCardinalitiesFromClassRequestV2 = { val inputOntology = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -869,7 +819,6 @@ object DeleteCardinalitiesFromClassRequestV2 extends KnoraJsonLDRequestReaderV2[ classInfoContent = classInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -887,7 +836,6 @@ case class DeleteClassRequestV2( classIri: SmartIri, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -895,12 +843,10 @@ case class DeleteClassRequestV2( * Asks whether a class can be deleted. A successful response will be a [[CanDoResponseV2]]. * * @param classIri the IRI of the class to be deleted. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class CanDeleteClassRequestV2( classIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -916,7 +862,6 @@ case class DeletePropertyRequestV2( propertyIri: SmartIri, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -924,12 +869,10 @@ case class DeletePropertyRequestV2( * Asks whether a property can be deleted. A successful response will be a [[CanDoResponseV2]]. * * @param propertyIri the IRI of the property to be deleted. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class CanDeletePropertyRequestV2( propertyIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -957,7 +900,6 @@ sealed trait ChangeLabelsOrCommentsRequest { * @param newGuiAttributes the new GUI attributes to be used with the property, or `None` if no GUI element should be specified. * @param lastModificationDate the ontology's last modification date. * @param apiRequestID the ID of the API request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ChangePropertyGuiElementRequest( @@ -966,7 +908,6 @@ case class ChangePropertyGuiElementRequest( newGuiAttributes: Set[String], lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -982,7 +923,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[ChangePropertyLabelsOrCommentsRequestV2]] representing the input. @@ -992,7 +932,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangePropertyGuiElementRequest] = @@ -1000,7 +939,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1008,7 +946,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): ChangePropertyGuiElementRequest = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -1048,7 +985,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change newGuiAttributes = newGuiAttributes, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1070,7 +1006,6 @@ case class ChangePropertyLabelsOrCommentsRequestV2( newObjects: Seq[StringLiteralV2], lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 with ChangeLabelsOrCommentsRequest @@ -1088,7 +1023,6 @@ object ChangePropertyLabelsOrCommentsRequestV2 * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[ChangePropertyLabelsOrCommentsRequestV2]] representing the input. @@ -1098,7 +1032,6 @@ object ChangePropertyLabelsOrCommentsRequestV2 apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangePropertyLabelsOrCommentsRequestV2] = @@ -1106,7 +1039,6 @@ object ChangePropertyLabelsOrCommentsRequestV2 fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1114,7 +1046,6 @@ object ChangePropertyLabelsOrCommentsRequestV2 private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): ChangePropertyLabelsOrCommentsRequestV2 = { val inputOntologiesV2 = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -1131,7 +1062,6 @@ object ChangePropertyLabelsOrCommentsRequestV2 }, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1149,7 +1079,6 @@ case class DeletePropertyCommentRequestV2( propertyIri: SmartIri, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -1165,7 +1094,6 @@ object DeletePropertyCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteP * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActor a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[DeletePropertyCommentRequestV2]] representing the input. @@ -1175,7 +1103,6 @@ object DeletePropertyCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteP apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeletePropertyCommentRequestV2] = @@ -1183,7 +1110,6 @@ object DeletePropertyCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteP fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1191,7 +1117,6 @@ object DeletePropertyCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteP private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): DeletePropertyCommentRequestV2 = { val inputOntologyV2 = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -1203,7 +1128,6 @@ object DeletePropertyCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteP propertyIri = propertyInfoContent.propertyIri, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1225,7 +1149,6 @@ case class ChangeClassLabelsOrCommentsRequestV2( newObjects: Seq[StringLiteralV2], lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 with ChangeLabelsOrCommentsRequest @@ -1242,7 +1165,6 @@ object ChangeClassLabelsOrCommentsRequestV2 extends KnoraJsonLDRequestReaderV2[C * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[ChangeClassLabelsOrCommentsRequestV2]] representing the input. @@ -1252,7 +1174,6 @@ object ChangeClassLabelsOrCommentsRequestV2 extends KnoraJsonLDRequestReaderV2[C apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeClassLabelsOrCommentsRequestV2] = @@ -1260,7 +1181,6 @@ object ChangeClassLabelsOrCommentsRequestV2 extends KnoraJsonLDRequestReaderV2[C fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1268,7 +1188,6 @@ object ChangeClassLabelsOrCommentsRequestV2 extends KnoraJsonLDRequestReaderV2[C private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): ChangeClassLabelsOrCommentsRequestV2 = { val inputOntologiesV2 = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -1285,7 +1204,6 @@ object ChangeClassLabelsOrCommentsRequestV2 extends KnoraJsonLDRequestReaderV2[C }, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1303,7 +1221,6 @@ case class DeleteClassCommentRequestV2( classIri: SmartIri, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -1319,7 +1236,6 @@ object DeleteClassCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteClas * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActor a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[DeleteClassCommentRequestV2]] representing the input. @@ -1329,7 +1245,6 @@ object DeleteClassCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteClas apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteClassCommentRequestV2] = @@ -1337,7 +1252,6 @@ object DeleteClassCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteClas fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1345,7 +1259,6 @@ object DeleteClassCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteClas private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): DeleteClassCommentRequestV2 = { val inputOntologyV2: InputOntologyV2 = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -1357,7 +1270,6 @@ object DeleteClassCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteClas classIri = classInfoContent.classIri, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1367,7 +1279,6 @@ case class ChangeGuiOrderRequestV2( classInfoContent: ClassInfoContentV2, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -1377,7 +1288,6 @@ object ChangeGuiOrderRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeGuiOrder apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeGuiOrderRequestV2] = @@ -1385,7 +1295,6 @@ object ChangeGuiOrderRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeGuiOrder fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1393,7 +1302,6 @@ object ChangeGuiOrderRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeGuiOrder private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): ChangeGuiOrderRequestV2 = { // Get the class definition and the ontology's last modification date from the JSON-LD. @@ -1413,7 +1321,6 @@ object ChangeGuiOrderRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeGuiOrder classInfoContent = classInfoContent, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1435,7 +1342,6 @@ case class ChangeOntologyMetadataRequestV2( comment: Option[String] = None, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 @@ -1451,7 +1357,6 @@ object ChangeOntologyMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Change * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[ChangeClassLabelsOrCommentsRequestV2]] representing the input. @@ -1461,7 +1366,6 @@ object ChangeOntologyMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Change apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeOntologyMetadataRequestV2] = @@ -1469,7 +1373,6 @@ object ChangeOntologyMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Change fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1477,7 +1380,6 @@ object ChangeOntologyMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Change private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): ChangeOntologyMetadataRequestV2 = { val inputOntologyV2 = InputOntologyV2.fromJsonLD(jsonLDDocument) @@ -1495,7 +1397,6 @@ object ChangeOntologyMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Change comment = comment, lastModificationDate = lastModificationDate, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -1513,7 +1414,6 @@ case class DeleteOntologyCommentRequestV2( ontologyIri: SmartIri, lastModificationDate: Instant, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends OntologiesResponderRequestV2 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala index 6b80cef4eb..ba3445b743 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala @@ -11,7 +11,6 @@ import akka.pattern._ import akka.util.Timeout import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -59,7 +58,6 @@ sealed trait ResourcesResponderRequestV2 extends KnoraRequestV2 { * @param versionDate if defined, requests the state of the resources at the specified time in the past. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ResourcesGetRequestV2( @@ -70,7 +68,6 @@ case class ResourcesGetRequestV2( withDeleted: Boolean = true, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption] = Set.empty, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 @@ -80,14 +77,12 @@ case class ResourcesGetRequestV2( * @param resourceIris the IRIs of the resources to obtain a preview for. * @param withDeletedResource indicates if a preview of deleted resource should be returned. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ResourcesPreviewGetRequestV2( resourceIris: Seq[IRI], withDeletedResource: Boolean = true, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 @@ -96,12 +91,10 @@ case class ResourcesPreviewGetRequestV2( * resource. * * @param resourceIri the resource IRI. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ResourceIIIFManifestGetRequestV2( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 @@ -126,7 +119,6 @@ case class ResourceIIIFManifestGetResponseV2(manifest: JsonLDDocument) extends K * @param withDeletedResource indicates if the version history of deleted resources should be returned or not. * @param startDate the start of the time period to return, inclusive. * @param endDate the end of the time period to return, exclusive. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ResourceVersionHistoryGetRequestV2( @@ -134,7 +126,6 @@ case class ResourceVersionHistoryGetRequestV2( withDeletedResource: Boolean = false, startDate: Option[Instant] = None, endDate: Option[Instant] = None, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 @@ -142,12 +133,10 @@ case class ResourceVersionHistoryGetRequestV2( * Requests the full version history of a resource and its values as events. * * @param resourceIri the IRI of the resource. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ResourceHistoryEventsGetRequestV2( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 { private val stringFormatter = StringFormatter.getInstanceForConstantOntologies @@ -161,12 +150,10 @@ case class ResourceHistoryEventsGetRequestV2( * Requests the version history of all resources of a project. * * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ProjectResourcesWithHistoryGetRequestV2( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 { private val stringFormatter = StringFormatter.getInstanceForConstantOntologies @@ -247,7 +234,6 @@ case class ResourceVersionHistoryResponseV2(history: Seq[ResourceHistoryEntry]) * @param mappingIri the IRI of the mapping to be used to convert from standoff to TEI/XML, if any. Otherwise the standard mapping is assumed. * @param gravsearchTemplateIri the gravsearch template to query the metadata for the TEI header, if provided. * @param headerXSLTIri the IRI of the XSL transformation to convert the resource's metadata to the TEI header. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class ResourceTEIGetRequestV2( @@ -256,7 +242,6 @@ case class ResourceTEIGetRequestV2( mappingIri: Option[IRI], gravsearchTemplateIri: Option[IRI], headerXSLTIri: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends ResourcesResponderRequestV2 @@ -285,13 +270,12 @@ case class ResourceTEIGetResponseV2(header: TEIHeader, body: TEIBody) { case class TEIHeader( headerInfo: ReadResourceV2, headerXSLT: Option[String], - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl ) { def toXML: String = if (headerXSLT.nonEmpty) { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() // Convert the resource to a JsonLDDocument. val headerJsonLD: JsonLDDocument = @@ -663,13 +647,11 @@ case class CreateResourceV2( * Represents a request to create a resource. * * @param createResource the resource to be created. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the API request ID. */ case class CreateResourceRequestV2( createResource: CreateResourceV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV2 @@ -683,7 +665,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -693,7 +674,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateResourceRequestV2] = { @@ -724,7 +704,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource .ask( ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri.toString)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -755,15 +734,15 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource stringFormatter.toSmartIriWithErr ) - maybeAttachedToUserFuture: Option[Future[UserADM]] = maybeAttachedToUserIri.map { attachedToUserIri => - UserUtilADM.switchToUser( - requestingUser = requestingUser, - requestedUserIri = attachedToUserIri.toString, - projectIri = projectIri.toString, - featureFactoryConfig = featureFactoryConfig, - appActor = appActor - ) - } + maybeAttachedToUserFuture: Option[Future[UserADM]] = + maybeAttachedToUserIri.map { attachedToUserIri => + UserUtilADM.switchToUser( + requestingUser = requestingUser, + requestedUserIri = attachedToUserIri.toString, + projectIri = projectIri.toString, + appActor = appActor + ) + } maybeAttachedToUser: Option[UserADM] <- ActorUtil.optionFuture2FutureOption(maybeAttachedToUserFuture) @@ -804,7 +783,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource jsonLDObject = valueJsonLDObject, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -865,7 +843,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource permissions = permissions, creationDate = creationDate ), - featureFactoryConfig = featureFactoryConfig, requestingUser = maybeAttachedToUser.getOrElse(requestingUser), apiRequestID = apiRequestID ) @@ -881,7 +858,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource * @param maybeLabel the resource's new `rdfs:label`, if any. * @param maybePermissions the resource's new permissions, if any. * @param maybeNewModificationDate the resource's new last modification date, if any. - * @param featureFactoryConfig the feature factory configuration. */ case class UpdateResourceMetadataRequestV2( resourceIri: IRI, @@ -890,7 +866,6 @@ case class UpdateResourceMetadataRequestV2( maybeLabel: Option[String] = None, maybePermissions: Option[String] = None, maybeNewModificationDate: Option[Instant] = None, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV2 @@ -904,7 +879,6 @@ object UpdateResourceMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Update * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -914,14 +888,12 @@ object UpdateResourceMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Update apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UpdateResourceMetadataRequestV2] = Future { fromJsonLDSync( jsonLDDocument = jsonLDDocument, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -929,7 +901,6 @@ object UpdateResourceMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Update def fromJsonLDSync( jsonLDDocument: JsonLDDocument, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): UpdateResourceMetadataRequestV2 = { @@ -975,7 +946,6 @@ object UpdateResourceMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Update maybeLabel = maybeLabel, maybePermissions = maybePermissions, maybeNewModificationDate = maybeNewModificationDate, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -990,15 +960,13 @@ object UpdateResourceMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Update * @param lastModificationDate the resource's last modification date. * @param maybeLabel the resource's new `rdfs:label`, if any. * @param maybePermissions the resource's new permissions, if any. - * @param featureFactoryConfig the feature factory configuration. */ case class UpdateResourceMetadataResponseV2( resourceIri: IRI, resourceClassIri: SmartIri, lastModificationDate: Instant, maybeLabel: Option[String] = None, - maybePermissions: Option[String] = None, - featureFactoryConfig: FeatureFactoryConfig + maybePermissions: Option[String] = None ) extends KnoraJsonLDResponseV2 { /** @@ -1077,7 +1045,6 @@ case class UpdateResourceMetadataResponseV2( * the current time will be used. * @param maybeLastModificationDate the resource's last modification date, if any. * @param erase if `true`, the resource will be erased from the triplestore, otherwise it will be marked as deleted. - * @param featureFactoryConfig the feature factory configuration. */ case class DeleteOrEraseResourceRequestV2( resourceIri: IRI, @@ -1086,7 +1053,6 @@ case class DeleteOrEraseResourceRequestV2( maybeDeleteDate: Option[Instant] = None, maybeLastModificationDate: Option[Instant] = None, erase: Boolean = false, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ResourcesResponderRequestV2 @@ -1100,7 +1066,6 @@ object DeleteOrEraseResourceRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteO * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -1110,14 +1075,12 @@ object DeleteOrEraseResourceRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteO apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteOrEraseResourceRequestV2] = Future { fromJsonLDSync( jsonLDDocument = jsonLDDocument, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -1125,7 +1088,6 @@ object DeleteOrEraseResourceRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteO def fromJsonLDSync( jsonLDDocument: JsonLDDocument, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): DeleteOrEraseResourceRequestV2 = { @@ -1162,7 +1124,6 @@ object DeleteOrEraseResourceRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteO maybeDeleteComment = maybeDeleteComment, maybeDeleteDate = maybeDeleteDate, maybeLastModificationDate = maybeLastModificationDate, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/searchmessages/SearchMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/searchmessages/SearchMessagesV2.scala index 9ef2d9989e..f878d7f4e5 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/searchmessages/SearchMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/searchmessages/SearchMessagesV2.scala @@ -8,7 +8,6 @@ package org.knora.webapi.messages.v2.responder.searchmessages import org.knora.webapi.ApiV2Schema import org.knora.webapi.IRI import org.knora.webapi.SchemaOption -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -35,7 +34,6 @@ sealed trait SearchResponderRequestV2 extends KnoraRequestV2 { * @param searchValue the values to search for. * @param limitToProject limit search to given project. * @param limitToResourceClass limit search to given resource class. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class FullTextSearchCountRequestV2( @@ -43,7 +41,6 @@ case class FullTextSearchCountRequestV2( limitToProject: Option[IRI], limitToResourceClass: Option[SmartIri], limitToStandoffClass: Option[SmartIri], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 @@ -57,7 +54,6 @@ case class FullTextSearchCountRequestV2( * @param returnFiles if true, return any file value value attached to each matching resource. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class FulltextSearchRequestV2( @@ -69,7 +65,6 @@ case class FulltextSearchRequestV2( returnFiles: Boolean, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 @@ -77,12 +72,10 @@ case class FulltextSearchRequestV2( * Requests the amount of results (resources count) of a given Gravsearch query. A successful response will be a [[ResourceCountV2]]. * * @param constructQuery a Sparql construct query provided by the client. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class GravsearchCountRequestV2( constructQuery: ConstructQuery, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 @@ -92,14 +85,12 @@ case class GravsearchCountRequestV2( * @param constructQuery a Sparql construct query provided by the client. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class GravsearchRequestV2( constructQuery: ConstructQuery, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption] = Set.empty[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 @@ -109,14 +100,12 @@ case class GravsearchRequestV2( * @param searchValue the values to search for. * @param limitToProject limit search to given project. * @param limitToResourceClass limit search to given resource class. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class SearchResourceByLabelCountRequestV2( searchValue: String, limitToProject: Option[IRI], limitToResourceClass: Option[SmartIri], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 @@ -128,7 +117,6 @@ case class SearchResourceByLabelCountRequestV2( * @param limitToProject limit search to given project. * @param limitToResourceClass limit search to given resource class. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class SearchResourceByLabelRequestV2( @@ -137,7 +125,6 @@ case class SearchResourceByLabelRequestV2( limitToProject: Option[IRI], limitToResourceClass: Option[SmartIri], targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 @@ -173,7 +160,6 @@ case class ResourceCountV2(numberOfResources: Int) extends KnoraJsonLDResponseV2 * @param page the page number of the results page to be returned. * @param targetSchema the schema of the response. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class SearchResourcesByProjectAndClassRequestV2( @@ -183,6 +169,5 @@ case class SearchResourcesByProjectAndClassRequestV2( page: Int, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends SearchResponderRequestV2 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/standoffmessages/StandoffMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/standoffmessages/StandoffMessagesV2.scala index d641ba4529..a2b867ab11 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/standoffmessages/StandoffMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/standoffmessages/StandoffMessagesV2.scala @@ -10,7 +10,6 @@ import com.typesafe.scalalogging.Logger import akka.util.Timeout import org.knora.webapi._ import dsp.errors.AssertionException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -42,7 +41,6 @@ sealed trait StandoffResponderRequestV2 extends KnoraRequestV2 * @param valueIri the IRI of the value. * @param offset the start index of the first standoff tag to be returned. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class GetStandoffPageRequestV2( @@ -50,7 +48,6 @@ case class GetStandoffPageRequestV2( valueIri: IRI, offset: Int, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends StandoffResponderRequestV2 @@ -59,13 +56,11 @@ case class GetStandoffPageRequestV2( * * @param resourceIri the IRI of the resource containing the text value. * @param valueIri the IRI of the text value. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. */ case class GetRemainingStandoffFromTextValueRequestV2( resourceIri: IRI, valueIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends StandoffResponderRequestV2 @@ -130,14 +125,12 @@ case class GetStandoffResponseV2(valueIri: IRI, standoff: Seq[StandoffTagV2], ne * * @param metadata the metadata describing the mapping. * @param xml the mapping in XML syntax. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the the user making the request. * @param apiRequestID the ID of the API request. */ case class CreateMappingRequestV2( metadata: CreateMappingRequestMetadataV2, xml: CreateMappingRequestXMLV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends StandoffResponderRequestV2 @@ -159,7 +152,6 @@ object CreateMappingRequestMetadataV2 extends KnoraJsonLDRequestReaderV2[CreateM apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateMappingRequestMetadataV2] = @@ -254,11 +246,9 @@ case class CreateMappingResponseV2(mappingIri: IRI, label: String, projectIri: S * Represents a request to get a mapping from XML elements and attributes to standoff entities. * * @param mappingIri the IRI of the mapping. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the the user making the request. */ -case class GetMappingRequestV2(mappingIri: IRI, featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM) - extends StandoffResponderRequestV2 +case class GetMappingRequestV2(mappingIri: IRI, requestingUser: UserADM) extends StandoffResponderRequestV2 /** * Represents a response to a [[GetMappingRequestV2]]. @@ -277,12 +267,10 @@ case class GetMappingResponseV2( * Represents a request that gets an XSL Transformation represented by a `knora-base:XSLTransformation`. * * @param xsltTextRepresentationIri the IRI of the `knora-base:XSLTransformation`. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the the user making the request. */ case class GetXSLTransformationRequestV2( xsltTextRepresentationIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends StandoffResponderRequestV2 diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/valuemessages/ValueMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/valuemessages/ValueMessagesV2.scala index 175fbb5c07..6f3fb4aca3 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/valuemessages/ValueMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/valuemessages/ValueMessagesV2.scala @@ -15,7 +15,6 @@ import dsp.errors.AssertionException import dsp.errors.BadRequestException import dsp.errors.NotImplementedException import dsp.errors.SipiException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -54,13 +53,11 @@ sealed trait ValuesResponderRequestV2 extends KnoraRequestV2 * * @param createValue a [[CreateValueV2]] representing the value to be created. A successful response will be * a [[CreateValueResponseV2]]. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the API request ID. */ case class CreateValueRequestV2( createValue: CreateValueV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV2 @@ -77,7 +74,6 @@ object CreateValueRequestV2 extends KnoraJsonLDRequestReaderV2[CreateValueReques * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -87,7 +83,6 @@ object CreateValueRequestV2 extends KnoraJsonLDRequestReaderV2[CreateValueReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateValueRequestV2] = { @@ -105,74 +100,69 @@ object CreateValueRequestV2 extends KnoraJsonLDRequestReaderV2[CreateValueReques resourceClassIri: SmartIri = jsonLDDocument.requireTypeAsKnoraTypeIri // Get the resource property and the value to be created. - createValue: CreateValueV2 <- jsonLDDocument.requireResourcePropertyValue match { - case (propertyIri: SmartIri, jsonLDObject: JsonLDObject) => - for { - valueContent: ValueContentV2 <- ValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) - - // Get and validate the custom value IRI if provided. - maybeCustomValueIri: Option[SmartIri] = - jsonLDObject.maybeIDAsKnoraDataIri.map { definedNewIri => - stringFormatter.validateCustomValueIri( - customValueIri = definedNewIri, - projectCode = resourceIri.getProjectCode.get, - resourceID = resourceIri.getResourceID.get + createValue: CreateValueV2 <- + jsonLDDocument.requireResourcePropertyValue match { + case (propertyIri: SmartIri, jsonLDObject: JsonLDObject) => + for { + valueContent: ValueContentV2 <- ValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log ) - } - - // Get the custom value UUID if provided. - maybeCustomUUID: Option[UUID] = - jsonLDObject.maybeUUID(OntologyConstants.KnoraApiV2Complex.ValueHasUUID) - - // Get the value's creation date. - // TODO: creationDate for values is a bug, and will not be supported in future. Use valueCreationDate instead. - maybeCreationDate: Option[Instant] = jsonLDObject - .maybeDatatypeValueInObject( - key = - OntologyConstants.KnoraApiV2Complex.ValueCreationDate, - expectedDatatype = - OntologyConstants.Xsd.DateTimeStamp.toSmartIri, - validationFun = - stringFormatter.xsdDateTimeStampToInstant - ) - .orElse( - jsonLDObject - .maybeDatatypeValueInObject( - key = - OntologyConstants.KnoraApiV2Complex.CreationDate, - expectedDatatype = - OntologyConstants.Xsd.DateTimeStamp.toSmartIri, - validationFun = - stringFormatter.xsdDateTimeStampToInstant - ) - ) - - maybePermissions: Option[String] = - jsonLDObject.maybeStringWithValidation( - OntologyConstants.KnoraApiV2Complex.HasPermissions, - stringFormatter.toSparqlEncodedString - ) - } yield CreateValueV2( - resourceIri = resourceIri.toString, - resourceClassIri = resourceClassIri, - propertyIri = propertyIri, - valueContent = valueContent, - valueIri = maybeCustomValueIri, - valueUUID = maybeCustomUUID, - valueCreationDate = maybeCreationDate, - permissions = maybePermissions - ) - } + + // Get and validate the custom value IRI if provided. + maybeCustomValueIri: Option[SmartIri] = + jsonLDObject.maybeIDAsKnoraDataIri.map { definedNewIri => + stringFormatter.validateCustomValueIri( + customValueIri = definedNewIri, + projectCode = resourceIri.getProjectCode.get, + resourceID = resourceIri.getResourceID.get + ) + } + + // Get the custom value UUID if provided. + maybeCustomUUID: Option[UUID] = + jsonLDObject.maybeUUID(OntologyConstants.KnoraApiV2Complex.ValueHasUUID) + + // Get the value's creation date. + // TODO: creationDate for values is a bug, and will not be supported in future. Use valueCreationDate instead. + maybeCreationDate: Option[Instant] = jsonLDObject + .maybeDatatypeValueInObject( + key = OntologyConstants.KnoraApiV2Complex.ValueCreationDate, + expectedDatatype = + OntologyConstants.Xsd.DateTimeStamp.toSmartIri, + validationFun = stringFormatter.xsdDateTimeStampToInstant + ) + .orElse( + jsonLDObject + .maybeDatatypeValueInObject( + key = OntologyConstants.KnoraApiV2Complex.CreationDate, + expectedDatatype = + OntologyConstants.Xsd.DateTimeStamp.toSmartIri, + validationFun = stringFormatter.xsdDateTimeStampToInstant + ) + ) + + maybePermissions: Option[String] = + jsonLDObject.maybeStringWithValidation( + OntologyConstants.KnoraApiV2Complex.HasPermissions, + stringFormatter.toSparqlEncodedString + ) + } yield CreateValueV2( + resourceIri = resourceIri.toString, + resourceClassIri = resourceClassIri, + propertyIri = propertyIri, + valueContent = valueContent, + valueIri = maybeCustomValueIri, + valueUUID = maybeCustomUUID, + valueCreationDate = maybeCreationDate, + permissions = maybePermissions + ) + } } yield CreateValueRequestV2( createValue = createValue, - featureFactoryConfig = featureFactoryConfig, apiRequestID = apiRequestID, requestingUser = requestingUser ) @@ -233,13 +223,11 @@ case class CreateValueResponseV2( * * @param updateValue an [[UpdateValueV2]] representing the new version of the value. A successful response will be * an [[UpdateValueResponseV2]]. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the API request ID. */ case class UpdateValueRequestV2( updateValue: UpdateValueV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV2 @@ -256,7 +244,6 @@ object UpdateValueRequestV2 extends KnoraJsonLDRequestReaderV2[UpdateValueReques * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -266,7 +253,6 @@ object UpdateValueRequestV2 extends KnoraJsonLDRequestReaderV2[UpdateValueReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UpdateValueRequestV2] = { @@ -284,112 +270,111 @@ object UpdateValueRequestV2 extends KnoraJsonLDRequestReaderV2[UpdateValueReques resourceClassIri: SmartIri = jsonLDDocument.requireTypeAsKnoraTypeIri // Get the resource property and the new value version. - updateValue: UpdateValueV2 <- jsonLDDocument.requireResourcePropertyValue match { - case (propertyIri: SmartIri, jsonLDObject: JsonLDObject) => - val valueIri: SmartIri = jsonLDObject.requireIDAsKnoraDataIri - - // Get the custom value creation date, if provided. - val maybeValueCreationDate: Option[Instant] = - jsonLDObject.maybeDatatypeValueInObject( - key = OntologyConstants.KnoraApiV2Complex.ValueCreationDate, - expectedDatatype = OntologyConstants.Xsd.DateTimeStamp.toSmartIri, - validationFun = stringFormatter.xsdDateTimeStampToInstant - ) + updateValue: UpdateValueV2 <- + jsonLDDocument.requireResourcePropertyValue match { + case (propertyIri: SmartIri, jsonLDObject: JsonLDObject) => + val valueIri: SmartIri = jsonLDObject.requireIDAsKnoraDataIri + + // Get the custom value creation date, if provided. + val maybeValueCreationDate: Option[Instant] = + jsonLDObject.maybeDatatypeValueInObject( + key = OntologyConstants.KnoraApiV2Complex.ValueCreationDate, + expectedDatatype = OntologyConstants.Xsd.DateTimeStamp.toSmartIri, + validationFun = stringFormatter.xsdDateTimeStampToInstant + ) - // Get and validate the custom new value version IRI, if provided. + // Get and validate the custom new value version IRI, if provided. - val maybeNewIri: Option[SmartIri] = jsonLDObject - .maybeIriInObject( - OntologyConstants.KnoraApiV2Complex.NewValueVersionIri, - stringFormatter.toSmartIriWithErr - ) - .map { definedNewIri => - if (definedNewIri == valueIri) { - throw BadRequestException( - s"The IRI of a new value version cannot be the same as the IRI of the current version" - ) - } - - stringFormatter.validateCustomValueIri( - customValueIri = definedNewIri, - projectCode = valueIri.getProjectCode.get, - resourceID = valueIri.getResourceID.get - ) - } + val maybeNewIri: Option[SmartIri] = jsonLDObject + .maybeIriInObject( + OntologyConstants.KnoraApiV2Complex.NewValueVersionIri, + stringFormatter.toSmartIriWithErr + ) + .map { definedNewIri => + if (definedNewIri == valueIri) { + throw BadRequestException( + s"The IRI of a new value version cannot be the same as the IRI of the current version" + ) + } - // Aside from the value's ID and type and the optional predicates above, does the value object just - // contain knora-api:hasPermissions? + stringFormatter.validateCustomValueIri( + customValueIri = definedNewIri, + projectCode = valueIri.getProjectCode.get, + resourceID = valueIri.getResourceID.get + ) + } - val otherValuePredicates: Set[IRI] = jsonLDObject.value.keySet -- Set( - JsonLDKeywords.ID, - JsonLDKeywords.TYPE, - OntologyConstants.KnoraApiV2Complex.ValueCreationDate, - OntologyConstants.KnoraApiV2Complex.NewValueVersionIri - ) + // Aside from the value's ID and type and the optional predicates above, does the value object just + // contain knora-api:hasPermissions? - if ( - otherValuePredicates == Set( - OntologyConstants.KnoraApiV2Complex.HasPermissions - ) - ) { - // Yes. This is a request to change the value's permissions. + val otherValuePredicates: Set[IRI] = jsonLDObject.value.keySet -- Set( + JsonLDKeywords.ID, + JsonLDKeywords.TYPE, + OntologyConstants.KnoraApiV2Complex.ValueCreationDate, + OntologyConstants.KnoraApiV2Complex.NewValueVersionIri + ) - val valueType: SmartIri = - jsonLDObject.requireStringWithValidation( - JsonLDKeywords.TYPE, - stringFormatter.toSmartIriWithErr - ) - val permissions = jsonLDObject.requireStringWithValidation( - OntologyConstants.KnoraApiV2Complex.HasPermissions, - stringFormatter.toSparqlEncodedString - ) + if ( + otherValuePredicates == Set( + OntologyConstants.KnoraApiV2Complex.HasPermissions + ) + ) { + // Yes. This is a request to change the value's permissions. - FastFuture.successful( - UpdateValuePermissionsV2( - resourceIri = resourceIri.toString, - resourceClassIri = resourceClassIri, - propertyIri = propertyIri, - valueIri = valueIri.toString, - valueType = valueType, - permissions = permissions, - valueCreationDate = maybeValueCreationDate, - newValueVersionIri = maybeNewIri - ) - ) - } else { - // No. This is a request to change the value content. + val valueType: SmartIri = + jsonLDObject.requireStringWithValidation( + JsonLDKeywords.TYPE, + stringFormatter.toSmartIriWithErr + ) + val permissions = jsonLDObject.requireStringWithValidation( + OntologyConstants.KnoraApiV2Complex.HasPermissions, + stringFormatter.toSparqlEncodedString + ) - for { - valueContent: ValueContentV2 <- - ValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig: FeatureFactoryConfig, - settings = settings, - log = log - ) + FastFuture.successful( + UpdateValuePermissionsV2( + resourceIri = resourceIri.toString, + resourceClassIri = resourceClassIri, + propertyIri = propertyIri, + valueIri = valueIri.toString, + valueType = valueType, + permissions = permissions, + valueCreationDate = maybeValueCreationDate, + newValueVersionIri = maybeNewIri + ) + ) + } else { + // No. This is a request to change the value content. + + for { + valueContent: ValueContentV2 <- + ValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - maybePermissions: Option[String] = - jsonLDObject.maybeStringWithValidation( - OntologyConstants.KnoraApiV2Complex.HasPermissions, - stringFormatter.toSparqlEncodedString - ) - } yield UpdateValueContentV2( - resourceIri = resourceIri.toString, - resourceClassIri = resourceClassIri, - propertyIri = propertyIri, - valueIri = valueIri.toString, - valueContent = valueContent, - permissions = maybePermissions, - valueCreationDate = maybeValueCreationDate, - newValueVersionIri = maybeNewIri - ) - } - } + maybePermissions: Option[String] = + jsonLDObject.maybeStringWithValidation( + OntologyConstants.KnoraApiV2Complex.HasPermissions, + stringFormatter.toSparqlEncodedString + ) + } yield UpdateValueContentV2( + resourceIri = resourceIri.toString, + resourceClassIri = resourceClassIri, + propertyIri = propertyIri, + valueIri = valueIri.toString, + valueContent = valueContent, + permissions = maybePermissions, + valueCreationDate = maybeValueCreationDate, + newValueVersionIri = maybeNewIri + ) + } + } } yield UpdateValueRequestV2( updateValue = updateValue, - featureFactoryConfig = featureFactoryConfig, apiRequestID = apiRequestID, requestingUser = requestingUser ) @@ -446,7 +431,6 @@ case class UpdateValueResponseV2(valueIri: IRI, valueType: SmartIri, valueUUID: * @param deleteComment an optional comment explaining why the value is being marked as deleted. * @param deleteDate an optional timestamp indicating when the value was deleted. If not supplied, * the current time will be used. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the API request ID. */ @@ -458,7 +442,6 @@ case class DeleteValueRequestV2( valueTypeIri: SmartIri, deleteComment: Option[String] = None, deleteDate: Option[Instant] = None, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ) extends ValuesResponderRequestV2 @@ -472,7 +455,6 @@ object DeleteValueRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteValueReques * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. @@ -482,7 +464,6 @@ object DeleteValueRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteValueReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteValueRequestV2] = @@ -490,7 +471,6 @@ object DeleteValueRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteValueReques fromJsonLDSync( jsonLDDocument = jsonLDDocument, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -498,7 +478,6 @@ object DeleteValueRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteValueReques private def fromJsonLDSync( jsonLDDocument: JsonLDDocument, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): DeleteValueRequestV2 = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -550,7 +529,6 @@ object DeleteValueRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteValueReques valueTypeIri = valueTypeIri, deleteComment = deleteComment, deleteDate = deleteDate, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -1176,7 +1154,6 @@ trait ValueContentReaderV2[C <: ValueContentV2] { * @param jsonLDObject the JSON-LD object. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a subclass of [[ValueContentV2]]. @@ -1185,7 +1162,6 @@ trait ValueContentReaderV2[C <: ValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[C] @@ -1208,7 +1184,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { * @param jsonLDObject the JSON-LD object. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[ValueContentV2]]. @@ -1217,7 +1192,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ValueContentV2] = { @@ -1229,202 +1203,184 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject.requireStringWithValidation(JsonLDKeywords.TYPE, stringFormatter.toSmartIriWithErr) ) - valueContent: ValueContentV2 <- valueType.toString match { - case OntologyConstants.KnoraApiV2Complex.TextValue => - TextValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + valueContent: ValueContentV2 <- + valueType.toString match { + case OntologyConstants.KnoraApiV2Complex.TextValue => + TextValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.IntValue => - IntegerValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.IntValue => + IntegerValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.DecimalValue => - DecimalValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.DecimalValue => + DecimalValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.BooleanValue => - BooleanValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.BooleanValue => + BooleanValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.DateValue => - DateValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.DateValue => + DateValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.GeomValue => - GeomValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.GeomValue => + GeomValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.IntervalValue => - IntervalValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.IntervalValue => + IntervalValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.TimeValue => - TimeValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.TimeValue => + TimeValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.LinkValue => - LinkValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.LinkValue => + LinkValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.ListValue => - HierarchicalListValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.ListValue => + HierarchicalListValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.UriValue => - UriValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.UriValue => + UriValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.GeonameValue => - GeonameValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.GeonameValue => + GeonameValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.ColorValue => - ColorValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.ColorValue => + ColorValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.StillImageFileValue => - StillImageFileValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.StillImageFileValue => + StillImageFileValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.DocumentFileValue => - DocumentFileValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.DocumentFileValue => + DocumentFileValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.TextFileValue => - TextFileValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.TextFileValue => + TextFileValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.AudioFileValue => - AudioFileValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.AudioFileValue => + AudioFileValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.MovingImageFileValue => - MovingImageFileValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.MovingImageFileValue => + MovingImageFileValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case OntologyConstants.KnoraApiV2Complex.ArchiveFileValue => - ArchiveFileValueContentV2.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - log = log - ) + case OntologyConstants.KnoraApiV2Complex.ArchiveFileValue => + ArchiveFileValueContentV2.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) - case other => - throw NotImplementedException( - s"Parsing of JSON-LD value type not implemented: $other" - ) - } + case other => + throw NotImplementedException( + s"Parsing of JSON-LD value type not implemented: $other" + ) + } } yield valueContent } @@ -1588,7 +1544,6 @@ object DateValueContentV2 extends ValueContentReaderV2[DateValueContentV2] { * @param jsonLDObject the JSON-LD object. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[DateValueContentV2]]. @@ -1597,7 +1552,6 @@ object DateValueContentV2 extends ValueContentReaderV2[DateValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DateValueContentV2] = @@ -1989,7 +1943,6 @@ object TextValueContentV2 extends ValueContentReaderV2[TextValueContentV2] { * @param jsonLDObject the JSON-LD object. * @param requestingUser the user making the request. * @param appActror a reference to the application actor. - * @param featureFactoryConfig the feature factory configuration. * @param settings the application settings. * @param log a logging adapter. * @return a [[TextValueContentV2]]. @@ -1998,7 +1951,6 @@ object TextValueContentV2 extends ValueContentReaderV2[TextValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TextValueContentV2] = { @@ -2023,21 +1975,20 @@ object TextValueContentV2 extends ValueContentReaderV2[TextValueContentV2] { // If the client supplied the IRI of a standoff-to-XML mapping, get the mapping. - maybeMappingFuture: Option[Future[GetMappingResponseV2]] = maybeMappingIri.map { mappingIri => - for { - mappingResponse: GetMappingResponseV2 <- - appActor - .ask( - GetMappingRequestV2( - mappingIri = mappingIri, - featureFactoryConfig = - featureFactoryConfig, - requestingUser = requestingUser - ) - ) - .mapTo[GetMappingResponseV2] - } yield mappingResponse - } + maybeMappingFuture: Option[Future[GetMappingResponseV2]] = + maybeMappingIri.map { mappingIri => + for { + mappingResponse: GetMappingResponseV2 <- + appActor + .ask( + GetMappingRequestV2( + mappingIri = mappingIri, + requestingUser = requestingUser + ) + ) + .mapTo[GetMappingResponseV2] + } yield mappingResponse + } maybeMappingResponse: Option[GetMappingResponseV2] <- ActorUtil.optionFuture2FutureOption(maybeMappingFuture) @@ -2159,7 +2110,6 @@ object IntegerValueContentV2 extends ValueContentReaderV2[IntegerValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[IntegerValueContentV2] = @@ -2258,7 +2208,6 @@ object DecimalValueContentV2 extends ValueContentReaderV2[DecimalValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DecimalValueContentV2] = @@ -2353,7 +2302,6 @@ object BooleanValueContentV2 extends ValueContentReaderV2[BooleanValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[BooleanValueContentV2] = @@ -2450,7 +2398,6 @@ object GeomValueContentV2 extends ValueContentReaderV2[GeomValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[GeomValueContentV2] = @@ -2569,7 +2516,6 @@ object IntervalValueContentV2 extends ValueContentReaderV2[IntervalValueContentV jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[IntervalValueContentV2] = @@ -2686,7 +2632,6 @@ object TimeValueContentV2 extends ValueContentReaderV2[TimeValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TimeValueContentV2] = @@ -2802,7 +2747,6 @@ object HierarchicalListValueContentV2 extends ValueContentReaderV2[HierarchicalL jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[HierarchicalListValueContentV2] = @@ -2905,7 +2849,6 @@ object ColorValueContentV2 extends ValueContentReaderV2[ColorValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ColorValueContentV2] = @@ -3006,7 +2949,6 @@ object UriValueContentV2 extends ValueContentReaderV2[UriValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UriValueContentV2] = @@ -3112,7 +3054,6 @@ object GeonameValueContentV2 extends ValueContentReaderV2[GeonameValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[GeonameValueContentV2] = @@ -3307,20 +3248,20 @@ object StillImageFileValueContentV2 extends ValueContentReaderV2[StillImageFileV jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[StillImageFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance for { - fileValueWithSipiMetadata <- FileValueWithSipiMetadata.fromJsonLDObject( - jsonLDObject = jsonLDObject, - requestingUser = requestingUser, - appActor = appActor, - settings = settings, - log = log - ) + fileValueWithSipiMetadata <- + FileValueWithSipiMetadata.fromJsonLDObject( + jsonLDObject = jsonLDObject, + requestingUser = requestingUser, + appActor = appActor, + settings = settings, + log = log + ) _ = if (!settings.imageMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { throw BadRequestException( @@ -3486,7 +3427,6 @@ object DocumentFileValueContentV2 extends ValueContentReaderV2[DocumentFileValue jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DocumentFileValueContentV2] = { @@ -3525,7 +3465,6 @@ object ArchiveFileValueContentV2 extends ValueContentReaderV2[ArchiveFileValueCo jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ArchiveFileValueContentV2] = { @@ -3619,7 +3558,6 @@ object TextFileValueContentV2 extends ValueContentReaderV2[TextFileValueContentV jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TextFileValueContentV2] = { @@ -3713,7 +3651,6 @@ object AudioFileValueContentV2 extends ValueContentReaderV2[AudioFileValueConten jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[AudioFileValueContentV2] = { @@ -3809,7 +3746,6 @@ object MovingImageFileValueContentV2 extends ValueContentReaderV2[MovingImageFil jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[MovingImageFileValueContentV2] = { @@ -3956,7 +3892,6 @@ object LinkValueContentV2 extends ValueContentReaderV2[LinkValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[LinkValueContentV2] = diff --git a/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala b/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala index 5a0db63d3e..016b54ef64 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala @@ -14,7 +14,7 @@ import akka.pattern._ import akka.util.Timeout import com.typesafe.scalalogging.LazyLogging import com.typesafe.scalalogging.Logger -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.cache.settings.CacheServiceSettings import scala.concurrent.ExecutionContext import scala.concurrent.Future diff --git a/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala b/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala index cb3aa4cdec..7d31b976bc 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala @@ -40,7 +40,7 @@ import org.knora.webapi.responders.v1._ import org.knora.webapi.responders.v2._ import org.knora.webapi.settings.KnoraDispatchers import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.cache.settings.CacheServiceSettings import org.knora.webapi.util.ActorUtil._ import scala.concurrent.ExecutionContext diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala index 4847a6e0f4..cd7cce4f36 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -43,47 +42,43 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * Receives a message extending [[ProjectsResponderRequestV1]], and returns an appropriate response message */ def receive(msg: GroupsResponderRequestADM) = msg match { - case GroupsGetADM(featureFactoryConfig, requestingUser) => groupsGetADM(featureFactoryConfig, requestingUser) - case GroupsGetRequestADM(featureFactoryConfig, requestingUser) => - groupsGetRequestADM(featureFactoryConfig, requestingUser) - case GroupGetADM(groupIri, featureFactoryConfig, requestingUser) => - groupGetADM(groupIri, featureFactoryConfig, requestingUser) - case MultipleGroupsGetRequestADM(groupIris, featureFactoryConfig, requestingUser) => - multipleGroupsGetRequestADM(groupIris, featureFactoryConfig, requestingUser) - case GroupGetRequestADM(groupIri, featureFactoryConfig, requestingUser) => - groupGetRequestADM(groupIri, featureFactoryConfig, requestingUser) - case GroupMembersGetRequestADM(groupIri, featureFactoryConfig, requestingUser) => - groupMembersGetRequestADM(groupIri, featureFactoryConfig, requestingUser) - case GroupCreateRequestADM(newGroupInfo, featureFactoryConfig, requestingUser, apiRequestID) => - createGroupADM(newGroupInfo, featureFactoryConfig, requestingUser, apiRequestID) - case GroupChangeRequestADM(groupIri, changeGroupRequest, featureFactoryConfig, requestingUser, apiRequestID) => + case GroupsGetADM(requestingUser) => groupsGetADM(requestingUser) + case GroupsGetRequestADM(requestingUser) => + groupsGetRequestADM(requestingUser) + case GroupGetADM(groupIri, requestingUser) => + groupGetADM(groupIri, requestingUser) + case MultipleGroupsGetRequestADM(groupIris, requestingUser) => + multipleGroupsGetRequestADM(groupIris, requestingUser) + case GroupGetRequestADM(groupIri, requestingUser) => + groupGetRequestADM(groupIri, requestingUser) + case GroupMembersGetRequestADM(groupIri, requestingUser) => + groupMembersGetRequestADM(groupIri, requestingUser) + case GroupCreateRequestADM(newGroupInfo, requestingUser, apiRequestID) => + createGroupADM(newGroupInfo, requestingUser, apiRequestID) + case GroupChangeRequestADM(groupIri, changeGroupRequest, requestingUser, apiRequestID) => changeGroupBasicInformationRequestADM( groupIri, changeGroupRequest, - featureFactoryConfig, requestingUser, apiRequestID ) case GroupChangeStatusRequestADM( groupIri, changeGroupRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => - changeGroupStatusRequestADM(groupIri, changeGroupRequest, featureFactoryConfig, requestingUser, apiRequestID) + changeGroupStatusRequestADM(groupIri, changeGroupRequest, requestingUser, apiRequestID) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } /** * Gets all the groups (without built-in groups) and returns them as a sequence of [[GroupADM]]. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return all the groups as a sequence of [[GroupADM]]. */ private def groupsGetADM( - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[GroupADM]] = { @@ -101,102 +96,100 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond groupsResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQuery ) ) .mapTo[SparqlExtendedConstructResponse] statements = groupsResponse.statements - groups: Seq[Future[GroupADM]] = statements.map { - case (groupIri: SubjectV2, propsMap: Map[SmartIri, Seq[LiteralV2]]) => - val projectIri: IRI = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.BelongsToProject.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no project attached" - ) - ) - .head - .asInstanceOf[IriLiteralV2] - .value - - for { - maybeProjectADM: Option[ProjectADM] <- appActor - .ask( - ProjectGetADM( - identifier = - ProjectIdentifierADM( - maybeIri = Some(projectIri) - ), - featureFactoryConfig = - featureFactoryConfig, - requestingUser = - KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[ProjectADM]] - - projectADM: ProjectADM = maybeProjectADM match { - case Some(project) => project - case None => - throw InconsistentRepositoryDataException( - s"Project $projectIri was referenced by $groupIri but was not found in the triplestore." - ) - } - - group = GroupADM( - id = groupIri.toString, - name = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.GroupName.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no name attached" - ) - ) - .head - .asInstanceOf[StringLiteralV2] - .value, - descriptions = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.GroupDescriptions.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no descriptions attached" - ) - ) - .map(l => - l.asStringLiteral( - throw InconsistentRepositoryDataException( - s"Expected StringLiteralV2 but got ${l.getClass}" - ) - ) - ), - project = projectADM, - status = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.Status.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no status attached" - ) - ) - .head - .asInstanceOf[BooleanLiteralV2] - .value, - selfjoin = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.HasSelfJoinEnabled.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no status attached" - ) - ) - .head - .asInstanceOf[BooleanLiteralV2] - .value - ) - - } yield group - }.toSeq + groups: Seq[Future[GroupADM]] = + statements.map { case (groupIri: SubjectV2, propsMap: Map[SmartIri, Seq[LiteralV2]]) => + val projectIri: IRI = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.BelongsToProject.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no project attached" + ) + ) + .head + .asInstanceOf[IriLiteralV2] + .value + + for { + maybeProjectADM: Option[ProjectADM] <- + appActor + .ask( + ProjectGetADM( + identifier = ProjectIdentifierADM( + maybeIri = Some(projectIri) + ), + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[ProjectADM]] + + projectADM: ProjectADM = + maybeProjectADM match { + case Some(project) => project + case None => + throw InconsistentRepositoryDataException( + s"Project $projectIri was referenced by $groupIri but was not found in the triplestore." + ) + } + + group = + GroupADM( + id = groupIri.toString, + name = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.GroupName.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no name attached" + ) + ) + .head + .asInstanceOf[StringLiteralV2] + .value, + descriptions = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.GroupDescriptions.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no descriptions attached" + ) + ) + .map(l => + l.asStringLiteral( + throw InconsistentRepositoryDataException( + s"Expected StringLiteralV2 but got ${l.getClass}" + ) + ) + ), + project = projectADM, + status = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.Status.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no status attached" + ) + ) + .head + .asInstanceOf[BooleanLiteralV2] + .value, + selfjoin = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.HasSelfJoinEnabled.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no status attached" + ) + ) + .head + .asInstanceOf[BooleanLiteralV2] + .value + ) + + } yield group + }.toSeq result: Seq[GroupADM] <- Future.sequence(groups) } yield result.sorted } @@ -208,14 +201,13 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * @return all the groups as a [[GroupsGetResponseADM]]. */ private def groupsGetRequestADM( - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[GroupsGetResponseADM] = for { - maybeGroupsListToReturn <- groupsGetADM( - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + maybeGroupsListToReturn <- + groupsGetADM( + requestingUser = requestingUser + ) result = maybeGroupsListToReturn match { case groups: Seq[GroupADM] if groups.nonEmpty => GroupsGetResponseADM(groups = groups) @@ -232,7 +224,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond */ private def groupGetADM( groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Option[GroupADM]] = for { @@ -244,14 +235,14 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond .toString() ) - groupResponse <- appActor - .ask( - SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig - ) - ) - .mapTo[SparqlExtendedConstructResponse] + groupResponse <- + appActor + .ask( + SparqlExtendedConstructRequest( + sparql = sparqlQuery + ) + ) + .mapTo[SparqlExtendedConstructResponse] maybeGroup: Option[GroupADM] <- if (groupResponse.statements.isEmpty) { @@ -259,7 +250,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond } else { statements2GroupADM( statements = groupResponse.statements.head, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -272,21 +262,19 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * Gets the group with the given group IRI and returns the information as a [[GroupGetResponseADM]]. * * @param groupIri the IRI of the group requested. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @return information about the group as a [[GroupGetResponseADM]]. */ private def groupGetRequestADM( groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[GroupGetResponseADM] = for { - maybeGroupADM: Option[GroupADM] <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + maybeGroupADM: Option[GroupADM] <- + groupGetADM( + groupIri = groupIri, + requestingUser = requestingUser + ) result = maybeGroupADM match { case Some(group) => GroupGetResponseADM(group = group) @@ -303,13 +291,11 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond */ private def multipleGroupsGetRequestADM( groupIris: Set[IRI], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Set[GroupGetResponseADM]] = { val groupResponseFutures: Set[Future[GroupGetResponseADM]] = groupIris.map { groupIri => groupGetRequestADM( groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -321,24 +307,22 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * Gets the members with the given group IRI and returns the information as a sequence of [[UserADM]]. * * @param groupIri the IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @return A sequence of [[UserADM]] */ private def groupMembersGetADM( groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[UserADM]] = { log.debug("groupMembersGetADM - groupIri: {}", groupIri) for { - maybeGroupADM: Option[GroupADM] <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + maybeGroupADM: Option[GroupADM] <- + groupGetADM( + groupIri = groupIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) _ = maybeGroupADM match { case Some(group) => @@ -377,19 +361,18 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond _ = log.debug("groupMembersGetRequestADM - groupMemberIris: {}", groupMemberIris) - maybeUsersFutures: Seq[Future[Option[UserADM]]] = groupMemberIris.map { userIri => - appActor - .ask( - UserGetADM( - UserIdentifierADM(maybeIri = Some(userIri)), - userInformationTypeADM = - UserInformationTypeADM.Restricted, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[UserADM]] - } + maybeUsersFutures: Seq[Future[Option[UserADM]]] = + groupMemberIris.map { userIri => + appActor + .ask( + UserGetADM( + UserIdentifierADM(maybeIri = Some(userIri)), + userInformationTypeADM = UserInformationTypeADM.Restricted, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[UserADM]] + } maybeUsers: Seq[Option[UserADM]] <- Future.sequence(maybeUsersFutures) users: Seq[UserADM] = maybeUsers.flatten @@ -403,24 +386,22 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * Only project and system admins are allowed to access this information. * * @param groupIri the IRI of the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user initiating the request. * @return A [[GroupMembersGetResponseADM]] */ private def groupMembersGetRequestADM( groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[GroupMembersGetResponseADM] = { log.debug("groupMembersGetRequestADM - groupIri: {}", groupIri) for { - maybeMembersListToReturn <- groupMembersGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + maybeMembersListToReturn <- + groupMembersGetADM( + groupIri = groupIri, + requestingUser = requestingUser + ) result = maybeMembersListToReturn match { case members: Seq[UserADM] if members.nonEmpty => GroupMembersGetResponseADM(members = members) @@ -433,14 +414,12 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * Create a new group. * * @param createRequest the create request information. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the unique request ID. * @return a [[GroupOperationResponseADM]] */ private def createGroupADM( createRequest: GroupCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[GroupOperationResponseADM] = { @@ -472,25 +451,24 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond throw DuplicateValueException(s"Group with the name '${createRequest.name.value}' already exists") } - maybeProjectADM: Option[ProjectADM] <- appActor - .ask( - ProjectGetADM( - identifier = ProjectIdentifierADM(maybeIri = - Some(createRequest.project.value) - ), - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[ProjectADM]] - - projectADM: ProjectADM = maybeProjectADM match { - case Some(p) => p - case None => - throw NotFoundException( - s"Cannot create group inside project <${createRequest.project}>. The project was not found." - ) - } + maybeProjectADM: Option[ProjectADM] <- + appActor + .ask( + ProjectGetADM( + identifier = ProjectIdentifierADM(maybeIri = Some(createRequest.project.value)), + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[ProjectADM]] + + projectADM: ProjectADM = + maybeProjectADM match { + case Some(p) => p + case None => + throw NotFoundException( + s"Cannot create group inside project <${createRequest.project}>. The project was not found." + ) + } // check the custom IRI; if not given, create an unused IRI customGroupIri: Option[SmartIri] = createRequest.id.map(_.value).map(iri => iri.toSmartIri) @@ -500,29 +478,30 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond ) /* create the group */ - createNewGroupSparqlString = org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .createNewGroup( - adminNamedGraphIri = OntologyConstants.NamedGraphs.AdminNamedGraph, - groupIri, - groupClassIri = OntologyConstants.KnoraAdmin.UserGroup, - name = createRequest.name.value, - descriptions = createRequest.descriptions.value, - projectIri = createRequest.project.value, - status = createRequest.status.value, - hasSelfJoinEnabled = createRequest.selfjoin.value - ) - .toString + createNewGroupSparqlString = + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .createNewGroup( + adminNamedGraphIri = OntologyConstants.NamedGraphs.AdminNamedGraph, + groupIri, + groupClassIri = OntologyConstants.KnoraAdmin.UserGroup, + name = createRequest.name.value, + descriptions = createRequest.descriptions.value, + projectIri = createRequest.project.value, + status = createRequest.status.value, + hasSelfJoinEnabled = createRequest.selfjoin.value + ) + .toString _ <- appActor .ask(SparqlUpdateRequest(createNewGroupSparqlString)) .mapTo[SparqlUpdateResponse] /* Verify that the group was created and updated */ - maybeCreatedGroup <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + maybeCreatedGroup <- + groupGetADM( + groupIri = groupIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) createdGroup: GroupADM = maybeCreatedGroup.getOrElse( @@ -546,7 +525,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * * @param groupIri the IRI of the group we want to change. * @param changeGroupRequest the change request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the unique request ID. * @return a [[GroupOperationResponseADM]]. @@ -554,7 +532,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond private def changeGroupBasicInformationRequestADM( groupIri: IRI, changeGroupRequest: GroupUpdatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[GroupOperationResponseADM] = { @@ -575,11 +552,11 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond ) /* Get the project IRI which also verifies that the group exists. */ - maybeGroupADM <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + maybeGroupADM <- + groupGetADM( + groupIri = groupIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) groupADM: GroupADM = maybeGroupADM.getOrElse( throw NotFoundException(s"Group <$groupIri> not found. Aborting update request.") @@ -605,7 +582,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond result <- updateGroupADM( groupIri = groupIri, groupUpdatePayload = groupUpdatePayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -627,7 +603,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * * @param groupIri the IRI of the group we want to change. * @param changeGroupRequest the change request. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @param apiRequestID the unique request ID. * @return a [[GroupOperationResponseADM]]. @@ -635,7 +610,6 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond private def changeGroupStatusRequestADM( groupIri: IRI, changeGroupRequest: ChangeGroupApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[GroupOperationResponseADM] = { @@ -656,11 +630,11 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond ) /* Get the project IRI which also verifies that the group exists. */ - maybeGroupADM <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + maybeGroupADM <- + groupGetADM( + groupIri = groupIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) groupADM: GroupADM = maybeGroupADM.getOrElse( throw NotFoundException(s"Group <$groupIri> not found. Aborting update request.") @@ -687,19 +661,19 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond ) // update group status - updateGroupResult: GroupOperationResponseADM <- updateGroupADM( - groupIri = groupIri, - groupUpdatePayload = groupUpdatePayload, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + updateGroupResult: GroupOperationResponseADM <- + updateGroupADM( + groupIri = groupIri, + groupUpdatePayload = groupUpdatePayload, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) // remove all members from group if status is false - operationResponse <- removeGroupMembersIfNecessary( - changedGroup = updateGroupResult.group, - featureFactoryConfig = featureFactoryConfig, - apiRequestID = apiRequestID - ) + operationResponse <- + removeGroupMembersIfNecessary( + changedGroup = updateGroupResult.group, + apiRequestID = apiRequestID + ) } yield operationResponse @@ -719,14 +693,12 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * * @param groupIri the IRI of the group we are updating. * @param groupUpdatePayload the payload holding the information which we want to update. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the profile of the user making the request. * @return a [[GroupOperationResponseADM]] */ private def updateGroupADM( groupIri: IRI, groupUpdatePayload: GroupUpdatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[GroupOperationResponseADM] = { @@ -743,15 +715,16 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond for { /* Verify that the group exists. */ - maybeGroupADM <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - - groupADM: GroupADM = maybeGroupADM.getOrElse( - throw NotFoundException(s"Group <$groupIri> not found. Aborting update request.") - ) + maybeGroupADM <- + groupGetADM( + groupIri = groupIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + + groupADM: GroupADM = + maybeGroupADM.getOrElse( + throw NotFoundException(s"Group <$groupIri> not found. Aborting update request.") + ) /* Verify that the potentially new name is unique */ groupByNameAlreadyExists <- @@ -768,30 +741,30 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond } /* Update group */ - updateGroupSparqlString <- Future( - org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .updateGroup( - adminNamedGraphIri = "http://www.knora.org/data/admin", - groupIri, - maybeName = groupUpdatePayload.name.map(_.value), - maybeDescriptions = groupUpdatePayload.descriptions.map(_.value), - maybeProject = - None, // maybe later we want to allow moving of a group to another project - maybeStatus = groupUpdatePayload.status.map(_.value), - maybeSelfjoin = groupUpdatePayload.selfjoin.map(_.value) - ) - .toString - ) + updateGroupSparqlString <- + Future( + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .updateGroup( + adminNamedGraphIri = "http://www.knora.org/data/admin", + groupIri, + maybeName = groupUpdatePayload.name.map(_.value), + maybeDescriptions = groupUpdatePayload.descriptions.map(_.value), + maybeProject = None, // maybe later we want to allow moving of a group to another project + maybeStatus = groupUpdatePayload.status.map(_.value), + maybeSelfjoin = groupUpdatePayload.selfjoin.map(_.value) + ) + .toString + ) //_ = log.debug(s"updateProjectV1 - query: {}",updateProjectSparqlString) _ <- appActor.ask(SparqlUpdateRequest(updateGroupSparqlString)).mapTo[SparqlUpdateResponse] /* Verify that the project was updated. */ - maybeUpdatedGroup <- groupGetADM( - groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + maybeUpdatedGroup <- + groupGetADM( + groupIri = groupIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) updatedGroup: GroupADM = maybeUpdatedGroup.getOrElse( @@ -812,13 +785,11 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * Helper method that turns SPARQL result rows into a [[GroupADM]]. * * @param statements results from the SPARQL query representing information about the group. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user that is making the request. * @return a [[GroupADM]] representing information about the group. */ private def statements2GroupADM( statements: (SubjectV2, Map[SmartIri, Seq[LiteralV2]]), - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Option[GroupADM]] = { @@ -839,66 +810,67 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond if (propsMap.nonEmpty) { for { projectIri <- projectIriFuture - maybeProject: Option[ProjectADM] <- appActor - .ask( - ProjectGetADM( - identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[ProjectADM]] + maybeProject: Option[ProjectADM] <- + appActor + .ask( + ProjectGetADM( + identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[ProjectADM]] project: ProjectADM = maybeProject.getOrElse( throw InconsistentRepositoryDataException(s"Group $groupIri has no project attached.") ) - groupADM: GroupADM = GroupADM( - id = groupIri, - name = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.GroupName.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no groupName attached" - ) - ) - .head - .asInstanceOf[StringLiteralV2] - .value, - descriptions = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.GroupDescriptions.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no descriptions attached" - ) - ) - .map(l => - l.asStringLiteral( - throw InconsistentRepositoryDataException( - s"Expected StringLiteralV2 but got ${l.getClass}" - ) - ) - ), - project = project, - status = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.Status.toSmartIri, - throw InconsistentRepositoryDataException(s"Group $groupIri has no status attached") - ) - .head - .asInstanceOf[BooleanLiteralV2] - .value, - selfjoin = propsMap - .getOrElse( - OntologyConstants.KnoraAdmin.HasSelfJoinEnabled.toSmartIri, - throw InconsistentRepositoryDataException( - s"Group $groupIri has no selfJoin attached" - ) - ) - .head - .asInstanceOf[BooleanLiteralV2] - .value - ) + groupADM: GroupADM = + GroupADM( + id = groupIri, + name = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.GroupName.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no groupName attached" + ) + ) + .head + .asInstanceOf[StringLiteralV2] + .value, + descriptions = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.GroupDescriptions.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no descriptions attached" + ) + ) + .map(l => + l.asStringLiteral( + throw InconsistentRepositoryDataException( + s"Expected StringLiteralV2 but got ${l.getClass}" + ) + ) + ), + project = project, + status = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.Status.toSmartIri, + throw InconsistentRepositoryDataException(s"Group $groupIri has no status attached") + ) + .head + .asInstanceOf[BooleanLiteralV2] + .value, + selfjoin = propsMap + .getOrElse( + OntologyConstants.KnoraAdmin.HasSelfJoinEnabled.toSmartIri, + throw InconsistentRepositoryDataException( + s"Group $groupIri has no selfJoin attached" + ) + ) + .head + .asInstanceOf[BooleanLiteralV2] + .value + ) } yield Some(groupADM) } else { FastFuture.successful(None) @@ -950,13 +922,11 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond * group members need to be removed from the group. * * @param changedGroup the group with the new status. - * @param featureFactoryConfig the feature factory configuration. * @param apiRequestID the unique request ID. * @return a [[GroupOperationResponseADM]] */ private def removeGroupMembersIfNecessary( changedGroup: GroupADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[GroupOperationResponseADM] = if (changedGroup.status) { @@ -967,26 +937,25 @@ class GroupsResponderADM(responderData: ResponderData) extends Responder(respond // group deactivated. need to remove members. log.debug("removeGroupMembersIfNecessary - group deactivated. need to remove members.") for { - members: Seq[UserADM] <- groupMembersGetADM( - groupIri = changedGroup.id, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - - seqOfFutures: Seq[Future[UserOperationResponseADM]] = members.map { user: UserADM => - appActor - .ask( - UserGroupMembershipRemoveRequestADM( - userIri = user.id, - groupIri = changedGroup.id, - featureFactoryConfig = featureFactoryConfig, - requestingUser = - KnoraSystemInstances.Users.SystemUser, - apiRequestID = apiRequestID - ) - ) - .mapTo[UserOperationResponseADM] - } + members: Seq[UserADM] <- + groupMembersGetADM( + groupIri = changedGroup.id, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + + seqOfFutures: Seq[Future[UserOperationResponseADM]] = + members.map { user: UserADM => + appActor + .ask( + UserGroupMembershipRemoveRequestADM( + userIri = user.id, + groupIri = changedGroup.id, + requestingUser = KnoraSystemInstances.Users.SystemUser, + apiRequestID = apiRequestID + ) + ) + .mapTo[UserOperationResponseADM] + } userOperationResults: Seq[UserOperationResponseADM] <- Future.sequence(seqOfFutures) } yield GroupOperationResponseADM(group = changedGroup) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala index 4f017aa050..ce8012260e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -48,52 +47,49 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Receives a message of type [[ListsResponderRequestADM]], and returns an appropriate response message. */ def receive(msg: ListsResponderRequestADM) = msg match { - case ListsGetRequestADM(projectIri, featureFactoryConfig, requestingUser) => - listsGetRequestADM(projectIri, featureFactoryConfig, requestingUser) - case ListGetRequestADM(listIri, featureFactoryConfig, requestingUser) => - listGetRequestADM(listIri, featureFactoryConfig, requestingUser) - case ListNodeInfoGetRequestADM(listIri, featureFactoryConfig, requestingUser) => - listNodeInfoGetRequestADM(listIri, featureFactoryConfig, requestingUser) - case NodePathGetRequestADM(iri, featureFactoryConfig, requestingUser) => + case ListsGetRequestADM(projectIri, requestingUser) => + listsGetRequestADM(projectIri, requestingUser) + case ListGetRequestADM(listIri, requestingUser) => + listGetRequestADM(listIri, requestingUser) + case ListNodeInfoGetRequestADM(listIri, requestingUser) => + listNodeInfoGetRequestADM(listIri, requestingUser) + case NodePathGetRequestADM(iri, requestingUser) => nodePathGetAdminRequest(iri, requestingUser) - case ListRootNodeCreateRequestADM(createRootNode, featureFactoryConfig, requestingUser, apiRequestID) => - listCreateRequestADM(createRootNode, featureFactoryConfig, apiRequestID) - case ListChildNodeCreateRequestADM(createChildNodeRequest, featureFactoryConfig, requestingUser, apiRequestID) => - listChildNodeCreateRequestADM(createChildNodeRequest, featureFactoryConfig, apiRequestID) - case NodeInfoChangeRequestADM(nodeIri, changeNodeRequest, featureFactoryConfig, requestingUser, apiRequestID) => - nodeInfoChangeRequest(nodeIri, changeNodeRequest, featureFactoryConfig, apiRequestID) - case NodeNameChangeRequestADM(nodeIri, changeNodeNameRequest, featureFactoryConfig, requestingUser, apiRequestID) => - nodeNameChangeRequest(nodeIri, changeNodeNameRequest, featureFactoryConfig, requestingUser, apiRequestID) + case ListRootNodeCreateRequestADM(createRootNode, requestingUser, apiRequestID) => + listCreateRequestADM(createRootNode, apiRequestID) + case ListChildNodeCreateRequestADM(createChildNodeRequest, requestingUser, apiRequestID) => + listChildNodeCreateRequestADM(createChildNodeRequest, apiRequestID) + case NodeInfoChangeRequestADM(nodeIri, changeNodeRequest, requestingUser, apiRequestID) => + nodeInfoChangeRequest(nodeIri, changeNodeRequest, apiRequestID) + case NodeNameChangeRequestADM(nodeIri, changeNodeNameRequest, requestingUser, apiRequestID) => + nodeNameChangeRequest(nodeIri, changeNodeNameRequest, requestingUser, apiRequestID) case NodeLabelsChangeRequestADM( nodeIri, changeNodeLabelsRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => - nodeLabelsChangeRequest(nodeIri, changeNodeLabelsRequest, featureFactoryConfig, requestingUser, apiRequestID) + nodeLabelsChangeRequest(nodeIri, changeNodeLabelsRequest, requestingUser, apiRequestID) case NodeCommentsChangeRequestADM( nodeIri, changeNodeCommentsRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => - nodeCommentsChangeRequest(nodeIri, changeNodeCommentsRequest, featureFactoryConfig, requestingUser, apiRequestID) + nodeCommentsChangeRequest(nodeIri, changeNodeCommentsRequest, requestingUser, apiRequestID) case NodePositionChangeRequestADM( nodeIri, changeNodePositionRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => - nodePositionChangeRequest(nodeIri, changeNodePositionRequest, featureFactoryConfig, requestingUser, apiRequestID) - case ListItemDeleteRequestADM(nodeIri, featureFactoryConfig, requestingUser, apiRequestID) => - deleteListItemRequestADM(nodeIri, featureFactoryConfig, requestingUser, apiRequestID) - case CanDeleteListRequestADM(iri, featureFactoryConfig, requestingUser) => + nodePositionChangeRequest(nodeIri, changeNodePositionRequest, requestingUser, apiRequestID) + case ListItemDeleteRequestADM(nodeIri, requestingUser, apiRequestID) => + deleteListItemRequestADM(nodeIri, requestingUser, apiRequestID) + case CanDeleteListRequestADM(iri, requestingUser) => canDeleteListRequestADM(iri) - case ListNodeCommentsDeleteRequestADM(iri, featureFactoryConfig, requestingUser) => - deleteListNodeCommentsADM(iri, featureFactoryConfig, requestingUser) + case ListNodeCommentsDeleteRequestADM(iri, requestingUser) => + deleteListNodeCommentsADM(iri, requestingUser) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -103,74 +99,73 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * any children. * * @param projectIri the IRI of the project the list belongs to. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a [[ListsGetResponseADM]]. */ private def listsGetRequestADM( projectIri: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ListsGetResponseADM] = // log.debug("listsGetRequestV2") for { - sparqlQuery <- Future( - org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .getLists( - maybeProjectIri = projectIri - ) - .toString() - ) + sparqlQuery <- + Future( + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .getLists( + maybeProjectIri = projectIri + ) + .toString() + ) - listsResponse <- appActor - .ask( - SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig - ) - ) - .mapTo[SparqlExtendedConstructResponse] + listsResponse <- + appActor + .ask( + SparqlExtendedConstructRequest( + sparql = sparqlQuery + ) + ) + .mapTo[SparqlExtendedConstructResponse] // _ = log.debug("listsGetAdminRequest - listsResponse: {}", listsResponse ) // Seq(subjectIri, (objectIri -> Seq(stringWithOptionalLand)) statements = listsResponse.statements.toList - lists: Seq[ListNodeInfoADM] = statements.map { - case (listIri: SubjectV2, propsMap: Map[SmartIri, Seq[LiteralV2]]) => - val name: Option[String] = propsMap - .get(OntologyConstants.KnoraBase.ListNodeName.toSmartIri) - .map(_.head.asInstanceOf[StringLiteralV2].value) - val labels: Seq[StringLiteralV2] = propsMap - .getOrElse( - OntologyConstants.Rdfs.Label.toSmartIri, - Seq.empty[StringLiteralV2] - ) - .map(_.asInstanceOf[StringLiteralV2]) - val comments: Seq[StringLiteralV2] = propsMap - .getOrElse( - OntologyConstants.Rdfs.Comment.toSmartIri, - Seq.empty[StringLiteralV2] - ) - .map(_.asInstanceOf[StringLiteralV2]) - - ListRootNodeInfoADM( - id = listIri.toString, - projectIri = propsMap - .getOrElse( - OntologyConstants.KnoraBase.AttachedToProject.toSmartIri, - throw InconsistentRepositoryDataException( - "The required property 'attachedToProject' not found." - ) - ) - .head - .asInstanceOf[IriLiteralV2] - .value, - name = name, - labels = StringLiteralSequenceV2(labels.toVector), - comments = StringLiteralSequenceV2(comments.toVector) - ).unescape - } + lists: Seq[ListNodeInfoADM] = + statements.map { case (listIri: SubjectV2, propsMap: Map[SmartIri, Seq[LiteralV2]]) => + val name: Option[String] = propsMap + .get(OntologyConstants.KnoraBase.ListNodeName.toSmartIri) + .map(_.head.asInstanceOf[StringLiteralV2].value) + val labels: Seq[StringLiteralV2] = propsMap + .getOrElse( + OntologyConstants.Rdfs.Label.toSmartIri, + Seq.empty[StringLiteralV2] + ) + .map(_.asInstanceOf[StringLiteralV2]) + val comments: Seq[StringLiteralV2] = propsMap + .getOrElse( + OntologyConstants.Rdfs.Comment.toSmartIri, + Seq.empty[StringLiteralV2] + ) + .map(_.asInstanceOf[StringLiteralV2]) + + ListRootNodeInfoADM( + id = listIri.toString, + projectIri = propsMap + .getOrElse( + OntologyConstants.KnoraBase.AttachedToProject.toSmartIri, + throw InconsistentRepositoryDataException( + "The required property 'attachedToProject' not found." + ) + ) + .head + .asInstanceOf[IriLiteralV2] + .value, + name = name, + labels = StringLiteralSequenceV2(labels.toVector), + comments = StringLiteralSequenceV2(comments.toVector) + ).unescape + } // _ = log.debug("listsGetAdminRequest - items: {}", items) @@ -180,13 +175,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Retrieves a complete list (root and all children) from the triplestore and returns it as a optional [[ListADM]]. * * @param rootNodeIri the Iri if the root node of the list to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a optional [[ListADM]]. */ private def listGetADM( rootNodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Option[ListADM]] = for { @@ -199,18 +192,18 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde if (exists) { for { // here we know that the list exists and it is fine if children is an empty list - children: Seq[ListChildNodeADM] <- getChildren( - ofNodeIri = rootNodeIri, - shallow = false, - featureFactoryConfig = featureFactoryConfig, - KnoraSystemInstances.Users.SystemUser - ) + children: Seq[ListChildNodeADM] <- + getChildren( + ofNodeIri = rootNodeIri, + shallow = false, + KnoraSystemInstances.Users.SystemUser + ) - maybeRootNodeInfo <- listNodeInfoGetADM( - nodeIri = rootNodeIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) + maybeRootNodeInfo <- + listNodeInfoGetADM( + nodeIri = rootNodeIri, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) // _ = log.debug(s"listGetADM - maybeRootNodeInfo: {}", maybeRootNodeInfo) @@ -245,18 +238,15 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde */ private def listGetRequestADM( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ListItemGetResponseADM] = { def getNodeADM( - childNode: ListChildNodeADM, - featureFactoryConfig: FeatureFactoryConfig + childNode: ListChildNodeADM ): Future[ListNodeGetResponseADM] = for { maybeNodeInfo <- listNodeInfoGetADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -283,7 +273,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde // Yes. Get the entire list maybeList <- listGetADM( rootNodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -299,7 +288,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNode <- listNodeGetADM( nodeIri = nodeIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -307,7 +295,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde // make sure that it is a child node case Some(childNode: ListChildNodeADM) => // get the info of the child node - getNodeADM(childNode, featureFactoryConfig) + getNodeADM(childNode) case _ => throw NotFoundException(s"Node '$nodeIri' not found") } @@ -321,13 +309,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * lists root node or child node * * @param nodeIri the Iri if the list node to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a optional [[ListNodeInfoADM]]. */ private def listNodeInfoGetADM( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Option[ListNodeInfoADM]] = { for { @@ -344,8 +330,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde listNodeResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQuery ) ) .mapTo[SparqlExtendedConstructResponse] @@ -463,19 +448,16 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * root node or child node * * @param nodeIri the IRI of the list node to be queried. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a [[ChildNodeInfoGetResponseADM]]. */ private def listNodeInfoGetRequestADM( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[NodeInfoGetResponseADM] = for { maybeListNodeInfoADM <- listNodeInfoGetADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -491,34 +473,33 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param nodeIri the IRI of the list node to be queried. * @param shallow denotes if all children or only the immediate children will be returned. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a optional [[ListNodeADM]] */ private def listNodeGetADM( nodeIri: IRI, shallow: Boolean, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Option[ListNodeADM]] = { for { // this query will give us only the information about the root node. - sparqlQuery <- Future( - org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .getListNode( - nodeIri = nodeIri - ) - .toString() - ) + sparqlQuery <- + Future( + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .getListNode( + nodeIri = nodeIri + ) + .toString() + ) - listInfoResponse <- appActor - .ask( - SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig - ) - ) - .mapTo[SparqlExtendedConstructResponse] + listInfoResponse <- + appActor + .ask( + SparqlExtendedConstructRequest( + sparql = sparqlQuery + ) + ) + .mapTo[SparqlExtendedConstructResponse] // _ = log.debug(s"listGetADM - statements: {}", MessageUtil.toSource(listInfoResponse.statements)) @@ -526,12 +507,12 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde if (listInfoResponse.statements.nonEmpty) { for { // here we know that the list exists and it is fine if children is an empty list - children: Seq[ListChildNodeADM] <- getChildren( - ofNodeIri = nodeIri, - shallow = shallow, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + children: Seq[ListChildNodeADM] <- + getChildren( + ofNodeIri = nodeIri, + shallow = shallow, + requestingUser = requestingUser + ) // _ = log.debug(s"listGetADM - children count: {}", children.size) @@ -647,14 +628,12 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param ofNodeIri the IRI of the node for which children are to be returned. * @param shallow denotes if all children or only the immediate children will be returned. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a sequence of [[ListChildNodeADM]]. */ private def getChildren( ofNodeIri: IRI, shallow: Boolean, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[ListChildNodeADM]] = { @@ -733,8 +712,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde nodeWithChildrenResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = nodeChildrenQuery, - featureFactoryConfig = featureFactoryConfig + sparql = nodeChildrenQuery ) ) .mapTo[SparqlExtendedConstructResponse] @@ -862,12 +840,10 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Creates a node (root or child). * * @param createNodeRequest the new node's information. - * @param featureFactoryConfig the feature factory configuration. * @return a [newListNodeIri] */ private def createNode( - createNodeRequest: ListNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig + createNodeRequest: ListNodeCreatePayloadADM ): Future[IRI] = { // TODO-mpro: it's quickfix, refactor val parentNode: Option[ListIri] = createNodeRequest match { @@ -906,15 +882,13 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde def getRootNodeAndPositionOfNewChild( parentNodeIri: IRI, - dataNamedGraph: IRI, - featureFactoryConfig: FeatureFactoryConfig + dataNamedGraph: IRI ): Future[(Some[Int], Some[IRI])] = for { /* Verify that the list node exists by retrieving the whole node including children one level deep (need for position calculation) */ maybeParentListNode <- listNodeGetADM( nodeIri = parentNodeIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -949,8 +923,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos = children.size - 1, nodes = children, shiftToLeft = false, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield updatedSiblings } else { @@ -969,7 +942,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde .ask( ProjectGetADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri.value)), - featureFactoryConfig = featureFactoryConfig, KnoraSystemInstances.Users.SystemUser ) ) @@ -1001,8 +973,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde if (parentNode.nonEmpty) { getRootNodeAndPositionOfNewChild( parentNodeIri = parentNode.get.value, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } else { Future(None, None) @@ -1069,13 +1040,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Creates a list. * * @param createRootRequest the new list's information. - * @param featureFactoryConfig the feature factory configuration. * @param apiRequestID the unique api request ID. * @return a [[RootNodeInfoGetResponseADM]] */ private def listCreateRequestADM( createRootRequest: ListRootNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[ListGetResponseADM] = { @@ -1086,16 +1055,14 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde */ def listCreateTask( createRootRequest: ListRootNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[ListGetResponseADM] = for { - listRootIri <- createNode(createRootRequest, featureFactoryConfig) + listRootIri <- createNode(createRootRequest) // Verify that the list was created. maybeNewListADM <- listGetADM( rootNodeIri = listRootIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1114,7 +1081,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde taskResult <- IriLocker.runWithIriLock( apiRequestID, LISTS_GLOBAL_LOCK_IRI, - () => listCreateTask(createRootRequest, featureFactoryConfig, apiRequestID) + () => listCreateTask(createRootRequest, apiRequestID) ) } yield taskResult } @@ -1124,7 +1091,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param nodeIri the list's IRI. * @param changeNodeRequest the new node information. - * @param featureFactoryConfig the feature factory configuration. * @param apiRequestID the unique api request ID. * @return a [[NodeInfoGetResponseADM]] * @throws ForbiddenException in the case that the user is not allowed to perform the operation. @@ -1134,7 +1100,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde private def nodeInfoChangeRequest( nodeIri: IRI, changeNodeRequest: ListNodeChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = { @@ -1144,7 +1109,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde def nodeInfoChangeTask( nodeIri: IRI, changeNodeRequest: ListNodeChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = for { @@ -1155,7 +1119,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde throw BadRequestException("IRI in path and payload don't match.") ) - changeNodeInfoSparqlString <- getUpdateNodeInfoSparqlStatement(changeNodeRequest, featureFactoryConfig) + changeNodeInfoSparqlString <- getUpdateNodeInfoSparqlStatement(changeNodeRequest) changeResourceResponse <- appActor .ask(SparqlUpdateRequest(changeNodeInfoSparqlString)) .mapTo[SparqlUpdateResponse] @@ -1163,7 +1127,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde /* Verify that the node info was updated */ maybeNodeADM <- listNodeInfoGetADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1185,7 +1148,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde taskResult <- IriLocker.runWithIriLock( apiRequestID, nodeIri, - () => nodeInfoChangeTask(nodeIri, changeNodeRequest, featureFactoryConfig, apiRequestID) + () => nodeInfoChangeTask(nodeIri, changeNodeRequest, apiRequestID) ) } yield taskResult } @@ -1194,13 +1157,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Creates a new child node and appends it to an existing list node. * * @param createChildNodeRequest the new list node's information. - * @param featureFactoryConfig the feature factory configuration. * @param apiRequestID the unique api request ID. * @return a [[ChildNodeInfoGetResponseADM]] */ private def listChildNodeCreateRequestADM( createChildNodeRequest: ListChildNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[ChildNodeInfoGetResponseADM] = { @@ -1209,15 +1170,13 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde */ def listChildNodeCreateTask( createChildNodeRequest: ListChildNodeCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, apiRequestID: UUID ): Future[ChildNodeInfoGetResponseADM] = for { - newListNodeIri <- createNode(createChildNodeRequest, featureFactoryConfig) + newListNodeIri <- createNode(createChildNodeRequest) // Verify that the list node was created. maybeNewListNode <- listNodeInfoGetADM( nodeIri = newListNodeIri, - featureFactoryConfig = featureFactoryConfig, KnoraSystemInstances.Users.SystemUser ) newListNode = maybeNewListNode match { @@ -1239,7 +1198,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde taskResult <- IriLocker.runWithIriLock( apiRequestID, LISTS_GLOBAL_LOCK_IRI, - () => listChildNodeCreateTask(createChildNodeRequest, featureFactoryConfig, apiRequestID) + () => listChildNodeCreateTask(createChildNodeRequest, apiRequestID) ) } yield taskResult @@ -1250,7 +1209,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param nodeIri the node's IRI. * @param changeNodeNameRequest the new node name. - * @param featureFactoryConfig the feature factory configuration. * @param apiRequestID the unique api request ID. * @return a [[NodeInfoGetResponseADM]] * @throws ForbiddenException in the case that the user is not allowed to perform the operation. @@ -1259,7 +1217,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde private def nodeNameChangeRequest( nodeIri: IRI, changeNodeNameRequest: NodeNameChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = { @@ -1270,26 +1227,25 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde def nodeNameChangeTask( nodeIri: IRI, changeNodeNameRequest: NodeNameChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = for { - projectIri <- getProjectIriFromNode(nodeIri, featureFactoryConfig) + projectIri <- getProjectIriFromNode(nodeIri) // check if the requesting user is allowed to perform operation _ = if (!requestingUser.permissions.isProjectAdmin(projectIri) && !requestingUser.permissions.isSystemAdmin) { // not project or a system admin throw ForbiddenException(ListErrorMessages.ListChangePermission) } - changeNodeNameSparqlString <- getUpdateNodeInfoSparqlStatement( - changeNodeInfoRequest = ListNodeChangePayloadADM( - listIri = ListIri.make(nodeIri).fold(e => throw e.head, v => v), - projectIri = ProjectIri.make(projectIri).fold(e => throw e.head, v => v), - name = Some(changeNodeNameRequest.name) - ), - featureFactoryConfig = featureFactoryConfig - ) + changeNodeNameSparqlString <- + getUpdateNodeInfoSparqlStatement( + changeNodeInfoRequest = ListNodeChangePayloadADM( + listIri = ListIri.make(nodeIri).fold(e => throw e.head, v => v), + projectIri = ProjectIri.make(projectIri).fold(e => throw e.head, v => v), + name = Some(changeNodeNameRequest.name) + ) + ) changeResourceResponse <- appActor .ask(SparqlUpdateRequest(changeNodeNameSparqlString)) @@ -1298,7 +1254,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde /* Verify that the node info was updated */ maybeNodeADM <- listNodeInfoGetADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1318,7 +1273,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde IriLocker.runWithIriLock( apiRequestID, nodeIri, - () => nodeNameChangeTask(nodeIri, changeNodeNameRequest, featureFactoryConfig, requestingUser, apiRequestID) + () => nodeNameChangeTask(nodeIri, changeNodeNameRequest, requestingUser, apiRequestID) ) } yield taskResult } @@ -1328,7 +1283,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param nodeIri the node's IRI. * @param changeNodeLabelsRequest the new node labels. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[NodeInfoGetResponseADM]] @@ -1338,7 +1292,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde private def nodeLabelsChangeRequest( nodeIri: IRI, changeNodeLabelsRequest: NodeLabelsChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = { @@ -1349,12 +1302,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde def nodeLabelsChangeTask( nodeIri: IRI, changeNodeLabelsRequest: NodeLabelsChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = for { - projectIri <- getProjectIriFromNode(nodeIri, featureFactoryConfig) + projectIri <- getProjectIriFromNode(nodeIri) // check if the requesting user is allowed to perform operation _ = if (!requestingUser.permissions.isProjectAdmin(projectIri) && !requestingUser.permissions.isSystemAdmin) { @@ -1366,8 +1318,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde listIri = ListIri.make(nodeIri).fold(e => throw e.head, v => v), projectIri = ProjectIri.make(projectIri).fold(e => throw e.head, v => v), labels = Some(changeNodeLabelsRequest.labels) - ), - featureFactoryConfig = featureFactoryConfig + ) ) changeResourceResponse <- appActor .ask(SparqlUpdateRequest(changeNodeLabelsSparqlString)) @@ -1376,7 +1327,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde /* Verify that the node info was updated */ maybeNodeADM <- listNodeInfoGetADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1396,8 +1346,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde IriLocker.runWithIriLock( apiRequestID, nodeIri, - () => - nodeLabelsChangeTask(nodeIri, changeNodeLabelsRequest, featureFactoryConfig, requestingUser, apiRequestID) + () => nodeLabelsChangeTask(nodeIri, changeNodeLabelsRequest, requestingUser, apiRequestID) ) } yield taskResult } @@ -1407,7 +1356,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param nodeIri the node's IRI. * @param changeNodeCommentsRequest the new node comments. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[NodeInfoGetResponseADM]] @@ -1417,7 +1365,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde private def nodeCommentsChangeRequest( nodeIri: IRI, changeNodeCommentsRequest: NodeCommentsChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = { @@ -1428,12 +1375,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde def nodeCommentsChangeTask( nodeIri: IRI, changeNodeCommentsRequest: NodeCommentsChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodeInfoGetResponseADM] = for { - projectIri <- getProjectIriFromNode(nodeIri, featureFactoryConfig) + projectIri <- getProjectIriFromNode(nodeIri) // check if the requesting user is allowed to perform operation _ = if (!requestingUser.permissions.isProjectAdmin(projectIri) && !requestingUser.permissions.isSystemAdmin) { @@ -1446,15 +1392,13 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde listIri = ListIri.make(nodeIri).fold(e => throw e.head, v => v), projectIri = ProjectIri.make(projectIri).fold(e => throw e.head, v => v), comments = Some(changeNodeCommentsRequest.comments) - ), - featureFactoryConfig = featureFactoryConfig + ) ) _ <- appActor.ask(SparqlUpdateRequest(changeNodeCommentsSparqlString)).mapTo[SparqlUpdateResponse] /* Verify that the node info was updated */ maybeNodeADM <- listNodeInfoGetADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1477,7 +1421,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde nodeCommentsChangeTask( nodeIri, changeNodeCommentsRequest, - featureFactoryConfig, requestingUser, apiRequestID ) @@ -1490,7 +1433,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * * @param nodeIri the node's IRI. * @param changeNodePositionRequest the new node comments. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[NodePositionChangeResponseADM]] @@ -1500,7 +1442,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde private def nodePositionChangeRequest( nodeIri: IRI, changeNodePositionRequest: ChangeNodePositionApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodePositionChangeResponseADM] = { @@ -1551,7 +1492,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeParentNode <- listNodeGetADM( nodeIri = changeNodePositionRequest.parentIri, shallow = false, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) updatedParent = maybeParentNode.get @@ -1603,7 +1543,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeParentNode <- listNodeGetADM( nodeIri = parentIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) parentNode = @@ -1624,8 +1563,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde _ <- updatePositionOfNode( nodeIri = node.id, newPosition = newPosition, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) // update position of siblings @@ -1638,8 +1576,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos = newPosition, nodes = parentChildren, shiftToLeft = true, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield updatedSiblings } else if (currPosition > newPosition) { @@ -1650,8 +1587,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos = currPosition - 1, nodes = parentChildren, shiftToLeft = false, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield updatedSiblings } else { @@ -1683,7 +1619,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeCurrentParentNode <- listNodeGetADM( nodeIri = currParentIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) currentSiblings = maybeCurrentParentNode.get.getChildren @@ -1691,7 +1626,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNewParentNode <- listNodeGetADM( nodeIri = newParentIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) newParent = maybeNewParentNode.get @@ -1710,8 +1644,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde _ <- updatePositionOfNode( nodeIri = node.id, newPosition = newPosition, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) // shift current siblings with a higher position to left as if the node is deleted @@ -1720,8 +1653,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos = currentSiblings.last.position, nodes = currentSiblings, shiftToLeft = true, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) // Is node supposed to be added to the end of new parent's children list? @@ -1738,8 +1670,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos = newSiblings.last.position, nodes = newSiblings, shiftToLeft = false, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield updatedSiblings } @@ -1749,8 +1680,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde nodeIri = node.id, oldParentIri = currParentIri, newParentIri = newParentIri, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield newPosition @@ -1761,15 +1691,14 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde def nodePositionChangeTask( nodeIri: IRI, changeNodePositionRequest: ChangeNodePositionApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[NodePositionChangeResponseADM] = for { - projectIri <- getProjectIriFromNode(nodeIri, featureFactoryConfig) + projectIri <- getProjectIriFromNode(nodeIri) // get data names graph of the project - dataNamedGraph <- getDataNamedGraph(projectIri, featureFactoryConfig) + dataNamedGraph <- getDataNamedGraph(projectIri) // check if the requesting user is allowed to perform operation _ = if (!requestingUser.permissions.isProjectAdmin(projectIri) && !requestingUser.permissions.isSystemAdmin) { @@ -1781,7 +1710,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNode <- listNodeGetADM( nodeIri = nodeIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) node = maybeNode match { @@ -1791,7 +1719,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde } // get node's current parent - currentParentNodeIri: IRI <- getParentNodeIRI(nodeIri, featureFactoryConfig) + currentParentNodeIri: IRI <- getParentNodeIRI(nodeIri) newPosition <- if (currentParentNodeIri == changeNodePositionRequest.parentIri) { updatePositionWithinSameParent( @@ -1822,7 +1750,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde nodePositionChangeTask( nodeIri, changeNodePositionRequest, - featureFactoryConfig, requestingUser, apiRequestID ) @@ -1860,13 +1787,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde */ private def deleteListNodeCommentsADM( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ListNodeCommentsDeleteResponseADM] = for { node <- listNodeInfoGetADM( nodeIri = iri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1887,8 +1812,8 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde throw BadRequestException("Root node comments cannot be deleted.") } - projectIri <- getProjectIriFromNode(iri, featureFactoryConfig) - namedGraph <- getDataNamedGraph(projectIri, featureFactoryConfig) + projectIri <- getProjectIriFromNode(iri) + namedGraph <- getDataNamedGraph(projectIri) sparqlQuery <- Future( @@ -1912,7 +1837,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * delete the list and return a confirmation message. * * @param nodeIri the node's IRI. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[NodeInfoGetResponseADM]] @@ -1921,7 +1845,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde */ private def deleteListItemRequestADM( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[ListItemDeleteResponseADM] = { @@ -1973,7 +1896,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde ): Future[IRI] = for { // get the data graph of the project. - dataNamedGraph <- getDataNamedGraph(projectIri, featureFactoryConfig) + dataNamedGraph <- getDataNamedGraph(projectIri) // delete the children errorCheckFutures: Seq[Future[Unit]] = @@ -1993,7 +1916,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * @param positionOfDeletedNode the position of the deleted node. * @param parentNodeIri the IRI of the deleted node's parent. * @param dataNamedGraph the data named graph. - * @param featureFactoryConfig the feature factory configuration. * @return a [[ListNodeADM]] * @throws UpdateNotPerformedException if the node that had to be deleted is still in the list of parent's children. */ @@ -2001,14 +1923,12 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde deletedNodeIri: IRI, positionOfDeletedNode: Int, parentNodeIri: IRI, - dataNamedGraph: IRI, - featureFactoryConfig: FeatureFactoryConfig + dataNamedGraph: IRI ): Future[ListNodeADM] = for { maybeNode <- listNodeGetADM( nodeIri = parentNodeIri, shallow = false, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -2032,8 +1952,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos = remainingChildren.last.position, nodes = remainingChildren, shiftToLeft = true, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield shiftedChildren } else { @@ -2070,12 +1989,11 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde */ def nodeDeleteTask( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[ListItemDeleteResponseADM] = for { - projectIri <- getProjectIriFromNode(nodeIri, featureFactoryConfig) + projectIri <- getProjectIriFromNode(nodeIri) // check if the requesting user is allowed to perform operation _ = if (!requestingUser.permissions.isProjectAdmin(projectIri) && !requestingUser.permissions.isSystemAdmin) { @@ -2086,7 +2004,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNode: Option[ListNodeADM] <- listNodeGetADM( nodeIri = nodeIri, shallow = false, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -2108,7 +2025,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde _ <- isNodeOrItsChildrenUsed(childNode.id, childNode.children) // get parent node IRI before deleting the node - parentNodeIri <- getParentNodeIRI(nodeIri, featureFactoryConfig) + parentNodeIri <- getParentNodeIRI(nodeIri) // delete the node dataNamedGraph <- deleteListItem( @@ -2123,8 +2040,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde deletedNodeIri = nodeIri, positionOfDeletedNode = childNode.position, parentNodeIri = parentNodeIri, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } yield ChildNodeDeleteResponseADM(node = updatedParentNode) @@ -2141,7 +2057,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde taskResult <- IriLocker.runWithIriLock( apiRequestID, nodeIri, - () => nodeDeleteTask(nodeIri, featureFactoryConfig, requestingUser, apiRequestID) + () => nodeDeleteTask(nodeIri, requestingUser, apiRequestID) ) } yield taskResult } @@ -2240,16 +2156,14 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Helper method to generate a sparql statement for updating node information. * * @param changeNodeInfoRequest the node information to change. - * @param featureFactoryConfig the feature factory configuration. * @return a [[String]]. */ private def getUpdateNodeInfoSparqlStatement( - changeNodeInfoRequest: ListNodeChangePayloadADM, - featureFactoryConfig: FeatureFactoryConfig + changeNodeInfoRequest: ListNodeChangePayloadADM ): Future[String] = for { // get the data graph of the project. - dataNamedGraph <- getDataNamedGraph(changeNodeInfoRequest.projectIri.value, featureFactoryConfig) + dataNamedGraph <- getDataNamedGraph(changeNodeInfoRequest.projectIri.value) /* verify that the list name is unique for the project */ nodeNameUnique: Boolean <- listNodeNameIsProjectUnique( @@ -2266,7 +2180,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNode <- listNodeGetADM( nodeIri = changeNodeInfoRequest.listIri.value, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -2302,15 +2215,13 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Helper method to get projectIri of a node. * * @param nodeIri the IRI of the node. - * @param featureFactoryConfig the feature factory configuration. * @return a [[IRI]]. */ - private def getProjectIriFromNode(nodeIri: IRI, featureFactoryConfig: FeatureFactoryConfig): Future[IRI] = + private def getProjectIriFromNode(nodeIri: IRI): Future[IRI] = for { maybeNode <- listNodeGetADM( nodeIri = nodeIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -2322,7 +2233,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeRoot <- listNodeGetADM( nodeIri = childNode.hasRootNode, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) rootProjectIri = maybeRoot match { @@ -2355,9 +2265,10 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde .toString() ) - isNodeUsedResponse: SparqlSelectResult <- appActor - .ask(SparqlSelectRequest(isNodeUsedSparql)) - .mapTo[SparqlSelectResult] + isNodeUsedResponse: SparqlSelectResult <- + appActor + .ask(SparqlSelectRequest(isNodeUsedSparql)) + .mapTo[SparqlSelectResult] _ = if (isNodeUsedResponse.results.bindings.nonEmpty) { errorFun @@ -2368,10 +2279,9 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Helper method to get the data named graph of a project. * * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @return an [[IRI]]. */ - protected def getDataNamedGraph(projectIri: IRI, featureFactoryConfig: FeatureFactoryConfig): Future[IRI] = + protected def getDataNamedGraph(projectIri: IRI): Future[IRI] = for { /* Get the project information */ maybeProject <- appActor @@ -2380,7 +2290,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde ProjectIdentifierADM( maybeIri = Some(projectIri) ), - featureFactoryConfig = featureFactoryConfig, KnoraSystemInstances.Users.SystemUser ) ) @@ -2399,10 +2308,9 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * Helper method to get parent of a node. * * @param nodeIri the IRI of the node. - * @param featureFactoryConfig the feature factory configuration. * @return a [[ListNodeADM]]. */ - protected def getParentNodeIRI(nodeIri: IRI, featureFactoryConfig: FeatureFactoryConfig): Future[IRI] = + protected def getParentNodeIRI(nodeIri: IRI): Future[IRI] = for { // query statement getParentNodeSparqlString: String <- Future( @@ -2416,8 +2324,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde parentNodeResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = getParentNodeSparqlString, - featureFactoryConfig = featureFactoryConfig + sparql = getParentNodeSparqlString ) ) .mapTo[SparqlExtendedConstructResponse] @@ -2441,15 +2348,16 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde protected def deleteNode(dataNamedGraph: IRI, nodeIri: IRI, isRootNode: Boolean): Future[Unit] = for { // Generate SPARQL for erasing a node. - sparqlDeleteNode: String <- Future( - org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .deleteNode( - dataNamedGraph = dataNamedGraph, - nodeIri = nodeIri, - isRootNode = isRootNode - ) - .toString() - ) + sparqlDeleteNode: String <- + Future( + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .deleteNode( + dataNamedGraph = dataNamedGraph, + nodeIri = nodeIri, + isRootNode = isRootNode + ) + .toString() + ) // Do the update. _ <- appActor.ask(SparqlUpdateRequest(sparqlDeleteNode)).mapTo[SparqlUpdateResponse] @@ -2468,27 +2376,26 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * @param nodeIri the IRI of the node that must be shifted. * @param newPosition the new position of the child node. * @param dataNamedGraph the data named graph of the project. - * @param featureFactoryConfig the feature factory configuration. * @throws UpdateNotPerformedException if the position of the node could not be updated. * @return a [[ListChildNodeADM]]. */ protected def updatePositionOfNode( nodeIri: IRI, newPosition: Int, - dataNamedGraph: IRI, - featureFactoryConfig: FeatureFactoryConfig + dataNamedGraph: IRI ): Future[ListChildNodeADM] = for { // Generate SPARQL for erasing a node. - sparqlUpdateNodePosition: String <- Future( - org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .updateNodePosition( - dataNamedGraph = dataNamedGraph, - nodeIri = nodeIri, - newPosition = newPosition - ) - .toString() - ) + sparqlUpdateNodePosition: String <- + Future( + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .updateNodePosition( + dataNamedGraph = dataNamedGraph, + nodeIri = nodeIri, + newPosition = newPosition + ) + .toString() + ) _ <- appActor.ask(SparqlUpdateRequest(sparqlUpdateNodePosition)).mapTo[SparqlUpdateResponse] @@ -2496,7 +2403,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNode <- listNodeGetADM( nodeIri = nodeIri, shallow = false, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -2522,7 +2428,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * @param nodes the list of all nodes. * @param shiftToLeft shift nodes to left if true, otherwise to right. * @param dataNamedGraph the data named graph of the project. - * @param featureFactoryConfig the feature factory configuration. * @throws UpdateNotPerformedException if the position of a node could not be updated. * @return a sequence of [[ListChildNodeADM]]. */ @@ -2531,8 +2436,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde endPos: Int, nodes: Seq[ListChildNodeADM], shiftToLeft: Boolean, - dataNamedGraph: IRI, - featureFactoryConfig: FeatureFactoryConfig + dataNamedGraph: IRI ): Future[Seq[ListChildNodeADM]] = for { nodesTobeUpdated: Seq[ListChildNodeADM] <- @@ -2550,8 +2454,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde updatePositionOfNode( nodeIri = child.id, newPosition = newPos, - dataNamedGraph = dataNamedGraph, - featureFactoryConfig = featureFactoryConfig + dataNamedGraph = dataNamedGraph ) } updatedNodes: Seq[ListChildNodeADM] <- Future.sequence(updatePositionFutures) @@ -2564,28 +2467,27 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde * @param oldParentIri the IRI of the current parent node. * @param newParentIri the IRI of the new parent node. * @param dataNamedGraph the data named graph of the project. - * @param featureFactoryConfig the feature factory configuration. * @throws UpdateNotPerformedException if the parent of a node could not be updated. */ protected def changeParentNode( nodeIri: IRI, oldParentIri: IRI, newParentIri: IRI, - dataNamedGraph: IRI, - featureFactoryConfig: FeatureFactoryConfig + dataNamedGraph: IRI ): Future[Unit] = for { // Generate SPARQL for changing the parent node of the node. - sparqlChangeParentNode: String <- Future( - org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .changeParentNode( - dataNamedGraph = dataNamedGraph, - nodeIri = nodeIri, - currentParentIri = oldParentIri, - newParentIri = newParentIri - ) - .toString() - ) + sparqlChangeParentNode: String <- + Future( + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .changeParentNode( + dataNamedGraph = dataNamedGraph, + nodeIri = nodeIri, + currentParentIri = oldParentIri, + newParentIri = newParentIri + ) + .toString() + ) _ <- appActor.ask(SparqlUpdateRequest(sparqlChangeParentNode)).mapTo[SparqlUpdateResponse] @@ -2594,7 +2496,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeOldParent <- listNodeGetADM( nodeIri = oldParentIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) childrenOfOldParent = maybeOldParent.get.getChildren @@ -2607,7 +2508,6 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde maybeNewParentNode <- listNodeGetADM( nodeIri = newParentIri, shallow = true, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) childrenOfNewParent = maybeNewParentNode.get.getChildren diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala index 1e5d2f3fcd..074bf2ca56 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -56,7 +55,6 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re groupIris, isInProjectAdminGroup, isInSystemAdminGroup, - featureFactoryConfig, requestingUser ) => permissionsDataGetADM( @@ -64,7 +62,6 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re groupIris, isInProjectAdminGroup, isInSystemAdminGroup, - featureFactoryConfig, requestingUser ) case AdministrativePermissionsForProjectGetRequestADM(projectIri, requestingUser, apiRequestID) => @@ -77,13 +74,11 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re administrativePermissionForProjectGroupGetRequestADM(projectIri, groupIri, requestingUser) case AdministrativePermissionCreateRequestADM( newAdministrativePermission, - featureFactoryConfig, requestingUser, apiRequestID ) => administrativePermissionCreateRequestADM( newAdministrativePermission.prepareHasPermissions, - featureFactoryConfig, requestingUser, apiRequestID ) @@ -138,18 +133,16 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re ) case DefaultObjectAccessPermissionCreateRequestADM( createRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => defaultObjectAccessPermissionCreateRequestADM( createRequest.prepareHasPermissions, - featureFactoryConfig, requestingUser, apiRequestID ) - case PermissionsForProjectGetRequestADM(projectIri, groupIri, featureFactoryConfig, requestingUser) => - permissionsForProjectGetRequestADM(projectIri, groupIri, featureFactoryConfig, requestingUser) + case PermissionsForProjectGetRequestADM(projectIri, groupIri, requestingUser) => + permissionsForProjectGetRequestADM(projectIri, groupIri, requestingUser) case PermissionByIriGetRequestADM(permissionIri, requestingUser) => permissionByIriGetRequestADM(permissionIri, requestingUser) case PermissionChangeGroupRequestADM(permissionIri, changePermissionGroupRequest, requestingUser, apiRequestID) => @@ -201,7 +194,6 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re * @param groupIris the groups the user is member of (without ProjectMember, ProjectAdmin, SystemAdmin) * @param isInProjectAdminGroups the projects in which the user is member of the ProjectAdmin group. * @param isInSystemAdminGroup the flag denoting membership in the SystemAdmin group. - * @param featureFactoryConfig the feature factory configuration. * @return */ private def permissionsDataGetADM( @@ -209,7 +201,6 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re groupIris: Seq[IRI], isInProjectAdminGroups: Seq[IRI], isInSystemAdminGroup: Boolean, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[PermissionsDataADM] = { // find out which project each group belongs to @@ -222,7 +213,6 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re .ask( GroupGetADM( groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) @@ -664,14 +654,12 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re * Adds a new administrative permission (internal use). * * @param createRequest the administrative permission to add. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the requesting user. * @param apiRequestID the API request ID. * @return an optional [[AdministrativePermissionADM]] */ private def administrativePermissionCreateRequestADM( createRequest: CreateAdministrativePermissionAPIRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[AdministrativePermissionCreateResponseADM] = { @@ -705,16 +693,15 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re } // get project - maybeProject: Option[ProjectADM] <- appActor - .ask( - ProjectGetADM( - identifier = - ProjectIdentifierADM(maybeIri = Some(createRequest.forProject)), - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[ProjectADM]] + maybeProject: Option[ProjectADM] <- + appActor + .ask( + ProjectGetADM( + identifier = ProjectIdentifierADM(maybeIri = Some(createRequest.forProject)), + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[ProjectADM]] // if it doesnt exist then throw an error project: ProjectADM = @@ -728,15 +715,15 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re Future.successful(createRequest.forGroup) } else { for { - maybeGroup <- appActor - .ask( - GroupGetADM( - groupIri = createRequest.forGroup, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[GroupADM]] + maybeGroup <- + appActor + .ask( + GroupGetADM( + groupIri = createRequest.forGroup, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[GroupADM]] // if it does not exist then throw an error group: GroupADM = @@ -747,27 +734,27 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re } customPermissionIri: Option[SmartIri] = createRequest.id.map(iri => iri.toSmartIri) - newPermissionIri: IRI <- checkOrCreateEntityIri( - customPermissionIri, - stringFormatter.makeRandomPermissionIri(project.shortcode) - ) + newPermissionIri: IRI <- + checkOrCreateEntityIri( + customPermissionIri, + stringFormatter.makeRandomPermissionIri(project.shortcode) + ) // Create the administrative permission. - createAdministrativePermissionSparqlString = org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .createNewAdministrativePermission( - namedGraphIri = - OntologyConstants.NamedGraphs.PermissionNamedGraph, - permissionClassIri = - OntologyConstants.KnoraAdmin.AdministrativePermission, - permissionIri = newPermissionIri, - projectIri = project.id, - groupIri = groupIri, - permissions = PermissionUtilADM.formatPermissionADMs( - createRequest.hasPermissions, - PermissionType.AP - ) - ) - .toString + createAdministrativePermissionSparqlString = + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .createNewAdministrativePermission( + namedGraphIri = OntologyConstants.NamedGraphs.PermissionNamedGraph, + permissionClassIri = OntologyConstants.KnoraAdmin.AdministrativePermission, + permissionIri = newPermissionIri, + projectIri = project.id, + groupIri = groupIri, + permissions = PermissionUtilADM.formatPermissionADMs( + createRequest.hasPermissions, + PermissionType.AP + ) + ) + .toString // _ = log.debug("projectCreateRequestADM - create query: {}", createNewProjectSparqlString) @@ -776,11 +763,12 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re .mapTo[SparqlUpdateResponse] // try to retrieve the newly created permission - maybePermission <- administrativePermissionForIriGetRequestADM( - administrativePermissionIri = newPermissionIri, - requestingUser = requestingUser, - apiRequestID = apiRequestID - ) + maybePermission <- + administrativePermissionForIriGetRequestADM( + administrativePermissionIri = newPermissionIri, + requestingUser = requestingUser, + apiRequestID = apiRequestID + ) newAdminPermission: AdministrativePermissionADM = maybePermission.administrativePermission } yield AdministrativePermissionCreateResponseADM(administrativePermission = newAdminPermission) @@ -1601,7 +1589,6 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re private def defaultObjectAccessPermissionCreateRequestADM( createRequest: CreateDefaultObjectAccessPermissionAPIRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[DefaultObjectAccessPermissionCreateResponseADM] = { @@ -1645,16 +1632,15 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re } // get project - maybeProject: Option[ProjectADM] <- appActor - .ask( - ProjectGetADM( - identifier = - ProjectIdentifierADM(maybeIri = Some(createRequest.forProject)), - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[ProjectADM]] + maybeProject: Option[ProjectADM] <- + appActor + .ask( + ProjectGetADM( + identifier = ProjectIdentifierADM(maybeIri = Some(createRequest.forProject)), + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[ProjectADM]] // if it doesnt exist then throw an error project: ProjectADM = @@ -1663,25 +1649,26 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re ) customPermissionIri: Option[SmartIri] = createRequest.id.map(iri => iri.toSmartIri) - newPermissionIri: IRI <- checkOrCreateEntityIri( - customPermissionIri, - stringFormatter.makeRandomPermissionIri(project.shortcode) - ) + newPermissionIri: IRI <- + checkOrCreateEntityIri( + customPermissionIri, + stringFormatter.makeRandomPermissionIri(project.shortcode) + ) // verify group, if any given. // Is a group given that is not a built-in one? maybeGroupIri: Option[IRI] <- if (createRequest.forGroup.exists(!OntologyConstants.KnoraAdmin.BuiltInGroups.contains(_))) { // Yes. Check if it is a known group. for { - maybeGroup <- appActor - .ask( - GroupGetADM( - groupIri = createRequest.forGroup.get, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[GroupADM]] + maybeGroup <- + appActor + .ask( + GroupGetADM( + groupIri = createRequest.forGroup.get, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[GroupADM]] group: GroupADM = maybeGroup.getOrElse( @@ -1696,23 +1683,22 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re } // Create the default object access permission. - createNewDefaultObjectAccessPermissionSparqlString = org.knora.webapi.messages.twirl.queries.sparql.admin.txt - .createNewDefaultObjectAccessPermission( - namedGraphIri = - OntologyConstants.NamedGraphs.PermissionNamedGraph, - permissionIri = newPermissionIri, - permissionClassIri = - OntologyConstants.KnoraAdmin.DefaultObjectAccessPermission, - projectIri = project.id, - maybeGroupIri = maybeGroupIri, - maybeResourceClassIri = createRequest.forResourceClass, - maybePropertyIri = createRequest.forProperty, - permissions = PermissionUtilADM.formatPermissionADMs( - createRequest.hasPermissions, - PermissionType.OAP - ) - ) - .toString + createNewDefaultObjectAccessPermissionSparqlString = + org.knora.webapi.messages.twirl.queries.sparql.admin.txt + .createNewDefaultObjectAccessPermission( + namedGraphIri = OntologyConstants.NamedGraphs.PermissionNamedGraph, + permissionIri = newPermissionIri, + permissionClassIri = OntologyConstants.KnoraAdmin.DefaultObjectAccessPermission, + projectIri = project.id, + maybeGroupIri = maybeGroupIri, + maybeResourceClassIri = createRequest.forResourceClass, + maybePropertyIri = createRequest.forProperty, + permissions = PermissionUtilADM.formatPermissionADMs( + createRequest.hasPermissions, + PermissionType.OAP + ) + ) + .toString _ <- appActor .ask(SparqlUpdateRequest(createNewDefaultObjectAccessPermissionSparqlString)) @@ -1751,14 +1737,12 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re * Gets all permissions defined inside a project. * * @param projectIRI the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the [[UserADM]] of the requesting user. * @param apiRequestID the API request ID. * @return a list of of [[PermissionInfoADM]] objects. */ private def permissionsForProjectGetRequestADM( projectIRI: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[PermissionsForProjectGetResponseADM] = @@ -1771,14 +1755,14 @@ class PermissionsResponderADM(responderData: ResponderData) extends Responder(re .toString() ) - permissionsQueryResponse <- appActor - .ask( - SparqlConstructRequest( - sparql = sparqlQueryString, - featureFactoryConfig = featureFactoryConfig - ) - ) - .mapTo[SparqlConstructResponse] + permissionsQueryResponse <- + appActor + .ask( + SparqlConstructRequest( + sparql = sparqlQueryString + ) + ) + .mapTo[SparqlConstructResponse] /* extract response statements */ permissionsQueryResponseStatements: Map[IRI, Seq[(IRI, String)]] = permissionsQueryResponse.statements diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala index 4e5168f9cb..202b341b4e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala @@ -10,7 +10,6 @@ import akka.pattern._ import org.knora.webapi._ import org.knora.webapi.annotation.ApiMayChange import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.instrumentation.InstrumentationSupport import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants @@ -59,55 +58,51 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * Receives a message extending [[ProjectsResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: ProjectsResponderRequestADM) = msg match { - case ProjectsGetADM(featureFactoryConfig, requestingUser) => projectsGetADM(featureFactoryConfig, requestingUser) - case ProjectsGetRequestADM(featureFactoryConfig, requestingUser) => - projectsGetRequestADM(featureFactoryConfig, requestingUser) - case ProjectGetADM(identifier, featureFactoryConfig, requestingUser) => - getSingleProjectADM(identifier, featureFactoryConfig, requestingUser) - case ProjectGetRequestADM(identifier, featureFactoryConfig, requestingUser) => - getSingleProjectADMRequest(identifier, featureFactoryConfig, requestingUser) - case ProjectMembersGetRequestADM(identifier, featureFactoryConfig, requestingUser) => - projectMembersGetRequestADM(identifier, featureFactoryConfig, requestingUser) - case ProjectAdminMembersGetRequestADM(identifier, featureFactoryConfig, requestingUser) => - projectAdminMembersGetRequestADM(identifier, featureFactoryConfig, requestingUser) - case ProjectsKeywordsGetRequestADM(featureFactoryConfig, requestingUser) => - projectsKeywordsGetRequestADM(featureFactoryConfig, requestingUser) - case ProjectKeywordsGetRequestADM(projectIri, featureFactoryConfig, requestingUser) => - projectKeywordsGetRequestADM(projectIri, featureFactoryConfig, requestingUser) - case ProjectRestrictedViewSettingsGetADM(identifier, featureFactoryConfig, requestingUser) => - projectRestrictedViewSettingsGetADM(identifier, featureFactoryConfig, requestingUser) - case ProjectRestrictedViewSettingsGetRequestADM(identifier, featureFactoryConfig, requestingUser) => - projectRestrictedViewSettingsGetRequestADM(identifier, featureFactoryConfig, requestingUser) - case ProjectCreateRequestADM(createRequest, featureFactoryConfig, requestingUser, apiRequestID) => - projectCreateRequestADM(createRequest, featureFactoryConfig, requestingUser, apiRequestID) + case ProjectsGetADM(requestingUser) => projectsGetADM(requestingUser) + case ProjectsGetRequestADM(requestingUser) => + projectsGetRequestADM(requestingUser) + case ProjectGetADM(identifier, requestingUser) => + getSingleProjectADM(identifier, requestingUser) + case ProjectGetRequestADM(identifier, requestingUser) => + getSingleProjectADMRequest(identifier, requestingUser) + case ProjectMembersGetRequestADM(identifier, requestingUser) => + projectMembersGetRequestADM(identifier, requestingUser) + case ProjectAdminMembersGetRequestADM(identifier, requestingUser) => + projectAdminMembersGetRequestADM(identifier, requestingUser) + case ProjectsKeywordsGetRequestADM(requestingUser) => + projectsKeywordsGetRequestADM(requestingUser) + case ProjectKeywordsGetRequestADM(projectIri, requestingUser) => + projectKeywordsGetRequestADM(projectIri, requestingUser) + case ProjectRestrictedViewSettingsGetADM(identifier, requestingUser) => + projectRestrictedViewSettingsGetADM(identifier, requestingUser) + case ProjectRestrictedViewSettingsGetRequestADM(identifier, requestingUser) => + projectRestrictedViewSettingsGetRequestADM(identifier, requestingUser) + case ProjectCreateRequestADM(createRequest, requestingUser, apiRequestID) => + projectCreateRequestADM(createRequest, requestingUser, apiRequestID) case ProjectChangeRequestADM( projectIri, changeProjectRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => changeBasicInformationRequestADM( projectIri, changeProjectRequest, - featureFactoryConfig, requestingUser, apiRequestID ) - case ProjectDataGetRequestADM(projectIdentifier, featureFactoryConfig, requestingUser) => - projectDataGetRequestADM(projectIdentifier, featureFactoryConfig, requestingUser) + case ProjectDataGetRequestADM(projectIdentifier, requestingUser) => + projectDataGetRequestADM(projectIdentifier, requestingUser) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } /** * Gets all the projects and returns them as a sequence containing [[ProjectADM]]. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return all the projects as a sequence containing [[ProjectADM]]. */ private def projectsGetADM( - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[ProjectADM]] = for { @@ -125,8 +120,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo projectsResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQueryString, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQueryString ) ) .mapTo[SparqlExtendedConstructResponse] @@ -185,13 +179,11 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo /** * Gets all the projects and returns them as a [[ProjectsResponseV1]]. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user that is making the request. * @return all the projects as a [[ProjectsResponseV1]]. * @throws NotFoundException if no projects are found. */ private def projectsGetRequestADM( - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectsGetResponseADM] = // log.debug("projectsGetRequestADM") @@ -199,7 +191,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo // ToDo: What permissions should be required, if any? for { projects <- projectsGetADM( - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -218,13 +209,11 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * Gets the project with the given project IRI, shortname, or shortcode and returns the information as a [[ProjectADM]]. * * @param identifier the IRI, shortname, or shortcode of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return information about the project as a [[ProjectInfoV1]]. */ private def getSingleProjectADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, skipCache: Boolean = false ): Future[Option[ProjectADM]] = @@ -243,10 +232,10 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo maybeProjectADM <- if (skipCache) { // getting directly from triplestore - getProjectFromTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig) + getProjectFromTriplestore(identifier = identifier) } else { // getting from cache or triplestore - getProjectFromCacheOrTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig) + getProjectFromCacheOrTriplestore(identifier = identifier) } _ = @@ -266,21 +255,19 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * as a [[ProjectGetResponseADM]]. * * @param identifier the IRI, shortname, or shortcode of the project. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return information about the project as a [[ProjectInfoResponseV1]]. * @throws NotFoundException when no project for the given IRI can be found */ private def getSingleProjectADMRequest( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectGetResponseADM] = // log.debug("getSingleProjectADMRequest - maybeIri: {}, maybeShortname: {}, maybeShortcode: {}", maybeIri, maybeShortname, maybeShortcode) for { maybeProject: Option[ProjectADM] <- getSingleProjectADM( identifier = identifier, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -297,13 +284,11 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * if none are found. * * @param identifier the IRI, shortname, or shortcode of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return the members of a project as a [[ProjectMembersGetResponseADM]] */ private def projectMembersGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectMembersGetResponseADM] = // log.debug("projectMembersGetRequestADM - maybeIri: {}, maybeShortname: {}, maybeShortcode: {}", maybeIri, maybeShortname, maybeShortcode) @@ -312,7 +297,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo /* Get project and verify permissions. */ project <- getSingleProjectADM( identifier = identifier, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -343,8 +327,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo projectMembersResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQueryString, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQueryString ) ) .mapTo[SparqlExtendedConstructResponse] @@ -361,19 +344,18 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo Seq.empty[IRI] } - maybeUserFutures: Seq[Future[Option[UserADM]]] = userIris.map { userIri => - appActor - .ask( - UserGetADM( - identifier = UserIdentifierADM(maybeIri = Some(userIri)), - userInformationTypeADM = - UserInformationTypeADM.Restricted, - featureFactoryConfig = featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[UserADM]] - } + maybeUserFutures: Seq[Future[Option[UserADM]]] = + userIris.map { userIri => + appActor + .ask( + UserGetADM( + identifier = UserIdentifierADM(maybeIri = Some(userIri)), + userInformationTypeADM = UserInformationTypeADM.Restricted, + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[UserADM]] + } maybeUsers: Seq[Option[UserADM]] <- Future.sequence(maybeUserFutures) users: Seq[UserADM] = maybeUsers.flatten @@ -386,13 +368,11 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * if none are found * * @param identifier the IRI, shortname, or shortcode of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return the members of a project as a [[ProjectMembersGetResponseADM]] */ private def projectAdminMembersGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectAdminMembersGetResponseADM] = // log.debug("projectAdminMembersGetRequestADM - maybeIri: {}, maybeShortname: {}, maybeShortcode: {}", maybeIri, maybeShortname, maybeShortcode) @@ -400,7 +380,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo /* Get project and verify permissions. */ project <- getSingleProjectADM( identifier = identifier, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -427,8 +406,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo projectAdminMembersResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQueryString, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQueryString ) ) .mapTo[SparqlExtendedConstructResponse] @@ -451,7 +429,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo identifier = UserIdentifierADM(maybeIri = Some(userIri)), userInformationTypeADM = UserInformationTypeADM.Restricted, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) @@ -467,17 +444,14 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo /** * Gets all unique keywords for all projects and returns them. Returns an empty list if none are found. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return all keywords for all projects as [[ProjectsKeywordsGetResponseADM]] */ private def projectsKeywordsGetRequestADM( - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectsKeywordsGetResponseADM] = for { projects <- projectsGetADM( - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -489,19 +463,16 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * Gets all keywords for a single project and returns them. Returns an empty list if none are found. * * @param projectIri the IRI of the project. - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return keywords for a projects as [[ProjectKeywordsGetResponseADM]] */ private def projectKeywordsGetRequestADM( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectKeywordsGetResponseADM] = for { maybeProject <- getSingleProjectADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -514,7 +485,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo private def projectDataGetRequestADM( projectIdentifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectDataGetResponseADM] = { @@ -566,7 +536,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * @param resultFile the output file. */ def combineGraphs(namedGraphTrigFiles: Seq[NamedGraphTrigFile], resultFile: Path): Unit = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() var maybeBufferedFileOutputStream: Option[BufferedOutputStream] = None val trigFileTry: Try[Unit] = Try { @@ -613,7 +583,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo // Get the project info. maybeProject: Option[ProjectADM] <- getSingleProjectADM( identifier = projectIdentifier, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -648,8 +617,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo NamedGraphFileRequest( graphIri = trigFile.graphIri, outputFile = trigFile.dataFile, - outputFormat = TriG, - featureFactoryConfig = featureFactoryConfig + outputFormat = TriG ) ) .mapTo[FileWrittenResponse] @@ -674,8 +642,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo sparql = adminDataSparql, graphIri = adminDataNamedGraphTrigFile.graphIri, outputFile = adminDataNamedGraphTrigFile.dataFile, - outputFormat = TriG, - featureFactoryConfig = featureFactoryConfig + outputFormat = TriG ) ) .mapTo[FileWrittenResponse] @@ -696,8 +663,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo sparql = permissionDataSparql, graphIri = permissionDataNamedGraphTrigFile.graphIri, outputFile = permissionDataNamedGraphTrigFile.dataFile, - outputFormat = TriG, - featureFactoryConfig = featureFactoryConfig + outputFormat = TriG ) ) .mapTo[FileWrittenResponse] @@ -715,14 +681,13 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * Get project's restricted view settings. * * @param identifier the project's identifier (IRI / shortcode / shortname) - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return [[ProjectRestrictedViewSettingsADM]] */ @ApiMayChange private def projectRestrictedViewSettingsGetADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Option[ProjectRestrictedViewSettingsADM]] = // ToDo: We have two possible NotFound scenarios: 1. Project, 2. ProjectRestrictedViewSettings resource. How to send the client the correct NotFound reply? @@ -740,8 +705,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo projectResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQuery ) ) .mapTo[SparqlExtendedConstructResponse] @@ -769,14 +733,13 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * Get project's restricted view settings. * * @param identifier the project's identifier (IRI / shortcode / shortname) - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return [[ProjectRestrictedViewSettingsGetResponseADM]] */ @ApiMayChange private def projectRestrictedViewSettingsGetRequestADM( identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectRestrictedViewSettingsGetResponseADM] = { @@ -787,7 +750,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo for { maybeSettings: Option[ProjectRestrictedViewSettingsADM] <- projectRestrictedViewSettingsGetADM( identifier = identifier, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -808,7 +770,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * * @param projectIri the IRI of the project. * @param changeProjectRequest the change payload. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @param apiRequestID the unique api request ID. * @return a [[ProjectOperationResponseADM]]. @@ -817,7 +779,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo private def changeBasicInformationRequestADM( projectIri: IRI, changeProjectRequest: ChangeProjectApiRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[ProjectOperationResponseADM] = { @@ -858,7 +819,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo result <- updateProjectADM( projectIri = projectIri, projectUpdatePayload = projectUpdatePayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -882,14 +842,13 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * @param projectUpdatePayload the data to be updated. Update means exchanging what is in the triplestore with * this data. If only some parts of the data need to be changed, then this needs to * be prepared in the step before this one. - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[ProjectOperationResponseADM]]. * @throws NotFoundException in the case that the project's IRI is not found. */ private def updateProjectADM( projectIri: IRI, projectUpdatePayload: ProjectUpdatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectOperationResponseADM] = { @@ -910,7 +869,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo for { maybeCurrentProject: Option[ProjectADM] <- getSingleProjectADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, skipCache = true ) @@ -947,7 +905,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo /* Verify that the project was updated. */ maybeUpdatedProject <- getSingleProjectADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, skipCache = true ) @@ -1025,7 +982,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo * Creates a project. * * @param createProjectRequest the new project's information. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user that is making the request. * @param apiRequestID the unique api request ID. * @return a [[ProjectOperationResponseADM]]. @@ -1035,7 +992,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo */ private def projectCreateRequestADM( createProjectRequest: ProjectCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[ProjectOperationResponseADM] = { @@ -1061,7 +1017,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo hasPermissions = Set(PermissionADM.ProjectAdminAllPermission, PermissionADM.ProjectResourceCreateAllPermission) ).prepareHasPermissions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -1077,7 +1032,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set(PermissionADM.ProjectResourceCreateAllPermission) ).prepareHasPermissions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -1097,7 +1051,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo PermissionADM.modifyPermission(OntologyConstants.KnoraAdmin.ProjectMember) ) ).prepareHasPermissions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -1117,7 +1070,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo PermissionADM.modifyPermission(OntologyConstants.KnoraAdmin.ProjectMember) ) ).prepareHasPermissions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -1197,7 +1149,6 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo // try to retrieve newly created project (will also add to cache) maybeNewProjectADM <- getSingleProjectADM( identifier = ProjectIdentifierADM(maybeIri = Some(newProjectIRI)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, skipCache = true ) @@ -1230,19 +1181,16 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo /** * Tries to retrieve a [[ProjectADM]] either from triplestore or cache if caching is enabled. * If project is not found in cache but in triplestore, then project is written to cache. - * - * @param featureFactoryConfig the feature factory configuration. */ private def getProjectFromCacheOrTriplestore( - identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig + identifier: ProjectIdentifierADM ): Future[Option[ProjectADM]] = if (cacheServiceSettings.cacheServiceEnabled) { // caching enabled getProjectFromCache(identifier).flatMap { case None => // none found in cache. getting from triplestore. - getProjectFromTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig).flatMap { + getProjectFromTriplestore(identifier = identifier).flatMap { case None => // also none found in triplestore. finally returning none. log.debug("getProjectFromCacheOrTriplestore - not found in cache and in triplestore") @@ -1262,17 +1210,14 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo } else { // caching disabled log.debug("getProjectFromCacheOrTriplestore - caching disabled. getting from triplestore.") - getProjectFromTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig) + getProjectFromTriplestore(identifier = identifier) } /** * Tries to retrieve a [[ProjectADM]] from the triplestore. - * - * @param featureFactoryConfig the feature factory configuration. */ private def getProjectFromTriplestore( - identifier: ProjectIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig + identifier: ProjectIdentifierADM ): Future[Option[ProjectADM]] = for { @@ -1289,8 +1234,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo projectResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQuery ) ) .mapTo[SparqlExtendedConstructResponse] diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala index 673ff7998e..bcc639c590 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala @@ -72,8 +72,7 @@ class SipiResponderADM(responderData: ResponderData) extends Responder(responder queryResponse: SparqlExtendedConstructResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQuery, - featureFactoryConfig = request.featureFactoryConfig + sparql = sparqlQuery ) ) .mapTo[SparqlExtendedConstructResponse] @@ -118,16 +117,15 @@ class SipiResponderADM(responderData: ResponderData) extends Responder(responder response <- permissionCode match { case 1 => for { - maybeRVSettings <- appActor - .ask( - ProjectRestrictedViewSettingsGetADM( - identifier = - ProjectIdentifierADM(maybeShortcode = Some(request.projectID)), - featureFactoryConfig = request.featureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ) - ) - .mapTo[Option[ProjectRestrictedViewSettingsADM]] + maybeRVSettings <- + appActor + .ask( + ProjectRestrictedViewSettingsGetADM( + identifier = ProjectIdentifierADM(maybeShortcode = Some(request.projectID)), + requestingUser = KnoraSystemInstances.Users.SystemUser + ) + ) + .mapTo[Option[ProjectRestrictedViewSettingsADM]] } yield SipiFileInfoGetResponseADM(permissionCode = permissionCode, maybeRVSettings) case _ => diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/StoresResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/StoresResponderADM.scala index 8200224f4c..06c4495186 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/StoresResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/StoresResponderADM.scala @@ -7,7 +7,7 @@ package org.knora.webapi.responders.admin import akka.pattern._ import dsp.errors.ForbiddenException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.storesmessages.ResetTriplestoreContentRequestADM import org.knora.webapi.messages.admin.responder.storesmessages.ResetTriplestoreContentResponseADM import org.knora.webapi.messages.admin.responder.storesmessages.StoreResponderRequestADM @@ -41,11 +41,10 @@ class StoresResponderADM(responderData: ResponderData) extends Responder(respond */ def receive(msg: StoreResponderRequestADM) = msg match { case ResetTriplestoreContentRequestADM( - rdfDataObjects: Seq[RdfDataObject], - prependDefaults: Boolean, - featureFactoryConfig: FeatureFactoryConfig + rdfDataObjects: List[RdfDataObject], + prependDefaults: Boolean ) => - resetTriplestoreContent(rdfDataObjects, prependDefaults, featureFactoryConfig) + resetTriplestoreContent(rdfDataObjects, prependDefaults) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -56,9 +55,8 @@ class StoresResponderADM(responderData: ResponderData) extends Responder(respond * @return a future containing a [[ResetTriplestoreContentResponseADM]]. */ private def resetTriplestoreContent( - rdfDataObjects: Seq[RdfDataObject], - prependDefaults: Boolean = true, - featureFactoryConfig: FeatureFactoryConfig + rdfDataObjects: List[RdfDataObject], + prependDefaults: Boolean = true ): Future[ResetTriplestoreContentResponseADM] = { log.debug(s"resetTriplestoreContent - called") @@ -79,7 +77,6 @@ class StoresResponderADM(responderData: ResponderData) extends Responder(respond loadOntologiesResponse <- appActor .ask( LoadOntologiesRequestV2( - featureFactoryConfig = featureFactoryConfig, requestingUser = systemUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala index 587837e20b..8997119225 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala @@ -11,7 +11,7 @@ import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.InconsistentRepositoryDataException import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.instrumentation.InstrumentationSupport import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants @@ -53,96 +53,87 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Receives a message extending [[UsersResponderRequestADM]], and returns an appropriate message. */ def receive(msg: UsersResponderRequestADM): Future[Equals] = msg match { - case UsersGetADM(userInformationTypeADM, featureFactoryConfig, requestingUser) => - getAllUserADM(userInformationTypeADM, featureFactoryConfig, requestingUser) - case UsersGetRequestADM(userInformationTypeADM, featureFactoryConfig, requestingUser) => - getAllUserADMRequest(userInformationTypeADM, featureFactoryConfig, requestingUser) - case UserGetADM(identifier, userInformationTypeADM, featureFactoryConfig, requestingUser) => - getSingleUserADM(identifier, userInformationTypeADM, featureFactoryConfig, requestingUser) - case UserGetRequestADM(identifier, userInformationTypeADM, featureFactoryConfig, requestingUser) => - getSingleUserADMRequest(identifier, userInformationTypeADM, featureFactoryConfig, requestingUser) - case UserCreateRequestADM(userCreatePayloadADM, featureFactoryConfig, requestingUser, apiRequestID) => - createNewUserADM(userCreatePayloadADM, featureFactoryConfig, requestingUser, apiRequestID) + case UsersGetADM(userInformationTypeADM, requestingUser) => + getAllUserADM(userInformationTypeADM, requestingUser) + case UsersGetRequestADM(userInformationTypeADM, requestingUser) => + getAllUserADMRequest(userInformationTypeADM, requestingUser) + case UserGetADM(identifier, userInformationTypeADM, requestingUser) => + getSingleUserADM(identifier, userInformationTypeADM, requestingUser) + case UserGetRequestADM(identifier, userInformationTypeADM, requestingUser) => + getSingleUserADMRequest(identifier, userInformationTypeADM, requestingUser) + case UserCreateRequestADM(userCreatePayloadADM, requestingUser, apiRequestID) => + createNewUserADM(userCreatePayloadADM, requestingUser, apiRequestID) case UserChangeBasicInformationRequestADM( userIri, userUpdateBasicInformationPayload, - featureFactoryConfig, requestingUser, apiRequestID ) => changeBasicUserInformationADM( userIri, userUpdateBasicInformationPayload, - featureFactoryConfig, requestingUser, apiRequestID ) case UserChangePasswordRequestADM( userIri, userUpdatePasswordPayload, - featureFactoryConfig, requestingUser, apiRequestID ) => - changePasswordADM(userIri, userUpdatePasswordPayload, featureFactoryConfig, requestingUser, apiRequestID) - case UserChangeStatusRequestADM(userIri, status, featureFactoryConfig, requestingUser, apiRequestID) => - changeUserStatusADM(userIri, status, featureFactoryConfig, requestingUser, apiRequestID) + changePasswordADM(userIri, userUpdatePasswordPayload, requestingUser, apiRequestID) + case UserChangeStatusRequestADM(userIri, status, requestingUser, apiRequestID) => + changeUserStatusADM(userIri, status, requestingUser, apiRequestID) case UserChangeSystemAdminMembershipStatusRequestADM( userIri, changeSystemAdminMembershipStatusRequest, - featureFactoryConfig, requestingUser, apiRequestID ) => changeUserSystemAdminMembershipStatusADM( userIri, changeSystemAdminMembershipStatusRequest, - featureFactoryConfig, requestingUser, apiRequestID ) - case UserProjectMembershipsGetRequestADM(userIri, featureFactoryConfig, requestingUser) => - userProjectMembershipsGetRequestADM(userIri, featureFactoryConfig, requestingUser) - case UserProjectMembershipAddRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) => - userProjectMembershipAddRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) + case UserProjectMembershipsGetRequestADM(userIri, requestingUser) => + userProjectMembershipsGetRequestADM(userIri, requestingUser) + case UserProjectMembershipAddRequestADM(userIri, projectIri, requestingUser, apiRequestID) => + userProjectMembershipAddRequestADM(userIri, projectIri, requestingUser, apiRequestID) case UserProjectMembershipRemoveRequestADM( userIri, projectIri, - featureFactoryConfig, requestingUser, apiRequestID ) => - userProjectMembershipRemoveRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) - case UserProjectAdminMembershipsGetRequestADM(userIri, featureFactoryConfig, requestingUser, apiRequestID) => - userProjectAdminMembershipsGetRequestADM(userIri, featureFactoryConfig, requestingUser, apiRequestID) + userProjectMembershipRemoveRequestADM(userIri, projectIri, requestingUser, apiRequestID) + case UserProjectAdminMembershipsGetRequestADM(userIri, requestingUser, apiRequestID) => + userProjectAdminMembershipsGetRequestADM(userIri, requestingUser, apiRequestID) case UserProjectAdminMembershipAddRequestADM( userIri, projectIri, - featureFactoryConfig, requestingUser, apiRequestID ) => - userProjectAdminMembershipAddRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) + userProjectAdminMembershipAddRequestADM(userIri, projectIri, requestingUser, apiRequestID) case UserProjectAdminMembershipRemoveRequestADM( userIri, projectIri, - featureFactoryConfig, requestingUser, apiRequestID ) => userProjectAdminMembershipRemoveRequestADM( userIri, projectIri, - featureFactoryConfig, requestingUser, apiRequestID ) - case UserGroupMembershipsGetRequestADM(userIri, featureFactoryConfig, requestingUser) => - userGroupMembershipsGetRequestADM(userIri, featureFactoryConfig, requestingUser) - case UserGroupMembershipAddRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) => - userGroupMembershipAddRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) - case UserGroupMembershipRemoveRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) => - userGroupMembershipRemoveRequestADM(userIri, projectIri, featureFactoryConfig, requestingUser, apiRequestID) + case UserGroupMembershipsGetRequestADM(userIri, requestingUser) => + userGroupMembershipsGetRequestADM(userIri, requestingUser) + case UserGroupMembershipAddRequestADM(userIri, projectIri, requestingUser, apiRequestID) => + userGroupMembershipAddRequestADM(userIri, projectIri, requestingUser, apiRequestID) + case UserGroupMembershipRemoveRequestADM(userIri, projectIri, requestingUser, apiRequestID) => + userGroupMembershipRemoveRequestADM(userIri, projectIri, requestingUser, apiRequestID) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -150,13 +141,12 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Gets all the users and returns them as a sequence of [[UserADM]]. * * @param userInformationType the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user initiating the request. * @return all the users as a sequence of [[UserADM]]. */ private def getAllUserADM( userInformationType: UserInformationTypeADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[UserADM]] = for { @@ -182,8 +172,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde usersResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQueryString, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQueryString ) ) .mapTo[SparqlExtendedConstructResponse] @@ -260,19 +249,17 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Gets all the users and returns them as a [[UsersGetResponseADM]]. * * @param userInformationType the extent of the information returned. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user initiating the request. * @return all the users as a [[UsersGetResponseV1]]. */ private def getAllUserADMRequest( userInformationType: UserInformationTypeADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[UsersGetResponseADM] = for { maybeUsersListToReturn <- getAllUserADM( userInformationType = userInformationType, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -294,7 +281,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * @param identifier the IRI, email, or username of the user. * @param userInformationType the type of the requested profile (restricted * of full). - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user initiating the request. * @param skipCache the flag denotes to skip the cache and instead * get data from the triplestore @@ -303,7 +290,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def getSingleUserADM( identifier: UserIdentifierADM, userInformationType: UserInformationTypeADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, skipCache: Boolean = false ): Future[Option[UserADM]] = tracedFuture("admin-user-get-single-user") { @@ -320,10 +306,10 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde maybeUserADM <- if (skipCache) { // getting directly from triplestore - getUserFromTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig) + getUserFromTriplestore(identifier = identifier) } else { // getting from cache or triplestore - getUserFromCacheOrTriplestore(identifier, featureFactoryConfig) + getUserFromCacheOrTriplestore(identifier) } // return the correct amount of information depending on either the request or user permission @@ -360,14 +346,12 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def getSingleUserADMRequest( identifier: UserIdentifierADM, userInformationType: UserInformationTypeADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[UserResponseADM] = for { maybeUserADM <- getSingleUserADM( identifier = identifier, userInformationType = userInformationType, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -383,7 +367,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the IRI of the existing user that we want to update. * @param userUpdateBasicInformationPayload the updated information stored as [[UserUpdateBasicInformationPayloadADM]]. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a future containing a [[UserOperationResponseADM]]. @@ -393,7 +377,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def changeBasicUserInformationADM( userIri: IRI, userUpdateBasicInformationPayload: UserUpdateBasicInformationPayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -423,7 +406,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde currentUserInformation: Option[UserADM] <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), userInformationType = UserInformationTypeADM.Full, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -455,7 +437,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde familyName = userUpdateBasicInformationPayload.familyName, lang = userUpdateBasicInformationPayload.lang ), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -477,7 +458,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the IRI of the existing user that we want to update. * @param userUpdatePasswordPayload the current password of the requesting user and the new password. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a future containing a [[UserOperationResponseADM]]. @@ -489,7 +470,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def changePasswordADM( userIri: IRI, userUpdatePasswordPayload: UserUpdatePasswordPayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -528,7 +508,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserPasswordADM( userIri = userIri, password = newHashedPassword, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -550,7 +529,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the IRI of the existing user that we want to update. * @param status the new status. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a future containing a [[UserOperationResponseADM]]. @@ -560,7 +539,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def changeUserStatusADM( userIri: IRI, status: UserStatus, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -589,7 +567,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(status = Some(status)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -611,7 +588,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the IRI of the existing user that we want to update. * @param systemAdmin the new status. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user profile of the requesting user. * @param apiRequestID the unique api request ID. * @return a future containing a [[UserOperationResponseADM]]. @@ -621,7 +598,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def changeUserSystemAdminMembershipStatusADM( userIri: IRI, systemAdmin: SystemAdmin, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -648,7 +624,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(systemAdmin = Some(systemAdmin)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -675,14 +650,12 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde */ private def userProjectMembershipsGetADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[ProjectADM]] = for { maybeUser <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), userInformationType = UserInformationTypeADM.Full, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -702,7 +675,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde */ private def userProjectMembershipsGetRequestADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[UserProjectMembershipsGetResponseADM] = for { @@ -713,7 +685,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde projects: Seq[ProjectADM] <- userProjectMembershipsGetADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } yield UserProjectMembershipsGetResponseADM(projects) @@ -723,7 +694,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the user's IRI. * @param projectIri the project's IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return @@ -731,7 +702,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def userProjectMembershipAddRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -769,7 +739,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // get users current project membership list currentProjectMemberships <- userProjectMembershipsGetRequestADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -789,7 +758,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde updateUseResult <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(projects = Some(updatedProjectMembershipIris)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -811,7 +779,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the user's IRI. * @param projectIri the project's IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return @@ -819,7 +787,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def userProjectMembershipRemoveRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -855,7 +822,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // get users current project membership list currentProjectMemberships <- userProjectMembershipsGetADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) currentProjectMembershipIris = currentProjectMemberships.map(_.id) @@ -874,7 +840,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(projects = Some(updatedProjectMembershipIris)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -894,14 +859,13 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Returns the user's project admin group memberships as a sequence of [[IRI]] * * @param userIri the user's IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[UserProjectMembershipsGetResponseV1]]. */ private def userProjectAdminMembershipsGetADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[Seq[ProjectADM]] = @@ -935,7 +899,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde identifier = ProjectIdentifierADM(maybeIri = Some(projectIri) ), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -952,14 +915,13 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * is a member of the project admin group. * * @param userIri the user's IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[UserProjectMembershipsGetResponseV1]]. */ private def userProjectAdminMembershipsGetRequestADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserProjectAdminMembershipsGetResponseADM] = @@ -973,7 +935,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde projects: Seq[ProjectADM] <- userProjectAdminMembershipsGetADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -984,7 +945,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the user's IRI. * @param projectIri the project's IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return @@ -992,7 +953,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def userProjectAdminMembershipAddRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1028,7 +988,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // get users current project membership list currentProjectAdminMemberships <- userProjectAdminMembershipsGetADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -1049,7 +1008,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(projectsAdmin = Some(updatedProjectAdminMembershipIris)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -1071,7 +1029,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the user's IRI. * @param projectIri the project's IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return @@ -1079,7 +1037,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def userProjectAdminMembershipRemoveRequestADM( userIri: IRI, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1115,7 +1072,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // get users current project membership list currentProjectAdminMemberships <- userProjectAdminMembershipsGetADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -1136,7 +1092,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(projectsAdmin = Some(updatedProjectAdminMembershipIris)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -1157,20 +1112,18 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Returns the user's group memberships as a sequence of [[GroupADM]] * * @param userIri the IRI of the user. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @return a sequence of [[GroupADM]]. */ private def userGroupMembershipsGetADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[GroupADM]] = for { maybeUserADM: Option[UserADM] <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), userInformationType = UserInformationTypeADM.Full, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1192,19 +1145,17 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Returns the user's group memberships as a [[UserGroupMembershipsGetResponseADM]] * * @param userIri the IRI of the user. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @return a [[UserGroupMembershipsGetResponseADM]]. */ private def userGroupMembershipsGetRequestADM( userIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[UserGroupMembershipsGetResponseADM] = for { groups: Seq[GroupADM] <- userGroupMembershipsGetADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } yield UserGroupMembershipsGetResponseADM(groups = groups) @@ -1214,7 +1165,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the user's IRI. * @param groupIri the group IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a [[UserOperationResponseADM]]. @@ -1222,7 +1173,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def userGroupMembershipAddRequestADM( userIri: IRI, groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1241,7 +1191,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde maybeUser <- getSingleUserADM( UserIdentifierADM(maybeIri = Some(userIri)), UserInformationTypeADM.Full, - featureFactoryConfig = featureFactoryConfig, KnoraSystemInstances.Users.SystemUser, skipCache = true ) @@ -1260,7 +1209,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde .ask( GroupGetADM( groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) @@ -1295,7 +1243,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(groups = Some(updatedGroupMembershipIris)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = apiRequestID ) @@ -1315,7 +1262,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def userGroupMembershipRemoveRequestADM( userIri: IRI, groupIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1343,7 +1289,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde .ask( GroupGetADM( groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) @@ -1366,7 +1311,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // get users current project membership list currentGroupMemberships <- userGroupMembershipsGetRequestADM( userIri = userIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1384,7 +1328,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde result <- updateUserADM( userIri = userIri, userUpdatePayload = UserChangeRequestADM(groups = Some(updatedGroupMembershipIris)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -1405,7 +1348,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the IRI of the existing user that we want to update. * @param userUpdatePayload the updated information. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a future containing a [[UserOperationResponseADM]]. @@ -1415,7 +1358,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def updateUserADM( userIri: IRI, userUpdatePayload: UserChangeRequestADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1436,7 +1378,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // get current user maybeCurrentUser <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, userInformationType = UserInformationTypeADM.Full, skipCache = true @@ -1531,7 +1472,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde /* Verify that the user was updated */ maybeUpdatedUserADM <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, userInformationType = UserInformationTypeADM.Full, skipCache = true @@ -1617,7 +1557,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * * @param userIri the IRI of the existing user that we want to update. * @param password the new password. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the requesting user. * @param apiRequestID the unique api request ID. * @return a future containing a [[UserOperationResponseADM]]. @@ -1627,7 +1567,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde private def updateUserPasswordADM( userIri: IRI, password: Password, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1644,7 +1583,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde for { maybeCurrentUser <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, userInformationType = UserInformationTypeADM.Full, skipCache = true @@ -1672,7 +1610,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde /* Verify that the password was updated. */ maybeUpdatedUserADM <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, userInformationType = UserInformationTypeADM.Full, skipCache = true @@ -1698,13 +1635,12 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * - http://blog.ircmaxell.com/2012/12/seven-ways-to-screw-up-bcrypt.html * * @param userCreatePayloadADM a [[UserCreatePayloadADM]] object containing information about the new user to be created. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser a [[UserADM]] object containing information about the requesting user. * @return a future containing the [[UserOperationResponseADM]]. */ private def createNewUserADM( userCreatePayloadADM: UserCreatePayloadADM, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[UserOperationResponseADM] = { @@ -1791,7 +1727,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde // try to retrieve newly created user (will also add to cache) maybeNewUserADM: Option[UserADM] <- getSingleUserADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser, userInformationType = UserInformationTypeADM.Full, skipCache = true @@ -1827,15 +1762,14 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * If user is not found in cache but in triplestore, then user is written to cache. */ private def getUserFromCacheOrTriplestore( - identifier: UserIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig + identifier: UserIdentifierADM ): Future[Option[UserADM]] = tracedFuture("admin-user-get-user-from-cache-or-triplestore") { if (cacheServiceSettings.cacheServiceEnabled) { // caching enabled getUserFromCache(identifier).flatMap { case None => // none found in cache. getting from triplestore. - getUserFromTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig).flatMap { + getUserFromTriplestore(identifier = identifier).flatMap { case None => // also none found in triplestore. finally returning none. log.debug("getUserFromCacheOrTriplestore - not found in cache and in triplestore") @@ -1856,7 +1790,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde } else { // caching disabled log.debug("getUserFromCacheOrTriplestore - caching disabled. getting from triplestore.") - getUserFromTriplestore(identifier = identifier, featureFactoryConfig = featureFactoryConfig) + getUserFromTriplestore(identifier = identifier) } } @@ -1864,8 +1798,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Tries to retrieve a [[UserADM]] from the triplestore. */ private def getUserFromTriplestore( - identifier: UserIdentifierADM, - featureFactoryConfig: FeatureFactoryConfig + identifier: UserIdentifierADM ): Future[Option[UserADM]] = for { sparqlQueryString <- Future( @@ -1881,8 +1814,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde userQueryResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparqlQueryString, - featureFactoryConfig = featureFactoryConfig + sparql = sparqlQueryString ) ) .mapTo[SparqlExtendedConstructResponse] @@ -1891,8 +1823,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde if (userQueryResponse.statements.nonEmpty) { log.debug("getUserFromTriplestore - triplestore hit for: {}", identifier) statements2UserADM( - statements = userQueryResponse.statements.head, - featureFactoryConfig = featureFactoryConfig + statements = userQueryResponse.statements.head ) } else { log.debug("getUserFromTriplestore - no triplestore hit for: {}", identifier) @@ -1904,12 +1835,11 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde * Helper method used to create a [[UserADM]] from the [[SparqlExtendedConstructResponse]] containing user data. * * @param statements result from the SPARQL query containing user data. - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[UserADM]] containing the user's data. */ private def statements2UserADM( - statements: (SubjectV2, Map[SmartIri, Seq[LiteralV2]]), - featureFactoryConfig: FeatureFactoryConfig + statements: (SubjectV2, Map[SmartIri, Seq[LiteralV2]]) ): Future[Option[UserADM]] = { // log.debug("statements2UserADM - statements: {}", statements) @@ -1956,7 +1886,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde groupIris = groupIris, isInProjectAdminGroups = isInProjectAdminGroups, isInSystemAdminGroup = isInSystemAdminGroup, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) @@ -1967,7 +1896,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde .ask( GroupGetADM( groupIri = groupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1986,7 +1914,6 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde ProjectIdentifierADM(maybeIri = Some(projectIri) ), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/CkanResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/CkanResponderV1.scala index 5b4f06e1f6..16be85454c 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/CkanResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/CkanResponderV1.scala @@ -9,7 +9,7 @@ import akka.actor.ActorRef import akka.pattern._ import akka.util.Timeout import org.knora.webapi.IRI -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.triplestoremessages.SparqlSelectRequest @@ -52,8 +52,8 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD * Receives a message extending [[CkanResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: CkanResponderRequestV1) = msg match { - case CkanRequestV1(projects, limit, info, featureFactoryConfig, userProfile) => - getCkanResponseV1(projects, limit, info, featureFactoryConfig, userProfile) + case CkanRequestV1(projects, limit, info, userProfile) => + getCkanResponseV1(projects, limit, info, userProfile) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -61,7 +61,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD project: Option[Seq[String]], limit: Option[Int], info: Boolean, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[CkanResponseV1] = { @@ -78,7 +77,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD val allowedProjects = projectList.filter(defaultProjectList.contains(_)) getProjectInfos( projectNames = allowedProjects, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -86,7 +84,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD // return our default project map, containing all projects that we want to serve over the Ckan endpoint getProjectInfos( projectNames = defaultProjectList, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } @@ -99,7 +96,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD getDokubibCkanProject( pinfo = projectFullInfo, limit = limit, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) ) @@ -109,7 +105,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD getIncunabulaCkanProject( pinfo = projectFullInfo, limit = limit, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) ) @@ -136,7 +131,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD private def getDokubibCkanProject( pinfo: ProjectInfoV1, limit: Option[Int], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[CkanProjectV1] = { @@ -164,7 +158,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD bilderMitPropsFuture = getResources( iris = bilder, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -236,14 +229,13 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD * * @param pinfo * @param limit - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile * @return */ private def getIncunabulaCkanProject( pinfo: ProjectInfoV1, limit: Option[Int], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[CkanProjectV1] = { @@ -274,7 +266,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD val bookDataset = singleBook map { case (bookIri: IRI, pageIris: Seq[IRI]) => val bookResourceFuture = getResource( iri = bookIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -284,7 +275,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD val files = pageIris map { pageIri => getResource( iri = pageIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) map { case (pIri, pInfo, pProps) => val pInfoMap = flattenInfo(pInfo) @@ -361,13 +351,12 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD * Get detailed information about the projects * * @param projectNames - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile * @return */ private def getProjectInfos( projectNames: Seq[String], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Seq[(String, ProjectInfoV1)]] = Future.sequence { @@ -378,7 +367,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD .ask( ProjectInfoByShortnameGetRequestV1( shortname = pName, - featureFactoryConfig = featureFactoryConfig, userProfileV1 = Some(userProfile.asUserProfileV1) ) ) @@ -427,13 +415,12 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD * Get all information there is about these resources * * @param iris - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile * @return */ private def getResources( iris: Seq[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Seq[(String, Option[ResourceInfoV1], Option[PropsV1])]] = Future.sequence { @@ -442,7 +429,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD resource = getResource( iri = iri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } yield resource @@ -452,13 +438,12 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD * Get all information there is about this one resource * * @param iri - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile * @return */ private def getResource( iri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[(String, Option[ResourceInfoV1], Option[PropsV1])] = { @@ -467,7 +452,6 @@ class CkanResponderV1(responderData: ResponderData) extends Responder(responderD .ask( ResourceFullGetRequestV1( iri = iri, - featureFactoryConfig = featureFactoryConfig, userADM = userProfile ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/OntologyResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/OntologyResponderV1.scala index cdf913346f..bccb498258 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/OntologyResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/OntologyResponderV1.scala @@ -9,7 +9,7 @@ import akka.pattern._ import org.knora.webapi._ import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotFoundException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -42,19 +42,19 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon * Receives a message extending [[OntologyResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: OntologyResponderRequestV1) = msg match { - case LoadOntologiesRequestV1(featureFactoryConfig, userProfile) => loadOntologies(featureFactoryConfig, userProfile) + case LoadOntologiesRequestV1(userProfile) => loadOntologies(userProfile) case EntityInfoGetRequestV1(resourceIris, propertyIris, userProfile) => getEntityInfoResponseV1(resourceIris, propertyIris, userProfile) case ResourceTypeGetRequestV1(resourceTypeIri, userProfile) => getResourceTypeResponseV1(resourceTypeIri, userProfile) case checkSubClassRequest: CheckSubClassRequestV1 => checkSubClass(checkSubClassRequest) case subClassesGetRequest: SubClassesGetRequestV1 => getSubClasses(subClassesGetRequest) - case NamedGraphsGetRequestV1(projectIris, featureFactoryConfig, userProfile) => - getNamedGraphs(projectIris, featureFactoryConfig, userProfile) - case ResourceTypesForNamedGraphGetRequestV1(namedGraphIri, featureFactoryConfig, userProfile) => - getResourceTypesForNamedGraph(namedGraphIri, featureFactoryConfig, userProfile) - case PropertyTypesForNamedGraphGetRequestV1(namedGraphIri, featureFactoryConfig, userProfile) => - getPropertyTypesForNamedGraph(namedGraphIri, featureFactoryConfig, userProfile) + case NamedGraphsGetRequestV1(projectIris, userProfile) => + getNamedGraphs(projectIris, userProfile) + case ResourceTypesForNamedGraphGetRequestV1(namedGraphIri, userProfile) => + getResourceTypesForNamedGraph(namedGraphIri, userProfile) + case PropertyTypesForNamedGraphGetRequestV1(namedGraphIri, userProfile) => + getPropertyTypesForNamedGraph(namedGraphIri, userProfile) case PropertyTypesForResourceTypeGetRequestV1(restypeId, userProfile) => getPropertyTypesForResourceType(restypeId, userProfile) case StandoffEntityInfoGetRequestV1(standoffClassIris, standoffPropertyIris, userProfile) => @@ -69,12 +69,10 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon /** * Loads and caches all ontology information. * - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @return a [[LoadOntologiesResponse]]. */ private def loadOntologies( - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[LoadOntologiesResponse] = for { @@ -82,7 +80,6 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon _: SuccessResponseV2 <- appActor .ask( LoadOntologiesRequestV2( - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) @@ -406,20 +403,18 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon * Returns information about ontology named graphs as a [[NamedGraphsResponseV1]]. * * @param projectIris the IRIs of the projects whose named graphs should be returned. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[NamedGraphsResponseV1]]. */ private def getNamedGraphs( projectIris: Set[IRI] = Set.empty[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[NamedGraphsResponseV1] = for { projectsResponse <- appActor .ask( ProjectsGetRequestADM( - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) @@ -507,13 +502,12 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon * Gets all the resource classes and their properties for a named graph. * * @param namedGraphIriOption the IRI of the named graph or None if all the named graphs should be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return [[ResourceTypesForNamedGraphResponseV1]]. */ private def getResourceTypesForNamedGraph( namedGraphIriOption: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ResourceTypesForNamedGraphResponseV1] = { @@ -572,7 +566,6 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon case None => // map over all named graphs and collect the resource types for { projectNamedGraphsResponse: NamedGraphsResponseV1 <- getNamedGraphs( - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -589,13 +582,12 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon * Gets the property types defined in the given named graph. If there is no named graph defined, get property types for all existing named graphs. * * @param namedGraphIriOption the IRI of the named graph or None if all the named graphs should be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[PropertyTypesForNamedGraphResponseV1]]. */ private def getPropertyTypesForNamedGraph( namedGraphIriOption: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[PropertyTypesForNamedGraphResponseV1] = { @@ -696,7 +688,6 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon for { projectNamedGraphsResponse: NamedGraphsResponseV1 <- getNamedGraphs( - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/ProjectsResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/ProjectsResponderV1.scala index 966f575bc9..73a27553e6 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/ProjectsResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/ProjectsResponderV1.scala @@ -10,7 +10,7 @@ import akka.pattern._ import org.knora.webapi._ import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotFoundException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UserGetRequestADM @@ -43,34 +43,31 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon * Receives a message extending [[ProjectsResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: ProjectsResponderRequestV1) = msg match { - case ProjectsGetRequestV1(featureFactoryConfig, userProfile) => - projectsGetRequestV1(featureFactoryConfig, userProfile) - case ProjectsGetV1(featureFactoryConfig, userProfile) => projectsGetV1(featureFactoryConfig, userProfile) - case ProjectInfoByIRIGetRequestV1(iri, featureFactoryConfig, userProfile) => - projectInfoByIRIGetRequestV1(iri, featureFactoryConfig, userProfile) - case ProjectInfoByIRIGetV1(iri, featureFactoryConfig, userProfile) => - projectInfoByIRIGetV1(iri, featureFactoryConfig, userProfile) - case ProjectInfoByShortnameGetRequestV1(shortname, featureFactoryConfig, userProfile) => - projectInfoByShortnameGetRequestV1(shortname, featureFactoryConfig, userProfile) + case ProjectsGetRequestV1(userProfile) => + projectsGetRequestV1(userProfile) + case ProjectsGetV1(userProfile) => projectsGetV1(userProfile) + case ProjectInfoByIRIGetRequestV1(iri, userProfile) => + projectInfoByIRIGetRequestV1(iri, userProfile) + case ProjectInfoByIRIGetV1(iri, userProfile) => + projectInfoByIRIGetV1(iri, userProfile) + case ProjectInfoByShortnameGetRequestV1(shortname, userProfile) => + projectInfoByShortnameGetRequestV1(shortname, userProfile) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } /** * Gets all the projects and returns them as a [[ProjectsResponseV1]]. * - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user that is making the request. * @return all the projects as a [[ProjectsResponseV1]]. * @throws NotFoundException if no projects are found. */ private def projectsGetRequestV1( - featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1] ): Future[ProjectsResponseV1] = //log.debug("projectsGetRequestV1") for { projects <- projectsGetV1( - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -88,12 +85,10 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon /** * Gets all the projects and returns them as a sequence containing [[ProjectInfoV1]]. * - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user that is making the request. * @return all the projects as a sequence containing [[ProjectInfoV1]]. */ private def projectsGetV1( - featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1] ): Future[Seq[ProjectInfoV1]] = for { @@ -121,7 +116,6 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon //_ = log.debug(s"getProjectsResponseV1 - projectsWithProperties: $projectsWithProperties") ontologiesForProjects <- getOntologiesForProjects( - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -188,7 +182,6 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon */ private def getOntologiesForProjects( projectIris: Set[IRI] = Set.empty[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1] ): Future[Map[IRI, Seq[IRI]]] = for { @@ -201,7 +194,6 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon .ask( UserGetRequestADM( identifier = UserIdentifierADM(maybeIri = Some(user_iri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) @@ -220,7 +212,6 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon .ask( NamedGraphsGetRequestV1( projectIris = projectIris, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) ) @@ -238,21 +229,19 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon * Gets the project with the given project IRI and returns the information as a [[ProjectInfoResponseV1]]. * * @param projectIri the IRI of the project requested. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of user that is making the request. * @return information about the project as a [[ProjectInfoResponseV1]]. * @throws NotFoundException when no project for the given IRI can be found */ private def projectInfoByIRIGetRequestV1( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1] = None ): Future[ProjectInfoResponseV1] = //log.debug("projectInfoByIRIGetRequestV1 - projectIRI: {}", projectIRI) for { maybeProjectInfo: Option[ProjectInfoV1] <- projectInfoByIRIGetV1( projectIri = projectIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -268,13 +257,12 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon * Gets the project with the given project IRI and returns the information as a [[ProjectInfoV1]]. * * @param projectIri the IRI of the project requested. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of user that is making the request. * @return information about the project as a [[ProjectInfoV1]]. */ private def projectInfoByIRIGetV1( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1] = None ): Future[Option[ProjectInfoV1]] = //log.debug("projectInfoByIRIGetV1 - projectIRI: {}", projectIri) @@ -291,7 +279,6 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon ontologiesForProjects: Map[IRI, Seq[IRI]] <- getOntologiesForProjects( projectIris = Set(projectIri), - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -319,14 +306,13 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon * Gets the project with the given shortname and returns the information as a [[ProjectInfoResponseV1]]. * * @param shortName the shortname of the project requested. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of user that is making the request. * @return information about the project as a [[ProjectInfoResponseV1]]. * @throws NotFoundException in the case that no project for the given shortname can be found. */ private def projectInfoByShortnameGetRequestV1( shortName: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: Option[UserProfileV1] ): Future[ProjectInfoResponseV1] = //log.debug("projectInfoByShortnameGetRequestV1 - shortName: {}", shortName) @@ -353,7 +339,6 @@ class ProjectsResponderV1(responderData: ResponderData) extends Responder(respon ontologiesForProjects: Map[IRI, Seq[IRI]] <- getOntologiesForProjects( projectIris = Set(projectIri), - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/ResourcesResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/ResourcesResponderV1.scala index 6f82646952..189d50ec01 100755 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/ResourcesResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/ResourcesResponderV1.scala @@ -9,7 +9,7 @@ import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -66,14 +66,14 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * Receives a message extending [[ResourcesResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: ResourcesResponderRequestV1) = msg match { - case ResourceInfoGetRequestV1(resourceIri, featureFactoryConfig, userProfile) => - getResourceInfoResponseV1(resourceIri, featureFactoryConfig, userProfile) - case ResourceFullGetRequestV1(resourceIri, featureFactoryConfig, userProfile, getIncoming) => - getFullResponseV1(resourceIri, featureFactoryConfig, userProfile, getIncoming) - case ResourceContextGetRequestV1(resourceIri, featureFactoryConfig, userProfile, resinfo) => - getContextResponseV1(resourceIri, featureFactoryConfig, userProfile, resinfo) - case ResourceRightsGetRequestV1(resourceIri, featureFactoryConfig, userProfile) => - getRightsResponseV1(resourceIri, featureFactoryConfig, userProfile) + case ResourceInfoGetRequestV1(resourceIri, userProfile) => + getResourceInfoResponseV1(resourceIri, userProfile) + case ResourceFullGetRequestV1(resourceIri, userProfile, getIncoming) => + getFullResponseV1(resourceIri, userProfile, getIncoming) + case ResourceContextGetRequestV1(resourceIri, userProfile, resinfo) => + getContextResponseV1(resourceIri, userProfile, resinfo) + case ResourceRightsGetRequestV1(resourceIri, userProfile) => + getRightsResponseV1(resourceIri, userProfile) case graphDataGetRequest: GraphDataGetRequestV1 => getGraphDataResponseV1(graphDataGetRequest) case ResourceSearchGetRequestV1( searchString: String, @@ -89,7 +89,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo values, file, projectIri, - featureFactoryConfig, userProfile, apiRequestID ) => @@ -99,25 +98,23 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo values, file, projectIri, - featureFactoryConfig, userProfile, apiRequestID ) case MultipleResourceCreateRequestV1( resourcesToCreate, projectIri, - featureFactoryConfig, userProfile, apiRequestID ) => - createMultipleNewResources(resourcesToCreate, projectIri, featureFactoryConfig, userProfile, apiRequestID) - case ResourceCheckClassRequestV1(resourceIri: IRI, owlClass: IRI, featureFactoryConfig, userProfile: UserADM) => - checkResourceClass(resourceIri, owlClass, featureFactoryConfig, userProfile) - case PropertiesGetRequestV1(resourceIri: IRI, featureFactoryConfig, userProfile: UserADM) => - getPropertiesV1(resourceIri = resourceIri, featureFactoryConfig = featureFactoryConfig, userProfile = userProfile) + createMultipleNewResources(resourcesToCreate, projectIri, userProfile, apiRequestID) + case ResourceCheckClassRequestV1(resourceIri: IRI, owlClass: IRI, userProfile: UserADM) => + checkResourceClass(resourceIri, owlClass, userProfile) + case PropertiesGetRequestV1(resourceIri: IRI, userProfile: UserADM) => + getPropertiesV1(resourceIri = resourceIri, userProfile = userProfile) case resourceDeleteRequest: ResourceDeleteRequestV1 => deleteResourceV1(resourceDeleteRequest) - case ChangeResourceLabelRequestV1(resourceIri, label, featureFactoryConfig, userProfile, apiRequestID) => - changeResourceLabelV1(resourceIri, label, apiRequestID, featureFactoryConfig, userProfile) + case ChangeResourceLabelRequestV1(resourceIri, label, userProfile, apiRequestID) => + changeResourceLabelV1(resourceIri, label, apiRequestID, userProfile) case UnexpectedMessageRequest() => makeFutureOfUnit case InternalServerExceptionMessageRequest() => makeInternalServerException case other => handleUnexpectedMessage(other, log, this.getClass.getName) @@ -490,13 +487,11 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo */ private def getResourceInfoResponseV1( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ResourceInfoResponseV1] = for { (userPermissions, resInfo) <- getResourceInfoV1( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = true ) @@ -521,7 +516,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo */ private def getFullResponseV1( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, getIncoming: Boolean = true ): Future[ResourceFullResponseV1] = { @@ -536,7 +530,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo // Get a resource info containing basic information about the resource. Do not query the ontology here, because we will query it below. val resourceInfoFuture = getResourceInfoV1( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = false ) @@ -583,170 +576,162 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo maybeIncomingRefsResponse: Option[SparqlSelectResult] <- maybeIncomingRefsFuture - incomingRefFutures: Vector[Future[Vector[IncomingV1]]] = maybeIncomingRefsResponse match { - case Some(incomingRefsResponse) => - val incomingRefsResponseRows = - incomingRefsResponse.results.bindings - - // Group the incoming reference query results by the IRI of the referring resource. - val groupedByIncomingIri - : Map[IRI, Seq[VariableResultsRow]] = - incomingRefsResponseRows.groupBy( - _.rowMap("referringResource") - ) - - groupedByIncomingIri.map { - case ( - incomingIri: IRI, - rows: Seq[VariableResultsRow] - ) => - // Make a resource info for each referring resource, and check the permissions on the referring resource. - - val rowsForResInfo = rows.filterNot(row => - stringFormatter.optionStringToBoolean( - row.rowMap.get("isLinkValue"), - throw InconsistentRepositoryDataException( - s"Invalid boolean for isLinkValue: ${row.rowMap - .get("isLinkValue")}" - ) - ) - ) - - for { - (incomingResPermission, incomingResInfo) <- - makeResourceInfoV1( - resourceIri = incomingIri, - resInfoResponseRows = rowsForResInfo, - featureFactoryConfig = - featureFactoryConfig, - userProfile = userProfile, - queryOntology = false - ) + incomingRefFutures: Vector[Future[Vector[IncomingV1]]] = + maybeIncomingRefsResponse match { + case Some(incomingRefsResponse) => + val incomingRefsResponseRows = + incomingRefsResponse.results.bindings + + // Group the incoming reference query results by the IRI of the referring resource. + val groupedByIncomingIri: Map[IRI, Seq[VariableResultsRow]] = + incomingRefsResponseRows.groupBy( + _.rowMap("referringResource") + ) + + groupedByIncomingIri.map { + case ( + incomingIri: IRI, + rows: Seq[VariableResultsRow] + ) => + // Make a resource info for each referring resource, and check the permissions on the referring resource. + + val rowsForResInfo = rows.filterNot(row => + stringFormatter.optionStringToBoolean( + row.rowMap.get("isLinkValue"), + throw InconsistentRepositoryDataException( + s"Invalid boolean for isLinkValue: ${row.rowMap + .get("isLinkValue")}" + ) + ) + ) + + for { + (incomingResPermission, incomingResInfo) <- + makeResourceInfoV1( + resourceIri = incomingIri, + resInfoResponseRows = rowsForResInfo, + userProfile = userProfile, + queryOntology = false + ) + + // Does the user have permission to see the referring resource? + incomingV1s: Vector[IncomingV1] <- + incomingResPermission match { + case Some(_) => + // Yes. For each link from the referring resource, check whether the user has permission to see the link. If so, make an IncomingV1 for the link. + + // Filter to get only the rows representing LinkValues. + val rowsWithLinkValues = rows.filter(row => + stringFormatter.optionStringToBoolean( + row.rowMap.get("isLinkValue"), + throw InconsistentRepositoryDataException( + s"Invalid boolean for isLinkValue: ${row.rowMap + .get("isLinkValue")}" + ) + ) + ) + + // Group them by LinkValue IRI. + val groupedByLinkValue: Map[String, Seq[ + VariableResultsRow + ]] = + rowsWithLinkValues.groupBy( + _.rowMap("obj") + ) + + // For each LinkValue, check whether the user has permission to see the link, and if so, make an IncomingV1. + val maybeIncomingV1sWithFuture: Iterable[ + Future[Option[IncomingV1]] + ] = groupedByLinkValue.map { + case ( + linkValueIri: IRI, + linkValueRows: Seq[ + VariableResultsRow + ] + ) => + // Convert the rows representing the LinkValue to a ValueProps. + val linkValueProps = + valueUtilV1.createValueProps( + valueIri = linkValueIri, + objRows = linkValueRows + ) + + // Convert the resulting ValueProps into a LinkValueV1 so we can check its rdf:predicate. + + for { + apiValueV1 <- + valueUtilV1.makeValueV1( + valueProps = linkValueProps, + projectShortcode = resInfoWithoutQueryingOntology.project_shortcode, + appActor = appActor, + userProfile = userProfile + ) + + linkValueV1: LinkValueV1 = + apiValueV1 match { + case linkValueV1: LinkValueV1 => + linkValueV1 + case _ => + throw InconsistentRepositoryDataException( + s"Expected $linkValueIri to be a knora-base:LinkValue, but its type is ${apiValueV1.valueTypeIri}" + ) + } + + // Check the permissions on the LinkValue. + linkValuePermission = + PermissionUtilADM + .getUserPermissionWithValuePropsV1( + valueIri = linkValueIri, + valueProps = linkValueProps, + entityProject = Some( + incomingResInfo.project_id + ), + userProfile = userProfileV1 + ) + } yield linkValuePermission match { + // Does the user have permission to see this link? + case Some(_) => + // Yes. Make a Some containing an IncomingV1 for the link. + Some( + IncomingV1( + ext_res_id = ExternalResourceIDV1( + id = incomingIri, + pid = linkValueV1.predicateIri + ), + resinfo = incomingResInfo, + value = incomingResInfo.firstproperty + ) + ) + + case None => + // No. Make a None. + None + } + + } + + for { + + // turn the Iterable of Futures into a Future of an Iterable + maybeIncomingV1s: Iterable[ + Option[IncomingV1] + ] <- Future.sequence( + maybeIncomingV1sWithFuture + ) - // Does the user have permission to see the referring resource? - incomingV1s: Vector[IncomingV1] <- - incomingResPermission match { - case Some(_) => - // Yes. For each link from the referring resource, check whether the user has permission to see the link. If so, make an IncomingV1 for the link. - - // Filter to get only the rows representing LinkValues. - val rowsWithLinkValues = rows.filter(row => - stringFormatter.optionStringToBoolean( - row.rowMap.get("isLinkValue"), - throw InconsistentRepositoryDataException( - s"Invalid boolean for isLinkValue: ${row.rowMap - .get("isLinkValue")}" - ) - ) - ) - - // Group them by LinkValue IRI. - val groupedByLinkValue: Map[String, Seq[ - VariableResultsRow - ]] = - rowsWithLinkValues.groupBy( - _.rowMap("obj") - ) - - // For each LinkValue, check whether the user has permission to see the link, and if so, make an IncomingV1. - val maybeIncomingV1sWithFuture: Iterable[ - Future[Option[IncomingV1]] - ] = groupedByLinkValue.map { - case ( - linkValueIri: IRI, - linkValueRows: Seq[ - VariableResultsRow - ] - ) => - // Convert the rows representing the LinkValue to a ValueProps. - val linkValueProps = - valueUtilV1.createValueProps( - valueIri = linkValueIri, - objRows = linkValueRows - ) - - // Convert the resulting ValueProps into a LinkValueV1 so we can check its rdf:predicate. - - for { - apiValueV1 <- - valueUtilV1.makeValueV1( - valueProps = linkValueProps, - projectShortcode = - resInfoWithoutQueryingOntology.project_shortcode, - appActor = appActor, - featureFactoryConfig = - featureFactoryConfig, - userProfile = userProfile - ) - - linkValueV1: LinkValueV1 = - apiValueV1 match { - case linkValueV1: LinkValueV1 => - linkValueV1 - case _ => - throw InconsistentRepositoryDataException( - s"Expected $linkValueIri to be a knora-base:LinkValue, but its type is ${apiValueV1.valueTypeIri}" - ) - } - - // Check the permissions on the LinkValue. - linkValuePermission = - PermissionUtilADM - .getUserPermissionWithValuePropsV1( - valueIri = linkValueIri, - valueProps = linkValueProps, - entityProject = Some( - incomingResInfo.project_id - ), - userProfile = userProfileV1 - ) - } yield linkValuePermission match { - // Does the user have permission to see this link? - case Some(_) => - // Yes. Make a Some containing an IncomingV1 for the link. - Some( - IncomingV1( - ext_res_id = - ExternalResourceIDV1( - id = incomingIri, - pid = - linkValueV1.predicateIri - ), - resinfo = incomingResInfo, - value = - incomingResInfo.firstproperty - ) - ) - - case None => - // No. Make a None. - None - } - - } - - for { - - // turn the Iterable of Futures into a Future of an Iterable - maybeIncomingV1s: Iterable[ - Option[IncomingV1] - ] <- Future.sequence( - maybeIncomingV1sWithFuture - ) - - // Filter out the Nones, which represent incoming links that the user doesn't have permission to see. - } yield maybeIncomingV1s.flatten.toVector - - case None => - // The user doesn't have permission to see the referring resource. - Future(Vector.empty[IncomingV1]) - } - } yield incomingV1s - - }.toVector - - case None => Vector.empty[Future[Vector[IncomingV1]]] - } + // Filter out the Nones, which represent incoming links that the user doesn't have permission to see. + } yield maybeIncomingV1s.flatten.toVector + + case None => + // The user doesn't have permission to see the referring resource. + Future(Vector.empty[IncomingV1]) + } + } yield incomingV1s + + }.toVector + + case None => Vector.empty[Future[Vector[IncomingV1]]] + } incomingRefsWithoutQueryingOntology <- Future.sequence(incomingRefFutures).map(_.flatten) @@ -844,7 +829,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo propertyInfoMap = entityInfoResponse.propertyInfoMap, resourceEntityInfoMap = entityInfoResponse.resourceClassInfoMap, propsAndCardinalities = propsAndCardinalities, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -972,14 +956,13 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * Returns an instance of [[ResourceContextResponseV1]] describing the context of a resource, in Knora API v1 format. * * @param resourceIri the IRI of the resource to be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @param resinfo a flag if resinfo should be retrieved or not. * @return a [[ResourceContextResponseV1]] describing the context of the resource. */ private def getContextResponseV1( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, resinfo: Boolean ): Future[ResourceContextResponseV1] = { @@ -1106,7 +1089,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo // Get the resource info even if the user didn't ask for it, so we can check its permissions. (userPermission, resInfoV1) <- getResourceInfoV1( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = true ) @@ -1137,7 +1119,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo for { (containingResourcePermissionCode, resInfoV1) <- getResourceInfoV1( resourceIri = containingResourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = true ) @@ -1255,97 +1236,90 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .mapTo[SparqlSelectResult] regionRows = regionQueryResponse.results.bindings - regionPropertiesSequencedFutures: Seq[Future[PropsGetForRegionV1]] = regionRows.filter { regionRow => - val permissionCodeForRegion = - PermissionUtilADM - .getUserPermissionV1( - entityIri = - regionRow.rowMap("region"), - entityCreator = - regionRow.rowMap("owner"), - entityProject = - regionRow.rowMap("project"), - entityPermissionLiteral = - regionRow.rowMap( - "regionObjectPermissions" - ), - userProfile = userProfileV1 - ) - - // ignore regions the user has no permissions on - permissionCodeForRegion.nonEmpty - }.map { regionRow => - val regionIri = - regionRow.rowMap("region") - val resClass = regionRow.rowMap( - "resclass" - ) // possibly we deal with a subclass of knora-base:Region - - // get the properties for each region - for { - propsV1: Seq[PropertyV1] <- - getResourceProperties( - resourceIri = regionIri, - maybeResourceTypeIri = - Some(resClass), - featureFactoryConfig = - featureFactoryConfig, - userProfile = userProfile - ) - - propsGetV1 = propsV1.map { - // convert each PropertyV1 in a PropertyGetV1 - propV1: PropertyV1 => - convertPropertyV1toPropertyGetV1( - propV1 - ) - } - - // get the icon for this region's resource class - entityInfoResponse: EntityInfoGetResponseV1 <- - appActor - .ask( - EntityInfoGetRequestV1( - resourceClassIris = - Set(resClass), - userProfile = userProfile - ) - ) - .mapTo[EntityInfoGetResponseV1] - - regionInfo: ClassInfoV1 = - entityInfoResponse - .resourceClassInfoMap(resClass) - - resClassIcon: Option[String] = - regionInfo.predicates.get( - OntologyConstants.KnoraBase.ResourceIcon - ) match { - case Some( - predicateInfo: PredicateInfoV1 - ) => - Some( - valueUtilV1 - .makeResourceClassIconURL( - resClass, - predicateInfo.objects.headOption - .getOrElse( - throw InconsistentRepositoryDataException( - s"resourceClass $resClass has no value for ${OntologyConstants.KnoraBase.ResourceIcon}" - ) - ) - ) - ) - case None => None - } - - } yield PropsGetForRegionV1( - properties = propsGetV1, - res_id = regionIri, - iconsrc = resClassIcon - ) - - } + regionPropertiesSequencedFutures: Seq[Future[PropsGetForRegionV1]] = + regionRows.filter { regionRow => + val permissionCodeForRegion = + PermissionUtilADM + .getUserPermissionV1( + entityIri = regionRow.rowMap("region"), + entityCreator = regionRow.rowMap("owner"), + entityProject = regionRow.rowMap("project"), + entityPermissionLiteral = regionRow.rowMap( + "regionObjectPermissions" + ), + userProfile = userProfileV1 + ) + + // ignore regions the user has no permissions on + permissionCodeForRegion.nonEmpty + }.map { regionRow => + val regionIri = + regionRow.rowMap("region") + val resClass = regionRow.rowMap( + "resclass" + ) // possibly we deal with a subclass of knora-base:Region + + // get the properties for each region + for { + propsV1: Seq[PropertyV1] <- + getResourceProperties( + resourceIri = regionIri, + maybeResourceTypeIri = Some(resClass), + userProfile = userProfile + ) + + propsGetV1 = propsV1.map { + // convert each PropertyV1 in a PropertyGetV1 + propV1: PropertyV1 => + convertPropertyV1toPropertyGetV1( + propV1 + ) + } + + // get the icon for this region's resource class + entityInfoResponse: EntityInfoGetResponseV1 <- + appActor + .ask( + EntityInfoGetRequestV1( + resourceClassIris = Set(resClass), + userProfile = userProfile + ) + ) + .mapTo[EntityInfoGetResponseV1] + + regionInfo: ClassInfoV1 = + entityInfoResponse + .resourceClassInfoMap(resClass) + + resClassIcon: Option[String] = + regionInfo.predicates.get( + OntologyConstants.KnoraBase.ResourceIcon + ) match { + case Some( + predicateInfo: PredicateInfoV1 + ) => + Some( + valueUtilV1 + .makeResourceClassIconURL( + resClass, + predicateInfo.objects.headOption + .getOrElse( + throw InconsistentRepositoryDataException( + s"resourceClass $resClass has no value for ${OntologyConstants.KnoraBase.ResourceIcon}" + ) + ) + ) + ) + case None => None + } + + } yield PropsGetForRegionV1( + properties = propsGetV1, + res_id = regionIri, + iconsrc = resClassIcon + ) + + } // turn sequenced Futures into one Future of a sequence regionProperties: Seq[PropsGetForRegionV1] <- Future.sequence(regionPropertiesSequencedFutures) @@ -1411,13 +1385,11 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo */ private def getRightsResponseV1( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ResourceRightsResponseV1] = for { (userPermission, _) <- getResourceInfoV1( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = false ) @@ -1576,14 +1548,13 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * @param resourcesToCreate collection of ResourceRequests . * @param projectIri IRI of the project . * @param apiRequestID the the ID of the API request. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[MultipleResourceCreateResponseV1]] informing the client about the new resources. */ private def createMultipleNewResources( resourcesToCreate: Seq[OneOfMultipleResourceCreateRequestV1], projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[MultipleResourceCreateResponseV1] = { @@ -1608,7 +1579,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .ask( ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -1836,7 +1806,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo values = resourceCreateRequest.values, convertedFile = resourceCreateRequest.file, clientResourceIDsToResourceClasses = clientResourceIDsToResourceClasses, - featureFactoryConfig = featureFactoryConfig, userProfile = requestingUser ) @@ -1871,7 +1840,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo clientResourceIDsToResourceIris = clientResourceIDsToResourceIris, creationDate = creationDate, fileValues = fileValues, - featureFactoryConfig = featureFactoryConfig, userProfile = requestingUser, apiRequestID = apiRequestID ) @@ -1964,7 +1932,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * be generated for links to missing resources. * @param convertedFile an already converted file to be attached to the resource. * @param clientResourceIDsToResourceClasses for each client resource ID, the IRI of the resource's class. Used only if `linkTargetsAlreadyExist` is false. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @return a tuple (IRI, Vector[CreateValueV1WithComment]) containing the IRI of the resource and a collection of holders of [[UpdateValueV1]] and comment. */ @@ -1983,7 +1950,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo throw BadRequestException(errorMsg) } ), - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Option[(IRI, Vector[CreateValueV1WithComment])]] = { for { @@ -2047,7 +2013,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo checkResourceClass( resourceIri = linkUpdate.targetResourceIri, owlClass = propertyObjectClassConstraint, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ).mapTo[ResourceCheckClassResponseV1] @@ -2143,7 +2108,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * @param clientResourceIDsToResourceIris a map of client resource IDs (which may appear in standoff link tags * in values passed to this method) to the IRIs that will be used for * those resources. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @param apiRequestID the the ID of the API request. * @return a [[GenerateSparqlToCreateMultipleValuesResponseV1]] returns response of generation of SPARQL for multiple values. @@ -2157,7 +2121,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo fileValues: Option[(IRI, Vector[CreateValueV1WithComment])], clientResourceIDsToResourceIris: Map[String, IRI], creationDate: Instant, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ): Future[GenerateSparqlToCreateMultipleValuesResponseV1] = @@ -2172,7 +2135,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo values = values ++ fileValues, clientResourceIDsToResourceIris = clientResourceIDsToResourceIris, creationDate = creationDate, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, apiRequestID = apiRequestID ) @@ -2217,7 +2179,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * @param createNewResourceSparql Sparql query to create the resource . * @param generateSparqlForValuesResponse Sparql statement for creation of values of resource. * @param projectADM the project in which the resource was created. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @return a [[ResourceCreateResponseV1]] containing information about the created resource . */ @@ -2227,7 +2188,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo createNewResourceSparql: String, generateSparqlForValuesResponse: GenerateSparqlToCreateMultipleValuesResponseV1, projectADM: ProjectADM, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ResourceCreateResponseV1] = // Verify that the resource was created. @@ -2255,7 +2215,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo verifyCreateValuesRequest = VerifyMultipleValueCreationRequestV1( resourceIri = resourceIri, unverifiedValues = generateSparqlForValuesResponse.unverifiedValues, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2299,7 +2258,7 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * @param file a file that has been uploaded to Sipi's temporary storage and should be attached to the resource. * @param creatorIri the creator of the resource to be created. * @param namedGraph the named graph the resource belongs to. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @param apiRequestID the request ID used for locking the resource. * @return a [[ResourceCreateResponseV1]] containing information about the created resource. @@ -2313,7 +2272,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo file: Option[FileValueV1], creatorIri: IRI, namedGraph: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[ResourceCreateResponseV1] = { @@ -2390,7 +2348,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo propertyInfoMap = propertyInfoMap, values = values, convertedFile = file, - featureFactoryConfig = featureFactoryConfig, userProfile = requestingUser ) @@ -2409,7 +2366,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo fileValues = fileValues, clientResourceIDsToResourceIris = Map.empty[String, IRI], creationDate = creationDate, - featureFactoryConfig = featureFactoryConfig, userProfile = requestingUser, apiRequestID = apiRequestID ) @@ -2444,7 +2400,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo createNewResourceSparql = createNewResourceSparql, generateSparqlForValuesResponse = generateSparqlForValuesResponse, projectADM = projectADM, - featureFactoryConfig = featureFactoryConfig, userProfile = requestingUser ) } yield apiResponse @@ -2463,7 +2418,7 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * @param values the values to be attached to the resource. * @param file a file that has been uploaded to Sipi's temporary storage and should be attached to the resource. * @param projectIri the project the resource belongs to. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the user that is creating the resource * @param apiRequestID the ID of this API request. * @return a [[ResourceCreateResponseV1]] informing the client about the new resource. @@ -2474,7 +2429,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo values: Map[IRI, Seq[CreateValueV1WithComment]], file: Option[FileValueV1] = None, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ): Future[ResourceCreateResponseV1] = @@ -2500,7 +2454,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .ask( ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) @@ -2572,7 +2525,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo file = file, creatorIri = userIri, namedGraph = namedGraph, - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile, apiRequestID = apiRequestID ) @@ -2592,7 +2544,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo // Check that the user has permission to delete the resource. (permissionCode, resourceInfo) <- getResourceInfoV1( resourceIri = resourceDeleteRequest.resourceIri, - featureFactoryConfig = resourceDeleteRequest.featureFactoryConfig, userProfile = resourceDeleteRequest.userADM, queryOntology = false ) @@ -2612,7 +2563,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .ask( ProjectInfoByIRIGetRequestV1( iri = resourceInfo.project_id, - featureFactoryConfig = resourceDeleteRequest.featureFactoryConfig, userProfileV1 = None ) ) @@ -2683,21 +2633,19 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * * @param resourceIri the IRI of the resource to be checked. * @param owlClass the IRI of the OWL class to compare the resource's class to. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ResourceCheckClassResponseV1]]. */ private def checkResourceClass( resourceIri: IRI, owlClass: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ResourceCheckClassResponseV1] = for { // Check that the user has permission to view the resource. (permissionCode, resourceInfo) <- getResourceInfoV1( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = false ) @@ -2734,7 +2682,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo resourceIri: IRI, label: String, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ChangeResourceLabelResponseV1] = { @@ -2743,7 +2690,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo // get the resource's permissions (permissionCode, resourceInfo) <- getResourceInfoV1( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = false ) @@ -2764,7 +2710,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .ask( ProjectInfoByIRIGetRequestV1( iri = resourceInfo.project_id, - featureFactoryConfig = featureFactoryConfig, userProfileV1 = None ) ) @@ -2838,7 +2783,7 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * Returns a [[ResourceInfoV1]] describing a resource. * * @param resourceIri the IRI of the resource to be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the user that is making the request. * @param queryOntology if `true`, the ontology will be queried for information about the resource type, and the [[ResourceInfoV1]] * will include `restype_label`, `restype_description`, and `restype_iconsrc`. Otherwise, those member variables @@ -2847,7 +2792,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo */ private def getResourceInfoV1( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, queryOntology: Boolean ): Future[(Option[Int], ResourceInfoV1)] = @@ -2865,7 +2809,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo resInfo: (Option[Int], ResourceInfoV1) <- makeResourceInfoV1( resourceIri = resourceIri, resInfoResponseRows = resInfoResponseRows, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, queryOntology = queryOntology ) @@ -2875,13 +2818,12 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * Queries the properties for the given resource. * * @param resourceIri the IRI of the given resource. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[PropertiesGetResponseV1]] representing the properties of the given resource. */ private def getPropertiesV1( resourceIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[PropertiesGetResponseV1] = for { @@ -2903,7 +2845,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo properties: Seq[PropertyV1] <- getResourceProperties( resourceIri = resourceIri, maybeResourceTypeIri = Some(resclass.rowMap("resourceClass")), - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2921,14 +2862,13 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * @param maybeResourceTypeIri an optional IRI representing the resource's class. If provided, an additional query will be done * to get ontology-based information, such as labels and cardinalities, which will be included in * the returned [[PropertyV1]] objects. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[Seq]] of [[PropertyV1]] objects representing the properties that have values for the resource. */ private def getResourceProperties( resourceIri: IRI, maybeResourceTypeIri: Option[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Seq[PropertyV1]] = for { @@ -2984,7 +2924,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo propertyInfoMap = propertyInfoMap, resourceEntityInfoMap = resourceEntityInfoMap, propsAndCardinalities = propsAndCardinalities, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } yield queryResult @@ -2995,7 +2934,7 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * * @param resourceIri the IRI of the resource. * @param resInfoResponseRows the SPARQL query result. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the user that is making the request. * @param queryOntology if `true`, the ontology will be queried for information about the resource type, and the [[ResourceInfoV1]] * will include `restype_label`, `restype_description`, and `restype_iconsrc`. Otherwise, those member variables @@ -3005,7 +2944,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo private def makeResourceInfoV1( resourceIri: IRI, resInfoResponseRows: Seq[VariableResultsRow], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, queryOntology: Boolean ): Future[(Option[Int], ResourceInfoV1)] = { @@ -3086,7 +3024,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo valueProps = fileValueProps, projectShortcode = projectShortcode, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -3241,7 +3178,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo * ontology-based information for linking properties in the returned [[PropertyV1]] objects. * @param propsAndCardinalities a [[Map]] of property IRIs to their cardinalities in the class of the queried resource. If this [[Map]] is not * empty, it will be used to include cardinalities in the returned [[PropertyV1]] objects. - * @param featureFactoryConfig the feature factory configuration. * @param userProfile the profile of the user making the request. * @return a [[Seq]] of [[PropertyV1]] objects. */ @@ -3252,7 +3188,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo propertyInfoMap: Map[IRI, PropertyInfoV1], resourceEntityInfoMap: Map[IRI, ClassInfoV1], propsAndCardinalities: Map[IRI, KnoraCardinalityInfo], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Seq[PropertyV1]] = { val userProfileV1 = userProfile.asUserProfileV1 @@ -3355,7 +3290,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo valueProps = valueProps, projectShortcode = projectShortcode, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -3508,7 +3442,6 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo valueProps = linkValueProps, projectShortcode = projectShortcode, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala index 103142b5d2..0b6d810e48 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala @@ -9,7 +9,7 @@ import akka.pattern._ import org.knora.webapi._ import dsp.errors.NotFoundException import dsp.errors.SipiException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -33,12 +33,12 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon * Receives a message of type [[StandoffResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: StandoffResponderRequestV1) = msg match { - case CreateMappingRequestV1(xml, label, projectIri, mappingName, featureFactoryConfig, userProfile, uuid) => - createMappingV1(xml, label, projectIri, mappingName, featureFactoryConfig, userProfile, uuid) - case GetMappingRequestV1(mappingIri, featureFactoryConfig, userProfile) => - getMappingV1(mappingIri, featureFactoryConfig, userProfile) - case GetXSLTransformationRequestV1(xsltTextReprIri, featureFactoryConfig, userProfile) => - getXSLTransformation(xsltTextReprIri, featureFactoryConfig, userProfile) + case CreateMappingRequestV1(xml, label, projectIri, mappingName, userProfile, uuid) => + createMappingV1(xml, label, projectIri, mappingName, userProfile, uuid) + case GetMappingRequestV1(mappingIri, userProfile) => + getMappingV1(mappingIri, userProfile) + case GetXSLTransformationRequestV1(xsltTextReprIri, userProfile) => + getXSLTransformation(xsltTextReprIri, userProfile) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -48,13 +48,12 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon * Retrieves a `knora-base:XSLTransformation` in the triplestore and requests the corresponding XSL file from Sipi. * * @param xslTransformationIri The IRI of the resource representing the XSL Transformation (a [[org.knora.webapi.messages.OntologyConstants.KnoraBase.XSLTransformation]]). - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile The client making the request. * @return a [[GetXSLTransformationResponseV1]]. */ private def getXSLTransformation( xslTransformationIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[GetXSLTransformationResponseV1] = { @@ -63,7 +62,6 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon .ask( GetXSLTransformationRequestV2( xsltTextRepresentationIri = xslTransformationIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) @@ -85,7 +83,7 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon * The mapping is used to convert XML documents to [[TextValueV1]] and back. * * @param xml the provided mapping. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the client that made the request. */ private def createMappingV1( @@ -93,7 +91,6 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon label: String, projectIri: IRI, mappingName: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM, apiRequestID: UUID ): Future[CreateMappingResponseV1] = { @@ -107,7 +104,6 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon mappingName = mappingName ), xml = CreateMappingRequestXMLV2(xml), - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile, apiRequestID = apiRequestID ) @@ -129,13 +125,12 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon * Gets a mapping either from the cache or by making a request to the triplestore. * * @param mappingIri the IRI of the mapping to retrieve. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the user making the request. * @return a [[MappingXMLtoStandoff]]. */ private def getMappingV1( mappingIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[GetMappingResponseV1] = for { @@ -143,7 +138,6 @@ class StandoffResponderV1(responderData: ResponderData) extends Responder(respon .ask( GetMappingRequestV2( mappingIri = mappingIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/UsersResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/UsersResponderV1.scala index 810d3f5ffc..ea562889b0 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/UsersResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/UsersResponderV1.scala @@ -11,7 +11,7 @@ import org.knora.webapi._ import dsp.errors.ApplicationCacheException import dsp.errors.ForbiddenException import dsp.errors.NotFoundException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionDataGetADM import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM @@ -48,14 +48,14 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder case UsersGetV1(userProfile) => usersGetV1(userProfile) case UsersGetRequestV1(userProfileV1) => usersGetRequestV1(userProfileV1) case UserDataByIriGetV1(userIri, short) => userDataByIriGetV1(userIri, short) - case UserProfileByIRIGetV1(userIri, profileType, featureFactoryConfig) => - userProfileByIRIGetV1(userIri, profileType, featureFactoryConfig) - case UserProfileByIRIGetRequestV1(userIri, profileType, featureFactoryConfig, userProfile) => - userProfileByIRIGetRequestV1(userIri, profileType, featureFactoryConfig, userProfile) - case UserProfileByEmailGetV1(email, profileType, featureFactoryConfig) => - userProfileByEmailGetV1(email, profileType, featureFactoryConfig) - case UserProfileByEmailGetRequestV1(email, profileType, featureFactoryConfig, userProfile) => - userProfileByEmailGetRequestV1(email, profileType, featureFactoryConfig, userProfile) + case UserProfileByIRIGetV1(userIri, profileType) => + userProfileByIRIGetV1(userIri, profileType) + case UserProfileByIRIGetRequestV1(userIri, profileType, userProfile) => + userProfileByIRIGetRequestV1(userIri, profileType, userProfile) + case UserProfileByEmailGetV1(email, profileType) => + userProfileByEmailGetV1(email, profileType) + case UserProfileByEmailGetRequestV1(email, profileType, userProfile) => + userProfileByEmailGetRequestV1(email, profileType, userProfile) case UserProjectMembershipsGetRequestV1(userIri, userProfile, apiRequestID) => userProjectMembershipsGetRequestV1(userIri, userProfile, apiRequestID) case UserProjectAdminMembershipsGetRequestV1(userIri, userProfile, apiRequestID) => @@ -158,13 +158,12 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder * * @param userIri the IRI of the user. * @param profileType the type of the requested profile (restricted of full). - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[UserProfileV1]] describing the user. */ private def userProfileByIRIGetV1( userIri: IRI, - profileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig + profileType: UserProfileType ): Future[Option[UserProfileV1]] = // log.debug(s"userProfileByIRIGetV1: userIri = $userIRI', clean = '$profileType'") CacheUtil.get[UserProfileV1](USER_PROFILE_CACHE_NAME, userIri) match { @@ -188,8 +187,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder userDataQueryResponse <- appActor.ask(SparqlSelectRequest(sparqlQueryString)).mapTo[SparqlSelectResult] maybeUserProfileV1 <- userDataQueryResponse2UserProfileV1( - userDataQueryResponse = userDataQueryResponse, - featureFactoryConfig = featureFactoryConfig + userDataQueryResponse = userDataQueryResponse ) _ = if (maybeUserProfileV1.nonEmpty) { @@ -207,14 +205,13 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder * * @param userIRI the IRI of the user. * @param profileType the type of the requested profile (restriced or full). - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the requesting user's profile. * @return a [[UserProfileResponseV1]] */ private def userProfileByIRIGetRequestV1( userIRI: IRI, profileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserProfileV1 ): Future[UserProfileResponseV1] = for { @@ -225,8 +222,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder ) maybeUserProfileToReturn <- userProfileByIRIGetV1( userIri = userIRI, - profileType = profileType, - featureFactoryConfig = featureFactoryConfig + profileType = profileType ) result = maybeUserProfileToReturn match { @@ -241,13 +237,12 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder * * @param email the email of the user. * @param profileType the type of the requested profile (restricted or full). - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[UserProfileV1]] describing the user. */ private def userProfileByEmailGetV1( email: String, - profileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig + profileType: UserProfileType ): Future[Option[UserProfileV1]] = // log.debug(s"userProfileByEmailGetV1: username = '{}', type = '{}'", email, profileType) CacheUtil.get[UserProfileV1](USER_PROFILE_CACHE_NAME, email) match { @@ -271,8 +266,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder //_ = log.debug(MessageUtil.toSource(userDataQueryResponse)) maybeUserProfileV1 <- userDataQueryResponse2UserProfileV1( - userDataQueryResponse = userDataQueryResponse, - featureFactoryConfig = featureFactoryConfig + userDataQueryResponse = userDataQueryResponse ) _ = if (maybeUserProfileV1.nonEmpty) { @@ -291,7 +285,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder * * @param email the email of the user. * @param profileType the type of the requested profile (restricted or full). - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the requesting user's profile. * @return a [[UserProfileResponseV1]] * @throws NotFoundException if the user with the supplied email is not found. @@ -299,14 +293,12 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder private def userProfileByEmailGetRequestV1( email: String, profileType: UserProfileType, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserProfileV1 ): Future[UserProfileResponseV1] = for { maybeUserProfileToReturn <- userProfileByEmailGetV1( email = email, - profileType = profileType, - featureFactoryConfig = featureFactoryConfig + profileType = profileType ) result = maybeUserProfileToReturn match { @@ -483,12 +475,10 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder * Helper method used to create a [[UserProfileV1]] from the [[SparqlSelectResult]] containing user data. * * @param userDataQueryResponse a [[SparqlSelectResult]] containing user data. - * @param featureFactoryConfig the feature factory configuration. * @return a [[UserProfileV1]] containing the user's data. */ private def userDataQueryResponse2UserProfileV1( - userDataQueryResponse: SparqlSelectResult, - featureFactoryConfig: FeatureFactoryConfig + userDataQueryResponse: SparqlSelectResult ): Future[Option[UserProfileV1]] = // log.debug("userDataQueryResponse2UserProfileV1 - userDataQueryResponse: {}", MessageUtil.toSource(userDataQueryResponse)) if (userDataQueryResponse.results.bindings.nonEmpty) { @@ -549,24 +539,22 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder groupIris = groupIris, isInProjectAdminGroups = isInProjectAdminGroups, isInSystemAdminGroup = isInSystemAdminGroup, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) .mapTo[PermissionsDataADM] - maybeProjectInfoFutures: Seq[Future[Option[ProjectInfoV1]]] = projectIris.map { projectIri => - appActor - .ask( - ProjectInfoByIRIGetV1( - iri = projectIri, - featureFactoryConfig = - featureFactoryConfig, - userProfileV1 = None - ) - ) - .mapTo[Option[ProjectInfoV1]] - } + maybeProjectInfoFutures: Seq[Future[Option[ProjectInfoV1]]] = + projectIris.map { projectIri => + appActor + .ask( + ProjectInfoByIRIGetV1( + iri = projectIri, + userProfileV1 = None + ) + ) + .mapTo[Option[ProjectInfoV1]] + } maybeProjectInfos: Seq[Option[ProjectInfoV1]] <- Future.sequence(maybeProjectInfoFutures) projectInfos = maybeProjectInfos.flatten diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/ValuesResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/ValuesResponderV1.scala index 8699426433..8a18d8c0d2 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/ValuesResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/ValuesResponderV1.scala @@ -8,7 +8,7 @@ package org.knora.webapi.responders.v1 import akka.pattern._ import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter @@ -62,10 +62,10 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * Receives a message of type [[ValuesResponderRequestV1]], and returns an appropriate response message. */ def receive(msg: ValuesResponderRequestV1) = msg match { - case ValueGetRequestV1(valueIri, featureFactoryConfig, userProfile) => - getValueResponseV1(valueIri, featureFactoryConfig, userProfile) - case LinkValueGetRequestV1(subjectIri, predicateIri, objectIri, featureFactoryConfig, userProfile) => - getLinkValue(subjectIri, predicateIri, objectIri, featureFactoryConfig, userProfile) + case ValueGetRequestV1(valueIri, userProfile) => + getValueResponseV1(valueIri, userProfile) + case LinkValueGetRequestV1(subjectIri, predicateIri, objectIri, userProfile) => + getLinkValue(subjectIri, predicateIri, objectIri, userProfile) case versionHistoryRequest: ValueVersionHistoryGetRequestV1 => getValueVersionHistoryResponseV1(versionHistoryRequest) case createValueRequest: CreateValueRequestV1 => createValueV1(createValueRequest) @@ -87,19 +87,17 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * Queries a `knora-base:Value` and returns a [[ValueGetResponseV1]] describing it. * * @param valueIri the IRI of the value to be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ValueGetResponseV1]]. */ private def getValueResponseV1( valueIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ValueGetResponseV1] = for { maybeValueQueryResult <- findValue( valueIri = valueIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -110,8 +108,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( UserProfileByIRIGetV1( userIri = valueQueryResult.creatorIri, - userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = featureFactoryConfig + userProfileType = UserProfileTypeV1.RESTRICTED ) ) .mapTo[Option[UserProfileV1]] @@ -180,7 +177,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde propertyIri = createValueRequest.propertyIri, propertyObjectClassConstraint = propertyObjectClassConstraint, updateValueV1 = createValueRequest.value, - featureFactoryConfig = createValueRequest.featureFactoryConfig, userProfile = createValueRequest.userProfile ) @@ -191,7 +187,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ResourceFullGetRequestV1( iri = createValueRequest.resourceIri, - featureFactoryConfig = createValueRequest.featureFactoryConfig, userADM = createValueRequest.userProfile, getIncoming = false ) @@ -278,7 +273,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( iri = projectIri, - featureFactoryConfig = createValueRequest.featureFactoryConfig, userProfileV1 = Some(createValueRequest.userProfile.asUserProfileV1) ) ) @@ -300,7 +294,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment = createValueRequest.comment, valueCreator = userIri, valuePermissions = defaultObjectAccessPermissions.permissionLiteral, - featureFactoryConfig = createValueRequest.featureFactoryConfig, userProfile = createValueRequest.userProfile ) @@ -309,7 +302,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri = createValueRequest.resourceIri, propertyIri = createValueRequest.propertyIri, unverifiedValue = unverifiedValue, - featureFactoryConfig = createValueRequest.featureFactoryConfig, userProfile = createValueRequest.userProfile ) } yield apiResponse @@ -445,7 +437,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetIriCheckResult <- checkStandoffResourceReferenceTargets( targetIris = targetIrisThatAlreadyExist, - featureFactoryConfig = createMultipleValuesRequest.featureFactoryConfig, userProfile = createMultipleValuesRequest.userProfile ) @@ -722,7 +713,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri = verifyRequest.resourceIri, propertyIri = propertyIri, unverifiedValue = unverifiedValue, - featureFactoryConfig = verifyRequest.featureFactoryConfig, userProfile = verifyRequest.userProfile ) } @@ -809,7 +799,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde ChangeValueRequestV1( valueIri = fileValues.head.valueObjectIri, value = changeFileValueRequest.file, - featureFactoryConfig = changeFileValueRequest.featureFactoryConfig, userProfile = changeFileValueRequest.userProfile, apiRequestID = changeFileValueRequest.apiRequestID // re-use the same id ) @@ -841,24 +830,21 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ResourceInfoGetRequestV1( iri = changeFileValueRequest.resourceIri, - featureFactoryConfig = changeFileValueRequest.featureFactoryConfig, userProfile = changeFileValueRequest.userProfile ) ) .mapTo[ResourceInfoResponseV1] // Get project info - projectResponse <- appActor - .ask( - ProjectGetRequestADM( - identifier = ProjectIdentifierADM(maybeIri = - Some(resourceInfoResponse.resource_info.get.project_id) - ), - featureFactoryConfig = changeFileValueRequest.featureFactoryConfig, - requestingUser = changeFileValueRequest.userProfile - ) - ) - .mapTo[ProjectGetResponseADM] + projectResponse <- + appActor + .ask( + ProjectGetRequestADM( + identifier = ProjectIdentifierADM(maybeIri = Some(resourceInfoResponse.resource_info.get.project_id)), + requestingUser = changeFileValueRequest.userProfile + ) + ) + .mapTo[ProjectGetResponseADM] // Do the preparations of a file value change while already holding an update lock on the resource. // This is necessary because in `makeTaskFuture` the current file value Iris for the given resource IRI have to been retrieved. @@ -909,31 +895,27 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde for { // Ensure that the user has permission to modify the value. - maybeCurrentValueQueryResult: Option[ValueQueryResult] <- changeValueRequest.value match { - case linkUpdateV1: LinkUpdateV1 => - // We're being asked to update a link. We expect the current value version IRI to point to a - // knora-base:LinkValue. Get all necessary information about the LinkValue and the corresponding - // direct link. - findLinkValueByIri( - subjectIri = - findResourceWithValueResult.resourceIri, - predicateIri = propertyIri, - objectIri = None, - linkValueIri = changeValueRequest.valueIri, - featureFactoryConfig = - changeValueRequest.featureFactoryConfig, - userProfile = changeValueRequest.userProfile - ) + maybeCurrentValueQueryResult: Option[ValueQueryResult] <- + changeValueRequest.value match { + case linkUpdateV1: LinkUpdateV1 => + // We're being asked to update a link. We expect the current value version IRI to point to a + // knora-base:LinkValue. Get all necessary information about the LinkValue and the corresponding + // direct link. + findLinkValueByIri( + subjectIri = findResourceWithValueResult.resourceIri, + predicateIri = propertyIri, + objectIri = None, + linkValueIri = changeValueRequest.valueIri, + userProfile = changeValueRequest.userProfile + ) - case otherValueV1 => - // We're being asked to update an ordinary value. - findValue( - valueIri = changeValueRequest.valueIri, - featureFactoryConfig = - changeValueRequest.featureFactoryConfig, - userProfile = changeValueRequest.userProfile - ) - } + case otherValueV1 => + // We're being asked to update an ordinary value. + findValue( + valueIri = changeValueRequest.valueIri, + userProfile = changeValueRequest.userProfile + ) + } currentValueQueryResult = maybeCurrentValueQueryResult.getOrElse( @@ -977,7 +959,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde propertyIri = propertyIri, propertyObjectClassConstraint = propertyObjectClassConstraint, updateValueV1 = changeValueRequest.value, - featureFactoryConfig = changeValueRequest.featureFactoryConfig, userProfile = changeValueRequest.userProfile ) @@ -999,7 +980,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ResourceFullGetRequestV1( iri = findResourceWithValueResult.resourceIri, - featureFactoryConfig = changeValueRequest.featureFactoryConfig, userADM = changeValueRequest.userProfile, getIncoming = false ) @@ -1065,7 +1045,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( iri = resourceFullResponse.resinfo.get.project_id, - featureFactoryConfig = changeValueRequest.featureFactoryConfig, userProfileV1 = Some(changeValueRequest.userProfile.asUserProfileV1) ) ) @@ -1108,7 +1087,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment = changeValueRequest.comment, valueCreator = userIri, valuePermissions = defaultObjectAccessPermissions.permissionLiteral, - featureFactoryConfig = changeValueRequest.featureFactoryConfig, userProfile = changeValueRequest.userProfile ) @@ -1140,7 +1118,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment = changeValueRequest.comment, valueCreator = userIri, valuePermissions = valuePermissions, - featureFactoryConfig = changeValueRequest.featureFactoryConfig, userProfile = changeValueRequest.userProfile ) } @@ -1184,12 +1161,11 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde ): Future[ChangeValueResponseV1] = for { // Ensure that the user has permission to modify the value. - maybeCurrentValueQueryResult: Option[ValueQueryResult] <- findValue( - valueIri = changeCommentRequest.valueIri, - featureFactoryConfig = - changeCommentRequest.featureFactoryConfig, - userProfile = changeCommentRequest.userProfile - ) + maybeCurrentValueQueryResult: Option[ValueQueryResult] <- + findValue( + valueIri = changeCommentRequest.valueIri, + userProfile = changeCommentRequest.userProfile + ) currentValueQueryResult = maybeCurrentValueQueryResult.getOrElse( @@ -1221,7 +1197,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( findResourceWithValueResult.projectIri, - featureFactoryConfig = changeCommentRequest.featureFactoryConfig, None ) ) @@ -1257,7 +1232,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri = findResourceWithValueResult.resourceIri, propertyIri = findResourceWithValueResult.propertyIri, searchValueIri = newValueIri, - featureFactoryConfig = changeCommentRequest.featureFactoryConfig, userProfile = changeCommentRequest.userProfile ) } yield ChangeValueResponseV1( @@ -1315,7 +1289,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde // Ensure that the user has permission to mark the value as deleted. maybeCurrentValueQueryResult <- findValue( valueIri = deleteValueRequest.valueIri, - featureFactoryConfig = deleteValueRequest.featureFactoryConfig, userProfile = deleteValueRequest.userProfile ) @@ -1371,7 +1344,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( iri = findResourceWithValueResult.projectIri, - featureFactoryConfig = deleteValueRequest.featureFactoryConfig, userProfileV1 = None ) ) @@ -1392,8 +1364,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri = linkValue.objectIri, valueCreator = userIri, valuePermissions = valuePermissions, - featureFactoryConfig = - deleteValueRequest.featureFactoryConfig, userProfile = deleteValueRequest.userProfile ) @@ -1429,8 +1399,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri = targetResourceIri, valueCreator = OntologyConstants.KnoraAdmin.SystemUser, valuePermissions = standoffLinkValuePermissions, - featureFactoryConfig = - deleteValueRequest.featureFactoryConfig, userProfile = deleteValueRequest.userProfile ) }.toVector @@ -1449,7 +1417,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( iri = findResourceWithValueResult.projectIri, - featureFactoryConfig = deleteValueRequest.featureFactoryConfig, userProfileV1 = None ) ) @@ -1664,7 +1631,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param subjectIri the IRI of the resource that is the source of the link. * @param predicateIri the IRI of the property that links the two resources. * @param objectIri the IRI of the resource that is the target of the link. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ValueGetResponseV1]] containing a [[LinkValueV1]]. */ @@ -1673,7 +1640,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde subjectIri: IRI, predicateIri: IRI, objectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ValueGetResponseV1] = for { @@ -1681,7 +1647,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde subjectIri = subjectIri, predicateIri = predicateIri, objectIri = objectIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -1692,8 +1657,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( UserProfileByIRIGetV1( userIri = valueQueryResult.creatorIri, - userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = featureFactoryConfig + userProfileType = UserProfileTypeV1.RESTRICTED ) ) .mapTo[Option[UserProfileV1]] @@ -1803,13 +1767,12 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * Queries a `knora-base:Value` and returns a [[ValueQueryResult]] describing it. * * @param valueIri the IRI of the value to be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ValueQueryResult]], or `None` if the value is not found. */ private def findValue( valueIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Option[ValueQueryResult]] = for { @@ -1827,7 +1790,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde maybeValueQueryResult <- sparqlQueryResults2ValueQueryResult( valueIri = valueIri, rows = rows, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -1903,7 +1865,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param predicateIri the IRI of the property that links the two resources. * @param objectIri if provided, the IRI of the target resource. * @param linkValueIri the IRI of the `LinkValue`. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return an optional [[ValueGetResponseV1]] containing a [[LinkValueV1]]. */ @@ -1912,7 +1874,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde predicateIri: IRI, objectIri: Option[IRI], linkValueIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Option[LinkValueQueryResult]] = for { @@ -1932,7 +1893,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde maybeLinkValueQueryResult <- sparqlQueryResults2LinkValueQueryResult( rows = rows, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -1950,7 +1910,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param subjectIri the IRI of the resource that is the source of the link. * @param predicateIri the IRI of the property that links the two resources. * @param objectIri the IRI of the target resource. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return an optional [[ValueGetResponseV1]] containing a [[LinkValueV1]]. */ @@ -1958,7 +1918,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde subjectIri: IRI, predicateIri: IRI, objectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Option[LinkValueQueryResult]] = for { @@ -1977,7 +1936,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde maybeLinkValueQueryResult <- sparqlQueryResults2LinkValueQueryResult( rows = rows, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -1996,7 +1954,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * * @param valueIri the IRI of the value that was queried. * @param rows the query result rows. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ValueQueryResult]]. */ @@ -2004,7 +1962,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde private def sparqlQueryResults2ValueQueryResult( valueIri: IRI, rows: Seq[VariableResultsRow], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Option[BasicValueQueryResult]] = { val userProfileV1 = userProfile.asUserProfileV1 @@ -2024,7 +1981,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde valueProps = valueProps, projectShortcode = projectShortcode, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2116,13 +2072,12 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * Converts SPARQL query results about a `knora-base:LinkValue` into a [[LinkValueQueryResult]]. * * @param rows SPARQL query results about a `knora-base:LinkValue`. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[LinkValueQueryResult]]. */ private def sparqlQueryResults2LinkValueQueryResult( rows: Seq[VariableResultsRow], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Option[LinkValueQueryResult]] = { val userProfileV1 = userProfile.asUserProfileV1 @@ -2145,7 +2100,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde valueProps = valueProps, projectShortcode = projectShortcode, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2228,7 +2182,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param resourceIri the IRI of the resource in which the value should have been created. * @param propertyIri the IRI of the property that should point from the resource to the value. * @param unverifiedValue the value that should have been created. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[CreateValueResponseV1]], or a failed [[Future]] if the value could not be found in * the resource's version history. @@ -2237,7 +2191,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri: IRI, propertyIri: IRI, unverifiedValue: UnverifiedValueV1, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[CreateValueResponseV1] = unverifiedValue.value match { @@ -2248,7 +2201,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde linkPropertyIri = propertyIri, linkTargetIri = linkUpdateV1.targetResourceIri, linkValueIri = unverifiedValue.newValueIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2269,7 +2221,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri = resourceIri, propertyIri = propertyIri, searchValueIri = unverifiedValue.newValueIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2288,7 +2239,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param resourceIri the IRI of the resource that may have the value. * @param propertyIri the IRI of the property that may have have the value. * @param searchValueIri the IRI of the value. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ValueQueryResult]]. */ @@ -2298,7 +2249,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri: IRI, propertyIri: IRI, searchValueIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ValueQueryResult] = for { @@ -2322,7 +2272,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resultOption <- sparqlQueryResults2ValueQueryResult( valueIri = searchValueIri, rows = rows, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2340,7 +2289,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param linkPropertyIri the IRI of the link property. * @param linkTargetIri the IRI of the resource that should be the target of the link. * @param linkValueIri the IRI of the `knora-base:LinkValue` that should have been created. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[LinkValueQueryResult]]. */ @@ -2351,7 +2300,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde linkPropertyIri: IRI, linkTargetIri: IRI, linkValueIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[LinkValueQueryResult] = for { @@ -2360,7 +2308,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde predicateIri = linkPropertyIri, objectIri = Some(linkTargetIri), linkValueIri = linkValueIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2441,7 +2388,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param value the value to create. * @param valueCreator the IRI of the new value's owner. * @param valuePermissions the literal that should be used as the object of the new value's `knora-base:hasPermissions` predicate. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return an [[UnverifiedValueV1]]. */ @@ -2454,7 +2401,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment: Option[String], valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[UnverifiedValueV1] = value match { @@ -2467,7 +2413,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment = comment, valueCreator = valueCreator, valuePermissions = valuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2480,7 +2425,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment = comment, valueCreator = valueCreator, valuePermissions = valuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } @@ -2494,7 +2438,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param linkUpdateV1 a [[LinkUpdateV1]] specifying the target resource. * @param valueCreator the IRI of the new link value's owner. * @param valuePermissions the literal that should be used as the object of the new link value's `knora-base:hasPermissions` predicate. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return an [[UnverifiedValueV1]]. */ @@ -2506,7 +2450,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment: Option[String], valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[UnverifiedValueV1] = for { @@ -2516,7 +2459,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri = linkUpdateV1.targetResourceIri, valueCreator = valueCreator, valuePermissions = valuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2555,7 +2497,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param value an [[UpdateValueV1]] describing the value. * @param valueCreator the IRI of the new value's owner. * @param valuePermissions the literal that should be used as the object of the new value's `knora-base:hasPermissions` predicate. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return an [[UnverifiedValueV1]]. */ @@ -2567,7 +2509,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment: Option[String], valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[UnverifiedValueV1] = { // Generate an IRI for the new value. @@ -2594,7 +2535,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde valueCreator = OntologyConstants.KnoraAdmin.SystemUser, valuePermissions = standoffLinkValuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) }.toVector @@ -2648,7 +2588,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param comment an optional comment on the new link value. * @param valueCreator the IRI of the new link value's owner. * @param valuePermissions the literal that should be used as the object of the new link value's `knora-base:hasPermissions` predicate. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[ChangeValueResponseV1]]. */ @@ -2662,7 +2602,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment: Option[String], valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ChangeValueResponseV1] = for { @@ -2673,7 +2612,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri = currentLinkValueV1.objectIri, valueCreator = valueCreator, valuePermissions = valuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2684,7 +2622,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri = linkUpdateV1.targetResourceIri, valueCreator = valueCreator, valuePermissions = valuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2693,7 +2630,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( iri = projectIri, - featureFactoryConfig = featureFactoryConfig, userProfileV1 = None ) ) @@ -2736,7 +2672,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde linkPropertyIri = propertyIri, linkTargetIri = linkUpdateV1.targetResourceIri, linkValueIri = sparqlTemplateLinkUpdateForNewLink.newLinkValueIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -2779,7 +2714,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde comment: Option[String], valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[ChangeValueResponseV1] = { for { @@ -2829,7 +2763,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde valueCreator = OntologyConstants.KnoraAdmin.SystemUser, valuePermissions = standoffLinkValuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } @@ -2847,7 +2780,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde valueCreator = OntologyConstants.KnoraAdmin.SystemUser, valuePermissions = standoffLinkValuePermissions, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } @@ -2864,7 +2796,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde .ask( ProjectInfoByIRIGetV1( iri = projectIri, - featureFactoryConfig = featureFactoryConfig, userProfileV1 = None ) ) @@ -2912,7 +2843,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde resourceIri = resourceIri, propertyIri = propertyIri, searchValueIri = newValueIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } yield ChangeValueResponseV1( @@ -2942,7 +2872,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param targetResourceIri the IRI of the target resource. * @param valueCreator the IRI of the new link value's owner. * @param valuePermissions the literal that should be used as the object of the new link value's `knora-base:hasPermissions` predicate. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[SparqlTemplateLinkUpdate]] that can be passed to a SPARQL update template. */ @@ -2952,7 +2882,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri: IRI, valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[SparqlTemplateLinkUpdate] = for { @@ -2961,14 +2890,12 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde subjectIri = sourceResourceIri, predicateIri = linkPropertyIri, objectIri = targetResourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) // Check that the target resource actually exists and is a knora-base:Resource. targetIriCheckResult <- checkStandoffResourceReferenceTargets( targetIris = Set(targetResourceIri), - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -3035,7 +2962,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param targetResourceIri the IRI of the target resource. * @param valueCreator the IRI of the new link value's owner. * @param valuePermissions the literal that should be used as the object of the new link value's `knora-base:hasPermissions` predicate. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a [[SparqlTemplateLinkUpdate]] that can be passed to a SPARQL update template. */ @@ -3045,7 +2972,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde targetResourceIri: IRI, valueCreator: IRI, valuePermissions: String, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[SparqlTemplateLinkUpdate] = for { @@ -3054,7 +2980,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde subjectIri = sourceResourceIri, predicateIri = linkPropertyIri, objectIri = targetResourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) @@ -3134,14 +3059,13 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * Given a set of IRIs of standoff resource reference targets, checks that each one actually refers to a `knora-base:Resource`. * * @param targetIris the IRIs to check. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return a `Future[Unit]` on success, otherwise a `Future` containing an exception ([[NotFoundException]] if the target resource is not found, * or [[BadRequestException]] if the target IRI isn't a `knora-base:Resource`). */ private def checkStandoffResourceReferenceTargets( targetIris: Set[IRI], - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Unit] = if (targetIris.isEmpty) { @@ -3154,7 +3078,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde ResourceCheckClassRequestV1( resourceIri = targetIri, owlClass = OntologyConstants.KnoraBase.Resource, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) ) @@ -3180,7 +3103,7 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde * @param propertyIri the IRI of the property. * @param propertyObjectClassConstraint the IRI of the `knora-base:objectClassConstraint` of the property. * @param updateValueV1 the value to be updated. - * @param featureFactoryConfig the feature factory configuration. + * * @param userProfile the profile of the user making the request. * @return an empty [[Future]] on success, or a failed [[Future]] if the value has the wrong type. */ @@ -3188,7 +3111,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde propertyIri: IRI, propertyObjectClassConstraint: IRI, updateValueV1: UpdateValueV1, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[Unit] = for { @@ -3201,7 +3123,6 @@ class ValuesResponderV1(responderData: ResponderData) extends Responder(responde ResourceCheckClassRequestV1( resourceIri = linkUpdate.targetResourceIri, owlClass = propertyObjectClassConstraint, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ListsResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ListsResponderV2.scala index be41ab9f71..1602aeb654 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ListsResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ListsResponderV2.scala @@ -7,7 +7,7 @@ package org.knora.webapi.responders.v2 import akka.pattern._ import org.knora.webapi.IRI -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.listsmessages.ChildNodeInfoGetResponseADM import org.knora.webapi.messages.admin.responder.listsmessages.ListGetRequestADM import org.knora.webapi.messages.admin.responder.listsmessages.ListGetResponseADM @@ -29,10 +29,10 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder * Receives a message of type [[ListsResponderRequestV2]], and returns an appropriate response message inside a future. */ def receive(msg: ListsResponderRequestV2) = msg match { - case ListGetRequestV2(listIri, featureFactoryConfig, requestingUser) => - getList(listIri, featureFactoryConfig, requestingUser) - case NodeGetRequestV2(nodeIri, featureFactoryConfig, requestingUser) => - getNode(nodeIri, featureFactoryConfig, requestingUser) + case ListGetRequestV2(listIri, requestingUser) => + getList(listIri, requestingUser) + case NodeGetRequestV2(nodeIri, requestingUser) => + getNode(nodeIri, requestingUser) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -45,7 +45,6 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder */ private def getList( listIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ListGetResponseV2] = for { @@ -53,7 +52,6 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder .ask( ListGetRequestADM( iri = listIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -65,13 +63,12 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder * Gets a single list node from the triplestore. * * @param nodeIri the Iri of the list node. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[NodeGetResponseV2]]. */ private def getNode( nodeIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[NodeGetResponseV2] = for { @@ -79,7 +76,6 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder .ask( ListNodeInfoGetRequestADM( iri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala index bf56abd169..0506b80113 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala @@ -40,8 +40,6 @@ import java.time.Instant import scala.concurrent.Future import scala.concurrent.Await import org.knora.webapi.messages.util.KnoraSystemInstances -import org.knora.webapi.feature.TestFeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig /** * Responds to requests dealing with ontologies. @@ -68,8 +66,8 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon * Receives a message of type [[OntologiesResponderRequestV2]], and returns an appropriate response message. */ def receive(msg: OntologiesResponderRequestV2) = msg match { - case LoadOntologiesRequestV2(featureFactoryConfig, requestingUser) => - Cache.loadOntologies(settings, appActor, featureFactoryConfig, requestingUser) + case LoadOntologiesRequestV2(requestingUser) => + Cache.loadOntologies(settings, appActor, requestingUser) case EntityInfoGetRequestV2(classIris, propertyIris, requestingUser) => getEntityInfoResponseV2(classIris, propertyIris, requestingUser) case StandoffEntityInfoGetRequestV2(standoffClassIris, standoffPropertyIris, requestingUser) => @@ -512,9 +510,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon existingOntologyMetadata: Option[OntologyMetadataV2] <- OntologyHelpers.loadOntologyMetadata( settings, appActor, - internalOntologyIri = internalOntologyIri, - featureFactoryConfig = - createOntologyRequest.featureFactoryConfig + internalOntologyIri = internalOntologyIri ) _ = if (existingOntologyMetadata.nonEmpty) { @@ -574,9 +570,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedOntologyMetadata: Option[OntologyMetadataV2] <- OntologyHelpers.loadOntologyMetadata( settings, appActor, - internalOntologyIri = internalOntologyIri, - featureFactoryConfig = - createOntologyRequest.featureFactoryConfig + internalOntologyIri = internalOntologyIri ) _ = maybeLoadedOntologyMetadata match { @@ -614,16 +608,15 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon } // Get project info for the shortcode. - projectInfo: ProjectGetResponseADM <- appActor - .ask( - ProjectGetRequestADM( - identifier = - ProjectIdentifierADM(maybeIri = Some(projectIri.toString)), - featureFactoryConfig = createOntologyRequest.featureFactoryConfig, - requestingUser = requestingUser - ) - ) - .mapTo[ProjectGetResponseADM] + projectInfo: ProjectGetResponseADM <- + appActor + .ask( + ProjectGetRequestADM( + identifier = ProjectIdentifierADM(maybeIri = Some(projectIri.toString)), + requestingUser = requestingUser + ) + ) + .mapTo[ProjectGetResponseADM] // Check that the ontology name is valid. validOntologyName = @@ -672,8 +665,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = changeOntologyMetadataRequest.lastModificationDate, - featureFactoryConfig = changeOntologyMetadataRequest.featureFactoryConfig + expectedLastModificationDate = changeOntologyMetadataRequest.lastModificationDate ) // get the metadata of the ontology. @@ -734,8 +726,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon OntologyHelpers.loadOntologyMetadata( settings, appActor, - internalOntologyIri = internalOntologyIri, - featureFactoryConfig = changeOntologyMetadataRequest.featureFactoryConfig + internalOntologyIri = internalOntologyIri ) _ = maybeLoadedOntologyMetadata match { @@ -789,8 +780,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deleteOntologyCommentRequestV2.lastModificationDate, - featureFactoryConfig = deleteOntologyCommentRequestV2.featureFactoryConfig + expectedLastModificationDate = deleteOntologyCommentRequestV2.lastModificationDate ) // get the metadata of the ontology. @@ -831,8 +821,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon OntologyHelpers.loadOntologyMetadata( settings, appActor, - internalOntologyIri = internalOntologyIri, - featureFactoryConfig = deleteOntologyCommentRequestV2.featureFactoryConfig + internalOntologyIri = internalOntologyIri ) _ = maybeLoadedOntologyMetadata match { @@ -883,8 +872,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = createClassRequest.lastModificationDate, - featureFactoryConfig = createClassRequest.featureFactoryConfig + expectedLastModificationDate = createClassRequest.lastModificationDate ) // Check that the class's rdf:type is owl:Class. @@ -1018,8 +1006,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = createClassRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. @@ -1027,8 +1014,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedClassDef <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = createClassRequest.featureFactoryConfig + classIri = internalClassIri ) _ = if (loadedClassDef != unescapedClassDefWithLinkValueProps) { @@ -1103,8 +1089,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = changeGuiOrderRequest.lastModificationDate, - featureFactoryConfig = changeGuiOrderRequest.featureFactoryConfig + expectedLastModificationDate = changeGuiOrderRequest.lastModificationDate ) // Check that the class's rdf:type is owl:Class. @@ -1198,8 +1183,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = changeGuiOrderRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. @@ -1207,8 +1191,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedClassDef: ClassInfoContentV2 <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = changeGuiOrderRequest.featureFactoryConfig + classIri = internalClassIri ) _ = if (loadedClassDef != newReadClassInfo.entityInfoContent) { @@ -1288,8 +1271,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = addCardinalitiesRequest.lastModificationDate, - featureFactoryConfig = addCardinalitiesRequest.featureFactoryConfig + expectedLastModificationDate = addCardinalitiesRequest.lastModificationDate ) // Check that the class's rdf:type is owl:Class. @@ -1440,8 +1422,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = addCardinalitiesRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. @@ -1449,8 +1430,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedClassDef <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = addCardinalitiesRequest.featureFactoryConfig + classIri = internalClassIri ) _ = if (loadedClassDef != newInternalClassDefWithLinkValueProps) { @@ -1565,8 +1545,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = changeCardinalitiesRequest.lastModificationDate, - featureFactoryConfig = changeCardinalitiesRequest.featureFactoryConfig + expectedLastModificationDate = changeCardinalitiesRequest.lastModificationDate ) // Check that the class's rdf:type is owl:Class. @@ -1691,8 +1670,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = changeCardinalitiesRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. @@ -1700,8 +1678,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedClassDef <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = changeCardinalitiesRequest.featureFactoryConfig + classIri = internalClassIri ) _ = if (loadedClassDef != newInternalClassDefWithLinkValueProps) { @@ -1884,8 +1861,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deleteClassRequest.lastModificationDate, - featureFactoryConfig = deleteClassRequest.featureFactoryConfig + expectedLastModificationDate = deleteClassRequest.lastModificationDate ) // Check that the class exists. @@ -1927,8 +1903,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = deleteClassRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Update the cache. @@ -2026,8 +2001,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deletePropertyRequest.lastModificationDate, - featureFactoryConfig = deletePropertyRequest.featureFactoryConfig + expectedLastModificationDate = deletePropertyRequest.lastModificationDate ) // Check that the property exists. @@ -2097,8 +2071,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = deletePropertyRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Update the cache. @@ -2186,8 +2159,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deleteOntologyRequest.lastModificationDate, - featureFactoryConfig = deleteOntologyRequest.featureFactoryConfig + expectedLastModificationDate = deleteOntologyRequest.lastModificationDate ) // Check that none of the entities in the ontology are used in data or in other ontologies. @@ -2219,8 +2191,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeOntologyMetadata <- OntologyHelpers.loadOntologyMetadata( settings, appActor, - internalOntologyIri = internalOntologyIri, - featureFactoryConfig = deleteOntologyRequest.featureFactoryConfig + internalOntologyIri = internalOntologyIri ) _ = if (maybeOntologyMetadata.nonEmpty) { @@ -2266,8 +2237,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = createPropertyRequest.lastModificationDate, - featureFactoryConfig = createPropertyRequest.featureFactoryConfig + expectedLastModificationDate = createPropertyRequest.lastModificationDate ) // Check that the property's rdf:type is owl:ObjectProperty. @@ -2495,8 +2465,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = createPropertyRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. To make this comparison, @@ -2505,8 +2474,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedPropertyDef <- OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = internalPropertyIri, - featureFactoryConfig = createPropertyRequest.featureFactoryConfig + propertyIri = internalPropertyIri ) unescapedInputPropertyDef = internalPropertyDef.unescape @@ -2522,8 +2490,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = linkValuePropertyDef.propertyIri, - featureFactoryConfig = createPropertyRequest.featureFactoryConfig + propertyIri = linkValuePropertyDef.propertyIri ) } @@ -2637,8 +2604,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = changePropertyGuiElementRequest.lastModificationDate, - featureFactoryConfig = changePropertyGuiElementRequest.featureFactoryConfig + expectedLastModificationDate = changePropertyGuiElementRequest.lastModificationDate ) // If this is a link property, also change the GUI element and attribute of the corresponding link value property. @@ -2685,8 +2651,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = changePropertyGuiElementRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. To make this comparison, @@ -2695,8 +2660,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedPropertyDef <- OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = internalPropertyIri, - featureFactoryConfig = changePropertyGuiElementRequest.featureFactoryConfig + propertyIri = internalPropertyIri ) maybeNewGuiElementPredicate: Option[(SmartIri, PredicateInfoV2)] = @@ -2739,8 +2703,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri, - featureFactoryConfig = changePropertyGuiElementRequest.featureFactoryConfig + propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri ) } @@ -2861,8 +2824,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = changePropertyLabelsOrCommentsRequest.lastModificationDate, - featureFactoryConfig = changePropertyLabelsOrCommentsRequest.featureFactoryConfig + expectedLastModificationDate = changePropertyLabelsOrCommentsRequest.lastModificationDate ) // If this is a link property, also change the labels/comments of the corresponding link value property. @@ -2909,8 +2871,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings = settings, appActor = appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = changePropertyLabelsOrCommentsRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. To make this comparison, @@ -2919,8 +2880,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedPropertyDef <- OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = internalPropertyIri, - featureFactoryConfig = changePropertyLabelsOrCommentsRequest.featureFactoryConfig + propertyIri = internalPropertyIri ) unescapedNewLabelOrCommentPredicate: PredicateInfoV2 = @@ -2946,8 +2906,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri, - featureFactoryConfig = changePropertyLabelsOrCommentsRequest.featureFactoryConfig + propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri ) } @@ -3065,8 +3024,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = changeClassLabelsOrCommentsRequest.lastModificationDate, - featureFactoryConfig = changeClassLabelsOrCommentsRequest.featureFactoryConfig + expectedLastModificationDate = changeClassLabelsOrCommentsRequest.lastModificationDate ) // Do the update. @@ -3093,8 +3051,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = changeClassLabelsOrCommentsRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. To make this comparison, @@ -3103,9 +3060,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon loadedClassDef: ClassInfoContentV2 <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = - changeClassLabelsOrCommentsRequest.featureFactoryConfig + classIri = internalClassIri ) unescapedNewLabelOrCommentPredicate = PredicateInfoV2( @@ -3200,8 +3155,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deletePropertyCommentRequest.lastModificationDate, - featureFactoryConfig = deletePropertyCommentRequest.featureFactoryConfig + expectedLastModificationDate = deletePropertyCommentRequest.lastModificationDate ) // If this is a link property, also delete the comment of the corresponding link value property. @@ -3248,17 +3202,14 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings = settings, appActor = appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = deletePropertyCommentRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the update was successful. loadedPropertyDef: PropertyInfoContentV2 <- OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = internalPropertyIri, - featureFactoryConfig = - deletePropertyCommentRequest.featureFactoryConfig + propertyIri = internalPropertyIri ) propertyDefWithoutComment: PropertyInfoContentV2 = @@ -3279,8 +3230,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon OntologyHelpers.loadPropertyDefinition( settings, appActor, - propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri, - featureFactoryConfig = deletePropertyCommentRequest.featureFactoryConfig + propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri ) } @@ -3423,8 +3373,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deleteClassCommentRequest.lastModificationDate, - featureFactoryConfig = deleteClassCommentRequest.featureFactoryConfig + expectedLastModificationDate = deleteClassCommentRequest.lastModificationDate ) currentTime: Instant = Instant.now @@ -3447,16 +3396,14 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon settings = settings, appActor = appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = deleteClassCommentRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the update was successful. loadedClassDef: ClassInfoContentV2 <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = deleteClassCommentRequest.featureFactoryConfig + classIri = internalClassIri ) classDefWithoutComment: ClassInfoContentV2 = diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala index 73d73172b5..eec88760e4 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala @@ -10,7 +10,7 @@ import akka.pattern._ import akka.stream.Materializer import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -29,6 +29,7 @@ import org.knora.webapi.messages.util.PermissionUtilADM.DeletePermission import org.knora.webapi.messages.util.PermissionUtilADM.ModifyPermission import org.knora.webapi.messages.util.PermissionUtilADM.PermissionComparisonResult import org.knora.webapi.messages.util._ +import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.util.rdf.JsonLDArray import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.JsonLDInt @@ -91,7 +92,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt withDeleted, targetSchema, schemaOptions, - featureFactoryConfig, requestingUser ) => getResourcesV2( @@ -103,24 +103,21 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt showDeletedValues = false, targetSchema, schemaOptions, - featureFactoryConfig, requestingUser ) case ResourcesPreviewGetRequestV2( resIris, withDeletedResource, targetSchema, - featureFactoryConfig, requestingUser ) => - getResourcePreviewV2(resIris, withDeletedResource, targetSchema, featureFactoryConfig, requestingUser) + getResourcePreviewV2(resIris, withDeletedResource, targetSchema, requestingUser) case ResourceTEIGetRequestV2( resIri, textProperty, mappingIri, gravsearchTemplateIri, headerXSLTIri, - featureFactoryConfig, requestingUser ) => getResourceAsTeiV2( @@ -129,7 +126,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt mappingIri, gravsearchTemplateIri, headerXSLTIri, - featureFactoryConfig, requestingUser ) @@ -185,7 +181,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt _ <- checkStandoffLinkTargets( values = internalCreateResource.flatValues, - featureFactoryConfig = createResourceRequestV2.featureFactoryConfig, requestingUser = createResourceRequestV2.requestingUser ) @@ -195,7 +190,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt linkTargetClasses: Map[IRI, SmartIri] <- getLinkTargetClasses( resourceIri: IRI, internalCreateResources = Seq(internalCreateResource), - featureFactoryConfig = createResourceRequestV2.featureFactoryConfig, requestingUser = createResourceRequestV2.requestingUser ) @@ -271,8 +265,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt defaultResourcePermissions = defaultResourcePermissions, defaultPropertyPermissions = defaultPropertyPermissions, creationDate = creationDate, - featureFactoryConfig = - createResourceRequestV2.featureFactoryConfig, requestingUser = createResourceRequestV2.requestingUser ) @@ -297,8 +289,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceReadyToCreate = resourceReadyToCreate, projectIri = createResourceRequestV2.createResource.projectADM.id, - featureFactoryConfig = - createResourceRequestV2.featureFactoryConfig, requestingUser = createResourceRequestV2.requestingUser ) } yield previewOfCreatedResource @@ -409,8 +399,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourcesSeq: ReadResourcesSequenceV2 <- getResourcePreviewV2( resourceIris = Seq(updateResourceMetadataRequestV2.resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = - updateResourceMetadataRequestV2.featureFactoryConfig, requestingUser = updateResourceMetadataRequestV2.requestingUser ) @@ -489,15 +477,12 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt // Verify that the resource was updated correctly. - updatedResourcesSeq: ReadResourcesSequenceV2 <- getResourcePreviewV2( - resourceIris = - Seq(updateResourceMetadataRequestV2.resourceIri), - targetSchema = ApiV2Complex, - featureFactoryConfig = - updateResourceMetadataRequestV2.featureFactoryConfig, - requestingUser = - updateResourceMetadataRequestV2.requestingUser - ) + updatedResourcesSeq: ReadResourcesSequenceV2 <- + getResourcePreviewV2( + resourceIris = Seq(updateResourceMetadataRequestV2.resourceIri), + targetSchema = ApiV2Complex, + requestingUser = updateResourceMetadataRequestV2.requestingUser + ) _ = if (updatedResourcesSeq.resources.size != 1) { throw AssertionException(s"Expected one resource, got ${resourcesSeq.resources.size}") @@ -532,24 +517,12 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt case None => () } - // If the resource's label was changed, update the full-text search index. - _ <- updateResourceMetadataRequestV2.maybeLabel match { - case Some(_) => - for { - _ <- appActor - .ask(SearchIndexUpdateRequest(Some(updateResourceMetadataRequestV2.resourceIri))) - .mapTo[SparqlUpdateResponse] - } yield () - - case None => FastFuture.successful(()) - } } yield UpdateResourceMetadataResponseV2( resourceIri = updateResourceMetadataRequestV2.resourceIri, resourceClassIri = updateResourceMetadataRequestV2.resourceClassIri, maybeLabel = updateResourceMetadataRequestV2.maybeLabel, maybePermissions = updateResourceMetadataRequestV2.maybePermissions, - lastModificationDate = newModificationDate, - featureFactoryConfig = updateResourceMetadataRequestV2.featureFactoryConfig + lastModificationDate = newModificationDate ) } @@ -590,7 +563,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourcesSeq: ReadResourcesSequenceV2 <- getResourcePreviewV2( resourceIris = Seq(deleteResourceV2.resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = deleteResourceV2.featureFactoryConfig, requestingUser = deleteResourceV2.requestingUser ) @@ -698,7 +670,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourcesSeq: ReadResourcesSequenceV2 <- getResourcePreviewV2( resourceIris = Seq(eraseResourceV2.resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = eraseResourceV2.featureFactoryConfig, requestingUser = eraseResourceV2.requestingUser ) @@ -800,7 +771,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * @param defaultPropertyPermissions the default permissions to be given to the resource's values, if they do not * have custom permissions. This is a map of property IRIs to permission strings. * @param creationDate the versionDate to be attached to the resource and its values. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[ResourceReadyToCreate]]. */ @@ -813,7 +784,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt defaultResourcePermissions: String, defaultPropertyPermissions: Map[SmartIri, String], creationDate: Instant, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ResourceReadyToCreate] = { val resourceIDForErrorMsg: String = @@ -891,44 +861,43 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt // Validate and reformat any custom permissions in the request, and set all permissions to defaults if custom // permissions are not provided. - resourcePermissions: String <- internalCreateResource.permissions match { - case Some(permissionStr) => - for { - validatedCustomPermissions: String <- PermissionUtilADM.validatePermissions( - permissionLiteral = permissionStr, - featureFactoryConfig = - featureFactoryConfig, - appActor = appActor - ) - - // Is the requesting user a system admin, or an admin of this project? - _ = if ( - !(requestingUser.permissions.isProjectAdmin( - internalCreateResource.projectADM.id - ) || requestingUser.permissions.isSystemAdmin) - ) { - - // No. Make sure they don't give themselves higher permissions than they would get from the default permissions. - - val permissionComparisonResult: PermissionComparisonResult = - PermissionUtilADM.comparePermissionsADM( - entityCreator = requestingUser.id, - entityProject = internalCreateResource.projectADM.id, - permissionLiteralA = validatedCustomPermissions, - permissionLiteralB = defaultResourcePermissions, - requestingUser = requestingUser - ) + resourcePermissions: String <- + internalCreateResource.permissions match { + case Some(permissionStr) => + for { + validatedCustomPermissions: String <- PermissionUtilADM.validatePermissions( + permissionLiteral = permissionStr, + appActor = appActor + ) - if (permissionComparisonResult == AGreaterThanB) { - throw ForbiddenException( - s"${resourceIDForErrorMsg}The specified permissions would give the resource's creator a higher permission on the resource than the default permissions" - ) - } - } - } yield validatedCustomPermissions + // Is the requesting user a system admin, or an admin of this project? + _ = if ( + !(requestingUser.permissions.isProjectAdmin( + internalCreateResource.projectADM.id + ) || requestingUser.permissions.isSystemAdmin) + ) { + + // No. Make sure they don't give themselves higher permissions than they would get from the default permissions. + + val permissionComparisonResult: PermissionComparisonResult = + PermissionUtilADM.comparePermissionsADM( + entityCreator = requestingUser.id, + entityProject = internalCreateResource.projectADM.id, + permissionLiteralA = validatedCustomPermissions, + permissionLiteralB = defaultResourcePermissions, + requestingUser = requestingUser + ) + + if (permissionComparisonResult == AGreaterThanB) { + throw ForbiddenException( + s"${resourceIDForErrorMsg}The specified permissions would give the resource's creator a higher permission on the resource than the default permissions" + ) + } + } + } yield validatedCustomPermissions - case None => FastFuture.successful(defaultResourcePermissions) - } + case None => FastFuture.successful(defaultResourcePermissions) + } valuesWithValidatedPermissions: Map[SmartIri, Seq[GenerateSparqlForValueInNewResourceV2]] <- validateAndFormatValuePermissions( @@ -936,7 +905,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt values = internalCreateResource.values, defaultPropertyPermissions = defaultPropertyPermissions, resourceIDForErrorMsg = resourceIDForErrorMsg, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -972,14 +940,13 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * to be created. * * @param internalCreateResources the resources to be created. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a map of resource IRIs to class IRIs. */ private def getLinkTargetClasses( resourceIri: IRI, internalCreateResources: Seq[CreateResourceV2], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Map[IRI, SmartIri]] = { // Get the IRIs of the new and existing resources that are targets of links. @@ -1010,7 +977,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt existingTargets: ReadResourcesSequenceV2 <- getResourcePreviewV2( resourceIris = existingTargetIris.toSeq, targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -1153,12 +1119,11 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * permission to see it. * * @param values the values to be checked. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. */ private def checkStandoffLinkTargets( values: Iterable[CreateValueInNewResourceV2], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Unit] = { val standoffLinkTargetsThatShouldExist: Set[IRI] = values.foldLeft(Set.empty[IRI]) { @@ -1173,7 +1138,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt getResourcePreviewV2( resourceIris = standoffLinkTargetsThatShouldExist.toSeq, targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ).map(_ => ()) } @@ -1222,7 +1186,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt values: Map[SmartIri, Seq[CreateValueInNewResourceV2]], defaultPropertyPermissions: Map[SmartIri, String], resourceIDForErrorMsg: String, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Map[SmartIri, Seq[GenerateSparqlForValueInNewResourceV2]]] = { val propertyValuesWithValidatedPermissionsFutures @@ -1237,7 +1200,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt for { validatedCustomPermissions <- PermissionUtilADM.validatePermissions( permissionLiteral = permissionStr, - featureFactoryConfig = featureFactoryConfig, appActor = appActor ) @@ -1360,14 +1322,13 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * * @param resourceReadyToCreate the resource that should have been created. * @param projectIri the IRI of the project in which the resource should have been created. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user that attempted to create the resource. * @return a preview of the resource that was created. */ private def verifyResource( resourceReadyToCreate: ResourceReadyToCreate, projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourcesSequenceV2] = { val resourceIri = resourceReadyToCreate.sparqlTemplateResourceToCreate.resourceIri @@ -1377,7 +1338,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceIris = Seq(resourceIri), requestingUser = requestingUser, targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, schemaOptions = SchemaOptions.ForStandoffWithTextValues ) @@ -1506,7 +1466,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * @param versionDate if defined, requests the state of the resources at the specified time in the past. * Cannot be used in conjunction with `preview`. * @param queryStandoff `true` if standoff should be queried. - * @param featureFactoryConfig the feature factory configuration. + * * @return a map of resource IRIs to RDF data. */ private def getResourcesFromTriplestore( @@ -1517,7 +1477,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt valueUuid: Option[UUID] = None, versionDate: Option[Instant] = None, queryStandoff: Boolean, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ConstructResponseUtilV2.MainResourcesAndValueRdfData] = { // eliminate duplicate Iris @@ -1552,8 +1511,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceRequestResponse: SparqlExtendedConstructResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = resourceRequestSparql, - featureFactoryConfig = featureFactoryConfig + sparql = resourceRequestSparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -1579,7 +1537,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * @param withDeleted if defined, indicates if the deleted resource and values should be returned or not. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[ReadResourcesSequenceV2]]. */ @@ -1592,7 +1550,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt showDeletedValues: Boolean = false, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourcesSequenceV2] = { // eliminate duplicate Iris @@ -1615,8 +1572,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt versionDate = versionDate, queryStandoff = queryStandoff, - featureFactoryConfig = - featureFactoryConfig, requestingUser = requestingUser ) @@ -1626,7 +1581,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt if (queryStandoff) { getMappingsFromQueryResultsSeparated( queryResultsSeparated = mainResourcesAndValueRdfData.resources, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } else { @@ -1645,7 +1599,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt appActor = appActor, targetSchema = targetSchema, settings = settings, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -1699,7 +1652,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * * @param resourceIris the resource to query for. * @param withDeleted indicates if the deleted resource should be returned or not. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the user making the request. * @return a [[ReadResourcesSequenceV2]]. */ @@ -1707,7 +1660,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceIris: Seq[IRI], withDeleted: Boolean = true, targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourcesSequenceV2] = { @@ -1722,8 +1674,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt withDeleted = withDeleted, queryStandoff = false, // This has no effect, because we are not querying values. - featureFactoryConfig = - featureFactoryConfig, requestingUser = requestingUser ) @@ -1740,7 +1690,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt appActor = appActor, targetSchema = targetSchema, settings = settings, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -1775,13 +1724,12 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * Obtains a Gravsearch template from Sipi. * * @param gravsearchTemplateIri the Iri of the resource representing the Gravsearch template. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return the Gravsearch template. */ private def getGravsearchTemplate( gravsearchTemplateIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[String] = { @@ -1790,7 +1738,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceIris = Vector(gravsearchTemplateIri), targetSchema = ApiV2Complex, schemaOptions = Set(MarkupAsStandoff), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -1865,7 +1812,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * @param mappingIri the Iri of the mapping to be used to convert standoff to XML, if a custom mapping is provided. The mapping is expected to contain an XSL transformation. * @param gravsearchTemplateIri the Iri of the Gravsearch template to query for the metadata for the TEI header. The resource Iri is expected to be represented by the placeholder '$resourceIri' in a BIND. * @param headerXSLTIri the Iri of the XSL template to convert the metadata properties to the TEI header. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[ResourceTEIGetResponseV2]]. */ @@ -1875,7 +1822,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt mappingIri: Option[IRI], gravsearchTemplateIri: Option[IRI], headerXSLTIri: Option[String], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ResourceTEIGetResponseV2] = { @@ -1966,7 +1912,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt // get the template template <- getGravsearchTemplate( gravsearchTemplateIri = gravsearchTemplateIri.get, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -1977,18 +1922,17 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt constructQuery: ConstructQuery = GravsearchParser.parseQuery(gravsearchQuery) // do a request to the SearchResponder - gravSearchResponse: ReadResourcesSequenceV2 <- appActor - .ask( - GravsearchRequestV2( - constructQuery = constructQuery, - targetSchema = ApiV2Complex, - schemaOptions = - SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) - ) - .mapTo[ReadResourcesSequenceV2] + gravSearchResponse: ReadResourcesSequenceV2 <- + appActor + .ask( + GravsearchRequestV2( + constructQuery = constructQuery, + targetSchema = ApiV2Complex, + schemaOptions = SchemaOptions.ForStandoffWithTextValues, + requestingUser = requestingUser + ) + ) + .mapTo[ReadResourcesSequenceV2] } yield gravSearchResponse.toResource(resourceIri) } else { @@ -2006,7 +1950,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceIris = Vector(resourceIri), targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ).map(_.toResource(resourceIri)) } yield resource @@ -2029,7 +1972,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt case Some(headerIri) => val teiHeaderXsltRequest = GetXSLTransformationRequestV2( xsltTextRepresentationIri = headerIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -2068,7 +2010,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt .ask( GetMappingRequestV2( mappingIri = mappingToBeApplied, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -2093,7 +2034,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt // get XSLT for the TEI body. val teiBodyXsltRequest = GetXSLTransformationRequestV2( xsltTextRepresentationIri = xslTransformationIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -2123,7 +2063,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt header = TEIHeader( headerInfo = headerResource, headerXSLT = headerXSLT, - featureFactoryConfig = featureFactoryConfig, settings = settings ), body = TEIBody( @@ -2476,9 +2415,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceIris = Seq(resourceHistoryRequest.resourceIri), withDeleted = resourceHistoryRequest.withDeletedResource, targetSchema = ApiV2Complex, - featureFactoryConfig = - resourceHistoryRequest.featureFactoryConfig, - requestingUser = resourceHistoryRequest.requestingUser + requestingUser = KnoraSystemInstances.Users.SystemUser ) resourcePreview: ReadResourceV2 = resourcePreviewResponse.toResource(resourceHistoryRequest.resourceIri) @@ -2563,7 +2500,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt constructQuery = parsedGravsearchQuery, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffSeparateFromTextValues, - featureFactoryConfig = request.featureFactoryConfig, requestingUser = request.requestingUser ) ) @@ -2695,23 +2631,18 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt resourceHistoryEventsGetRequest: ResourceHistoryEventsGetRequestV2 ): Future[ResourceAndValueVersionHistoryResponseV2] = for { - resourceHistory: ResourceVersionHistoryResponseV2 <- getResourceHistoryV2( - ResourceVersionHistoryGetRequestV2( - resourceIri = - resourceHistoryEventsGetRequest.resourceIri, - withDeletedResource = true, - featureFactoryConfig = - resourceHistoryEventsGetRequest.featureFactoryConfig, - requestingUser = - resourceHistoryEventsGetRequest.requestingUser - ) - ) + resourceHistory: ResourceVersionHistoryResponseV2 <- + getResourceHistoryV2( + ResourceVersionHistoryGetRequestV2( + resourceIri = resourceHistoryEventsGetRequest.resourceIri, + withDeletedResource = true, + requestingUser = resourceHistoryEventsGetRequest.requestingUser + ) + ) resourceFullHist: Seq[ResourceAndValueHistoryEvent] <- extractEventsFromHistory( resourceIri = resourceHistoryEventsGetRequest.resourceIri, resourceHistory = resourceHistory.history, - featureFactoryConfig = - resourceHistoryEventsGetRequest.featureFactoryConfig, requestingUser = resourceHistoryEventsGetRequest.requestingUser ) @@ -2735,8 +2666,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt identifier = ProjectIdentifierADM(maybeIri = Some(projectResourceHistoryEventsGetRequest.projectIri) ), - featureFactoryConfig = - projectResourceHistoryEventsGetRequest.featureFactoryConfig, requestingUser = projectResourceHistoryEventsGetRequest.requestingUser ) @@ -2756,24 +2685,20 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt historyOfResourcesAsSeqOfFutures: Seq[Future[Seq[ResourceAndValueHistoryEvent]]] = mainResourceIris.map { resourceIri => for { - resourceHistory: ResourceVersionHistoryResponseV2 <- getResourceHistoryV2( - ResourceVersionHistoryGetRequestV2( - resourceIri = resourceIri, - withDeletedResource = true, - featureFactoryConfig = - projectResourceHistoryEventsGetRequest.featureFactoryConfig, - requestingUser = - projectResourceHistoryEventsGetRequest.requestingUser - ) - ) - resourceFullHist: Seq[ResourceAndValueHistoryEvent] <- extractEventsFromHistory( - resourceIri = resourceIri, - resourceHistory = resourceHistory.history, - featureFactoryConfig = - projectResourceHistoryEventsGetRequest.featureFactoryConfig, - requestingUser = - projectResourceHistoryEventsGetRequest.requestingUser - ) + resourceHistory: ResourceVersionHistoryResponseV2 <- + getResourceHistoryV2( + ResourceVersionHistoryGetRequestV2( + resourceIri = resourceIri, + withDeletedResource = true, + requestingUser = projectResourceHistoryEventsGetRequest.requestingUser + ) + ) + resourceFullHist: Seq[ResourceAndValueHistoryEvent] <- + extractEventsFromHistory( + resourceIri = resourceIri, + resourceHistory = resourceHistory.history, + requestingUser = projectResourceHistoryEventsGetRequest.requestingUser + ) } yield resourceFullHist } @@ -2787,14 +2712,13 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * * @param resourceIri the IRI of the resource. * @param resourceHistory the full representations of the resource in each point in its history. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return the full history of resource as sequence of [[ResourceAndValueHistoryEvent]]. */ def extractEventsFromHistory( resourceIri: IRI, resourceHistory: Seq[ResourceHistoryEntry], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Seq[ResourceAndValueHistoryEvent]] = for { @@ -2804,7 +2728,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt getResourceAtGivenTime( resourceIri = resourceIri, versionHist = hist, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -2849,14 +2772,13 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt * * @param resourceIri the IRI of the resource. * @param versionHist the history info of the version; i.e. versionDate and author. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return the full representation of the resource at the given version date. */ private def getResourceAtGivenTime( resourceIri: IRI, versionHist: ResourceHistoryEntry, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[(ResourceHistoryEntry, ReadResourceV2)] = for { @@ -2866,7 +2788,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt showDeletedValues = true, targetSchema = ApiV2Complex, schemaOptions = Set.empty[SchemaOption], - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) resourceAtCreationTime: ReadResourceV2 = resourceFullRepAtCreationTime.resources.head diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala index 5e5f787046..d334d037cc 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala @@ -10,7 +10,7 @@ import akka.pattern._ import org.knora.webapi.IRI import dsp.errors.NotFoundException import dsp.errors.SipiException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ConstructResponseUtilV2 import org.knora.webapi.messages.util.ConstructResponseUtilV2.MappingAndXSLTransformation @@ -33,13 +33,12 @@ abstract class ResponderWithStandoffV2(responderData: ResponderData) extends Res * Gets mappings referred to in query results [[Map[IRI, ResourceWithValueRdfData]]]. * * @param queryResultsSeparated query results referring to mappings. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return the referred mappings. */ protected def getMappingsFromQueryResultsSeparated( queryResultsSeparated: Map[IRI, ResourceWithValueRdfData], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Map[IRI, MappingAndXSLTransformation]] = { @@ -55,7 +54,6 @@ abstract class ResponderWithStandoffV2(responderData: ResponderData) extends Res .ask( GetMappingRequestV2( mappingIri = mappingIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -79,7 +77,6 @@ abstract class ResponderWithStandoffV2(responderData: ResponderData) extends Res .ask( GetXSLTransformationRequestV2( mapping.mapping.defaultXSLTransformation.get, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/SearchResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/SearchResponderV2.scala index 5cec2cd421..ad4c264642 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/SearchResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/SearchResponderV2.scala @@ -13,7 +13,7 @@ import dsp.errors.BadRequestException import dsp.errors.GravsearchException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.TriplestoreTimeoutException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -63,7 +63,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToProject, limitToResourceClass, limitToStandoffClass, - featureFactoryConfig, requestingUser ) => fulltextSearchCountV2( @@ -71,7 +70,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToProject, limitToResourceClass, limitToStandoffClass, - featureFactoryConfig, requestingUser ) @@ -84,7 +82,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand returnFiles, targetSchema, schemaOptions, - featureFactoryConfig, requestingUser ) => fulltextSearchV2( @@ -96,23 +93,20 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand returnFiles, targetSchema, schemaOptions, - featureFactoryConfig, requestingUser ) - case GravsearchCountRequestV2(query, featureFactoryConfig, requestingUser) => + case GravsearchCountRequestV2(query, requestingUser) => gravsearchCountV2( inputQuery = query, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) - case GravsearchRequestV2(query, targetSchema, schemaOptions, featureFactoryConfig, requestingUser) => + case GravsearchRequestV2(query, targetSchema, schemaOptions, requestingUser) => gravsearchV2( inputQuery = query, targetSchema = targetSchema, schemaOptions = schemaOptions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -120,14 +114,12 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand searchValue, limitToProject, limitToResourceClass, - featureFactoryConfig, requestingUser ) => searchResourcesByLabelCountV2( searchValue, limitToProject, limitToResourceClass, - featureFactoryConfig, requestingUser ) @@ -137,7 +129,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToProject, limitToResourceClass, targetSchema, - featureFactoryConfig, requestingUser ) => searchResourcesByLabelV2( @@ -146,7 +137,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToProject, limitToResourceClass, targetSchema, - featureFactoryConfig, requestingUser ) @@ -165,7 +155,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand * @param searchValue the values to search for. * @param limitToProject limit search to given project. * @param limitToResourceClass limit search to given resource class. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the client making the request. * @return a [[ResourceCountV2]] representing the number of resources that have been found. */ @@ -174,7 +164,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToProject: Option[IRI], limitToResourceClass: Option[SmartIri], limitToStandoffClass: Option[SmartIri], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ResourceCountV2] = { @@ -222,7 +211,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand * @param returnFiles if true, return any file value attached to each matching resource. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the client making the request. * @return a [[ReadResourcesSequenceV2]] representing the resources that have been found. */ @@ -235,7 +224,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand returnFiles: Boolean, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourcesSequenceV2] = { import org.knora.webapi.messages.util.search.FullTextMainQueryGenerator.FullTextSearchConstants @@ -322,8 +310,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor .ask( SparqlExtendedConstructRequest( - sparql = triplestoreSpecificQuery.toSparql, - featureFactoryConfig = featureFactoryConfig + sparql = triplestoreSpecificQuery.toSparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -356,7 +343,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand if (queryStandoff) { getMappingsFromQueryResultsSeparated( queryResultsSeparated = mainResourcesAndValueRdfData.resources, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } else { @@ -375,7 +361,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor = appActor, settings = settings, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -386,13 +371,12 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand * Performs a count query for a Gravsearch query provided by the user. * * @param inputQuery a Gravsearch query provided by the client. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the client making the request. * @return a [[ResourceCountV2]] representing the number of resources that have been found. */ private def gravsearchCountV2( inputQuery: ConstructQuery, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ResourceCountV2] = { @@ -426,8 +410,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand new NonTriplestoreSpecificGravsearchToCountPrequeryTransformer( constructClause = inputQuery.constructClause, typeInspectionResult = typeInspectionResult, - querySchema = inputQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")), - featureFactoryConfig = featureFactoryConfig + querySchema = inputQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")) ) nonTriplestoreSpecificPrequery: SelectQuery = @@ -485,7 +468,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand * @param inputQuery a Gravsearch query provided by the client. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the client making the request. * @return a [[ReadResourcesSequenceV2]] representing the resources that have been found. */ @@ -493,7 +476,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand inputQuery: ConstructQuery, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourcesSequenceV2] = { import org.knora.webapi.messages.util.search.gravsearch.mainquery.GravsearchMainQueryGenerator @@ -523,8 +505,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand constructClause = inputQuery.constructClause, typeInspectionResult = typeInspectionResult, querySchema = inputQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")), - settings = settings, - featureFactoryConfig = featureFactoryConfig + settings = settings ) // TODO: if the ORDER BY criterion is a property whose occurrence is not 1, then the logic does not work correctly @@ -674,8 +655,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor .ask( SparqlExtendedConstructRequest( - sparql = triplestoreSpecificMainQuerySparql, - featureFactoryConfig = featureFactoryConfig + sparql = triplestoreSpecificMainQuerySparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -723,7 +703,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand if (queryStandoff) { getMappingsFromQueryResultsSeparated( queryResultsSeparated = mainQueryResults.resources, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } else { @@ -742,7 +721,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor = appActor, settings = settings, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -901,8 +879,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor .ask( SparqlExtendedConstructRequest( - sparql = resourceRequestSparql, - featureFactoryConfig = resourcesInProjectGetRequestV2.featureFactoryConfig + sparql = resourceRequestSparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -920,7 +897,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand if (queryStandoff) { getMappingsFromQueryResultsSeparated( mainResourcesAndValueRdfData.resources, - featureFactoryConfig = resourcesInProjectGetRequestV2.featureFactoryConfig, resourcesInProjectGetRequestV2.requestingUser ) } else { @@ -940,7 +916,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor = appActor, targetSchema = resourcesInProjectGetRequestV2.targetSchema, settings = settings, - featureFactoryConfig = resourcesInProjectGetRequestV2.featureFactoryConfig, requestingUser = resourcesInProjectGetRequestV2.requestingUser ) } yield readResourcesSequence @@ -956,7 +931,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand * @param searchValue the values to search for. * @param limitToProject limit search to given project. * @param limitToResourceClass limit search to given resource class. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the client making the request. * @return a [[ReadResourcesSequenceV2]] representing the resources that have been found. */ @@ -964,7 +939,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand searchValue: String, limitToProject: Option[IRI], limitToResourceClass: Option[SmartIri], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ResourceCountV2] = { val searchPhrase: MatchStringWhileTyping = MatchStringWhileTyping(searchValue) @@ -1009,7 +983,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand * @param limitToProject limit search to given project. * @param limitToResourceClass limit search to given resource class. * @param targetSchema the schema of the response. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the the client making the request. * @return a [[ReadResourcesSequenceV2]] representing the resources that have been found. */ @@ -1019,7 +993,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToProject: Option[IRI], limitToResourceClass: Option[SmartIri], targetSchema: ApiV2Schema, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourcesSequenceV2] = { @@ -1044,8 +1017,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor .ask( SparqlExtendedConstructRequest( - sparql = searchResourceByLabelSparql, - featureFactoryConfig = featureFactoryConfig + sparql = searchResourceByLabelSparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -1091,7 +1063,6 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand appActor = appActor, targetSchema = targetSchema, settings = settings, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/StandoffResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/StandoffResponderV2.scala index 13a2707fb4..89703ceb44 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/StandoffResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/StandoffResponderV2.scala @@ -10,7 +10,7 @@ import akka.stream.Materializer import akka.util.Timeout import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -79,20 +79,19 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon case getStandoffPageRequestV2: GetStandoffPageRequestV2 => getStandoffV2(getStandoffPageRequestV2) case getRemainingStandoffFromTextValueRequestV2: GetRemainingStandoffFromTextValueRequestV2 => getRemainingStandoffFromTextValueV2(getRemainingStandoffFromTextValueRequestV2) - case CreateMappingRequestV2(metadata, xml, featureFactoryConfig, requestingUser, uuid) => + case CreateMappingRequestV2(metadata, xml, requestingUser, uuid) => createMappingV2( xml.xml, metadata.label, metadata.projectIri, metadata.mappingName, - featureFactoryConfig, requestingUser, uuid ) - case GetMappingRequestV2(mappingIri, featureFactoryConfig, requestingUser) => - getMappingV2(mappingIri, featureFactoryConfig, requestingUser) - case GetXSLTransformationRequestV2(xsltTextReprIri, featureFactoryConfig, requestingUser) => - getXSLTransformation(xsltTextReprIri, featureFactoryConfig, requestingUser) + case GetMappingRequestV2(mappingIri, requestingUser) => + getMappingV2(mappingIri, requestingUser) + case GetXSLTransformationRequestV2(xsltTextReprIri, requestingUser) => + getXSLTransformation(xsltTextReprIri, requestingUser) case other => handleUnexpectedMessage(other, log, this.getClass.getName) } @@ -128,8 +127,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon appActor .ask( SparqlExtendedConstructRequest( - sparql = resourceRequestSparql, - featureFactoryConfig = getStandoffRequestV2.featureFactoryConfig + sparql = resourceRequestSparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -158,8 +156,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon appActor = appActor, targetSchema = getStandoffRequestV2.targetSchema, settings = settings, - featureFactoryConfig = - getStandoffRequestV2.featureFactoryConfig, requestingUser = getStandoffRequestV2.requestingUser ) @@ -203,13 +199,12 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon * If not already in the cache, retrieves a `knora-base:XSLTransformation` in the triplestore and requests the corresponding XSL transformation file from Sipi. * * @param xslTransformationIri the IRI of the resource representing the XSL Transformation (a [[OntologyConstants.KnoraBase.XSLTransformation]]). - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[GetXSLTransformationResponseV2]]. */ private def getXSLTransformation( xslTransformationIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[GetXSLTransformationResponseV2] = { @@ -221,7 +216,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon ResourcesGetRequestV2( resourceIris = Vector(xslTransformationIri), targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -308,7 +302,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon * The mapping is used to convert XML documents to texts with standoff and back. * * @param xml the provided mapping. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the client that made the request. */ private def createMappingV2( @@ -316,7 +310,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon label: String, projectIri: SmartIri, mappingName: String, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM, apiRequestID: UUID ): Future[CreateMappingResponseV2] = { @@ -370,7 +363,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon transform: GetXSLTransformationResponseV2 <- getXSLTransformation( xslTransformationIri = transIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } yield Some(transIri) @@ -597,8 +589,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon existingMappingResponse: SparqlConstructResponse <- appActor .ask( SparqlConstructRequest( - sparql = getExistingMappingSparql, - featureFactoryConfig = featureFactoryConfig + sparql = getExistingMappingSparql ) ) .mapTo[SparqlConstructResponse] @@ -626,8 +617,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon newMappingResponse <- appActor .ask( SparqlConstructRequest( - sparql = getExistingMappingSparql, - featureFactoryConfig = featureFactoryConfig + sparql = getExistingMappingSparql ) ) .mapTo[SparqlConstructResponse] @@ -644,7 +634,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon // get the mapping from the triplestore and cache it thereby _ = getMappingFromTriplestore( mappingIri = mappingIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } yield { @@ -684,7 +673,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon .ask( ProjectGetADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectIri.toString)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -874,13 +862,12 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon * Gets a mapping either from the cache or by making a request to the triplestore. * * @param mappingIri the IRI of the mapping to retrieve. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[MappingXMLtoStandoff]]. */ private def getMappingV2( mappingIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[GetMappingResponseV2] = { @@ -901,7 +888,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon for { mapping: MappingXMLtoStandoff <- getMappingFromTriplestore( mappingIri = mappingIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) @@ -928,13 +914,12 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon * Gets a mapping from the triplestore. * * @param mappingIri the IRI of the mapping to retrieve. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[MappingXMLtoStandoff]]. */ private def getMappingFromTriplestore( mappingIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[MappingXMLtoStandoff] = { @@ -949,8 +934,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon mappingResponse: SparqlConstructResponse <- appActor .ask( SparqlConstructRequest( - sparql = getMappingSparql, - featureFactoryConfig = featureFactoryConfig + sparql = getMappingSparql ) ) .mapTo[SparqlConstructResponse] @@ -1239,14 +1223,13 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon * @param resourceIri the IRI of the resource containing the value. * @param valueIri the IRI of the value. * @param offset the start index of the first standoff tag to be returned. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. */ case class GetStandoffTask( resourceIri: IRI, valueIri: IRI, offset: Int, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ) extends Task[StandoffTaskUnderlyingResult] { override def runTask( @@ -1260,7 +1243,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon valueIri = valueIri, offset = offset, targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -1301,7 +1283,6 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon resourceIri = getRemainingStandoffFromTextValueRequestV2.resourceIri, valueIri = getRemainingStandoffFromTextValueRequestV2.valueIri, offset = settings.standoffPerPage, // the offset of the second page - featureFactoryConfig = getRemainingStandoffFromTextValueRequestV2.featureFactoryConfig, requestingUser = getRemainingStandoffFromTextValueRequestV2.requestingUser ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ValuesResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ValuesResponderV2.scala index 3707ea28fe..26b1cf720e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ValuesResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ValuesResponderV2.scala @@ -9,7 +9,7 @@ import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi._ import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -137,7 +137,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde resourceInfo: ReadResourceV2 <- getResourceWithPropertyValues( resourceIri = createValueRequest.createValue.resourceIri, propertyInfo = adjustedInternalPropertyInfo, - featureFactoryConfig = createValueRequest.featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -188,7 +187,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde _ <- checkPropertyObjectClassConstraint( propertyInfo = adjustedInternalPropertyInfo, valueContent = submittedInternalValueContent, - featureFactoryConfig = createValueRequest.featureFactoryConfig, requestingUser = createValueRequest.requestingUser ) @@ -245,7 +243,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde case textValueContent: TextValueContentV2 => checkResourceIris( targetResourceIris = textValueContent.standoffLinkTagTargetResourceIris, - featureFactoryConfig = createValueRequest.featureFactoryConfig, requestingUser = createValueRequest.requestingUser ) @@ -268,8 +265,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde for { validatedCustomPermissions <- PermissionUtilADM.validatePermissions( permissionLiteral = permissions, - featureFactoryConfig = - createValueRequest.featureFactoryConfig, appActor = appActor ) @@ -328,7 +323,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde resourceIri = createValueRequest.createValue.resourceIri, propertyIri = submittedInternalPropertyIri, unverifiedValue = unverifiedValue, - featureFactoryConfig = createValueRequest.featureFactoryConfig, requestingUser = createValueRequest.requestingUser ) } yield CreateValueResponseV2( @@ -949,7 +943,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde resourceInfo: ReadResourceV2 <- getResourceWithPropertyValues( resourceIri = resourceIri, propertyInfo = adjustedInternalPropertyInfo, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -1019,7 +1012,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde newValuePermissionLiteral: String <- PermissionUtilADM.validatePermissions( permissionLiteral = updateValuePermissionsV2.permissions, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, appActor = appActor ) @@ -1087,7 +1079,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde resourceIri = resourceInfo.resourceIri, propertyIri = submittedInternalPropertyIri, unverifiedValue = unverifiedValue, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, requestingUser = updateValueRequest.requestingUser ) } yield UpdateValueResponseV2( @@ -1130,7 +1121,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde // Yes. Validate them. PermissionUtilADM.validatePermissions( permissionLiteral = permissions, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, appActor = appActor ) @@ -1178,7 +1168,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde _ <- checkPropertyObjectClassConstraint( propertyInfo = adjustedInternalPropertyInfo, valueContent = submittedInternalValueContent, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, requestingUser = updateValueRequest.requestingUser ) @@ -1218,7 +1207,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde // and that the user has permission to see them. checkResourceIris( textValueContent.standoffLinkTagTargetResourceIris, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, updateValueRequest.requestingUser ) @@ -1281,7 +1269,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde resourceIri = updateValueContentV2.resourceIri, propertyIri = submittedInternalPropertyIri, unverifiedValue = unverifiedValue, - featureFactoryConfig = updateValueRequest.featureFactoryConfig, requestingUser = updateValueRequest.requestingUser ) } yield UpdateValueResponseV2( @@ -1657,7 +1644,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde resourceInfo: ReadResourceV2 <- getResourceWithPropertyValues( resourceIri = deleteValueRequest.resourceIri, propertyInfo = adjustedInternalPropertyInfo, - featureFactoryConfig = deleteValueRequest.featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -2031,12 +2017,11 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde * If not, throws an exception. * * @param targetResourceIris the IRIs to be checked. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. */ private def checkResourceIris( targetResourceIris: Set[IRI], - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Unit] = if (targetResourceIris.isEmpty) { @@ -2047,7 +2032,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde ResourcesPreviewGetRequestV2( resourceIris = targetResourceIris.toSeq, targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -2067,14 +2051,13 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde * @param resourceIri the resource IRI. * @param propertyInfo the property definition (in the internal schema). If the caller wants to query a link, this must be the link property, * not the link value property. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return a [[ReadResourceV2]] containing only the resource's metadata and its values for the specified property. */ private def getResourceWithPropertyValues( resourceIri: IRI, propertyInfo: ReadPropertyInfoV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ReadResourceV2] = for { @@ -2119,7 +2102,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde constructQuery = parsedGravsearchQuery, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -2133,14 +2115,13 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde * @param propertyIri the internal IRI of the property that points to the value. If the value is a link value, * this is the link value property. * @param unverifiedValue the value that should have been written to the triplestore. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. */ private def verifyValue( resourceIri: IRI, propertyIri: SmartIri, unverifiedValue: UnverifiedValueV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[VerifiedValueV2] = { val verifiedValueFuture: Future[VerifiedValueV2] = for { @@ -2151,7 +2132,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde versionDate = Some(unverifiedValue.creationDate), targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) } @@ -2200,14 +2180,13 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde * @param linkPropertyIri the IRI of the link property. * @param objectClassConstraint the object class constraint of the link property. * @param linkValueContent the link value. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. */ private def checkLinkPropertyObjectClassConstraint( linkPropertyIri: SmartIri, objectClassConstraint: SmartIri, linkValueContent: LinkValueContentV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Unit] = for { @@ -2216,7 +2195,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde ResourcesPreviewGetRequestV2( resourceIris = Seq(linkValueContent.referredResourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) @@ -2291,13 +2269,12 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde * * @param propertyInfo the property whose object class constraint is to be checked. If the value is a link value, this is the link property. * @param valueContent the value to be updated. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. */ private def checkPropertyObjectClassConstraint( propertyInfo: ReadPropertyInfoV2, valueContent: ValueContentV2, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[Unit] = for { @@ -2326,7 +2303,6 @@ class ValuesResponderV2(responderData: ResponderData) extends Responder(responde linkPropertyIri = propertyInfo.entityInfoContent.propertyIri, objectClassConstraint = objectClassConstraint, linkValueContent = linkValueContent, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cache.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cache.scala index 66fb8578e2..5fcbf17fc0 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cache.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cache.scala @@ -20,7 +20,6 @@ import dsp.errors.BadRequestException import dsp.errors.ForbiddenException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.MissingLastModificationDateOntologyException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -102,14 +101,12 @@ object Cache extends LazyLogging { /** * Loads and caches all ontology information. * - * @param featureFactoryConfig the feature factory configuration. * @param requestingUser the user making the request. * @return a [[SuccessResponseV2]]. */ def loadOntologies( settings: KnoraSettingsImpl, appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM )(implicit ec: ExecutionContext, stringFormat: StringFormatter, timeout: Timeout): Future[SuccessResponseV2] = { val loadOntologiesFuture: Future[SuccessResponseV2] = for { @@ -187,8 +184,7 @@ object Cache extends LazyLogging { appActor .ask( SparqlExtendedConstructRequest( - sparql = ontologyGraphConstructQuery, - featureFactoryConfig = featureFactoryConfig + sparql = ontologyGraphConstructQuery ) ) .mapTo[SparqlExtendedConstructResponse] diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cardinalities.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cardinalities.scala index df24742530..6df4b1900e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cardinalities.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/Cardinalities.scala @@ -63,8 +63,7 @@ object Cardinalities { settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deleteCardinalitiesFromClassRequest.lastModificationDate, - featureFactoryConfig = deleteCardinalitiesFromClassRequest.featureFactoryConfig + expectedLastModificationDate = deleteCardinalitiesFromClassRequest.lastModificationDate ) // Check that the class's rdf:type is owl:Class. @@ -223,8 +222,7 @@ object Cardinalities { settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = deleteCardinalitiesFromClassRequest.lastModificationDate, - featureFactoryConfig = deleteCardinalitiesFromClassRequest.featureFactoryConfig + expectedLastModificationDate = deleteCardinalitiesFromClassRequest.lastModificationDate ) // Check that the class's rdf:type is owl:Class. @@ -406,8 +404,7 @@ object Cardinalities { settings, appActor, internalOntologyIri = internalOntologyIri, - expectedLastModificationDate = currentTime, - featureFactoryConfig = deleteCardinalitiesFromClassRequest.featureFactoryConfig + expectedLastModificationDate = currentTime ) // Check that the data that was saved corresponds to the data that was submitted. @@ -415,8 +412,7 @@ object Cardinalities { loadedClassDef <- OntologyHelpers.loadClassDefinition( settings, appActor, - classIri = internalClassIri, - featureFactoryConfig = deleteCardinalitiesFromClassRequest.featureFactoryConfig + classIri = internalClassIri ) _ = if (loadedClassDef != newInternalClassDefWithLinkValueProps) { diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/OntologyHelpers.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/OntologyHelpers.scala index 8acdc32c0d..f3aee1dbd6 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/OntologyHelpers.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/OntologyHelpers.scala @@ -16,7 +16,7 @@ import org.knora.webapi.IRI import org.knora.webapi.InternalSchema import org.knora.webapi.OntologySchema import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -119,14 +119,13 @@ object OntologyHelpers { * Reads an ontology's metadata. * * @param internalOntologyIri the ontology's internal IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @return an [[OntologyMetadataV2]], or [[None]] if the ontology is not found. */ def loadOntologyMetadata( settings: KnoraSettingsImpl, appActor: ActorRef, - internalOntologyIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig + internalOntologyIri: SmartIri )(implicit executionContext: ExecutionContext, stringFormatter: StringFormatter, @@ -148,8 +147,7 @@ object OntologyHelpers { getOntologyInfoResponse <- appActor .ask( SparqlConstructRequest( - sparql = getOntologyInfoSparql, - featureFactoryConfig = featureFactoryConfig + sparql = getOntologyInfoSparql ) ) .mapTo[SparqlConstructResponse] @@ -1128,14 +1126,13 @@ object OntologyHelpers { * Loads a property definition from the triplestore and converts it to a [[PropertyInfoContentV2]]. * * @param propertyIri the IRI of the property to be loaded. - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[PropertyInfoContentV2]] representing the property definition. */ def loadPropertyDefinition( settings: KnoraSettingsImpl, appActor: ActorRef, - propertyIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig + propertyIri: SmartIri )(implicit ex: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[PropertyInfoContentV2] = for { sparql <- Future( @@ -1149,8 +1146,7 @@ object OntologyHelpers { constructResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparql, - featureFactoryConfig = featureFactoryConfig + sparql = sparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -1575,14 +1571,13 @@ object OntologyHelpers { * Loads a class definition from the triplestore and converts it to a [[ClassInfoContentV2]]. * * @param classIri the IRI of the class to be loaded. - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[ClassInfoContentV2]] representing the class definition. */ def loadClassDefinition( settings: KnoraSettingsImpl, appActor: ActorRef, - classIri: SmartIri, - featureFactoryConfig: FeatureFactoryConfig + classIri: SmartIri )(implicit ex: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[ClassInfoContentV2] = for { sparql <- Future( @@ -1596,8 +1591,7 @@ object OntologyHelpers { constructResponse <- appActor .ask( SparqlExtendedConstructRequest( - sparql = sparql, - featureFactoryConfig = featureFactoryConfig + sparql = sparql ) ) .mapTo[SparqlExtendedConstructResponse] @@ -1767,22 +1761,20 @@ object OntologyHelpers { * @param appActor the store manager actor ref. * @param internalOntologyIri the internal IRI of the ontology. * @param expectedLastModificationDate the last modification date that should now be attached to the ontology. - * @param featureFactoryConfig the feature factory configuration. + * * @return a failed Future if the expected last modification date is not found. */ def checkOntologyLastModificationDateBeforeUpdate( settings: KnoraSettingsImpl, appActor: ActorRef, internalOntologyIri: SmartIri, - expectedLastModificationDate: Instant, - featureFactoryConfig: FeatureFactoryConfig + expectedLastModificationDate: Instant )(implicit ec: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[Unit] = checkOntologyLastModificationDate( settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = expectedLastModificationDate, - featureFactoryConfig = featureFactoryConfig, errorFun = throw EditConflictException( s"Ontology ${internalOntologyIri.toOntologySchema(ApiV2Complex)} has been modified by another user, please reload it and try again." ) @@ -1796,22 +1788,20 @@ object OntologyHelpers { * @param appActor the store manager actor ref. * @param internalOntologyIri the internal IRI of the ontology. * @param expectedLastModificationDate the last modification date that should now be attached to the ontology. - * @param featureFactoryConfig the feature factory configuration. + * * @return a failed Future if the expected last modification date is not found. */ def checkOntologyLastModificationDateAfterUpdate( settings: KnoraSettingsImpl, appActor: ActorRef, internalOntologyIri: SmartIri, - expectedLastModificationDate: Instant, - featureFactoryConfig: FeatureFactoryConfig + expectedLastModificationDate: Instant )(implicit ec: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[Unit] = checkOntologyLastModificationDate( settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = expectedLastModificationDate, - featureFactoryConfig = featureFactoryConfig, errorFun = throw UpdateNotPerformedException( s"Ontology ${internalOntologyIri.toOntologySchema(ApiV2Complex)} was not updated. Please report this as a possible bug." ) @@ -1824,7 +1814,7 @@ object OntologyHelpers { * @param appActor the store manager actor ref. * @param internalOntologyIri the internal IRI of the ontology. * @param expectedLastModificationDate the last modification date that the ontology is expected to have. - * @param featureFactoryConfig the feature factory configuration. + * * @param errorFun a function that throws an exception. It will be called if the expected last modification date is not found. * @return a failed Future if the expected last modification date is not found. */ @@ -1833,15 +1823,13 @@ object OntologyHelpers { appActor: ActorRef, internalOntologyIri: SmartIri, expectedLastModificationDate: Instant, - featureFactoryConfig: FeatureFactoryConfig, errorFun: => Nothing )(implicit ec: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[Unit] = for { existingOntologyMetadata: Option[OntologyMetadataV2] <- loadOntologyMetadata( settings, appActor, - internalOntologyIri = internalOntologyIri, - featureFactoryConfig = featureFactoryConfig + internalOntologyIri = internalOntologyIri ) _ = existingOntologyMetadata match { diff --git a/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala b/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala index af48638e84..39572470da 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala @@ -21,7 +21,7 @@ import org.knora.webapi.IRI import dsp.errors.AuthenticationException import dsp.errors.BadCredentialsException import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.instrumentation.InstrumentationSupport import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages._ @@ -69,12 +69,12 @@ trait Authenticator extends InstrumentationSupport { * with the generated session id for the client to save. * * @param requestContext a [[RequestContext]] containing the http request - * @param featureFactoryConfig the feature factory configuration. + * * @param system the current [[ActorSystem]] * @return a [[HttpResponse]] containing either a failure message or a message with a cookie header containing * the generated session id. */ - def doLoginV1(requestContext: RequestContext, featureFactoryConfig: FeatureFactoryConfig)(implicit + def doLoginV1(requestContext: RequestContext)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -86,8 +86,7 @@ trait Authenticator extends InstrumentationSupport { for { userADM <- getUserADMThroughCredentialsV2( - credentials = credentials, - featureFactoryConfig = featureFactoryConfig + credentials = credentials ) // will return or throw userProfile = userADM.asUserProfileV1 @@ -129,12 +128,12 @@ trait Authenticator extends InstrumentationSupport { * Checks if the provided credentials are valid, and if so returns a JWT token for the client to save. * * @param credentials the user supplied [[KnoraPasswordCredentialsV2]] containing the user's login information. - * @param featureFactoryConfig the feature factory configuration. + * * @param system the current [[ActorSystem]] * @return a [[HttpResponse]] containing either a failure message or a message with a cookie header containing * the generated session id. */ - def doLoginV2(credentials: KnoraPasswordCredentialsV2, featureFactoryConfig: FeatureFactoryConfig)(implicit + def doLoginV2(credentials: KnoraPasswordCredentialsV2)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -145,15 +144,13 @@ trait Authenticator extends InstrumentationSupport { for { // will throw exception if not valid and thus trigger the correct response _ <- authenticateCredentialsV2( - credentials = Some(credentials), - featureFactoryConfig = featureFactoryConfig + credentials = Some(credentials) ) settings = KnoraSettings(system) userADM <- getUserByIdentifier( - identifier = credentials.identifier, - featureFactoryConfig = featureFactoryConfig + identifier = credentials.identifier ) cookieDomain = Some(settings.cookieDomain) @@ -244,11 +241,11 @@ trait Authenticator extends InstrumentationSupport { * generated. * * @param requestContext a [[RequestContext]] containing the http request - * @param featureFactoryConfig the feature factory configuration. + * * @param system the current [[ActorSystem]] * @return a [[RequestContext]] */ - def doAuthenticateV1(requestContext: RequestContext, featureFactoryConfig: FeatureFactoryConfig)(implicit + def doAuthenticateV1(requestContext: RequestContext)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -259,8 +256,7 @@ trait Authenticator extends InstrumentationSupport { for { // will authenticate and either return or throw userADM: UserADM <- getUserADMThroughCredentialsV2( - credentials = credentials, - featureFactoryConfig = featureFactoryConfig + credentials = credentials ) userProfile: UserProfileV1 = userADM.asUserProfileV1 @@ -286,7 +282,7 @@ trait Authenticator extends InstrumentationSupport { * @param system the current [[ActorSystem]] * @return a [[HttpResponse]] */ - def doAuthenticateV2(requestContext: RequestContext, featureFactoryConfig: FeatureFactoryConfig)(implicit + def doAuthenticateV2(requestContext: RequestContext)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -297,8 +293,7 @@ trait Authenticator extends InstrumentationSupport { for { // will throw exception if not valid _ <- authenticateCredentialsV2( - credentials = credentials, - featureFactoryConfig = featureFactoryConfig + credentials = credentials ) httpResponse = HttpResponse( @@ -413,7 +408,7 @@ trait Authenticator extends InstrumentationSupport { * @return a [[UserProfileV1]] */ @deprecated("Please use: getUserADM()", "Knora v1.7.0") - def getUserProfileV1(requestContext: RequestContext, featureFactoryConfig: FeatureFactoryConfig)(implicit + def getUserProfileV1(requestContext: RequestContext)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -437,8 +432,7 @@ trait Authenticator extends InstrumentationSupport { } else { for { userADM <- getUserADMThroughCredentialsV2( - credentials = credentials, - featureFactoryConfig = featureFactoryConfig + credentials = credentials ) userProfile: UserProfileV1 = userADM.asUserProfileV1 _ = log.debug("Authenticator - getUserProfileV1 - userProfile: {}", userProfile) @@ -455,11 +449,11 @@ trait Authenticator extends InstrumentationSupport { * corresponding error is returned. * * @param requestContext a [[RequestContext]] containing the http request - * @param featureFactoryConfig the feature factory configuration. + * * @param system the current [[ActorSystem]] * @return a [[UserProfileV1]] */ - def getUserADM(requestContext: RequestContext, featureFactoryConfig: FeatureFactoryConfig)(implicit + def getUserADM(requestContext: RequestContext)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -480,8 +474,7 @@ trait Authenticator extends InstrumentationSupport { for { user: UserADM <- getUserADMThroughCredentialsV2( - credentials = credentials, - featureFactoryConfig = featureFactoryConfig + credentials = credentials ) _ = log.debug("Authenticator - getUserADM - user: {}", user) @@ -521,7 +514,7 @@ object Authenticator extends InstrumentationSupport { * to be valid. * * @param credentials the user supplied and extracted credentials. - * @param featureFactoryConfig the feature factory configuration. + * * @param system the current [[ActorSystem]] * @return true if the credentials are valid. If the credentials are invalid, then the corresponding exception * will be thrown. @@ -529,8 +522,7 @@ object Authenticator extends InstrumentationSupport { * when the password does not match; when the supplied token is not valid. */ def authenticateCredentialsV2( - credentials: Option[KnoraCredentialsV2], - featureFactoryConfig: FeatureFactoryConfig + credentials: Option[KnoraCredentialsV2] )(implicit system: ActorSystem, appActor: ActorRef, @@ -543,8 +535,7 @@ object Authenticator extends InstrumentationSupport { case Some(passCreds: KnoraPasswordCredentialsV2) => for { user <- getUserByIdentifier( - identifier = passCreds.identifier, - featureFactoryConfig = featureFactoryConfig + identifier = passCreds.identifier ) /* check if the user is active, if not, then no need to check the password */ @@ -757,13 +748,12 @@ object Authenticator extends InstrumentationSupport { * with authenticated credentials. * * @param credentials the user supplied credentials. - * @param featureFactoryConfig the feature factory configuration. + * * @return a [[UserADM]] * @throws AuthenticationException when the IRI can not be found inside the token, which is probably a bug. */ private def getUserADMThroughCredentialsV2( - credentials: Option[KnoraCredentialsV2], - featureFactoryConfig: FeatureFactoryConfig + credentials: Option[KnoraCredentialsV2] )(implicit system: ActorSystem, appActor: ActorRef, @@ -773,14 +763,13 @@ object Authenticator extends InstrumentationSupport { val settings = KnoraSettings(system) for { - authenticated <- authenticateCredentialsV2(credentials = credentials, featureFactoryConfig = featureFactoryConfig) + authenticated <- authenticateCredentialsV2(credentials = credentials) user: UserADM <- credentials match { case Some(passCreds: KnoraPasswordCredentialsV2) => // log.debug("getUserADMThroughCredentialsV2 - used identifier: {}", passCreds.identifier) getUserByIdentifier( - identifier = passCreds.identifier, - featureFactoryConfig = featureFactoryConfig + identifier = passCreds.identifier ) case Some(KnoraJWTTokenCredentialsV2(jwtToken)) => val userIri: IRI = JWTHelper.extractUserIriFromToken( @@ -797,8 +786,7 @@ object Authenticator extends InstrumentationSupport { } // log.debug("getUserADMThroughCredentialsV2 - used token") getUserByIdentifier( - identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig + identifier = UserIdentifierADM(maybeIri = Some(userIri)) ) case Some(KnoraSessionCredentialsV2(sessionToken)) => val userIri: IRI = JWTHelper.extractUserIriFromToken( @@ -815,8 +803,7 @@ object Authenticator extends InstrumentationSupport { } // log.debug("getUserADMThroughCredentialsV2 - used session token") getUserByIdentifier( - identifier = UserIdentifierADM(maybeIri = Some(userIri)), - featureFactoryConfig = featureFactoryConfig + identifier = UserIdentifierADM(maybeIri = Some(userIri)) ) case None => // log.debug("getUserADMThroughCredentialsV2 - no credentials supplied") @@ -834,14 +821,14 @@ object Authenticator extends InstrumentationSupport { * Tries to get a [[UserADM]]. * * @param identifier the IRI, email, or username of the user to be queried - * @param featureFactoryConfig the feature factory configuration. + * * @param system the current akka actor system * @param timeout the timeout of the query * @param executionContext the current execution context * @return a [[UserADM]] * @throws BadCredentialsException when either the supplied email is empty or no user with such an email could be found. */ - private def getUserByIdentifier(identifier: UserIdentifierADM, featureFactoryConfig: FeatureFactoryConfig)(implicit + private def getUserByIdentifier(identifier: UserIdentifierADM)(implicit system: ActorSystem, appActor: ActorRef, timeout: Timeout, @@ -854,7 +841,6 @@ object Authenticator extends InstrumentationSupport { UserGetADM( identifier = identifier, userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = featureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala index 2dd768af92..97e9877c27 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala @@ -11,7 +11,6 @@ import akka.http.scaladsl.server.Directives.path import akka.http.scaladsl.server.Route import akka.pattern.ask import akka.util.Timeout -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.app.appmessages.AppState import org.knora.webapi.messages.app.appmessages.AppStates import org.knora.webapi.messages.app.appmessages.GetAppState @@ -20,6 +19,7 @@ import spray.json.JsString import scala.concurrent.Future import scala.concurrent.duration._ +import akka.http.scaladsl.util.FastFuture case class HealthCheckResult(name: String, severity: String, status: Boolean, message: String) @@ -34,40 +34,45 @@ trait HealthCheck { protected def healthCheck(): Future[HttpResponse] = for { - state: AppState <- appActor.ask(GetAppState()).mapTo[AppState] - - result: HealthCheckResult = state match { - case AppStates.Stopped => unhealthy("Stopped. Please retry later.") - case AppStates.StartingUp => unhealthy("Starting up. Please retry later.") - case AppStates.WaitingForTriplestore => - unhealthy("Waiting for triplestore. Please retry later.") - case AppStates.TriplestoreReady => - unhealthy("Triplestore ready. Please retry later.") - case AppStates.UpdatingRepository => - unhealthy("Updating repository. Please retry later.") - case AppStates.RepositoryUpToDate => - unhealthy("Repository up to date. Please retry later.") - case AppStates.CreatingCaches => unhealthy("Creating caches. Please retry later.") - case AppStates.CachesReady => unhealthy("Caches ready. Please retry later.") - case AppStates.UpdatingSearchIndex => - unhealthy("Updating search index. Please retry later.") - case AppStates.SearchIndexReady => - unhealthy("Search index ready. Please retry later.") - case AppStates.LoadingOntologies => - unhealthy("Loading ontologies. Please retry later.") - case AppStates.OntologiesReady => unhealthy("Ontologies ready. Please retry later.") - case AppStates.WaitingForIIIFService => - unhealthy("Waiting for IIIF service. Please retry later.") - case AppStates.IIIFServiceReady => - unhealthy("IIIF service ready. Please retry later.") - case AppStates.WaitingForCacheService => - unhealthy("Waiting for cache service. Please retry later.") - case AppStates.CacheServiceReady => - unhealthy("Cache service ready. Please retry later.") - case AppStates.MaintenanceMode => - unhealthy("Application is in maintenance mode. Please retry later.") - case AppStates.Running => healthy() - } + state: AppState <- + appActor + .ask(GetAppState()) + .mapTo[AppState] + .fallbackTo(FastFuture.successful(AppStates.Stopped)) + + result: HealthCheckResult = + state match { + case AppStates.Stopped => unhealthy("Stopped. Please retry later.") + case AppStates.StartingUp => unhealthy("Starting up. Please retry later.") + case AppStates.WaitingForTriplestore => + unhealthy("Waiting for triplestore. Please retry later.") + case AppStates.TriplestoreReady => + unhealthy("Triplestore ready. Please retry later.") + case AppStates.UpdatingRepository => + unhealthy("Updating repository. Please retry later.") + case AppStates.RepositoryUpToDate => + unhealthy("Repository up to date. Please retry later.") + case AppStates.CreatingCaches => unhealthy("Creating caches. Please retry later.") + case AppStates.CachesReady => unhealthy("Caches ready. Please retry later.") + case AppStates.UpdatingSearchIndex => + unhealthy("Updating search index. Please retry later.") + case AppStates.SearchIndexReady => + unhealthy("Search index ready. Please retry later.") + case AppStates.LoadingOntologies => + unhealthy("Loading ontologies. Please retry later.") + case AppStates.OntologiesReady => unhealthy("Ontologies ready. Please retry later.") + case AppStates.WaitingForIIIFService => + unhealthy("Waiting for IIIF service. Please retry later.") + case AppStates.IIIFServiceReady => + unhealthy("IIIF service ready. Please retry later.") + case AppStates.WaitingForCacheService => + unhealthy("Waiting for cache service. Please retry later.") + case AppStates.CacheServiceReady => + unhealthy("Cache service ready. Please retry later.") + case AppStates.MaintenanceMode => + unhealthy("Application is in maintenance mode. Please retry later.") + case AppStates.Running => healthy() + } response = createResponse(result) @@ -116,7 +121,7 @@ class HealthRoute(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("health") { get { requestContext => requestContext.complete(healthCheck()) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala index 26971d46d1..7f4338505c 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala @@ -16,9 +16,6 @@ import akka.stream.Materializer import akka.util.Timeout import org.knora.webapi.IRI import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig -import org.knora.webapi.feature.RequestContextFeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -72,10 +69,9 @@ abstract class KnoraRouteFactory(routeData: KnoraRouteData) { * * - by making a choice based on a feature toggle (if this is a feature factory) * - * @param featureFactoryConfig the per-request feature factory configuration. * @return a route configured with the features enabled by the feature factory configuration. */ - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route + def makeRoute(): Route } /** @@ -85,12 +81,6 @@ abstract class KnoraRouteFactory(routeData: KnoraRouteData) { */ abstract class KnoraRoute(routeData: KnoraRouteData) extends KnoraRouteFactory(routeData) { - /** - * A [[KnoraSettingsFeatureFactoryConfig]] to use as the parent [[FeatureFactoryConfig]]. - */ - private val knoraSettingsFeatureFactoryConfig: KnoraSettingsFeatureFactoryConfig = - new KnoraSettingsFeatureFactoryConfig(settings) - /** * Returns a routing function that uses per-request feature factory configuration. */ @@ -104,14 +94,8 @@ abstract class KnoraRoute(routeData: KnoraRouteData) extends KnoraRouteFactory(r * @return the result of running the route. */ private def runRoute(requestContext: RequestContext): Future[RouteResult] = { - // Construct the per-request feature factory configuration. - val featureFactoryConfig: FeatureFactoryConfig = new RequestContextFeatureFactoryConfig( - requestContext = requestContext, - parent = knoraSettingsFeatureFactoryConfig - ) - // Construct a routing function using that configuration. - val route: Route = makeRoute(featureFactoryConfig) + val route: Route = makeRoute() // Call the routing function. route(requestContext) @@ -121,13 +105,12 @@ abstract class KnoraRoute(routeData: KnoraRouteData) extends KnoraRouteFactory(r * Gets a [[ProjectADM]] corresponding to the specified project IRI. * * @param projectIri the project IRI. - * @param featureFactoryConfig the feature factory configuration. + * * @param requestingUser the user making the request. * @return the corresponding [[ProjectADM]]. */ protected def getProjectADM( projectIri: IRI, - featureFactoryConfig: FeatureFactoryConfig, requestingUser: UserADM ): Future[ProjectADM] = { val checkedProjectIri = stringFormatter.validateAndEscapeProjectIri( @@ -145,7 +128,6 @@ abstract class KnoraRoute(routeData: KnoraRouteData) extends KnoraRouteFactory(r .ask( ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(checkedProjectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala index 2168eee8c4..b09736a920 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.pattern.ask import akka.util.Timeout -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.app.appmessages.AppState import org.knora.webapi.messages.app.appmessages.AppStates import org.knora.webapi.messages.app.appmessages.GetAppState @@ -49,7 +48,7 @@ class RejectingRoute(routeData: KnoraRouteData) extends KnoraRoute(routeData) wi /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path(Remaining) { wholePath => // check to see if route is on the rejection list val rejectSeq: Seq[Option[Boolean]] = settings.routesToReject.map { pathToReject: String => diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala index c3033599e6..634a1ac8d7 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -13,7 +13,6 @@ import akka.http.scaladsl.server.RouteResult import akka.pattern._ import akka.util.Timeout import dsp.errors.UnexpectedMessageException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.settings.KnoraSettingsImpl @@ -31,7 +30,7 @@ object RouteUtilADM { * * @param requestMessageF a future containing a [[KnoraRequestADM]] message that should be sent to the responder manager. * @param requestContext the akka-http [[RequestContext]]. - * @param featureFactoryConfig the per-request feature factory configuration. + * * @param settings the application's settings. * @param appActor a reference to the application actor. * @param log a logging adapter. @@ -42,7 +41,6 @@ object RouteUtilADM { def runJsonRoute( requestMessageF: Future[KnoraRequestADM], requestContext: RequestContext, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger @@ -75,13 +73,11 @@ object RouteUtilADM { } jsonResponse = knoraResponse.toJsValue.asJsObject - } yield featureFactoryConfig.addHeaderToHttpResponse( - HttpResponse( - status = StatusCodes.OK, - entity = HttpEntity( - ContentTypes.`application/json`, - jsonResponse.compactPrint - ) + } yield HttpResponse( + status = StatusCodes.OK, + entity = HttpEntity( + ContentTypes.`application/json`, + jsonResponse.compactPrint ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala index 48613098eb..ac64953d51 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala @@ -16,7 +16,7 @@ import org.knora.webapi.IRI import dsp.errors.BadRequestException import dsp.errors.SipiException import dsp.errors.UnexpectedMessageException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.http.status.ApiStatusCodesV1 import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.sipimessages.GetFileMetadataResponse @@ -204,7 +204,7 @@ object RouteUtilV1 { * resources. In a bulk import, this allows standoff links to resources * that are to be created by the import. * @param userProfile the user making the request. - * @param featureFactoryConfig the feature factory configuration. + * * @param settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. @@ -217,7 +217,6 @@ object RouteUtilV1 { mappingIri: IRI, acceptStandoffLinksToClientIDs: Boolean, userProfile: UserADM, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger @@ -230,7 +229,6 @@ object RouteUtilV1 { .ask( GetMappingRequestV2( mappingIri = mappingIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala index 1f59537423..cbd8c55ead 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala @@ -15,7 +15,6 @@ import akka.util.Timeout import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.UnexpectedMessageException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter @@ -204,7 +203,6 @@ object RouteUtilV2 { * * @param requestMessage a future containing a [[KnoraRequestV2]] message that should be sent to the responder manager. * @param requestContext the akka-http [[RequestContext]]. - * @param featureFactoryConfig the per-request feature factory configuration. * @param settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. @@ -216,7 +214,6 @@ object RouteUtilV2 { private def runRdfRoute( requestMessage: KnoraRequestV2, requestContext: RequestContext, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger, @@ -260,16 +257,13 @@ object RouteUtilV2 { rdfFormat = RdfFormat.fromMediaType(specificMediaType), targetSchema = targetSchema, settings = settings, - featureFactoryConfig = featureFactoryConfig, schemaOptions = schemaOptions ) - } yield featureFactoryConfig.addHeaderToHttpResponse( - HttpResponse( - status = StatusCodes.OK, - entity = HttpEntity( - contentType, - formattedResponseContent - ) + } yield HttpResponse( + status = StatusCodes.OK, + entity = HttpEntity( + contentType, + formattedResponseContent ) ) @@ -281,7 +275,6 @@ object RouteUtilV2 { * * @param requestMessageF a future containing a [[KnoraRequestV2]] message that should be sent to the responder manager. * @param requestContext the akka-http [[RequestContext]]. - * @param featureFactoryConfig the per-request feature factory configuration. * @param settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. @@ -293,7 +286,6 @@ object RouteUtilV2 { def runTEIXMLRoute( requestMessageF: Future[KnoraRequestV2], requestContext: RequestContext, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger, @@ -317,13 +309,11 @@ object RouteUtilV2 { ) } - } yield featureFactoryConfig.addHeaderToHttpResponse( - HttpResponse( - status = StatusCodes.OK, - entity = HttpEntity( - contentType, - teiResponse.toXML - ) + } yield HttpResponse( + status = StatusCodes.OK, + entity = HttpEntity( + contentType, + teiResponse.toXML ) ) @@ -335,7 +325,6 @@ object RouteUtilV2 { * * @param requestMessageF a [[Future]] containing a [[KnoraRequestV2]] message that should be sent to the responder manager. * @param requestContext the akka-http [[RequestContext]]. - * @param featureFactoryConfig the per-request feature factory configuration. * @param settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. @@ -348,7 +337,6 @@ object RouteUtilV2 { def runRdfRouteWithFuture( requestMessageF: Future[KnoraRequestV2], requestContext: RequestContext, - featureFactoryConfig: FeatureFactoryConfig, settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger, @@ -360,7 +348,6 @@ object RouteUtilV2 { routeResult <- runRdfRoute( requestMessage = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -379,11 +366,10 @@ object RouteUtilV2 { */ def requestToRdfModel( entityStr: String, - requestContext: RequestContext, - featureFactoryConfig: FeatureFactoryConfig + requestContext: RequestContext ): RdfModel = RdfFeatureFactory - .getRdfFormatUtil(featureFactoryConfig) + .getRdfFormatUtil() .parseToRdfModel( rdfStr = entityStr, rdfFormat = RdfFormat.fromMediaType(getRequestContentType(requestContext)) @@ -398,11 +384,10 @@ object RouteUtilV2 { */ def requestToJsonLD( entityStr: String, - requestContext: RequestContext, - featureFactoryConfig: FeatureFactoryConfig + requestContext: RequestContext ): JsonLDDocument = RdfFeatureFactory - .getRdfFormatUtil(featureFactoryConfig) + .getRdfFormatUtil() .parseToJsonLDDocument( rdfStr = entityStr, rdfFormat = RdfFormat.fromMediaType(getRequestContentType(requestContext)) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala index d94acb8dbc..44f002c63d 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala @@ -11,7 +11,6 @@ import com.github.swagger.akka.model.Info import io.swagger.models.ExternalDocs import io.swagger.models.Scheme import io.swagger.models.auth.BasicAuthDefinition -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.routing.admin._ import org.knora.webapi.routing.admin.lists._ @@ -52,7 +51,7 @@ class SwaggerApiDocsRoute(routeData: KnoraRouteData) extends KnoraRoute(routeDat /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = routes } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala index 07cd50197b..f5511320c9 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.server.Directives.get import akka.http.scaladsl.server.Directives.path import akka.http.scaladsl.server.Route import akka.util.Timeout -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.http.version.BuildInfo import spray.json.JsObject import spray.json.JsString @@ -54,7 +53,7 @@ class VersionRoute(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("version") { get { requestContext => requestContext.complete(createResponse()) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala index 496298fbfd..2c777447ea 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.groupsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -40,34 +39,27 @@ class GroupsRouteADM(routeData: KnoraRouteData) import GroupsRouteADM._ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getGroups(featureFactoryConfig) ~ - getGroup(featureFactoryConfig) ~ - getGroupMembers(featureFactoryConfig) ~ - createGroup(featureFactoryConfig) ~ - updateGroup(featureFactoryConfig) ~ - changeGroupStatus(featureFactoryConfig) ~ - deleteGroup(featureFactoryConfig) + override def makeRoute(): Route = + getGroups() ~ + getGroup() ~ + getGroupMembers() ~ + createGroup() ~ + updateGroup() ~ + changeGroupStatus() ~ + deleteGroup() /** * Returns all groups. */ - private def getGroups(featureFactoryConfig: FeatureFactoryConfig): Route = path(GroupsBasePath) { + private def getGroups(): Route = path(GroupsBasePath) { get { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield GroupsGetRequestADM( - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + requestingUser <- getUserADM(requestContext) + } yield GroupsGetRequestADM(requestingUser) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -78,26 +70,21 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Returns a single group identified by IRI. */ - private def getGroup(featureFactoryConfig: FeatureFactoryConfig): Route = path(GroupsBasePath / Segment) { value => + private def getGroup(): Route = path(GroupsBasePath / Segment) { value => get { requestContext => val checkedGroupIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid custom group IRI $value")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GroupGetRequestADM( groupIri = checkedGroupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -108,27 +95,22 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Returns all members of single group. */ - private def getGroupMembers(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getGroupMembers(): Route = path(GroupsBasePath / Segment / "members") { value => get { requestContext => val checkedGroupIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid group IRI $value")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GroupMembersGetRequestADM( groupIri = checkedGroupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -139,7 +121,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Creates a group. */ - private def createGroup(featureFactoryConfig: FeatureFactoryConfig): Route = path(GroupsBasePath) { + private def createGroup(): Route = path(GroupsBasePath) { post { entity(as[CreateGroupApiRequestADM]) { apiRequest => requestContext => val id: Validation[Throwable, Option[GroupIri]] = GroupIri.make(apiRequest.id) @@ -154,10 +136,9 @@ class GroupsRouteADM(routeData: KnoraRouteData) val requestMessage = for { payload <- toFuture(validatedGroupCreatePayload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield GroupCreateRequestADM( createRequest = payload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -165,7 +146,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -177,7 +157,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Updates basic group information. */ - private def updateGroup(featureFactoryConfig: FeatureFactoryConfig): Route = path(GroupsBasePath / Segment) { value => + private def updateGroup(): Route = path(GroupsBasePath / Segment) { value => put { entity(as[ChangeGroupApiRequestADM]) { apiRequest => requestContext => val checkedGroupIri = @@ -204,11 +184,10 @@ class GroupsRouteADM(routeData: KnoraRouteData) val requestMessage = for { payload <- toFuture(validatedGroupUpdatePayload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield GroupChangeRequestADM( groupIri = checkedGroupIri, changeGroupRequest = payload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -216,7 +195,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -228,7 +206,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Updates the group's status. */ - private def changeGroupStatus(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeGroupStatus(): Route = path(GroupsBasePath / Segment / "status") { value => put { entity(as[ChangeGroupApiRequestADM]) { apiRequest => requestContext => @@ -247,14 +225,10 @@ class GroupsRouteADM(routeData: KnoraRouteData) } val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GroupChangeStatusRequestADM( groupIri = checkedGroupIri, changeGroupRequest = apiRequest, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -262,7 +236,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -274,20 +247,16 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Deletes a group (sets status to false). */ - private def deleteGroup(featureFactoryConfig: FeatureFactoryConfig): Route = path(GroupsBasePath / Segment) { value => + private def deleteGroup(): Route = path(GroupsBasePath / Segment) { value => delete { requestContext => val checkedGroupIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid group IRI $value")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GroupChangeStatusRequestADM( groupIri = checkedGroupIri, changeGroupRequest = ChangeGroupApiRequestADM(status = Some(false)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -295,7 +264,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala index f07cb0fb0f..2aa6dabd15 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala @@ -7,7 +7,6 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.admin.lists._ @@ -20,8 +19,8 @@ class ListsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) { private val deleteNodeRoute: DeleteListItemsRouteADM = new DeleteListItemsRouteADM(routeData) private val updateNodeRoute: UpdateListItemsRouteADM = new UpdateListItemsRouteADM(routeData) - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - oldListRoute.makeRoute(featureFactoryConfig) ~ - deleteNodeRoute.makeRoute(featureFactoryConfig) ~ - updateNodeRoute.makeRoute(featureFactoryConfig) + override def makeRoute(): Route = + oldListRoute.makeRoute() ~ + deleteNodeRoute.makeRoute() ~ + updateNodeRoute.makeRoute() } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala index 29d6bd12fb..a8a4ee75b1 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala @@ -7,7 +7,6 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.admin.permissions._ @@ -21,9 +20,9 @@ class PermissionsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeDat private val updatePermissionRoute: UpdatePermissionRouteADM = new UpdatePermissionRouteADM(routeData) private val deletePermissionRoute: DeletePermissionRouteADM = new DeletePermissionRouteADM(routeData) - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - createPermissionRoute.makeRoute(featureFactoryConfig) ~ - getPermissionRoute.makeRoute(featureFactoryConfig) ~ - updatePermissionRoute.makeRoute(featureFactoryConfig) ~ - deletePermissionRoute.makeRoute(featureFactoryConfig) + override def makeRoute(): Route = + createPermissionRoute.makeRoute() ~ + getPermissionRoute.makeRoute() ~ + updatePermissionRoute.makeRoute() ~ + deletePermissionRoute.makeRoute() } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala index 81e6f0aedc..1c7f105c0a 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala @@ -22,7 +22,7 @@ import io.swagger.annotations._ import org.knora.webapi.IRI import org.knora.webapi.annotation.ApiMayChange import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.projectsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -54,26 +54,26 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getProjects(featureFactoryConfig) ~ - addProject(featureFactoryConfig) ~ - getKeywords(featureFactoryConfig) ~ - getProjectKeywords(featureFactoryConfig) ~ - getProjectByIri(featureFactoryConfig) ~ - getProjectByShortname(featureFactoryConfig) ~ - getProjectByShortcode(featureFactoryConfig) ~ - changeProject(featureFactoryConfig) ~ - deleteProject(featureFactoryConfig) ~ - getProjectMembersByIri(featureFactoryConfig) ~ - getProjectMembersByShortname(featureFactoryConfig) ~ - getProjectMembersByShortcode(featureFactoryConfig) ~ - getProjectAdminMembersByIri(featureFactoryConfig) ~ - getProjectAdminMembersByShortname(featureFactoryConfig) ~ - getProjectAdminMembersByShortcode(featureFactoryConfig) ~ - getProjectRestrictedViewSettingsByIri(featureFactoryConfig) ~ - getProjectRestrictedViewSettingsByShortname(featureFactoryConfig) ~ - getProjectRestrictedViewSettingsByShortcode(featureFactoryConfig) ~ - getProjectData(featureFactoryConfig) + override def makeRoute(): Route = + getProjects() ~ + addProject() ~ + getKeywords() ~ + getProjectKeywords() ~ + getProjectByIri() ~ + getProjectByShortname() ~ + getProjectByShortcode() ~ + changeProject() ~ + deleteProject() ~ + getProjectMembersByIri() ~ + getProjectMembersByShortname() ~ + getProjectMembersByShortcode() ~ + getProjectAdminMembersByIri() ~ + getProjectAdminMembersByShortname() ~ + getProjectAdminMembersByShortcode() ~ + getProjectRestrictedViewSettingsByIri() ~ + getProjectRestrictedViewSettingsByShortname() ~ + getProjectRestrictedViewSettingsByShortcode() ~ + getProjectData() /* return all projects */ @ApiOperation( @@ -87,22 +87,19 @@ class ProjectsRouteADM(routeData: KnoraRouteData) new ApiResponse(code = 500, message = "Internal server error") ) ) - private def getProjects(featureFactoryConfig: FeatureFactoryConfig): Route = path(ProjectsBasePath) { + private def getProjects(): Route = path(ProjectsBasePath) { get { requestContext => val requestMessage: Future[ProjectsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectsGetRequestADM( - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -133,7 +130,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) new ApiResponse(code = 500, message = "Internal server error") ) ) - private def addProject(featureFactoryConfig: FeatureFactoryConfig): Route = path(ProjectsBasePath) { + private def addProject(): Route = path(ProjectsBasePath) { post { entity(as[CreateProjectApiRequestADM]) { apiRequest => requestContext => // zio prelude: validation @@ -154,10 +151,9 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectCreateRequestADM] = for { projectCreatePayload <- toFuture(projectCreatePayload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield ProjectCreateRequestADM( createRequest = projectCreatePayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -165,7 +161,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -175,22 +170,19 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } /* returns all unique keywords for all projects as a list */ - private def getKeywords(featureFactoryConfig: FeatureFactoryConfig): Route = path(ProjectsBasePath / "Keywords") { + private def getKeywords(): Route = path(ProjectsBasePath / "Keywords") { get { requestContext => val requestMessage: Future[ProjectsKeywordsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectsKeywordsGetRequestADM( - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -199,7 +191,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } /* returns all keywords for a single project */ - private def getProjectKeywords(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectKeywords(): Route = path(ProjectsBasePath / "iri" / Segment / "Keywords") { value => get { requestContext => val checkedProjectIri = @@ -207,19 +199,16 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectKeywordsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectKeywordsGetRequestADM( projectIri = checkedProjectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -230,27 +219,24 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /** * returns a single project identified through iri */ - private def getProjectByIri(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectByIri(): Route = path(ProjectsBasePath / "iri" / Segment) { value => get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) } yield ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(checkedProjectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -261,13 +247,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /** * returns a single project identified through shortname. */ - private def getProjectByShortname(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectByShortname(): Route = path(ProjectsBasePath / "shortname" / Segment) { value => get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) shortNameDec = stringFormatter.validateAndEscapeProjectShortname( value, @@ -276,14 +261,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } yield ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some(shortNameDec)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -294,13 +277,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /** * returns a single project identified through shortcode. */ - private def getProjectByShortcode(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectByShortcode(): Route = path(ProjectsBasePath / "shortcode" / Segment) { value => get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedShortcode = stringFormatter.validateAndEscapeProjectShortcode( value, @@ -309,14 +291,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } yield ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some(checkedShortcode)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -327,7 +307,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /** * update a project identified by iri */ - private def changeProject(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeProject(): Route = path(ProjectsBasePath / "iri" / Segment) { value => put { entity(as[ChangeProjectApiRequestADM]) { apiRequest => requestContext => @@ -338,13 +318,11 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectChangeRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectChangeRequestADM( projectIri = checkedProjectIri, changeProjectRequest = apiRequest.validateAndEscape, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -352,7 +330,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -365,7 +342,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: update project status to false */ @ApiMayChange - private def deleteProject(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteProject(): Route = path(ProjectsBasePath / "iri" / Segment) { value => delete { requestContext => val checkedProjectIri = @@ -373,13 +350,11 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectChangeRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectChangeRequestADM( projectIri = checkedProjectIri, changeProjectRequest = ChangeProjectApiRequestADM(status = Some(false)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -387,7 +362,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -399,27 +373,24 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: returns all members part of a project identified through iri */ @ApiMayChange - private def getProjectMembersByIri(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectMembersByIri(): Route = path(ProjectsBasePath / "iri" / Segment / "members") { value => get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) } yield ProjectMembersGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(checkedProjectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -431,13 +402,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: returns all members part of a project identified through shortname */ @ApiMayChange - private def getProjectMembersByShortname(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectMembersByShortname(): Route = path(ProjectsBasePath / "shortname" / Segment / "members") { value => get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) shortNameDec = stringFormatter.validateAndEscapeProjectShortname( value, @@ -446,14 +416,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } yield ProjectMembersGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some(shortNameDec)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -465,13 +433,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: returns all members part of a project identified through shortcode */ @ApiMayChange - private def getProjectMembersByShortcode(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectMembersByShortcode(): Route = path(ProjectsBasePath / "shortcode" / Segment / "members") { value => get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedShortcode = stringFormatter.validateAndEscapeProjectShortcode( value, @@ -480,14 +447,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } yield ProjectMembersGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some(checkedShortcode)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -499,27 +464,24 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: returns all admin members part of a project identified through iri */ @ApiMayChange - private def getProjectAdminMembersByIri(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectAdminMembersByIri(): Route = path(ProjectsBasePath / "iri" / Segment / "admin-members") { value => get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) } yield ProjectAdminMembersGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(checkedProjectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -531,13 +493,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: returns all admin members part of a project identified through shortname */ @ApiMayChange - private def getProjectAdminMembersByShortname(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectAdminMembersByShortname(): Route = path(ProjectsBasePath / "shortname" / Segment / "admin-members") { value => get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedShortname = stringFormatter.validateAndEscapeProjectShortname( value, @@ -546,14 +507,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } yield ProjectAdminMembersGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some(checkedShortname)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -565,13 +524,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * API MAY CHANGE: returns all admin members part of a project identified through shortcode */ @ApiMayChange - private def getProjectAdminMembersByShortcode(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectAdminMembersByShortcode(): Route = path(ProjectsBasePath / "shortcode" / Segment / "admin-members") { value => get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) checkedShortcode = stringFormatter.validateProjectShortcode( value, @@ -580,14 +538,12 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } yield ProjectAdminMembersGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some(checkedShortcode)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -599,25 +555,22 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * Returns the project's restricted view settings identified through IRI. */ @ApiMayChange - private def getProjectRestrictedViewSettingsByIri(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectRestrictedViewSettingsByIri(): Route = path(ProjectsBasePath / "iri" / Segment / "RestrictedViewSettings") { value: String => get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(value)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -629,26 +582,23 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * Returns the project's restricted view settings identified through shortname. */ @ApiMayChange - private def getProjectRestrictedViewSettingsByShortname(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectRestrictedViewSettingsByShortname(): Route = path(ProjectsBasePath / "shortname" / Segment / "RestrictedViewSettings") { value: String => get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) shortNameDec = java.net.URLDecoder.decode(value, "utf-8") } yield ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some(shortNameDec)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -660,24 +610,21 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * Returns the project's restricted view settings identified through shortcode. */ @ApiMayChange - private def getProjectRestrictedViewSettingsByShortcode(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectRestrictedViewSettingsByShortcode(): Route = path(ProjectsBasePath / "shortcode" / Segment / "RestrictedViewSettings") { value: String => get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some(value)), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -691,60 +638,44 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /** * Returns all ontologies, data, and configuration belonging to a project. */ - private def getProjectData(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectData(): Route = path(ProjectsBasePath / "iri" / Segment / "AllData") { projectIri: IRI => get { - featureFactoryConfig.makeHttpResponseHeader match { - case Some(featureToggleHeader) => - respondWithHeaders(projectDataHeader, featureToggleHeader) { - getProjectDataEntity( - projectIri = projectIri, - featureFactoryConfig = featureFactoryConfig - ) - } - - case None => - respondWithHeaders(projectDataHeader) { - getProjectDataEntity( - projectIri = projectIri, - featureFactoryConfig = featureFactoryConfig - ) - } + respondWithHeaders(projectDataHeader) { + getProjectDataEntity( + projectIri = projectIri + ) } - } } - private def getProjectDataEntity(projectIri: IRI, featureFactoryConfig: FeatureFactoryConfig): Route = { - requestContext => - val projectIdentifier = ProjectIdentifierADM(maybeIri = Some(projectIri)) + private def getProjectDataEntity(projectIri: IRI): Route = { requestContext => + val projectIdentifier = ProjectIdentifierADM(maybeIri = Some(projectIri)) - val httpEntityFuture: Future[HttpEntity.Chunked] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + val httpEntityFuture: Future[HttpEntity.Chunked] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) - requestMessage = ProjectDataGetRequestADM( - projectIdentifier = projectIdentifier, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + requestMessage = ProjectDataGetRequestADM( + projectIdentifier = projectIdentifier, + requestingUser = requestingUser + ) - responseMessage <- (appActor.ask(requestMessage)).mapTo[ProjectDataGetResponseADM] + responseMessage <- (appActor.ask(requestMessage)).mapTo[ProjectDataGetResponseADM] - // Stream the output file back to the client, then delete the file. + // Stream the output file back to the client, then delete the file. - source: Source[ByteString, Unit] = FileIO.fromPath(responseMessage.projectDataFile).watchTermination() { - case (_: Future[IOResult], result: Future[Done]) => - result.onComplete((_: Try[Done]) => - Files.delete(responseMessage.projectDataFile) - ) - } + source: Source[ByteString, Unit] = FileIO.fromPath(responseMessage.projectDataFile).watchTermination() { + case (_: Future[IOResult], result: Future[Done]) => + result.onComplete((_: Try[Done]) => + Files.delete(responseMessage.projectDataFile) + ) + } - httpEntity = HttpEntity(ContentTypes.`application/octet-stream`, source) - } yield httpEntity + httpEntity = HttpEntity(ContentTypes.`application/octet-stream`, source) + } yield httpEntity - requestContext.complete(httpEntityFuture) + requestContext.complete(httpEntityFuture) } } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala index 350f8590ed..d0991f85f4 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala @@ -8,7 +8,6 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.sipimessages.SipiFileInfoGetRequestADM import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -26,14 +25,11 @@ class SipiRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("admin" / "files" / Segments(2)) { projectIDAndFile: Seq[String] => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) projectID = stringFormatter.validateProjectShortcode( projectIDAndFile.head, throw BadRequestException(s"Invalid project ID: '${projectIDAndFile.head}'") @@ -46,14 +42,12 @@ class SipiRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with } yield SipiFileInfoGetRequestADM( projectID = projectID, filename = filename, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/StoreRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/StoreRouteADM.scala index 58dc7d104c..89a2fb63d6 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/StoreRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/StoreRouteADM.scala @@ -8,7 +8,6 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import io.swagger.annotations.Api -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.storesmessages.ResetTriplestoreContentRequestADM import org.knora.webapi.messages.admin.responder.storesmessages.StoresADMJsonProtocol import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject @@ -35,7 +34,7 @@ class StoreRouteADM(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = Route { + override def makeRoute(): Route = Route { path("admin" / "store") { get { requestContext => /** @@ -52,8 +51,7 @@ class StoreRouteADM(routeData: KnoraRouteData) parameter(Symbol("prependdefaults").as[Boolean] ? true) { prependDefaults => requestContext => val msg = ResetTriplestoreContentRequestADM( rdfDataObjects = apiRequest, - prependDefaults = prependDefaults, - featureFactoryConfig = featureFactoryConfig + prependDefaults = prependDefaults ) val requestMessage = Future.successful(msg) @@ -61,7 +59,6 @@ class StoreRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala index f45a9175d3..811f7a7b53 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala @@ -11,7 +11,7 @@ import akka.http.scaladsl.server.Route import io.swagger.annotations._ import org.knora.webapi.annotation.ApiMayChange import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.usersmessages.UsersADMJsonProtocol._ import org.knora.webapi.messages.admin.responder.usersmessages._ import org.knora.webapi.messages.util.KnoraSystemInstances @@ -43,26 +43,26 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getUsers(featureFactoryConfig) ~ - addUser(featureFactoryConfig) ~ - getUserByIri(featureFactoryConfig) ~ - getUserByEmail(featureFactoryConfig) ~ - getUserByUsername(featureFactoryConfig) ~ - changeUserBasicInformation(featureFactoryConfig) ~ - changeUserPassword(featureFactoryConfig) ~ - changeUserStatus(featureFactoryConfig) ~ - deleteUser(featureFactoryConfig) ~ - changeUserSystemAdminMembership(featureFactoryConfig) ~ - getUsersProjectMemberships(featureFactoryConfig) ~ - addUserToProjectMembership(featureFactoryConfig) ~ - removeUserFromProjectMembership(featureFactoryConfig) ~ - getUsersProjectAdminMemberships(featureFactoryConfig) ~ - addUserToProjectAdminMembership(featureFactoryConfig) ~ - removeUserFromProjectAdminMembership(featureFactoryConfig) ~ - getUsersGroupMemberships(featureFactoryConfig) ~ - addUserToGroupMembership(featureFactoryConfig) ~ - removeUserFromGroupMembership(featureFactoryConfig) + override def makeRoute(): Route = + getUsers() ~ + addUser() ~ + getUserByIri() ~ + getUserByEmail() ~ + getUserByUsername() ~ + changeUserBasicInformation() ~ + changeUserPassword() ~ + changeUserStatus() ~ + deleteUser() ~ + changeUserSystemAdminMembership() ~ + getUsersProjectMemberships() ~ + addUserToProjectMembership() ~ + removeUserFromProjectMembership() ~ + getUsersProjectAdminMemberships() ~ + addUserToProjectAdminMembership() ~ + removeUserFromProjectAdminMembership() ~ + getUsersGroupMemberships() ~ + addUserToGroupMembership() ~ + removeUserFromGroupMembership() @ApiOperation(value = "Get users", nickname = "getUsers", httpMethod = "GET", response = classOf[UsersGetResponseADM]) @ApiResponses( Array( @@ -70,22 +70,19 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ) ) /* return all users */ - def getUsers(featureFactoryConfig: FeatureFactoryConfig): Route = path(UsersBasePath) { + def getUsers(): Route = path(UsersBasePath) { get { requestContext => val requestMessage: Future[UsersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UsersGetRequestADM( - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -116,7 +113,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ) ) /* create a new user */ - def addUser(featureFactoryConfig: FeatureFactoryConfig): Route = path(UsersBasePath) { + def addUser(): Route = path(UsersBasePath) { post { entity(as[CreateUserApiRequestADM]) { apiRequest => requestContext => // get all values from request and make value objects from it @@ -145,10 +142,9 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserCreateRequestADM] = for { payload <- toFuture(validatedUserCreatePayload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield UserCreateRequestADM( userCreatePayloadADM = payload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -156,7 +152,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -168,54 +163,47 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * return a single user identified by iri */ - private def getUserByIri(featureFactoryConfig: FeatureFactoryConfig): Route = path(UsersBasePath / "iri" / Segment) { - userIri => - get { requestContext => - val requestMessage: Future[UserGetRequestADM] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield UserGetRequestADM( - identifier = UserIdentifierADM(maybeIri = Some(userIri)), - userInformationTypeADM = UserInformationTypeADM.Restricted, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + private def getUserByIri(): Route = path(UsersBasePath / "iri" / Segment) { userIri => + get { requestContext => + val requestMessage: Future[UserGetRequestADM] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield UserGetRequestADM( + identifier = UserIdentifierADM(maybeIri = Some(userIri)), + userInformationTypeADM = UserInformationTypeADM.Restricted, + requestingUser = requestingUser + ) - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log - ) - } + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } } /** * return a single user identified by email */ - private def getUserByEmail(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getUserByEmail(): Route = path(UsersBasePath / "email" / Segment) { userIri => get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserGetRequestADM( identifier = UserIdentifierADM(maybeEmail = Some(userIri)), userInformationTypeADM = UserInformationTypeADM.Restricted, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -226,25 +214,22 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * return a single user identified by username */ - private def getUserByUsername(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getUserByUsername(): Route = path(UsersBasePath / "username" / Segment) { userIri => get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserGetRequestADM( identifier = UserIdentifierADM(maybeUsername = Some(userIri)), userInformationTypeADM = UserInformationTypeADM.Restricted, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -256,7 +241,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: Change existing user's basic information. */ @ApiMayChange - private def changeUserBasicInformation(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeUserBasicInformation(): Route = path(UsersBasePath / "iri" / Segment / "BasicUserInformation") { userIri => put { entity(as[ChangeUserApiRequestADM]) { apiRequest => requestContext => @@ -293,13 +278,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /* the api request is already checked at time of creation. see case class. */ val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserChangeBasicInformationRequestADM( userIri = checkedUserIri, userUpdateBasicInformationPayload = userUpdatePayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -307,7 +290,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -320,7 +302,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: Change user's password. */ @ApiMayChange - private def changeUserPassword(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeUserPassword(): Route = path(UsersBasePath / "iri" / Segment / "Password") { userIri => put { entity(as[ChangeUserPasswordApiRequestADM]) { apiRequest => requestContext => @@ -348,13 +330,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserChangePasswordRequestADM( userIri = checkedUserIri, userUpdatePasswordPayload = UserUpdatePasswordPayloadADM(requesterPassword, changedPassword), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -362,7 +342,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -375,7 +354,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: Change user's status. */ @ApiMayChange - private def changeUserStatus(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeUserStatus(): Route = path(UsersBasePath / "iri" / Segment / "Status") { userIri => put { entity(as[ChangeUserApiRequestADM]) { apiRequest => requestContext => @@ -399,13 +378,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserChangeStatusRequestADM( userIri = checkedUserIri, status = newStatus, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -413,7 +390,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -426,54 +402,50 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: delete a user identified by iri (change status to false). */ @ApiMayChange - private def deleteUser(featureFactoryConfig: FeatureFactoryConfig): Route = path(UsersBasePath / "iri" / Segment) { - userIri => - delete { requestContext => - if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") + private def deleteUser(): Route = path(UsersBasePath / "iri" / Segment) { userIri => + delete { requestContext => + if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") - val checkedUserIri = - stringFormatter.validateAndEscapeUserIri(userIri, throw BadRequestException(s"Invalid user IRI $userIri")) + val checkedUserIri = + stringFormatter.validateAndEscapeUserIri(userIri, throw BadRequestException(s"Invalid user IRI $userIri")) - if ( - checkedUserIri.equals(KnoraSystemInstances.Users.SystemUser.id) || checkedUserIri.equals( - KnoraSystemInstances.Users.AnonymousUser.id - ) - ) { - throw BadRequestException("Changes to built-in users are not allowed.") - } + if ( + checkedUserIri.equals(KnoraSystemInstances.Users.SystemUser.id) || checkedUserIri.equals( + KnoraSystemInstances.Users.AnonymousUser.id + ) + ) { + throw BadRequestException("Changes to built-in users are not allowed.") + } - /* update existing user's status to false */ - val status = UserStatus.make(false).fold(error => throw error.head, value => value) + /* update existing user's status to false */ + val status = UserStatus.make(false).fold(error => throw error.head, value => value) - val requestMessage: Future[UserChangeStatusRequestADM] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield UserChangeStatusRequestADM( - userIri = checkedUserIri, - status = status, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser, - apiRequestID = UUID.randomUUID() - ) + val requestMessage: Future[UserChangeStatusRequestADM] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield UserChangeStatusRequestADM( + userIri = checkedUserIri, + status = status, + requestingUser = requestingUser, + apiRequestID = UUID.randomUUID() + ) - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log - ) - } + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } } /** * API MAY CHANGE: Change user's SystemAdmin membership. */ @ApiMayChange - private def changeUserSystemAdminMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeUserSystemAdminMembership(): Route = path(UsersBasePath / "iri" / Segment / "SystemAdmin") { userIri => put { entity(as[ChangeUserApiRequestADM]) { apiRequest => requestContext => @@ -497,13 +469,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserChangeSystemAdminMembershipStatusRequestADM( userIri = checkedUserIri, systemAdmin = newSystemAdmin, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -511,7 +481,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -524,7 +493,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: get user's project memberships */ @ApiMayChange - private def getUsersProjectMemberships(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getUsersProjectMemberships(): Route = path(UsersBasePath / "iri" / Segment / "project-memberships") { userIri => get { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -534,19 +503,16 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectMembershipsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserProjectMembershipsGetRequestADM( userIri = checkedUserIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -558,7 +524,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: add user to project */ @ApiMayChange - private def addUserToProjectMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def addUserToProjectMembership(): Route = path(UsersBasePath / "iri" / Segment / "project-memberships" / Segment) { (userIri, projectIri) => post { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -582,13 +548,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectMembershipAddRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserProjectMembershipAddRequestADM( userIri = checkedUserIri, projectIri = checkedProjectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -596,7 +560,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -608,7 +571,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: remove user from project (and all groups belonging to this project) */ @ApiMayChange - private def removeUserFromProjectMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def removeUserFromProjectMembership(): Route = path(UsersBasePath / "iri" / Segment / "project-memberships" / Segment) { (userIri, projectIri) => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -632,13 +595,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectMembershipRemoveRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserProjectMembershipRemoveRequestADM( userIri = checkedUserIri, projectIri = checkedProjectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -646,7 +607,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -658,7 +618,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: get user's project admin memberships */ @ApiMayChange - private def getUsersProjectAdminMemberships(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getUsersProjectAdminMemberships(): Route = path(UsersBasePath / "iri" / Segment / "project-admin-memberships") { userIri => get { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -668,12 +628,10 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectAdminMembershipsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserProjectAdminMembershipsGetRequestADM( userIri = checkedUserIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -681,7 +639,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -693,7 +650,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: add user to project admin */ @ApiMayChange - private def addUserToProjectAdminMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def addUserToProjectAdminMembership(): Route = path(UsersBasePath / "iri" / Segment / "project-admin-memberships" / Segment) { (userIri, projectIri) => post { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -717,13 +674,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectAdminMembershipAddRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserProjectAdminMembershipAddRequestADM( userIri = checkedUserIri, projectIri = checkedProjectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -731,7 +686,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -743,7 +697,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: remove user from project admin membership */ @ApiMayChange - private def removeUserFromProjectAdminMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def removeUserFromProjectAdminMembership(): Route = path(UsersBasePath / "iri" / Segment / "project-admin-memberships" / Segment) { (userIri, projectIri) => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -767,13 +721,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectAdminMembershipRemoveRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserProjectAdminMembershipRemoveRequestADM( userIri = checkedUserIri, projectIri = checkedProjectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -781,7 +733,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -793,7 +744,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: get user's group memberships */ @ApiMayChange - private def getUsersGroupMemberships(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getUsersGroupMemberships(): Route = path(UsersBasePath / "iri" / Segment / "group-memberships") { userIri => get { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -803,19 +754,16 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserGroupMembershipsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserGroupMembershipsGetRequestADM( userIri = checkedUserIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -827,7 +775,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: add user to group */ @ApiMayChange - private def addUserToGroupMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def addUserToGroupMembership(): Route = path(UsersBasePath / "iri" / Segment / "group-memberships" / Segment) { (userIri, groupIri) => post { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -848,13 +796,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserGroupMembershipAddRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserGroupMembershipAddRequestADM( userIri = checkedUserIri, groupIri = checkedGroupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -862,7 +808,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -874,7 +819,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: remove user from group */ @ApiMayChange - private def removeUserFromGroupMembership(featureFactoryConfig: FeatureFactoryConfig): Route = + private def removeUserFromGroupMembership(): Route = path(UsersBasePath / "iri" / Segment / "group-memberships" / Segment) { (userIri, groupIri) => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -895,13 +840,11 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserGroupMembershipRemoveRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield UserGroupMembershipRemoveRequestADM( userIri = checkedUserIri, groupIri = checkedGroupIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -909,7 +852,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala index b238bb3c2c..abc309d3fa 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala @@ -9,8 +9,7 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import dsp.errors.BadRequestException -import org.knora.webapi.feature.Feature -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -31,19 +30,18 @@ object DeleteListItemsRouteADM { */ class DeleteListItemsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) - with Feature with Authenticator with ListADMJsonProtocol { import DeleteListItemsRouteADM._ - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - deleteListItem(featureFactoryConfig) ~ - canDeleteList(featureFactoryConfig) ~ - deleteListNodeComments(featureFactoryConfig) + def makeRoute(): Route = + deleteListItem() ~ + canDeleteList() ~ + deleteListNodeComments() /* delete list (i.e. root node) or a child node which should also delete its children */ - private def deleteListItem(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath / Segment) { iri => + private def deleteListItem(): Route = path(ListsBasePath / Segment) { iri => delete { /* delete a list item root node or child if unused */ requestContext => @@ -51,10 +49,9 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list item Iri: $iri")) val requestMessage: Future[ListItemDeleteRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield ListItemDeleteRequestADM( nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -62,7 +59,6 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -73,24 +69,22 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) /** * Checks if a list can be deleted (none of its nodes is used in data). */ - private def canDeleteList(featureFactoryConfig: FeatureFactoryConfig): Route = + private def canDeleteList(): Route = path(ListsBasePath / "candelete" / Segment) { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list IRI: $iri")) val requestMessage: Future[CanDeleteListRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield CanDeleteListRequestADM( iri = listIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -101,24 +95,22 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) /** * Deletes all comments from requested list node (only child). */ - private def deleteListNodeComments(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteListNodeComments(): Route = path(ListsBasePath / "comments" / Segment) { iri => delete { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list IRI: $iri")) val requestMessage: Future[ListNodeCommentsDeleteRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield ListNodeCommentsDeleteRequestADM( iri = listIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala index 220290cb50..f1c8e5edec 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala @@ -12,8 +12,7 @@ import io.swagger.annotations._ import org.knora.webapi.IRI import dsp.errors.BadRequestException import dsp.errors.ForbiddenException -import org.knora.webapi.feature.Feature -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages._ @@ -43,21 +42,20 @@ object OldListsRouteADMFeature { @Path("/admin/lists") class OldListsRouteADMFeature(routeData: KnoraRouteData) extends KnoraRoute(routeData) - with Feature with Authenticator with ListADMJsonProtocol { import OldListsRouteADMFeature._ - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getLists(featureFactoryConfig) ~ - getListNode(featureFactoryConfig) ~ - getListOrNodeInfo(featureFactoryConfig, "infos") ~ - getListOrNodeInfo(featureFactoryConfig, "nodes") ~ - getListInfo(featureFactoryConfig) ~ - createListRootNode(featureFactoryConfig) ~ - createListChildNode(featureFactoryConfig) ~ - updateList(featureFactoryConfig) + def makeRoute(): Route = + getLists() ~ + getListNode() ~ + getListOrNodeInfo("infos") ~ + getListOrNodeInfo("nodes") ~ + getListInfo() ~ + createListRootNode() ~ + createListChildNode() ~ + updateList() @ApiOperation(value = "Get lists", nickname = "getlists", httpMethod = "GET", response = classOf[ListsGetResponseADM]) @ApiResponses( @@ -68,7 +66,7 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Returns all lists optionally filtered by project. */ - private def getLists(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath) { + private def getLists(): Route = path(ListsBasePath) { get { parameters("projectIri".?) { maybeProjectIri: Option[IRI] => requestContext => val projectIri = @@ -79,19 +77,16 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) val requestMessage: Future[ListsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ListsGetRequestADM( projectIri = projectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -110,26 +105,23 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Returns a list node, root or child, with children (if exist). */ - private def getListNode(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath / Segment) { iri => + private def getListNode(): Route = path(ListsBasePath / Segment) { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) val requestMessage: Future[ListGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ListGetRequestADM( iri = listIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -140,23 +132,21 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Returns basic information about list node, root or child, w/o children (if exist). */ - private def getListOrNodeInfo(featureFactoryConfig: FeatureFactoryConfig, routeSwitch: String): Route = + private def getListOrNodeInfo(routeSwitch: String): Route = path(ListsBasePath / routeSwitch / Segment) { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) val requestMessage: Future[ListNodeInfoGetRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield ListNodeInfoGetRequestADM( iri = listIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -167,7 +157,7 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Returns basic information about a node, root or child, w/o children. */ - private def getListInfo(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getListInfo(): Route = // Brought from new lists route implementation, has the e functionality as getListOrNodeInfo path(ListsBasePath / Segment / "info") { iri => get { requestContext => @@ -175,17 +165,15 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) val requestMessage: Future[ListNodeInfoGetRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield ListNodeInfoGetRequestADM( iri = listIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -218,7 +206,7 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Creates a new list (root node). */ - private def createListRootNode(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath) { + private def createListRootNode(): Route = path(ListsBasePath) { post { entity(as[ListRootNodeCreateApiRequestADM]) { apiRequest => requestContext => val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) @@ -231,7 +219,7 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) val requestMessage: Future[ListRootNodeCreateRequestADM] = for { payload <- toFuture(validatedListRootNodeCreatePayload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) // check if the requesting user is allowed to perform operation _ = if ( @@ -244,7 +232,6 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) } } yield ListRootNodeCreateRequestADM( createRootNode = payload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -252,7 +239,6 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -287,58 +273,55 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Creates a new list child node. */ - private def createListChildNode(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath / Segment) { - iri => - post { - entity(as[ListChildNodeCreateApiRequestADM]) { apiRequest => requestContext => - // check if requested ListIri matches the Iri passed in the route - val parentNodeIri: Validation[Throwable, ListIri] = if (iri == apiRequest.parentNodeIri) { - ListIri.make(apiRequest.parentNodeIri) - } else { - Validation.fail(throw BadRequestException("Route and payload parentNodeIri mismatch.")) - } - - val id: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) - val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) - val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) - val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) - val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) - val comments: Validation[Throwable, Option[Comments]] = Comments.make(apiRequest.comments) - val validatedCreateChildNodePeyload: Validation[Throwable, ListChildNodeCreatePayloadADM] = - Validation.validateWith(id, parentNodeIri, projectIri, name, position, labels, comments)( - ListChildNodeCreatePayloadADM - ) - - val requestMessage: Future[ListChildNodeCreateRequestADM] = for { - payload <- toFuture(validatedCreateChildNodePeyload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) - - // check if the requesting user is allowed to perform operation - _ = if ( - !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value - ) && !requestingUser.permissions.isSystemAdmin - ) { - // not project or a system admin - throw ForbiddenException(ListErrorMessages.ListCreatePermission) - } - } yield ListChildNodeCreateRequestADM( - createChildNodeRequest = payload, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser, - apiRequestID = UUID.randomUUID() - ) + private def createListChildNode(): Route = path(ListsBasePath / Segment) { iri => + post { + entity(as[ListChildNodeCreateApiRequestADM]) { apiRequest => requestContext => + // check if requested ListIri matches the Iri passed in the route + val parentNodeIri: Validation[Throwable, ListIri] = if (iri == apiRequest.parentNodeIri) { + ListIri.make(apiRequest.parentNodeIri) + } else { + Validation.fail(throw BadRequestException("Route and payload parentNodeIri mismatch.")) + } - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log + val id: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) + val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) + val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) + val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) + val comments: Validation[Throwable, Option[Comments]] = Comments.make(apiRequest.comments) + val validatedCreateChildNodePeyload: Validation[Throwable, ListChildNodeCreatePayloadADM] = + Validation.validateWith(id, parentNodeIri, projectIri, name, position, labels, comments)( + ListChildNodeCreatePayloadADM ) - } + + val requestMessage: Future[ListChildNodeCreateRequestADM] = for { + payload <- toFuture(validatedCreateChildNodePeyload) + requestingUser <- getUserADM(requestContext) + + // check if the requesting user is allowed to perform operation + _ = if ( + !requestingUser.permissions.isProjectAdmin( + projectIri.toOption.get.value + ) && !requestingUser.permissions.isSystemAdmin + ) { + // not project or a system admin + throw ForbiddenException(ListErrorMessages.ListCreatePermission) + } + } yield ListChildNodeCreateRequestADM( + createChildNodeRequest = payload, + requestingUser = requestingUser, + apiRequestID = UUID.randomUUID() + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) } + } } @Path("/{IRI}") @@ -367,7 +350,7 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) /** * Updates existing list node, either root or child. */ - private def updateList(featureFactoryConfig: FeatureFactoryConfig): Route = path(ListsBasePath / Segment) { iri => + private def updateList(): Route = path(ListsBasePath / Segment) { iri => put { entity(as[ListNodeChangeApiRequestADM]) { apiRequest => requestContext => // check if requested Iri matches the route Iri @@ -391,7 +374,7 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) val requestMessage: Future[NodeInfoChangeRequestADM] = for { payload <- toFuture(validatedChangeNodeInfoPayload) - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) // check if the requesting user is allowed to perform operation _ = if ( !requestingUser.permissions.isProjectAdmin( @@ -404,7 +387,6 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) } yield NodeInfoChangeRequestADM( listIri = listIri.toOption.get.value, changeNodeRequest = payload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -412,7 +394,6 @@ class OldListsRouteADMFeature(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index 0a438e90ff..e143da900d 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -10,8 +10,7 @@ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.Feature -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -34,17 +33,16 @@ object UpdateListItemsRouteADM { */ class UpdateListItemsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) - with Feature with Authenticator with ListADMJsonProtocol { import UpdateListItemsRouteADM._ - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - updateNodeName(featureFactoryConfig) ~ - updateNodeLabels(featureFactoryConfig) ~ - updateNodeComments(featureFactoryConfig) ~ - updateNodePosition(featureFactoryConfig) + def makeRoute(): Route = + updateNodeName() ~ + updateNodeLabels() ~ + updateNodeComments() ~ + updateNodePosition() @Path("/{IRI}/name") @ApiOperation( @@ -72,7 +70,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) /** * Update name of an existing list node, either root or child. */ - private def updateNodeName(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updateNodeName(): Route = path(ListsBasePath / Segment / "name") { iri => put { entity(as[ChangeNodeNameApiRequestADM]) { apiRequest => requestContext => @@ -83,11 +81,10 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) NodeNameChangePayloadADM(ListName.make(apiRequest.name).fold(e => throw e.head, v => v)) val requestMessage: Future[NodeNameChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield NodeNameChangeRequestADM( nodeIri = nodeIri, changeNodeNameRequest = namePayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -95,7 +92,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -130,7 +126,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) /** * Update labels of an existing list node, either root or child. */ - private def updateNodeLabels(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updateNodeLabels(): Route = path(ListsBasePath / Segment / "labels") { iri => put { entity(as[ChangeNodeLabelsApiRequestADM]) { apiRequest => requestContext => @@ -141,11 +137,10 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) NodeLabelsChangePayloadADM(Labels.make(apiRequest.labels).fold(e => throw e.head, v => v)) val requestMessage: Future[NodeLabelsChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield NodeLabelsChangeRequestADM( nodeIri = nodeIri, changeNodeLabelsRequest = labelsPayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -153,7 +148,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -188,7 +182,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) /** * Updates comments of an existing list node, either root or child. */ - private def updateNodeComments(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updateNodeComments(): Route = path(ListsBasePath / Segment / "comments") { iri => put { entity(as[ChangeNodeCommentsApiRequestADM]) { apiRequest => requestContext => @@ -199,11 +193,10 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) NodeCommentsChangePayloadADM(Comments.make(apiRequest.comments).fold(e => throw e.head, v => v)) val requestMessage: Future[NodeCommentsChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield NodeCommentsChangeRequestADM( nodeIri = nodeIri, changeNodeCommentsRequest = commentsPayload, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -211,7 +204,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -246,7 +238,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) /** * Updates position of an existing list child node. */ - private def updateNodePosition(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updateNodePosition(): Route = path(ListsBasePath / Segment / "position") { iri => put { entity(as[ChangeNodePositionApiRequestADM]) { apiRequest => requestContext => @@ -254,11 +246,10 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param node IRI: $iri")) val requestMessage: Future[NodePositionChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext, featureFactoryConfig) + requestingUser <- getUserADM(requestContext) } yield NodePositionChangeRequestADM( nodeIri = nodeIri, changeNodePositionRequest = apiRequest, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -266,7 +257,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala index ab86dcf78f..e4d0dabbe8 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -36,26 +35,22 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - createAdministrativePermission(featureFactoryConfig) ~ - createDefaultObjectAccessPermission(featureFactoryConfig) + override def makeRoute(): Route = + createAdministrativePermission() ~ + createDefaultObjectAccessPermission() /** * Create a new administrative permission */ - private def createAdministrativePermission(featureFactoryConfig: FeatureFactoryConfig): Route = + private def createAdministrativePermission(): Route = path(PermissionsBasePath / "ap") { post { /* create a new administrative permission */ entity(as[CreateAdministrativePermissionAPIRequestADM]) { apiRequest => requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield AdministrativePermissionCreateRequestADM( createRequest = apiRequest, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -63,7 +58,6 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -75,19 +69,15 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) /** * Create default object access permission */ - private def createDefaultObjectAccessPermission(featureFactoryConfig: FeatureFactoryConfig): Route = + private def createDefaultObjectAccessPermission(): Route = path(PermissionsBasePath / "doap") { post { /* create a new default object access permission */ entity(as[CreateDefaultObjectAccessPermissionAPIRequestADM]) { apiRequest => requestContext => val requestMessage: Future[DefaultObjectAccessPermissionCreateRequestADM] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield DefaultObjectAccessPermissionCreateRequestADM( createRequest = apiRequest, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -95,7 +85,6 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala index 4d6b0dd1cd..91cb0dd588 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -35,20 +34,17 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - deletePermission(featureFactoryConfig) + override def makeRoute(): Route = + deletePermission() /** * Delete a permission */ - private def deletePermission(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deletePermission(): Route = path(PermissionsBasePath / Segment) { iri => delete { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield PermissionDeleteRequestADM( permissionIri = iri, requestingUser = requestingUser, @@ -58,7 +54,6 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala index f1d4f7a9b7..6c12d8103d 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -35,26 +34,22 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getAdministrativePermissionForProjectGroup(featureFactoryConfig) ~ - getAdministrativePermissionsForProject(featureFactoryConfig) ~ - getDefaultObjectAccessPermissionsForProject(featureFactoryConfig) ~ - getPermissionsForProject(featureFactoryConfig) + override def makeRoute(): Route = + getAdministrativePermissionForProjectGroup() ~ + getAdministrativePermissionsForProject() ~ + getDefaultObjectAccessPermissionsForProject() ~ + getPermissionsForProject() - private def getAdministrativePermissionForProjectGroup(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getAdministrativePermissionForProjectGroup(): Route = path(PermissionsBasePath / "ap" / Segment / Segment) { (projectIri, groupIri) => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield AdministrativePermissionForProjectGroupGetRequestADM(projectIri, groupIri, requestingUser) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -62,14 +57,11 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) } } - private def getAdministrativePermissionsForProject(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getAdministrativePermissionsForProject(): Route = path(PermissionsBasePath / "ap" / Segment) { projectIri => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield AdministrativePermissionsForProjectGetRequestADM( projectIri = projectIri, requestingUser = requestingUser, @@ -79,7 +71,6 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -87,14 +78,11 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) } } - private def getDefaultObjectAccessPermissionsForProject(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getDefaultObjectAccessPermissionsForProject(): Route = path(PermissionsBasePath / "doap" / Segment) { projectIri => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield DefaultObjectAccessPermissionsForProjectGetRequestADM( projectIri = projectIri, requestingUser = requestingUser, @@ -104,7 +92,6 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -112,17 +99,13 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) } } - private def getPermissionsForProject(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getPermissionsForProject(): Route = path(PermissionsBasePath / Segment) { projectIri => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield PermissionsForProjectGetRequestADM( projectIri = projectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() ) @@ -130,7 +113,6 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala index a10186926a..8134818e24 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -36,16 +35,16 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - updatePermissionGroup(featureFactoryConfig) ~ - updatePermissionHasPermissions(featureFactoryConfig) ~ - updatePermissionResourceClass(featureFactoryConfig) ~ - updatePermissionProperty(featureFactoryConfig) + override def makeRoute(): Route = + updatePermissionGroup() ~ + updatePermissionHasPermissions() ~ + updatePermissionResourceClass() ~ + updatePermissionProperty() /** * Update a permission's group */ - private def updatePermissionGroup(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updatePermissionGroup(): Route = path(PermissionsBasePath / Segment / "group") { iri => put { entity(as[ChangePermissionGroupApiRequestADM]) { apiRequest => requestContext => @@ -53,10 +52,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield PermissionChangeGroupRequestADM( permissionIri = permissionIri, changePermissionGroupRequest = apiRequest, @@ -67,7 +63,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -79,7 +74,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) /** * Update a permission's set of hasPermissions. */ - private def updatePermissionHasPermissions(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updatePermissionHasPermissions(): Route = path(PermissionsBasePath / Segment / "hasPermissions") { iri => put { entity(as[ChangePermissionHasPermissionsApiRequestADM]) { apiRequest => requestContext => @@ -87,10 +82,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield PermissionChangeHasPermissionsRequestADM( permissionIri = permissionIri, changePermissionHasPermissionsRequest = apiRequest, @@ -101,7 +93,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -113,7 +104,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) /** * Update a doap permission by setting it for a new resource class */ - private def updatePermissionResourceClass(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updatePermissionResourceClass(): Route = path(PermissionsBasePath / Segment / "resourceClass") { iri => put { entity(as[ChangePermissionResourceClassApiRequestADM]) { apiRequest => requestContext => @@ -121,10 +112,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield PermissionChangeResourceClassRequestADM( permissionIri = permissionIri, changePermissionResourceClassRequest = apiRequest, @@ -135,7 +123,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -147,7 +134,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) /** * Update a doap permission by setting it for a new property class */ - private def updatePermissionProperty(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updatePermissionProperty(): Route = path(PermissionsBasePath / Segment / "property") { iri => put { entity(as[ChangePermissionPropertyApiRequestADM]) { apiRequest => requestContext => @@ -155,10 +142,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield PermissionChangePropertyRequestADM( permissionIri = permissionIri, changePermissionPropertyRequest = apiRequest, @@ -169,7 +153,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala index af1695beb8..402fc06c20 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData @@ -31,7 +30,7 @@ class AssetsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v1" / "assets" / Remaining) { assetId => get { requestContext => requestContext.complete { diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/AuthenticationRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/AuthenticationRouteV1.scala index e63c2a901a..8d28bdcae2 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/AuthenticationRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/AuthenticationRouteV1.scala @@ -7,7 +7,6 @@ package org.knora.webapi.routing.v1 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData @@ -20,14 +19,11 @@ class AuthenticationRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeD /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v1" / "authenticate") { get { requestContext => requestContext.complete { - doAuthenticateV1( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + doAuthenticateV1(requestContext) } } } ~ path("v1" / "session") { @@ -37,23 +33,14 @@ class AuthenticationRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeD if (params.contains("logout")) { doLogoutV2(requestContext) } else if (params.contains("login")) { - doLoginV1( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + doLoginV1(requestContext) } else { - doAuthenticateV1( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + doAuthenticateV1(requestContext) } } } ~ post { requestContext => requestContext.complete { - doLoginV1( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + doLoginV1(requestContext) } } ~ delete { requestContext => requestContext.complete { diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/CkanRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/CkanRouteV1.scala index 8358688b3a..3d9b318a88 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/CkanRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/CkanRouteV1.scala @@ -7,7 +7,6 @@ package org.knora.webapi.routing.v1 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.ckanmessages.CkanRequestV1 import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -22,14 +21,11 @@ class CkanRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v1" / "ckan") { get { requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + userProfile <- getUserADM(requestContext) params = requestContext.request.uri.query().toMap project: Option[Seq[String]] = params.get("project").map(_.split(",").toSeq) limit: Option[Int] = params.get("limit").map(_.toInt) @@ -38,7 +34,6 @@ class CkanRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with projects = project, limit = limit, info = info, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/ListsRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/ListsRouteV1.scala index 3f926b5fd7..34209a2a34 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/ListsRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/ListsRouteV1.scala @@ -8,7 +8,6 @@ package org.knora.webapi.routing.v1 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.v1.responder.listmessages._ import org.knora.webapi.routing.Authenticator @@ -24,17 +23,14 @@ class ListsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { + override def makeRoute(): Route = { val stringFormatter = StringFormatter.getGeneralInstance path("v1" / "hlists" / Segment) { iri => get { requestContext => val requestMessageFuture = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) listIri = stringFormatter.validateAndEscapeIri( iri, throw BadRequestException(s"Invalid param list IRI: $iri") @@ -59,10 +55,7 @@ class ListsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with path("v1" / "selections" / Segment) { iri => get { requestContext => val requestMessageFuture = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) selIri = stringFormatter.validateAndEscapeIri( iri, throw BadRequestException(s"Invalid param list IRI: $iri") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/ProjectsRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/ProjectsRouteV1.scala index 1d9bf80555..a64d58ee26 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/ProjectsRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/ProjectsRouteV1.scala @@ -8,7 +8,6 @@ package org.knora.webapi.routing.v1 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.projectmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -23,18 +22,14 @@ class ProjectsRouteV1(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v1" / "projects") { get { /* returns all projects */ requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) } yield ProjectsGetRequestV1( - featureFactoryConfig = featureFactoryConfig, userProfile = Some(userProfile) ) @@ -53,26 +48,18 @@ class ProjectsRouteV1(routeData: KnoraRouteData) val requestMessage = if (identifier != "iri") { // identify project by shortname. val shortNameDec = java.net.URLDecoder.decode(value, "utf-8") for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) } yield ProjectInfoByShortnameGetRequestV1( shortname = shortNameDec, - featureFactoryConfig = featureFactoryConfig, userProfileV1 = Some(userProfile) ) } else { // identify project by iri. this is the default case. val checkedProjectIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid project IRI $value")) for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) } yield ProjectInfoByIRIGetRequestV1( iri = checkedProjectIri, - featureFactoryConfig = featureFactoryConfig, userProfileV1 = Some(userProfile) ) } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourceTypesRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourceTypesRouteV1.scala index b3bbdcf4ed..ecfbfb1d55 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourceTypesRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourceTypesRouteV1.scala @@ -8,7 +8,6 @@ package org.knora.webapi.routing.v1 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.ontologymessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -23,21 +22,19 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { + override def makeRoute(): Route = { path("v1" / "resourcetypes" / Segment) { iri => get { requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + userProfile <- getUserADM(requestContext) // TODO: Check that this is the IRI of a resource type and not just any IRI - resourceTypeIri = stringFormatter.validateAndEscapeIri( - iri, - throw BadRequestException(s"Invalid resource class IRI: $iri") - ) + resourceTypeIri = + stringFormatter.validateAndEscapeIri( + iri, + throw BadRequestException(s"Invalid resource class IRI: $iri") + ) } yield ResourceTypeGetRequestV1(resourceTypeIri, userProfile) @@ -52,11 +49,8 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "resourcetypes") { get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - params = requestContext.request.uri.query().toMap + userADM <- getUserADM(requestContext) + params = requestContext.request.uri.query().toMap vocabularyId = params.getOrElse( "vocabulary", @@ -76,7 +70,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } yield ResourceTypesForNamedGraphGetRequestV1( namedGraph = namedGraphIri, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) @@ -92,11 +85,8 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "propertylists") { get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - params = requestContext.request.uri.query().toMap + userADM <- getUserADM(requestContext) + params = requestContext.request.uri.query().toMap vocabularyId: Option[String] = params.get("vocabulary") resourcetypeId: Option[String] = params.get("restype") @@ -108,7 +98,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa case Some("0") => // 0 means that all named graphs should be queried PropertyTypesForNamedGraphGetRequestV1( namedGraph = None, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) @@ -119,7 +108,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa ) PropertyTypesForNamedGraphGetRequestV1( namedGraph = Some(namedGraphIri), - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) @@ -134,7 +122,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa case None => // no params given, get all property types (behaves like vocbulary=0) PropertyTypesForNamedGraphGetRequestV1( namedGraph = None, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) } @@ -152,14 +139,8 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "vocabularies") { get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield NamedGraphsGetRequestV1( - featureFactoryConfig = featureFactoryConfig, - userADM = userADM - ) + userADM <- getUserADM(requestContext) + } yield NamedGraphsGetRequestV1(userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, @@ -173,14 +154,8 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "vocabularies" / "reload") { get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield LoadOntologiesRequestV1( - featureFactoryConfig = featureFactoryConfig, - userADM = userADM - ) + userADM <- getUserADM(requestContext) + } yield LoadOntologiesRequestV1(userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, @@ -193,10 +168,7 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "subclasses" / Segment) { iri => get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + userADM <- getUserADM(requestContext) // TODO: Check that this is the IRI of a resource type and not just any IRI resourceClassIri = stringFormatter.validateAndEscapeIri( diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourcesRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourcesRouteV1.scala index 5bd9003036..84e70320d5 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourcesRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/ResourcesRouteV1.scala @@ -16,7 +16,7 @@ import dsp.errors.AssertionException import dsp.errors.BadRequestException import dsp.errors.ForbiddenException import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -70,7 +70,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { + override def makeRoute(): Route = { def makeResourceRequestMessage( resIri: String, @@ -85,21 +85,18 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) case "info" => ResourceInfoGetRequestV1( iri = validResIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) case "rights" => ResourceRightsGetRequestV1( iri = validResIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) case "context" => ResourceContextGetRequestV1( iri = validResIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM, resinfo = resinfo ) @@ -107,7 +104,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) case "" => ResourceFullGetRequestV1( iri = validResIri, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) @@ -178,7 +174,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) acceptStandoffLinksToClientIDs = acceptStandoffLinksToClientIDs, userProfile = userProfile, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -301,7 +296,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) def makeCreateResourceRequestMessage( apiRequest: CreateResourceApiRequestV1, - featureFactoryConfig: FeatureFactoryConfig, userADM: UserADM ): Future[ResourceCreateRequestV1] = { val projectIri = stringFormatter.validateAndEscapeIri( @@ -324,7 +318,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) .ask( ProjectGetRequestADM( ProjectIdentifierADM(maybeIri = Some(projectIri)), - featureFactoryConfig = featureFactoryConfig, requestingUser = userADM ) ) @@ -374,7 +367,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) projectIri = projectIri, values = valuesToBeCreated, file = file, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM, apiRequestID = UUID.randomUUID ) @@ -437,7 +429,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) resourceRequest: Seq[CreateResourceFromXmlImportRequestV1], projectId: IRI, apiRequestID: UUID, - featureFactoryConfig: FeatureFactoryConfig, userProfile: UserADM ): Future[MultipleResourceCreateRequestV1] = { // Make sure there are no duplicate client resource IDs. @@ -459,7 +450,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) .ask( ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(projectId)), - featureFactoryConfig = featureFactoryConfig, requestingUser = userProfile ) ) @@ -479,7 +469,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) } yield MultipleResourceCreateRequestV1( resourcesToCreate = resToCreateCollection, projectIri = projectId, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, apiRequestID = apiRequestID ) @@ -488,7 +477,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) def makeGetPropertiesRequestMessage(resIri: IRI, userADM: UserADM): PropertiesGetRequestV1 = PropertiesGetRequestV1( iri = resIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) @@ -503,7 +491,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) deleteComment = deleteComment.map(comment => stringFormatter.toSparqlEncodedString(comment, throw BadRequestException(s"Invalid comment: '$comment'")) ), - featureFactoryConfig = featureFactoryConfig, userADM = userADM, apiRequestID = UUID.randomUUID ) @@ -1229,8 +1216,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) requestContext => val requestMessage = for { userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) params = requestContext.request.uri.query().toMap searchstr = params.getOrElse("searchstr", throw BadRequestException(s"required param searchstr is missing")) @@ -1294,12 +1280,10 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) entity(as[CreateResourceApiRequestV1]) { apiRequest => requestContext => val requestMessageFuture = for { userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) request <- makeCreateResourceRequestMessage( apiRequest = apiRequest, - featureFactoryConfig = featureFactoryConfig, userADM = userProfile ) } yield request @@ -1319,8 +1303,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestType = reqtypeParam.getOrElse("") resinfo = resinfoParam.getOrElse(false) @@ -1343,8 +1326,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) parameters("deleteComment".?) { deleteCommentParam => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield makeResourceDeleteMessage(resIri = resIri, deleteComment = deleteCommentParam, userADM = userADM) @@ -1366,8 +1348,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) case "properties" => for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) resIri = stringFormatter.validateAndEscapeIri( iri, @@ -1375,7 +1356,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) ) } yield ResourceFullGetRequestV1( iri = resIri, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) case other => throw BadRequestException(s"Invalid request type: $other") @@ -1394,8 +1374,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) resIri = stringFormatter.validateAndEscapeIri( iri, @@ -1417,8 +1396,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) entity(as[ChangeResourceLabelApiRequestV1]) { apiRequest => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) resIri = stringFormatter.validateAndEscapeIri( iri, @@ -1432,7 +1410,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) resourceIri = resIri, label = label, apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, userADM = userADM ) @@ -1450,8 +1427,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) parameters("depth".as[Int].?) { depth => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) resourceIri = stringFormatter.validateAndEscapeIri( iri, @@ -1492,8 +1468,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) entity(as[String]) { xml => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) _ = if (userADM.isAnonymousUser) { @@ -1539,7 +1514,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) resourceRequest = resourcesToCreate, projectId = projectId, apiRequestID = apiRequestID, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) } yield updateRequest @@ -1575,8 +1549,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) ) { requestContext => val httpResponseFuture: Future[HttpResponse] = for { userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) schemaZipFileBytes: Array[Byte] <- generateSchemaZipFile( internalOntologyIri = internalOntologyIri, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/SearchRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/SearchRouteV1.scala index 8451b94c06..2e813f2d60 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/SearchRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/SearchRouteV1.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi.IRI import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.v1.responder.searchmessages.ExtendedSearchGetRequestV1 @@ -242,15 +241,12 @@ class SearchRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v1" / "search" /) { // in the original API, there is a slash after "search": "http://www.salsah.org/api/search/?searchtype=extended" get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + userADM <- getUserADM(requestContext) params: Map[String, Seq[String]] = requestContext.request.uri.query().toMultiMap } yield makeExtendedSearchRequestMessage(userADM, params) @@ -267,10 +263,7 @@ class SearchRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit searchval => // TODO: if a space is encoded as a "+", this is not converted back to a space get { requestContext => val requestMessage = for { - userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + userADM <- getUserADM(requestContext) params: Map[String, String] = requestContext.request.uri.query().toMap } yield makeFulltextSearchRequestMessage(userADM, searchval, params) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/StandoffRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/StandoffRouteV1.scala index 22215009f5..2deccfaa31 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/StandoffRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/StandoffRouteV1.scala @@ -10,7 +10,6 @@ import akka.http.scaladsl.model.Multipart.BodyPart import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.standoffmessages.RepresentationV1JsonProtocol.createMappingApiRequestV1Format import org.knora.webapi.messages.v1.responder.standoffmessages._ import org.knora.webapi.routing.Authenticator @@ -31,7 +30,7 @@ class StandoffRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) w /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v1" / "mapping") { post { entity(as[Multipart.FormData]) { formdata: Multipart.FormData => requestContext => @@ -67,10 +66,7 @@ class StandoffRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) w val requestMessageFuture: Future[CreateMappingRequestV1] = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + userProfile <- getUserADM(requestContext) allParts: Map[Name, String] <- allPartsFuture @@ -110,7 +106,6 @@ class StandoffRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) w standoffApiJSONRequest.mappingName, throw BadRequestException("'mappingName' contains invalid characters") ), - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile, apiRequestID = UUID.randomUUID ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/UsersRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/UsersRouteV1.scala index f5d75e6413..830fabbc94 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/UsersRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/UsersRouteV1.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.apache.commons.validator.routines.UrlValidator import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.usermessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute @@ -29,17 +28,14 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { + override def makeRoute(): Route = { path("v1" / "users") { get { /* return all users */ requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) } yield UsersGetRequestV1(userProfile) RouteUtilV1.runJsonRouteWithFuture( @@ -58,22 +54,15 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* check if email or iri was supplied */ val requestMessage = if (identifier == "email") { for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) } yield UserProfileByEmailGetRequestV1( email = value, userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } else { for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) userIri = stringFormatter.validateAndEscapeIri( value, throw BadRequestException(s"Invalid user IRI $value") @@ -81,7 +70,6 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with } yield UserProfileByIRIGetRequestV1( userIri = userIri, userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = featureFactoryConfig, userProfile = userProfile ) } @@ -101,10 +89,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* get user's project memberships */ requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) checkedUserIri = stringFormatter.validateAndEscapeIri( userIri, throw BadRequestException(s"Invalid user IRI $userIri") @@ -129,10 +114,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* get user's project admin memberships */ requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) checkedUserIri = stringFormatter.validateAndEscapeIri( userIri, throw BadRequestException(s"Invalid user IRI $userIri") @@ -157,10 +139,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* get user's group memberships */ requestContext => val requestMessage = for { - userProfile <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) checkedUserIri = stringFormatter.validateAndEscapeIri( userIri, throw BadRequestException(s"Invalid user IRI $userIri") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/ValuesRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/ValuesRouteV1.scala index 11f65d4fe1..e632c0c4f5 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/ValuesRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/ValuesRouteV1.scala @@ -13,7 +13,7 @@ import org.knora.webapi._ import dsp.errors.BadRequestException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotFoundException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest @@ -41,7 +41,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { + override def makeRoute(): Route = { def makeVersionHistoryRequestMessage(iris: Seq[IRI], userADM: UserADM): ValueVersionHistoryGetRequestV1 = { if (iris.length != 3) @@ -93,7 +93,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit subjectIri = subjectIri, predicateIri = predicateIri, objectIri = objectIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) } @@ -158,7 +157,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit mappingIri = mappingIri, acceptStandoffLinksToClientIDs = false, userProfile = userADM, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -322,7 +320,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit comment = commentStr.map(str => stringFormatter.toSparqlEncodedString(str, throw BadRequestException(s"Invalid comment: '$str'")) ), - featureFactoryConfig = featureFactoryConfig, userProfile = userADM, apiRequestID = UUID.randomUUID ) @@ -383,7 +380,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit mappingIri = mappingIri, acceptStandoffLinksToClientIDs = false, userProfile = userADM, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log @@ -546,7 +542,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit comment = commentStr.map(str => stringFormatter.toSparqlEncodedString(str, throw BadRequestException(s"Invalid comment: '$str'")) ), - featureFactoryConfig = featureFactoryConfig, userProfile = userADM, apiRequestID = UUID.randomUUID ) @@ -563,7 +558,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit comment = comment.map(str => stringFormatter.toSparqlEncodedString(str, throw BadRequestException(s"Invalid comment: '$str'")) ), - featureFactoryConfig = featureFactoryConfig, userProfile = userADM, apiRequestID = UUID.randomUUID ) @@ -579,7 +573,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit deleteComment = deleteComment.map(comment => stringFormatter.toSparqlEncodedString(comment, throw BadRequestException(s"Invalid comment: '$comment'")) ), - featureFactoryConfig = featureFactoryConfig, userProfile = userADM, apiRequestID = UUID.randomUUID ) @@ -588,7 +581,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ValueGetRequestV1( valueIri = stringFormatter .validateAndEscapeIri(valueIriStr, throw BadRequestException(s"Invalid value IRI: $valueIriStr")), - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) @@ -619,7 +611,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit projectShortcode = projectShortcode ), apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) } @@ -629,8 +620,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield makeVersionHistoryRequestMessage(iris = iris, userADM = userADM) @@ -647,8 +637,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit entity(as[CreateValueApiRequestV1]) { apiRequest => requestContext => val requestMessageFuture = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) request <- makeCreateValueRequestMessage(apiRequest = apiRequest, userADM = userADM) } yield request @@ -666,8 +655,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield makeGetValueRequest(valueIriStr = valueIriStr, userADM = userADM) @@ -684,8 +672,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit // we are getting a request to change either the value or the comment, but not both. val requestMessageFuture = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) request <- apiRequest match { case ChangeValueApiRequestV1(_, _, _, _, _, _, _, _, _, _, _, _, _, Some(comment)) => @@ -716,8 +703,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } ~ delete { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) params = requestContext.request.uri.query().toMap deleteComment = params.get("deleteComment") @@ -735,8 +721,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit delete { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield makeChangeCommentRequestMessage(valueIriStr = valueIriStr, comment = None, userADM = userADM) @@ -753,8 +738,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield makeLinkValueGetRequestMessage(iris = iris, userADM = userADM) @@ -771,8 +755,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit entity(as[ChangeFileValueApiRequestV1]) { apiRequest => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) resourceIri = stringFormatter.validateAndEscapeIri( resIriStr, @@ -783,7 +766,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit .ask( ResourceInfoGetRequestV1( iri = resourceIri, - featureFactoryConfig = featureFactoryConfig, userProfile = userADM ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/AuthenticationRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/AuthenticationRouteV2.scala index d97b8fa270..0caa835089 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/AuthenticationRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/AuthenticationRouteV2.scala @@ -7,7 +7,6 @@ package org.knora.webapi.routing.v2 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.messages.v2.routing.authenticationmessages.AuthenticationV2JsonProtocol import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraPasswordCredentialsV2 @@ -27,14 +26,13 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = path("v2" / "authentication") { get { // authenticate credentials requestContext => requestContext.complete { doAuthenticateV2( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } } ~ @@ -62,8 +60,7 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) maybeUsername = apiRequest.username ), password = apiRequest.password - ), - featureFactoryConfig = featureFactoryConfig + ) ) } } @@ -92,8 +89,7 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) maybeUsername = Some(username) ), password = password - ), - featureFactoryConfig = featureFactoryConfig + ) ) } } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ListsRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ListsRouteV2.scala index 985c94fb80..c7b09bdb4b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ListsRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ListsRouteV2.scala @@ -9,7 +9,7 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.v2.responder.listsmessages.ListGetRequestV2 import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetRequestV2 import org.knora.webapi.routing.Authenticator @@ -27,73 +27,65 @@ class ListsRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getList(featureFactoryConfig) ~ - getNode(featureFactoryConfig) + override def makeRoute(): Route = + getList() ~ + getNode() - private def getList(featureFactoryConfig: FeatureFactoryConfig): Route = path("v2" / "lists" / Segment) { - lIri: String => - get { - /* return a list (a graph with all list nodes) */ - requestContext => - val requestMessage: Future[ListGetRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - listIri: IRI = stringFormatter.validateAndEscapeIri( - lIri, - throw BadRequestException(s"Invalid list IRI: '$lIri'") - ) - } yield ListGetRequestV2( - listIri = listIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + private def getList(): Route = path("v2" / "lists" / Segment) { lIri: String => + get { + /* return a list (a graph with all list nodes) */ + requestContext => + val requestMessage: Future[ListGetRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + listIri: IRI = stringFormatter.validateAndEscapeIri( + lIri, + throw BadRequestException(s"Invalid list IRI: '$lIri'") + ) + } yield ListGetRequestV2( + listIri = listIri, + requestingUser = requestingUser + ) - RouteUtilV2.runRdfRouteWithFuture( - requestMessageF = requestMessage, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = ApiV2Complex, - schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) - ) - } + RouteUtilV2.runRdfRouteWithFuture( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = ApiV2Complex, + schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) + ) + } } - private def getNode(featureFactoryConfig: FeatureFactoryConfig): Route = path("v2" / "node" / Segment) { - nIri: String => - get { - /* return a list node */ - requestContext => - val requestMessage: Future[NodeGetRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - nodeIri: IRI = stringFormatter.validateAndEscapeIri( - nIri, - throw BadRequestException(s"Invalid list IRI: '$nIri'") - ) - } yield NodeGetRequestV2( - nodeIri = nodeIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + private def getNode(): Route = path("v2" / "node" / Segment) { nIri: String => + get { + /* return a list node */ + requestContext => + val requestMessage: Future[NodeGetRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + nodeIri: IRI = stringFormatter.validateAndEscapeIri( + nIri, + throw BadRequestException(s"Invalid list IRI: '$nIri'") + ) + } yield NodeGetRequestV2( + nodeIri = nodeIri, + requestingUser = requestingUser + ) - RouteUtilV2.runRdfRouteWithFuture( - requestMessageF = requestMessage, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = ApiV2Complex, - schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) - ) - } + RouteUtilV2.runRdfRouteWithFuture( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = ApiV2Complex, + schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) + ) + } } } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala index 547e249628..81335802ef 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala @@ -3,8 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi -package routing.v2 +package org.knora.webapi.routing.v2 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher @@ -14,12 +13,14 @@ import java.util.UUID import scala.concurrent.Future import dsp.errors.BadRequestException -import feature.FeatureFactoryConfig -import messages.IriConversions._ -import messages.util.rdf.{JsonLDDocument, JsonLDUtil} -import messages.v2.responder.ontologymessages._ -import messages.{OntologyConstants, SmartIri} -import routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} + +import org.knora.webapi._ +import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDUtil} +import org.knora.webapi.messages.v2.responder.ontologymessages._ +import org.knora.webapi.messages.{OntologyConstants, SmartIri} +import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} +import org.knora.webapi.ApiV2Complex object OntologiesRouteV2 { val OntologiesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "ontologies") @@ -38,106 +39,102 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - dereferenceOntologyIri(featureFactoryConfig) ~ - getOntologyMetadata(featureFactoryConfig) ~ - updateOntologyMetadata(featureFactoryConfig) ~ - getOntologyMetadataForProjects(featureFactoryConfig) ~ - getOntology(featureFactoryConfig) ~ - createClass(featureFactoryConfig) ~ - updateClass(featureFactoryConfig) ~ - deleteClassComment(featureFactoryConfig) ~ - addCardinalities(featureFactoryConfig) ~ - canReplaceCardinalities(featureFactoryConfig) ~ - replaceCardinalities(featureFactoryConfig) ~ - canDeleteCardinalitiesFromClass(featureFactoryConfig) ~ - deleteCardinalitiesFromClass(featureFactoryConfig) ~ - changeGuiOrder(featureFactoryConfig) ~ - getClasses(featureFactoryConfig) ~ - canDeleteClass(featureFactoryConfig) ~ - deleteClass(featureFactoryConfig) ~ - deleteOntologyComment(featureFactoryConfig) ~ - createProperty(featureFactoryConfig) ~ - updatePropertyLabelsOrComments(featureFactoryConfig) ~ - deletePropertyComment(featureFactoryConfig) ~ - updatePropertyGuiElement(featureFactoryConfig) ~ - getProperties(featureFactoryConfig) ~ - canDeleteProperty(featureFactoryConfig) ~ - deleteProperty(featureFactoryConfig) ~ - createOntology(featureFactoryConfig) ~ - canDeleteOntology(featureFactoryConfig) ~ - deleteOntology(featureFactoryConfig) - - private def dereferenceOntologyIri(featureFactoryConfig: FeatureFactoryConfig): Route = path("ontology" / Segments) { - _: List[String] => - get { requestContext => - // This is the route used to dereference an actual ontology IRI. If the URL path looks like it - // belongs to a built-in API ontology (which has to contain "knora-api"), prefix it with - // http://api.knora.org to get the ontology IRI. Otherwise, if it looks like it belongs to a - // project-specific API ontology, prefix it with settings.externalOntologyIriHostAndPort to get the - // ontology IRI. - - val urlPath = requestContext.request.uri.path.toString - - val requestedOntologyStr: IRI = if (stringFormatter.isBuiltInApiV2OntologyUrlPath(urlPath)) { - OntologyConstants.KnoraApi.ApiOntologyHostname + urlPath - } else if (stringFormatter.isProjectSpecificApiV2OntologyUrlPath(urlPath)) { - "http://" + settings.externalOntologyIriHostAndPort + urlPath - } else { - throw BadRequestException(s"Invalid or unknown URL path for external ontology: $urlPath") - } - - val requestedOntology = requestedOntologyStr.toSmartIriWithErr( - throw BadRequestException(s"Invalid ontology IRI: $requestedOntologyStr") - ) - - stringFormatter.checkExternalOntologyName(requestedOntology) - - val targetSchema = requestedOntology.getOntologySchema match { - case Some(apiV2Schema: ApiV2Schema) => apiV2Schema - case _ => throw BadRequestException(s"Invalid ontology IRI: $requestedOntologyStr") - } + override def makeRoute(): Route = + dereferenceOntologyIri() ~ + getOntologyMetadata() ~ + updateOntologyMetadata() ~ + getOntologyMetadataForProjects() ~ + getOntology() ~ + createClass() ~ + updateClass() ~ + deleteClassComment() ~ + addCardinalities() ~ + canReplaceCardinalities() ~ + replaceCardinalities() ~ + canDeleteCardinalitiesFromClass() ~ + deleteCardinalitiesFromClass() ~ + changeGuiOrder() ~ + getClasses() ~ + canDeleteClass() ~ + deleteClass() ~ + deleteOntologyComment() ~ + createProperty() ~ + updatePropertyLabelsOrComments() ~ + deletePropertyComment() ~ + updatePropertyGuiElement() ~ + getProperties() ~ + canDeleteProperty() ~ + deleteProperty() ~ + createOntology() ~ + canDeleteOntology() ~ + deleteOntology() + + private def dereferenceOntologyIri(): Route = path("ontology" / Segments) { _: List[String] => + get { requestContext => + // This is the route used to dereference an actual ontology IRI. If the URL path looks like it + // belongs to a built-in API ontology (which has to contain "knora-api"), prefix it with + // http://api.knora.org to get the ontology IRI. Otherwise, if it looks like it belongs to a + // project-specific API ontology, prefix it with settings.externalOntologyIriHostAndPort to get the + // ontology IRI. + + val urlPath = requestContext.request.uri.path.toString + + val requestedOntologyStr: IRI = if (stringFormatter.isBuiltInApiV2OntologyUrlPath(urlPath)) { + OntologyConstants.KnoraApi.ApiOntologyHostname + urlPath + } else if (stringFormatter.isProjectSpecificApiV2OntologyUrlPath(urlPath)) { + "http://" + settings.externalOntologyIriHostAndPort + urlPath + } else { + throw BadRequestException(s"Invalid or unknown URL path for external ontology: $urlPath") + } - val params: Map[String, String] = requestContext.request.uri.query().toMap - val allLanguagesStr = params.get(ALL_LANGUAGES) - val allLanguages = stringFormatter.optionStringToBoolean( - allLanguagesStr, - throw BadRequestException(s"Invalid boolean for $ALL_LANGUAGES: $allLanguagesStr") - ) + val requestedOntology = requestedOntologyStr.toSmartIriWithErr( + throw BadRequestException(s"Invalid ontology IRI: $requestedOntologyStr") + ) - val requestMessageFuture: Future[OntologyEntitiesGetRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield OntologyEntitiesGetRequestV2( - ontologyIri = requestedOntology, - allLanguages = allLanguages, - requestingUser = requestingUser - ) + stringFormatter.checkExternalOntologyName(requestedOntology) - RouteUtilV2.runRdfRouteWithFuture( - requestMessageF = requestMessageFuture, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = targetSchema, - schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) - ) + val targetSchema = requestedOntology.getOntologySchema match { + case Some(apiV2Schema: ApiV2Schema) => apiV2Schema + case _ => throw BadRequestException(s"Invalid ontology IRI: $requestedOntologyStr") } + + val params: Map[String, String] = requestContext.request.uri.query().toMap + val allLanguagesStr = params.get(ALL_LANGUAGES) + val allLanguages = stringFormatter.optionStringToBoolean( + allLanguagesStr, + throw BadRequestException(s"Invalid boolean for $ALL_LANGUAGES: $allLanguagesStr") + ) + + val requestMessageFuture: Future[OntologyEntitiesGetRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield OntologyEntitiesGetRequestV2( + ontologyIri = requestedOntology, + allLanguages = allLanguages, + requestingUser = requestingUser + ) + + RouteUtilV2.runRdfRouteWithFuture( + requestMessageF = requestMessageFuture, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = targetSchema, + schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) + ) + } } - private def getOntologyMetadata(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getOntologyMetadata(): Route = path(OntologiesBasePath / "metadata") { get { requestContext => val maybeProjectIri: Option[SmartIri] = RouteUtilV2.getProject(requestContext) val requestMessageFuture: Future[OntologyMetadataGetByProjectRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield OntologyMetadataGetByProjectRequestV2( projectIris = maybeProjectIri.toSet, @@ -147,7 +144,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -157,7 +153,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def updateOntologyMetadata(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updateOntologyMetadata(): Route = path(OntologiesBasePath / "metadata") { put { entity(as[String]) { jsonRequest => requestContext => @@ -166,8 +162,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ChangeOntologyMetadataRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: ChangeOntologyMetadataRequestV2 <- ChangeOntologyMetadataRequestV2.fromJsonLD( @@ -175,7 +170,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -184,7 +178,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -196,13 +189,12 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getOntologyMetadataForProjects(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getOntologyMetadataForProjects(): Route = path(OntologiesBasePath / "metadata" / Segments) { projectIris: List[IRI] => get { requestContext => val requestMessageFuture: Future[OntologyMetadataGetByProjectRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) validatedProjectIris = @@ -217,7 +209,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -227,7 +218,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getOntology(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getOntology(): Route = path(OntologiesBasePath / "allentities" / Segment) { externalOntologyIriStr: IRI => get { requestContext => val requestedOntologyIri = externalOntologyIriStr.toSmartIriWithErr( @@ -250,8 +241,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[OntologyEntitiesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield OntologyEntitiesGetRequestV2( ontologyIri = requestedOntologyIri, @@ -262,7 +252,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -272,15 +261,14 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createClass(featureFactoryConfig: FeatureFactoryConfig): Route = path(OntologiesBasePath / "classes") { + private def createClass(): Route = path(OntologiesBasePath / "classes") { post { // Create a new class. entity(as[String]) { jsonRequest => requestContext => { val requestMessageFuture: Future[CreateClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -290,7 +278,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -299,7 +286,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -311,7 +297,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def updateClass(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updateClass(): Route = path(OntologiesBasePath / "classes") { put { // Change the labels or comments of a class. @@ -319,8 +305,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangeClassLabelsOrCommentsRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -330,7 +315,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -339,7 +323,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -352,7 +335,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } // delete the comment of a class definition - private def deleteClassComment(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteClassComment(): Route = path(OntologiesBasePath / "classes" / "comment" / Segment) { classIriStr: IRI => delete { requestContext => val classIri = classIriStr.toSmartIri @@ -373,21 +356,18 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteClassCommentRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield DeleteClassCommentRequestV2( classIri = classIri, lastModificationDate = lastModificationDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -397,7 +377,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def addCardinalities(featureFactoryConfig: FeatureFactoryConfig): Route = + private def addCardinalities(): Route = path(OntologiesBasePath / "cardinalities") { post { // Add cardinalities to a class. @@ -405,8 +385,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[AddCardinalitiesToClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -416,7 +395,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -425,7 +403,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -437,7 +414,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def canReplaceCardinalities(featureFactoryConfig: FeatureFactoryConfig): Route = + private def canReplaceCardinalities(): Route = path(OntologiesBasePath / "canreplacecardinalities" / Segment) { classIriStr: IRI => get { requestContext => val classIri = classIriStr.toSmartIri @@ -449,19 +426,16 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanChangeCardinalitiesRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield CanChangeCardinalitiesRequestV2( classIri = classIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -473,15 +447,14 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // Replaces all cardinalities with what was sent. Deleting means send empty // replace request. - private def replaceCardinalities(featureFactoryConfig: FeatureFactoryConfig): Route = + private def replaceCardinalities(): Route = path(OntologiesBasePath / "cardinalities") { put { entity(as[String]) { jsonRequest => requestContext => { val requestMessageFuture: Future[ChangeCardinalitiesRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -491,7 +464,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -500,7 +472,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -512,15 +483,14 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def canDeleteCardinalitiesFromClass(featureFactoryConfig: FeatureFactoryConfig): Route = + private def canDeleteCardinalitiesFromClass(): Route = path(OntologiesBasePath / "candeletecardinalities") { post { entity(as[String]) { jsonRequest => requestContext => { val requestMessageFuture: Future[CanDeleteCardinalitiesFromClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -531,7 +501,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -540,7 +509,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -554,15 +522,14 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // delete a single cardinality from the specified class if the property is // not used in resources. - private def deleteCardinalitiesFromClass(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteCardinalitiesFromClass(): Route = path(OntologiesBasePath / "cardinalities") { patch { entity(as[String]) { jsonRequest => requestContext => { val requestMessageFuture: Future[DeleteCardinalitiesFromClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -572,7 +539,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -581,7 +547,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -593,7 +558,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def changeGuiOrder(featureFactoryConfig: FeatureFactoryConfig): Route = + private def changeGuiOrder(): Route = path(OntologiesBasePath / "guiorder") { put { // Change a class's cardinalities. @@ -601,8 +566,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangeGuiOrderRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -612,7 +576,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -621,7 +584,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -633,7 +595,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getClasses(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getClasses(): Route = path(OntologiesBasePath / "classes" / Segments) { externalResourceClassIris: List[IRI] => get { requestContext => val classesAndSchemas: Set[(SmartIri, ApiV2Schema)] = externalResourceClassIris.map { classIriStr: IRI => @@ -677,8 +639,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ClassesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ClassesGetRequestV2( classIris = classesForResponder, @@ -689,7 +650,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -699,7 +659,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def canDeleteClass(featureFactoryConfig: FeatureFactoryConfig): Route = + private def canDeleteClass(): Route = path(OntologiesBasePath / "candeleteclass" / Segment) { classIriStr: IRI => get { requestContext => val classIri = classIriStr.toSmartIri @@ -711,19 +671,16 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanDeleteClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield CanDeleteClassRequestV2( classIri = classIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -733,7 +690,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def deleteClass(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteClass(): Route = path(OntologiesBasePath / "classes" / Segments) { externalResourceClassIris: List[IRI] => delete { requestContext => val classIriStr = externalResourceClassIris match { @@ -759,21 +716,18 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield DeleteClassRequestV2( classIri = classIri, lastModificationDate = lastModificationDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -783,7 +737,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def deleteOntologyComment(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteOntologyComment(): Route = path(OntologiesBasePath / "comment" / Segment) { ontologyIriStr: IRI => delete { requestContext => val ontologyIri = ontologyIriStr.toSmartIri @@ -804,21 +758,18 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOntologyCommentRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield DeleteOntologyCommentRequestV2( ontologyIri = ontologyIri, lastModificationDate = lastModificationDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -828,7 +779,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createProperty(featureFactoryConfig: FeatureFactoryConfig): Route = + private def createProperty(): Route = path(OntologiesBasePath / "properties") { post { // Create a new property. @@ -836,8 +787,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[CreatePropertyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -847,7 +797,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -856,7 +805,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -868,7 +816,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def updatePropertyLabelsOrComments(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updatePropertyLabelsOrComments(): Route = path(OntologiesBasePath / "properties") { put { // Change the labels or comments of a property. @@ -876,8 +824,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangePropertyLabelsOrCommentsRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -888,8 +835,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = - featureFactoryConfig, settings = settings, log = log ) @@ -898,7 +843,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -911,7 +855,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } // delete the comment of a property definition - private def deletePropertyComment(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deletePropertyComment(): Route = path(OntologiesBasePath / "properties" / "comment" / Segment) { propertyIriStr: IRI => delete { requestContext => val propertyIri = propertyIriStr.toSmartIri @@ -932,21 +876,18 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeletePropertyCommentRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield DeletePropertyCommentRequestV2( propertyIri = propertyIri, lastModificationDate = lastModificationDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -956,7 +897,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def updatePropertyGuiElement(featureFactoryConfig: FeatureFactoryConfig): Route = + private def updatePropertyGuiElement(): Route = path(OntologiesBasePath / "properties" / "guielement") { put { // Change the salsah-gui:guiElement and/or salsah-gui:guiAttribute of a property. @@ -964,8 +905,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangePropertyGuiElementRequest] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -976,7 +916,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -985,7 +924,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -997,7 +935,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getProperties(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProperties(): Route = path(OntologiesBasePath / "properties" / Segments) { externalPropertyIris: List[IRI] => get { requestContext => val propsAndSchemas: Set[(SmartIri, ApiV2Schema)] = externalPropertyIris.map { propIriStr: IRI => @@ -1041,8 +979,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[PropertiesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield PropertiesGetRequestV2( propertyIris = propsForResponder, @@ -1053,7 +990,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -1063,7 +999,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def canDeleteProperty(featureFactoryConfig: FeatureFactoryConfig): Route = + private def canDeleteProperty(): Route = path(OntologiesBasePath / "candeleteproperty" / Segment) { propertyIriStr: IRI => get { requestContext => val propertyIri = propertyIriStr.toSmartIri @@ -1075,19 +1011,16 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanDeletePropertyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield CanDeletePropertyRequestV2( propertyIri = propertyIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -1097,7 +1030,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def deleteProperty(featureFactoryConfig: FeatureFactoryConfig): Route = + private def deleteProperty(): Route = path(OntologiesBasePath / "properties" / Segments) { externalPropertyIris: List[IRI] => delete { requestContext => val propertyIriStr = externalPropertyIris match { @@ -1123,21 +1056,18 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeletePropertyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield DeletePropertyRequestV2( propertyIri = propertyIri, lastModificationDate = lastModificationDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -1147,15 +1077,14 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createOntology(featureFactoryConfig: FeatureFactoryConfig): Route = path(OntologiesBasePath) { + private def createOntology(): Route = path(OntologiesBasePath) { // Create a new, empty ontology. post { entity(as[String]) { jsonRequest => requestContext => { val requestMessageFuture: Future[CreateOntologyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -1165,7 +1094,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -1174,7 +1102,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -1186,7 +1113,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def canDeleteOntology(featureFactoryConfig: FeatureFactoryConfig): Route = + private def canDeleteOntology(): Route = path(OntologiesBasePath / "candeleteontology" / Segment) { ontologyIriStr: IRI => get { requestContext => val ontologyIri = ontologyIriStr.toSmartIri @@ -1198,19 +1125,16 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanDeleteOntologyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield CanDeleteOntologyRequestV2( ontologyIri = ontologyIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -1220,51 +1144,47 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def deleteOntology(featureFactoryConfig: FeatureFactoryConfig): Route = path(OntologiesBasePath / Segment) { - ontologyIriStr => - delete { requestContext => - val ontologyIri = ontologyIriStr.toSmartIri - stringFormatter.checkExternalOntologyName(ontologyIri) - - if ( - !ontologyIri.isKnoraOntologyIri || ontologyIri.isKnoraBuiltInDefinitionIri || !ontologyIri.getOntologySchema - .contains(ApiV2Complex) - ) { - throw BadRequestException(s"Invalid ontology IRI for request: $ontologyIri") - } + private def deleteOntology(): Route = path(OntologiesBasePath / Segment) { ontologyIriStr => + delete { requestContext => + val ontologyIri = ontologyIriStr.toSmartIri + stringFormatter.checkExternalOntologyName(ontologyIri) - val lastModificationDateStr = requestContext.request.uri - .query() - .toMap - .getOrElse(LAST_MODIFICATION_DATE, throw BadRequestException(s"Missing parameter: $LAST_MODIFICATION_DATE")) - val lastModificationDate = stringFormatter.xsdDateTimeStampToInstant( - lastModificationDateStr, - throw BadRequestException(s"Invalid timestamp: $lastModificationDateStr") - ) - - val requestMessageFuture: Future[DeleteOntologyRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield DeleteOntologyRequestV2( - ontologyIri = ontologyIri, - lastModificationDate = lastModificationDate, - apiRequestID = UUID.randomUUID, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) - - RouteUtilV2.runRdfRouteWithFuture( - requestMessageF = requestMessageFuture, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = ApiV2Complex, - schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) - ) + if ( + !ontologyIri.isKnoraOntologyIri || ontologyIri.isKnoraBuiltInDefinitionIri || !ontologyIri.getOntologySchema + .contains(ApiV2Complex) + ) { + throw BadRequestException(s"Invalid ontology IRI for request: $ontologyIri") } + + val lastModificationDateStr = requestContext.request.uri + .query() + .toMap + .getOrElse(LAST_MODIFICATION_DATE, throw BadRequestException(s"Missing parameter: $LAST_MODIFICATION_DATE")) + val lastModificationDate = stringFormatter.xsdDateTimeStampToInstant( + lastModificationDateStr, + throw BadRequestException(s"Invalid timestamp: $lastModificationDateStr") + ) + + val requestMessageFuture: Future[DeleteOntologyRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield DeleteOntologyRequestV2( + ontologyIri = ontologyIri, + lastModificationDate = lastModificationDate, + apiRequestID = UUID.randomUUID, + requestingUser = requestingUser + ) + + RouteUtilV2.runRdfRouteWithFuture( + requestMessageF = requestMessageFuture, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = ApiV2Complex, + schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) + ) + } } } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala index 58c1f3ac58..159ce60016 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala @@ -10,7 +10,7 @@ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import org.knora.webapi._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter @@ -52,22 +52,22 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getIIIFManifest(featureFactoryConfig) ~ - createResource(featureFactoryConfig) ~ - updateResourceMetadata(featureFactoryConfig) ~ - getResourcesInProject(featureFactoryConfig) ~ - getResourceHistory(featureFactoryConfig) ~ - getResourceHistoryEvents(featureFactoryConfig) ~ - getProjectResourceAndValueHistory(featureFactoryConfig) ~ - getResources(featureFactoryConfig) ~ - getResourcesPreview(featureFactoryConfig) ~ - getResourcesTei(featureFactoryConfig) ~ - getResourcesGraph(featureFactoryConfig) ~ - deleteResource(featureFactoryConfig) ~ - eraseResource(featureFactoryConfig) - - private def getIIIFManifest(featureFactoryConfig: FeatureFactoryConfig): Route = + override def makeRoute(): Route = + getIIIFManifest() ~ + createResource() ~ + updateResourceMetadata() ~ + getResourcesInProject() ~ + getResourceHistory() ~ + getResourceHistoryEvents() ~ + getProjectResourceAndValueHistory() ~ + getResources() ~ + getResourcesPreview() ~ + getResourcesTei() ~ + getResourcesGraph() ~ + deleteResource() ~ + eraseResource() + + private def getIIIFManifest(): Route = path(ResourcesBasePath / "iiifmanifest" / Segment) { resourceIriStr: IRI => get { requestContext => val resourceIri: IRI = @@ -78,19 +78,16 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourceIIIFManifestGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ResourceIIIFManifestGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -100,7 +97,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createResource(featureFactoryConfig: FeatureFactoryConfig): Route = path(ResourcesBasePath) { + private def createResource(): Route = path(ResourcesBasePath) { post { entity(as[String]) { jsonRequest => requestContext => { @@ -108,8 +105,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CreateResourceRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: CreateResourceRequestV2 <- CreateResourceRequestV2.fromJsonLD( @@ -117,7 +113,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -126,7 +121,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -138,7 +132,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def updateResourceMetadata(featureFactoryConfig: FeatureFactoryConfig): Route = path(ResourcesBasePath) { + private def updateResourceMetadata(): Route = path(ResourcesBasePath) { put { entity(as[String]) { jsonRequest => requestContext => { @@ -146,8 +140,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[UpdateResourceMetadataRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: UpdateResourceMetadataRequestV2 <- UpdateResourceMetadataRequestV2.fromJsonLD( @@ -155,7 +148,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -164,7 +156,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -176,7 +167,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResourcesInProject(featureFactoryConfig: FeatureFactoryConfig): Route = path(ResourcesBasePath) { + private def getResourcesInProject(): Route = path(ResourcesBasePath) { get { requestContext => val projectIri: SmartIri = RouteUtilV2 .getProject(requestContext) @@ -218,8 +209,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[SearchResourcesByProjectAndClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield SearchResourcesByProjectAndClassRequestV2( projectIri = projectIri, @@ -228,14 +218,12 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) page = page, targetSchema = targetSchema, schemaOptions = schemaOptions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -245,7 +233,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResourceHistory(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getResourceHistory(): Route = path(ResourcesBasePath / "history" / Segment) { resourceIriStr: IRI => get { requestContext => val resourceIri = @@ -268,21 +256,18 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourceVersionHistoryGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ResourceVersionHistoryGetRequestV2( resourceIri = resourceIri, startDate = startDate, endDate = endDate, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -292,24 +277,21 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResourceHistoryEvents(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getResourceHistoryEvents(): Route = path(ResourcesBasePath / "resourceHistoryEvents" / Segment) { resourceIri: IRI => get { requestContext => val requestMessageFuture: Future[ResourceHistoryEventsGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -319,24 +301,21 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getProjectResourceAndValueHistory(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getProjectResourceAndValueHistory(): Route = path(ResourcesBasePath / "projectHistoryEvents" / Segment) { projectIri: IRI => get { requestContext => val requestMessageFuture: Future[ProjectResourcesWithHistoryGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ProjectResourcesWithHistoryGetRequestV2( projectIri = projectIri, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -346,62 +325,58 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResources(featureFactoryConfig: FeatureFactoryConfig): Route = path(ResourcesBasePath / Segments) { - resIris: Seq[String] => - get { requestContext => - if (resIris.size > settings.v2ResultsPerPage) - throw BadRequestException(s"List of provided resource Iris exceeds limit of ${settings.v2ResultsPerPage}") + private def getResources(): Route = path(ResourcesBasePath / Segments) { resIris: Seq[String] => + get { requestContext => + if (resIris.size > settings.v2ResultsPerPage) + throw BadRequestException(s"List of provided resource Iris exceeds limit of ${settings.v2ResultsPerPage}") - val resourceIris: Seq[IRI] = resIris.map { resIri: String => - stringFormatter.validateAndEscapeIri(resIri, throw BadRequestException(s"Invalid resource IRI: <$resIri>")) - } + val resourceIris: Seq[IRI] = resIris.map { resIri: String => + stringFormatter.validateAndEscapeIri(resIri, throw BadRequestException(s"Invalid resource IRI: <$resIri>")) + } - val params: Map[String, String] = requestContext.request.uri.query().toMap + val params: Map[String, String] = requestContext.request.uri.query().toMap + + // Was a version date provided? + val versionDate: Option[Instant] = params.get("version").map { versionStr => + def errorFun: Nothing = throw BadRequestException(s"Invalid version date: $versionStr") - // Was a version date provided? - val versionDate: Option[Instant] = params.get("version").map { versionStr => - def errorFun: Nothing = throw BadRequestException(s"Invalid version date: $versionStr") - - // Yes. Try to parse it as an xsd:dateTimeStamp. - try { - stringFormatter.xsdDateTimeStampToInstant(versionStr, errorFun) - } catch { - // If that doesn't work, try to parse it as a Knora ARK timestamp. - case _: Exception => stringFormatter.arkTimestampToInstant(versionStr, errorFun) - } + // Yes. Try to parse it as an xsd:dateTimeStamp. + try { + stringFormatter.xsdDateTimeStampToInstant(versionStr, errorFun) + } catch { + // If that doesn't work, try to parse it as a Knora ARK timestamp. + case _: Exception => stringFormatter.arkTimestampToInstant(versionStr, errorFun) } + } - val targetSchema: ApiV2Schema = RouteUtilV2.getOntologySchema(requestContext) - val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) + val targetSchema: ApiV2Schema = RouteUtilV2.getOntologySchema(requestContext) + val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) - val requestMessageFuture: Future[ResourcesGetRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield ResourcesGetRequestV2( - resourceIris = resourceIris, - versionDate = versionDate, - targetSchema = targetSchema, - schemaOptions = schemaOptions, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + val requestMessageFuture: Future[ResourcesGetRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield ResourcesGetRequestV2( + resourceIris = resourceIris, + versionDate = versionDate, + targetSchema = targetSchema, + schemaOptions = schemaOptions, + requestingUser = requestingUser + ) - RouteUtilV2.runRdfRouteWithFuture( - requestMessageF = requestMessageFuture, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = targetSchema, - schemaOptions = schemaOptions - ) - } + RouteUtilV2.runRdfRouteWithFuture( + requestMessageF = requestMessageFuture, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = targetSchema, + schemaOptions = schemaOptions + ) + } } - private def getResourcesPreview(featureFactoryConfig: FeatureFactoryConfig): Route = + private def getResourcesPreview(): Route = path("v2" / "resourcespreview" / Segments) { resIris: Seq[String] => get { requestContext => if (resIris.size > settings.v2ResultsPerPage) @@ -415,20 +390,17 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourcesPreviewGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ResourcesPreviewGetRequestV2( resourceIris = resourceIris, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -438,111 +410,104 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResourcesTei(featureFactoryConfig: FeatureFactoryConfig): Route = path("v2" / "tei" / Segment) { - resIri: String => - get { requestContext => - val resourceIri: IRI = - stringFormatter.validateAndEscapeIri(resIri, throw BadRequestException(s"Invalid resource IRI: <$resIri>")) + private def getResourcesTei(): Route = path("v2" / "tei" / Segment) { resIri: String => + get { requestContext => + val resourceIri: IRI = + stringFormatter.validateAndEscapeIri(resIri, throw BadRequestException(s"Invalid resource IRI: <$resIri>")) - val params: Map[String, String] = requestContext.request.uri.query().toMap + val params: Map[String, String] = requestContext.request.uri.query().toMap - // the the property that represents the text - val textProperty: SmartIri = getTextPropertyFromParams(params) + // the the property that represents the text + val textProperty: SmartIri = getTextPropertyFromParams(params) - val mappingIri: Option[IRI] = getMappingIriFromParams(params) + val mappingIri: Option[IRI] = getMappingIriFromParams(params) - val gravsearchTemplateIri: Option[IRI] = getGravsearchTemplateIriFromParams(params) + val gravsearchTemplateIri: Option[IRI] = getGravsearchTemplateIriFromParams(params) - val headerXSLTIri = getHeaderXSLTIriFromParams(params) + val headerXSLTIri = getHeaderXSLTIriFromParams(params) - val requestMessageFuture: Future[ResourceTEIGetRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield ResourceTEIGetRequestV2( - resourceIri = resourceIri, - textProperty = textProperty, - mappingIri = mappingIri, - gravsearchTemplateIri = gravsearchTemplateIri, - headerXSLTIri = headerXSLTIri, - featureFactoryConfig = featureFactoryConfig, - requestingUser = requestingUser - ) + val requestMessageFuture: Future[ResourceTEIGetRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield ResourceTEIGetRequestV2( + resourceIri = resourceIri, + textProperty = textProperty, + mappingIri = mappingIri, + gravsearchTemplateIri = gravsearchTemplateIri, + headerXSLTIri = headerXSLTIri, + requestingUser = requestingUser + ) - RouteUtilV2.runTEIXMLRoute( - requestMessageF = requestMessageFuture, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = RouteUtilV2.getOntologySchema(requestContext) - ) - } + RouteUtilV2.runTEIXMLRoute( + requestMessageF = requestMessageFuture, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = RouteUtilV2.getOntologySchema(requestContext) + ) + } } - private def getResourcesGraph(featureFactoryConfig: FeatureFactoryConfig): Route = path("v2" / "graph" / Segment) { - resIriStr: String => - get { requestContext => - val resourceIri: IRI = - stringFormatter.validateAndEscapeIri( - resIriStr, - throw BadRequestException(s"Invalid resource IRI: <$resIriStr>") - ) - val params: Map[String, String] = requestContext.request.uri.query().toMap - val depth: Int = params.get(Depth).map(_.toInt).getOrElse(settings.defaultGraphDepth) - - if (depth < 1) { - throw BadRequestException(s"$Depth must be at least 1") - } - - if (depth > settings.maxGraphDepth) { - throw BadRequestException(s"$Depth cannot be greater than ${settings.maxGraphDepth}") - } + private def getResourcesGraph(): Route = path("v2" / "graph" / Segment) { resIriStr: String => + get { requestContext => + val resourceIri: IRI = + stringFormatter.validateAndEscapeIri( + resIriStr, + throw BadRequestException(s"Invalid resource IRI: <$resIriStr>") + ) + val params: Map[String, String] = requestContext.request.uri.query().toMap + val depth: Int = params.get(Depth).map(_.toInt).getOrElse(settings.defaultGraphDepth) - val direction: String = params.getOrElse(Direction, Outbound) - val excludeProperty: Option[SmartIri] = params - .get(ExcludeProperty) - .map(propIriStr => - propIriStr.toSmartIriWithErr(throw BadRequestException(s"Invalid property IRI: <$propIriStr>")) - ) + if (depth < 1) { + throw BadRequestException(s"$Depth must be at least 1") + } - val (inbound: Boolean, outbound: Boolean) = direction match { - case Inbound => (true, false) - case Outbound => (false, true) - case Both => (true, true) - case other => throw BadRequestException(s"Invalid direction: $other") - } + if (depth > settings.maxGraphDepth) { + throw BadRequestException(s"$Depth cannot be greater than ${settings.maxGraphDepth}") + } - val requestMessageFuture: Future[GraphDataGetRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) - } yield GraphDataGetRequestV2( - resourceIri = resourceIri, - depth = depth, - inbound = inbound, - outbound = outbound, - excludeProperty = excludeProperty, - requestingUser = requestingUser + val direction: String = params.getOrElse(Direction, Outbound) + val excludeProperty: Option[SmartIri] = params + .get(ExcludeProperty) + .map(propIriStr => + propIriStr.toSmartIriWithErr(throw BadRequestException(s"Invalid property IRI: <$propIriStr>")) ) - RouteUtilV2.runRdfRouteWithFuture( - requestMessageF = requestMessageFuture, - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, - settings = settings, - appActor = appActor, - log = log, - targetSchema = RouteUtilV2.getOntologySchema(requestContext), - schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) - ) + val (inbound: Boolean, outbound: Boolean) = direction match { + case Inbound => (true, false) + case Outbound => (false, true) + case Both => (true, true) + case other => throw BadRequestException(s"Invalid direction: $other") } + + val requestMessageFuture: Future[GraphDataGetRequestV2] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield GraphDataGetRequestV2( + resourceIri = resourceIri, + depth = depth, + inbound = inbound, + outbound = outbound, + excludeProperty = excludeProperty, + requestingUser = requestingUser + ) + + RouteUtilV2.runRdfRouteWithFuture( + requestMessageF = requestMessageFuture, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log, + targetSchema = RouteUtilV2.getOntologySchema(requestContext), + schemaOptions = RouteUtilV2.getSchemaOptions(requestContext) + ) + } } - private def deleteResource(featureFactoryConfig: FeatureFactoryConfig): Route = path(ResourcesBasePath / "delete") { + private def deleteResource(): Route = path(ResourcesBasePath / "delete") { post { entity(as[String]) { jsonRequest => requestContext => { @@ -550,15 +515,13 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOrEraseResourceRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: DeleteOrEraseResourceRequestV2 <- DeleteOrEraseResourceRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -567,7 +530,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -579,7 +541,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def eraseResource(featureFactoryConfig: FeatureFactoryConfig): Route = path(ResourcesBasePath / "erase") { + private def eraseResource(): Route = path(ResourcesBasePath / "erase") { post { entity(as[String]) { jsonRequest => requestContext => { @@ -587,8 +549,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOrEraseResourceRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: DeleteOrEraseResourceRequestV2 <- DeleteOrEraseResourceRequestV2.fromJsonLD( @@ -596,7 +557,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -605,7 +565,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala index 6ed77c477d..7bc3ab1f1c 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -37,15 +36,15 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - fullTextSearchCount(featureFactoryConfig) ~ - fullTextSearch(featureFactoryConfig) ~ - gravsearchCountGet(featureFactoryConfig) ~ - gravsearchCountPost(featureFactoryConfig) ~ - gravsearchGet(featureFactoryConfig) ~ - gravsearchPost(featureFactoryConfig) ~ - searchByLabelCount(featureFactoryConfig) ~ - searchByLabel(featureFactoryConfig) + override def makeRoute(): Route = + fullTextSearchCount() ~ + fullTextSearch() ~ + gravsearchCountGet() ~ + gravsearchCountPost() ~ + gravsearchGet() ~ + gravsearchPost() ~ + searchByLabelCount() ~ + searchByLabel() /** * Gets the requested offset. Returns zero if no offset is indicated. @@ -152,7 +151,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def fullTextSearchCount(featureFactoryConfig: FeatureFactoryConfig): Route = + private def fullTextSearchCount(): Route = path("v2" / "search" / "count" / Segment) { searchStr => // TODO: if a space is encoded as a "+", this is not converted back to a space get { requestContext => @@ -183,23 +182,18 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val limitToStandoffClass: Option[SmartIri] = getStandoffClass(params) val requestMessage: Future[FullTextSearchCountRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield FullTextSearchCountRequestV2( searchValue = escapedSearchStr, limitToProject = limitToProject, limitToResourceClass = limitToResourceClass, limitToStandoffClass = limitToStandoffClass, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -209,7 +203,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def fullTextSearch(featureFactoryConfig: FeatureFactoryConfig): Route = path("v2" / "search" / Segment) { + private def fullTextSearch(): Route = path("v2" / "search" / Segment) { searchStr => // TODO: if a space is encoded as a "+", this is not converted back to a space get { requestContext => if (searchStr.contains(OntologyConstants.KnoraApi.ApiOntologyHostname)) { @@ -247,10 +241,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) val requestMessage: Future[FulltextSearchRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield FulltextSearchRequestV2( searchValue = escapedSearchStr, offset = offset, @@ -258,7 +249,6 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit limitToResourceClass = limitToResourceClass, limitToStandoffClass = limitToStandoffClass, returnFiles = returnFiles, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, targetSchema = targetSchema, schemaOptions = schemaOptions @@ -267,7 +257,6 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -277,27 +266,22 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def gravsearchCountGet(featureFactoryConfig: FeatureFactoryConfig): Route = + private def gravsearchCountGet(): Route = path("v2" / "searchextended" / "count" / Segment) { gravsearchQuery => // Segment is a URL encoded string representing a Gravsearch query get { requestContext => val constructQuery = GravsearchParser.parseQuery(gravsearchQuery) val requestMessage: Future[GravsearchCountRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GravsearchCountRequestV2( constructQuery = constructQuery, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -307,27 +291,22 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def gravsearchCountPost(featureFactoryConfig: FeatureFactoryConfig): Route = + private def gravsearchCountPost(): Route = path("v2" / "searchextended" / "count") { post { entity(as[String]) { gravsearchQuery => requestContext => { val constructQuery = GravsearchParser.parseQuery(gravsearchQuery) val requestMessage: Future[GravsearchCountRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GravsearchCountRequestV2( constructQuery = constructQuery, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -339,7 +318,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def gravsearchGet(featureFactoryConfig: FeatureFactoryConfig): Route = path( + private def gravsearchGet(): Route = path( "v2" / "searchextended" / Segment ) { sparql => // Segment is a URL encoded string representing a Gravsearch query get { requestContext => @@ -348,22 +327,17 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) val requestMessage: Future[GravsearchRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GravsearchRequestV2( constructQuery = constructQuery, targetSchema = targetSchema, schemaOptions = schemaOptions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -373,7 +347,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def gravsearchPost(featureFactoryConfig: FeatureFactoryConfig): Route = path("v2" / "searchextended") { + private def gravsearchPost(): Route = path("v2" / "searchextended") { post { entity(as[String]) { gravsearchQuery => requestContext => { @@ -382,22 +356,17 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) val requestMessage: Future[GravsearchRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield GravsearchRequestV2( constructQuery = constructQuery, targetSchema = targetSchema, schemaOptions = schemaOptions, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -409,7 +378,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def searchByLabelCount(featureFactoryConfig: FeatureFactoryConfig): Route = + private def searchByLabelCount(): Route = path("v2" / "searchbylabel" / "count" / Segment) { searchval => // TODO: if a space is encoded as a "+", this is not converted back to a space get { requestContext => @@ -432,22 +401,17 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val limitToResourceClass: Option[SmartIri] = getResourceClassFromParams(params) val requestMessage: Future[SearchResourceByLabelCountRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield SearchResourceByLabelCountRequestV2( searchValue = searchString, limitToProject = limitToProject, limitToResourceClass = limitToResourceClass, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -457,7 +421,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def searchByLabel(featureFactoryConfig: FeatureFactoryConfig): Route = path( + private def searchByLabel(): Route = path( "v2" / "searchbylabel" / Segment ) { searchval => // TODO: if a space is encoded as a "+", this is not converted back to a space get { requestContext => @@ -484,24 +448,19 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val targetSchema: ApiV2Schema = RouteUtilV2.getOntologySchema(requestContext) val requestMessage: Future[SearchResourceByLabelRequestV2] = for { - requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig - ) + requestingUser <- getUserADM(requestContext) } yield SearchResourceByLabelRequestV2( searchValue = searchString, offset = offset, limitToProject = limitToProject, limitToResourceClass = limitToResourceClass, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/StandoffRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/StandoffRouteV2.scala index cf516a9540..ad4b25546a 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/StandoffRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/StandoffRouteV2.scala @@ -11,7 +11,7 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.rdf.JsonLDUtil @@ -36,7 +36,7 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { + override def makeRoute(): Route = { path("v2" / "standoff" / Segment / Segment / Segment) { (resourceIriStr: String, valueIriStr: String, offsetStr: String) => @@ -63,22 +63,19 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w val requestMessageFuture: Future[GetStandoffPageRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield GetStandoffPageRequestV2( resourceIri = resourceIri.toString, valueIri = valueIri.toString, offset = offset, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -124,8 +121,7 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w val requestMessageFuture: Future[CreateMappingRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) allParts: Map[Name, String] <- allPartsFuture jsonldDoc = @@ -143,7 +139,6 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w apiRequestID = apiRequestID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -158,7 +153,6 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w } yield CreateMappingRequestV2( metadata = metadata, xml = CreateMappingRequestXMLV2(xml), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = apiRequestID ) @@ -166,7 +160,6 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala index fb52f076f5..6b5eb94abf 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala @@ -10,7 +10,7 @@ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import org.knora.webapi._ import dsp.errors.BadRequestException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.rdf.JsonLDDocument @@ -40,13 +40,13 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * Returns the route. */ - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - getValue(featureFactoryConfig) ~ - createValue(featureFactoryConfig) ~ - updateValue(featureFactoryConfig) ~ - deleteValue(featureFactoryConfig) + override def makeRoute(): Route = + getValue() ~ + createValue() ~ + updateValue() ~ + deleteValue() - private def getValue(featureFactoryConfig: FeatureFactoryConfig): Route = path(ValuesBasePath / Segment / Segment) { + private def getValue(): Route = path(ValuesBasePath / Segment / Segment) { (resourceIriStr: IRI, valueUuidStr: String) => get { requestContext => val resourceIri: SmartIri = @@ -82,22 +82,19 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[ResourcesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) } yield ResourcesGetRequestV2( resourceIris = Seq(resourceIri.toString), valueUuid = Some(valueUuid), versionDate = versionDate, targetSchema = targetSchema, - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser ) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -107,7 +104,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def createValue(featureFactoryConfig: FeatureFactoryConfig): Route = path(ValuesBasePath) { + private def createValue(): Route = path(ValuesBasePath) { post { entity(as[String]) { jsonRequest => requestContext => { @@ -115,15 +112,13 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[CreateValueRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: CreateValueRequestV2 <- CreateValueRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -132,7 +127,6 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -144,7 +138,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def updateValue(featureFactoryConfig: FeatureFactoryConfig): Route = path(ValuesBasePath) { + private def updateValue(): Route = path(ValuesBasePath) { put { entity(as[String]) { jsonRequest => requestContext => { @@ -152,15 +146,13 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[UpdateValueRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: UpdateValueRequestV2 <- UpdateValueRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -169,7 +161,6 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, @@ -181,7 +172,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def deleteValue(featureFactoryConfig: FeatureFactoryConfig): Route = path(ValuesBasePath / "delete") { + private def deleteValue(): Route = path(ValuesBasePath / "delete") { post { entity(as[String]) { jsonRequest => requestContext => { @@ -189,15 +180,13 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[DeleteValueRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig + requestContext = requestContext ) requestMessage: DeleteValueRequestV2 <- DeleteValueRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) @@ -206,7 +195,6 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - featureFactoryConfig = featureFactoryConfig, settings = settings, appActor = appActor, log = log, diff --git a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala index 89fb7344d7..b6002518ed 100644 --- a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala @@ -223,11 +223,6 @@ class KnoraSettingsImpl(config: Config, log: Logger) extends Extension { //used in the store package val tripleStoreConfig: Config = config.getConfig("app.triplestore") - private val fakeTriplestore: String = config.getString("app.triplestore.fake-triplestore") - val prepareFakeTriplestore: Boolean = fakeTriplestore == "prepare" - val useFakeTriplestore: Boolean = fakeTriplestore == "use" - val fakeTriplestoreDataDir: Path = Paths.get(config.getString("app.triplestore.fake-triplestore-data-dir")) - val skipAuthentication: Boolean = config.getBoolean("app.skip-authentication") val jwtSecretKey: String = config.getString("app.jwt-secret-key") @@ -269,84 +264,6 @@ class KnoraSettingsImpl(config: Config, log: Logger) extends Extension { val prometheusEndpoint: Boolean = config.getBoolean("app.monitoring.prometheus-endpoint") val shaclShapesDir: Path = Paths.get(config.getString("app.shacl.shapes-dir")) - - val featureToggles: Set[FeatureToggleBaseConfig] = if (config.hasPath(featureTogglesPath)) { - Try { - config - .getObject(featureTogglesPath) - .asScala - .toMap - .map { case (featureName: String, featureConfigValue: ConfigValue) => - val featureConfig: Config = featureConfigValue match { - case configObject: ConfigObject => configObject.toConfig - case _ => throw FeatureToggleException(s"The feature toggle configuration $featureName must be an object") - } - - val description: String = featureConfig.getString(descriptionKey) - val availableVersions: Seq[Int] = - featureConfig.getIntList(availableVersionsKey).asScala.map(_.intValue).toVector - - if (availableVersions.isEmpty) { - throw FeatureToggleException(s"Feature toggle $featureName has no version numbers") - } - - for ((version: Int, index: Int) <- availableVersions.zipWithIndex) { - if (version != index + 1) { - throw FeatureToggleException( - s"The version numbers of feature toggle $featureName must be an ascending sequence of consecutive integers starting from 1" - ) - } - } - - val defaultVersion: Int = featureConfig.getInt(defaultVersionKey) - - if (!availableVersions.contains(defaultVersion)) { - throw FeatureToggleException( - s"Invalid default version number $defaultVersion for feature toggle $featureName" - ) - } - - val enabledByDefault: Boolean = featureConfig.getBoolean(enabledByDefaultKey) - val overrideAllowed: Boolean = featureConfig.getBoolean(overrideAllowedKey) - - val expirationDate: Option[Instant] = if (featureConfig.hasPath(expirationDateKey)) { - val definedExpirationDate: Instant = Instant.parse(featureConfig.getString(expirationDateKey)) - - if (Instant.ofEpochMilli(System.currentTimeMillis).isAfter(definedExpirationDate)) { - log.warn(s"Feature toggle $featureName has expired") - } - - Some(definedExpirationDate) - } else { - None - } - - val developerEmails: Set[String] = featureConfig.getStringList(developerEmailsKey).asScala.toSet - - FeatureToggleBaseConfig( - featureName = featureName, - description = description, - availableVersions = availableVersions, - defaultVersion = defaultVersion, - enabledByDefault = enabledByDefault, - overrideAllowed = overrideAllowed, - expirationDate = expirationDate, - developerEmails = developerEmails - ) - } - .toSet - } match { - case Success(toggles) => toggles - case Failure(ex) => - ex match { - case fte: FeatureToggleException => throw fte - case other => - throw FeatureToggleException(s"Invalid feature toggle configuration: ${other.getMessage}", Some(ex)) - } - } - } else { - Set.empty - } } object KnoraSettings extends ExtensionId[KnoraSettingsImpl] with ExtensionIdProvider { @@ -360,39 +277,4 @@ object KnoraSettings extends ExtensionId[KnoraSettingsImpl] with ExtensionIdProv * Java API: retrieve the Settings extension for the given system. */ override def get(system: ActorSystem): KnoraSettingsImpl = super.get(system) - - val featureTogglesPath: String = "app.feature-toggles" - val descriptionKey: String = "description" - val availableVersionsKey: String = "available-versions" - val developerEmailsKey: String = "developer-emails" - val expirationDateKey: String = "expiration-date" - val enabledByDefaultKey: String = "enabled-by-default" - val defaultVersionKey: String = "default-version" - val overrideAllowedKey: String = "override-allowed" - - /** - * Represents the base configuration of a feature toggle. - * - * @param featureName the name of the feature. - * @param description a description of the feature. - * @param availableVersions the available versions of the feature. - * @param defaultVersion the version of the feature that should be enabled by default. - * @param enabledByDefault `true` if the feature should be enabled by default, `false` if it should be - * disabled by default. - * @param overrideAllowed `true` if this configuration can be overridden, e.g. by per-request feature - * toggle configuration. - * @param expirationDate the expiration date of the feature. - * @param developerEmails one or more email addresses of developers who can be contacted about the feature. - */ - case class FeatureToggleBaseConfig( - featureName: String, - description: String, - availableVersions: Seq[Int], - defaultVersion: Int, - enabledByDefault: Boolean, - overrideAllowed: Boolean, - expirationDate: Option[Instant], - developerEmails: Set[String] - ) - } diff --git a/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala b/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala deleted file mode 100644 index 1da5b95a43..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store - -import akka.actor._ -import akka.event.LoggingReceive -import org.knora.webapi.config.AppConfig -import org.knora.webapi.core.LiveActorMaker -import org.knora.webapi.core._ -import dsp.errors.UnexpectedMessageException -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig -import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceRequest -import org.knora.webapi.messages.store.sipimessages.IIIFRequest -import org.knora.webapi.messages.store.triplestoremessages.TriplestoreRequest -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.settings._ -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.iiif.IIIFServiceManager -import org.knora.webapi.store.triplestore.TriplestoreManager -import org.knora.webapi.util.ActorUtil - -import scala.concurrent.ExecutionContext -import com.typesafe.scalalogging.LazyLogging - -/** - * This actor receives messages for different stores, and forwards them to the corresponding store manager. - * At the moment only triple stores and Sipi are implemented, but in the future, support for different - * remote repositories will probably be needed. This place would then be the crossroad for these different kinds - * of 'stores' and their requests. - * - * @param appActor a reference to the main application actor. - */ -class StoreManager( - appActor: ActorRef, - cacheServiceManager: CacheServiceManager, - iiifsm: IIIFServiceManager, - appConfig: AppConfig -) extends Actor - with LazyLogging { - this: ActorMaker => - - /** - * The Knora Akka actor system. - */ - protected implicit val system: ActorSystem = context.system - - /** - * The Akka actor system's execution context for futures. - */ - protected implicit val executionContext: ExecutionContext = - system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - /** - * The Knora settings. - */ - protected val settings: KnoraSettingsImpl = KnoraSettings(system) - - /** - * The default feature factory configuration. - */ - protected val defaultFeatureFactoryConfig: FeatureFactoryConfig = new KnoraSettingsFeatureFactoryConfig(settings) - - /** - * Starts the Triplestore Manager Actor - */ - protected lazy val triplestoreManager: ActorRef = makeActor( - Props( - new TriplestoreManager( - appActor = appActor, - settings = settings, - defaultFeatureFactoryConfig = defaultFeatureFactoryConfig - ) with LiveActorMaker - ).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - TriplestoreManagerActorName - ) - - def receive: Receive = LoggingReceive { - case req: CacheServiceRequest => ActorUtil.zio2Message(sender(), cacheServiceManager.receive(req), appConfig) - case req: IIIFRequest => ActorUtil.zio2Message(sender(), iiifsm.receive(req), appConfig) - case req: TriplestoreRequest => triplestoreManager forward req - case other => - sender() ! Status.Failure(UnexpectedMessageException(s"StoreManager received an unexpected message: $other")) - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala similarity index 96% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala index a4871ade96..c23d4ce8b3 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala @@ -3,20 +3,20 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice +package org.knora.webapi.store.cache import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.messages.store.cacheservicemessages._ -import org.knora.webapi.store.cacheservice.api.CacheService +import org.knora.webapi.store.cache.api.CacheService import zio._ import zio.metrics.Metric import java.time.temporal.ChronoUnit -case class CacheServiceManager(cs: CacheService) { +final case class CacheServiceManager(cs: CacheService) { val cacheServiceWriteUserTimer = Metric .timer( diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/api/CacheService.scala similarity index 97% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/api/CacheService.scala index c9a0edc8c6..e64f9f43b9 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/api/CacheService.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.api +package org.knora.webapi.store.cache.api import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheServiceExceptions.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/api/CacheServiceExceptions.scala similarity index 90% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheServiceExceptions.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/api/CacheServiceExceptions.scala index 3387841778..f228a8cf2c 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheServiceExceptions.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/api/CacheServiceExceptions.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.api +package org.knora.webapi.store.cache.api import dsp.errors.CacheServiceException diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/config/CacheServiceConfig.scala similarity index 72% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/config/CacheServiceConfig.scala index bc7304c31d..9924e150ac 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/config/CacheServiceConfig.scala @@ -1,4 +1,4 @@ -package org.knora.webapi.store.cacheservice.config +package org.knora.webapi.store.cache.config final case class CacheServiceConfig(enabled: Boolean, redis: RedisConfig) diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/impl/CacheServiceInMemImpl.scala similarity index 97% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/impl/CacheServiceInMemImpl.scala index 3f66b853d0..76df948a37 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/impl/CacheServiceInMemImpl.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.impl +package org.knora.webapi.store.cache.impl import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM @@ -13,9 +13,9 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierType import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceStatusOK import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceStatusResponse -import org.knora.webapi.store.cacheservice.api.CacheService -import org.knora.webapi.store.cacheservice.api.EmptyKey -import org.knora.webapi.store.cacheservice.api.EmptyValue +import org.knora.webapi.store.cache.api.CacheService +import org.knora.webapi.store.cache.api.EmptyKey +import org.knora.webapi.store.cache.api.EmptyValue import zio._ import zio.stm._ diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/impl/CacheServiceRedisImpl.scala similarity index 96% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/impl/CacheServiceRedisImpl.scala index 0bfffa2cd7..0e1ce914c3 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/impl/CacheServiceRedisImpl.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.impl +package org.knora.webapi.store.cache.impl import dsp.errors.ForbiddenException import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -15,11 +15,11 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierTyp import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceStatusNOK import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceStatusOK import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceStatusResponse -import org.knora.webapi.store.cacheservice.api.CacheService -import org.knora.webapi.store.cacheservice.api.EmptyKey -import org.knora.webapi.store.cacheservice.api.EmptyValue -import org.knora.webapi.store.cacheservice.config.RedisConfig -import org.knora.webapi.store.cacheservice.serialization.CacheSerialization +import org.knora.webapi.store.cache.api.CacheService +import org.knora.webapi.store.cache.api.EmptyKey +import org.knora.webapi.store.cache.api.EmptyValue +import org.knora.webapi.store.cache.config.RedisConfig +import org.knora.webapi.store.cache.serialization.CacheSerialization import redis.clients.jedis.Jedis import redis.clients.jedis.JedisPool import redis.clients.jedis.JedisPoolConfig diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/serialization/CacheSerialization.scala similarity index 95% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/serialization/CacheSerialization.scala index 83b5db0e68..d7c565d1fa 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/serialization/CacheSerialization.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.serialization +package org.knora.webapi.store.cache.serialization import dsp.errors.CacheServiceException import zio._ diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/settings/CacheServiceSettings.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala similarity index 91% rename from webapi/src/main/scala/org/knora/webapi/store/cacheservice/settings/CacheServiceSettings.scala rename to webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala index 6ddfa0dd6f..bfedd49ea8 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/settings/CacheServiceSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.settings +package org.knora.webapi.store.cache.settings import com.typesafe.config.Config diff --git a/webapi/src/main/scala/org/knora/webapi/store/iiif/impl/IIIFServiceSipiImpl.scala b/webapi/src/main/scala/org/knora/webapi/store/iiif/impl/IIIFServiceSipiImpl.scala index d48d70aaa7..34d1983a16 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/iiif/impl/IIIFServiceSipiImpl.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/iiif/impl/IIIFServiceSipiImpl.scala @@ -60,9 +60,9 @@ case class IIIFServiceSipiImpl( import SipiKnoraJsonResponseProtocol._ for { - url <- ZIO.succeed(config.sipi.internalBaseUrl + getFileMetadataRequest.filePath + "/knora.json") - request <- ZIO.succeed(new HttpGet(url)) - _ <- ZIO.debug(request) + url <- ZIO.succeed(config.sipi.internalBaseUrl + getFileMetadataRequest.filePath + "/knora.json") + request <- ZIO.succeed(new HttpGet(url)) + // _ <- ZIO.debug(request) sipiResponseStr <- doSipiRequest(request) sipiResponse <- ZIO.attempt(sipiResponseStr.parseJson.convertTo[SipiKnoraJsonResponse]) } yield GetFileMetadataResponse( @@ -332,7 +332,7 @@ object IIIFServiceSipiImpl { }.tap(_ => ZIO.debug(">>> Release Sipi IIIF Service <<<")).orDie val layer: ZLayer[AppConfig & JWTService, Nothing, IIIFService] = { - ZLayer { + ZLayer.scoped { for { config <- ZIO.service[AppConfig] // _ <- ZIO.debug(config) @@ -340,8 +340,8 @@ object IIIFServiceSipiImpl { // HINT: Scope does not work when used together with unsafeRun to // bridge over to Akka. Need to change this as soon Akka is removed // httpClient <- ZIO.acquireRelease(acquire(config))(release(_)) - httpClient <- acquire(config) + httpClient <- ZIO.acquireRelease(acquire(config))(release(_)) } yield IIIFServiceSipiImpl(config, jwtService, httpClient) - }.tap(_ => ZIO.debug(">>> Sipi IIIF Service Initialized <<<")) + } } } diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/RdfDataObjectFactory.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/RdfDataObjectFactory.scala deleted file mode 100644 index 62d862b559..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/RdfDataObjectFactory.scala +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.triplestore - -import com.typesafe.config.Config -import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject - -/** - */ -object RdfDataObjectFactory { - def apply(conf: Config): RdfDataObject = { - val path = conf.getString("path") - val name = conf.getString("name") - new RdfDataObject(path, name) - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala deleted file mode 100644 index 34414ff2cc..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.triplestore - -import akka.actor.Actor -import akka.actor.ActorRef -import akka.actor.Props -import akka.event.LoggingReceive -import akka.routing.FromConfig -import org.knora.webapi.core.ActorMaker -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.store.triplestoremessages.UpdateRepositoryRequest -import org.knora.webapi.messages.util.FakeTriplestore -import org.knora.webapi.settings._ -import org.knora.webapi.store.triplestore.http.HttpTriplestoreConnector -import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater -import org.knora.webapi.util.ActorUtil._ - -import scala.concurrent.ExecutionContext -import com.typesafe.scalalogging.LazyLogging - -/** - * This actor receives messages representing SPARQL requests, and forwards them to instances of one of the configured - * triple stores. - * - * @param appActor a reference to the main application actor. - * @param settings the application settings. - * @param defaultFeatureFactoryConfig the application's default feature factory configuration. - */ -class TriplestoreManager( - appActor: ActorRef, - settings: KnoraSettingsImpl, - defaultFeatureFactoryConfig: FeatureFactoryConfig -) extends Actor - with LazyLogging { - this: ActorMaker => - - protected implicit val executionContext: ExecutionContext = - context.system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - private var storeActorRef: ActorRef = _ - - // TODO: run the fake triple store as an actor (the fake triple store will not be needed anymore, once the embedded triple store is implemented) - FakeTriplestore.init(settings.fakeTriplestoreDataDir) - - if (settings.useFakeTriplestore) { - FakeTriplestore.load() - logger.info("Loaded fake triplestore") - } else { - logger.debug(s"Using triplestore: ${settings.triplestoreType}") - } - - if (settings.prepareFakeTriplestore) { - FakeTriplestore.clear() - logger.info("About to prepare fake triplestore") - } - - logger.debug(settings.triplestoreType) - - // A RepositoryUpdater for processing requests to update the repository. - private val repositoryUpdater: RepositoryUpdater = new RepositoryUpdater( - system = context.system, - appActor = appActor, - settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig - ) - - override def preStart(): Unit = { - logger.debug("TriplestoreManagerActor: start with preStart") - - storeActorRef = makeActor( - FromConfig.props(Props[HttpTriplestoreConnector]()).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = HttpTriplestoreActorName - ) - - logger.debug("TriplestoreManagerActor: finished with preStart") - } - - def receive: Receive = LoggingReceive { - case UpdateRepositoryRequest() => future2Message(sender(), repositoryUpdater.maybeUpdateRepository, logger) - case other => storeActorRef.forward(other) - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManager.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManager.scala new file mode 100644 index 0000000000..965c1abbe3 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManager.scala @@ -0,0 +1,96 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.triplestore + +import org.knora.webapi.messages.store.triplestoremessages.UpdateRepositoryRequest +import org.knora.webapi.settings._ +import org.knora.webapi._ +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater + +import zio._ +import org.knora.webapi.store.triplestore.api.TriplestoreService +import dsp.errors.UnexpectedMessageException +import org.knora.webapi.messages.store.triplestoremessages.SimulateTimeoutRequest +import org.knora.webapi.messages.store.triplestoremessages.InsertGraphDataContentRequest +import org.knora.webapi.messages.store.triplestoremessages.UploadRepositoryRequest +import java.nio.file.Path +import org.knora.webapi.messages.store.triplestoremessages.DownloadRepositoryRequest +import org.knora.webapi.messages.store.triplestoremessages.CheckTriplestoreRequest +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.InsertRepositoryContent +import org.knora.webapi.messages.store.triplestoremessages.DropAllTRepositoryContent +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContent +import org.knora.webapi.messages.store.triplestoremessages.SparqlAskRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlUpdateRequest +import org.knora.webapi.messages.store.triplestoremessages.NamedGraphDataRequest +import org.knora.webapi.messages.util.rdf.QuadFormat +import org.knora.webapi.messages.store.triplestoremessages.NamedGraphFileRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlConstructFileRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstructRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlConstructRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlSelectRequest +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreRequest + +/** + * This service receives akka messages and translates them to calls to ZIO besed service implementations. + * This will be removed when Akka-Actors are removed. + * + * @param ts a triplestore service. + * @param updater a RepositoryUpdater for processing requests to update the repository. + */ +final case class TriplestoreServiceManager( + ts: TriplestoreService, + updater: RepositoryUpdater +) { + def receive(message: TriplestoreRequest) = message match { + case UpdateRepositoryRequest() => updater.maybeUpdateRepository + case SparqlSelectRequest(sparql: String) => ts.sparqlHttpSelect(sparql) + case sparqlConstructRequest: SparqlConstructRequest => + ts.sparqlHttpConstruct(sparqlConstructRequest) + case sparqlExtendedConstructRequest: SparqlExtendedConstructRequest => + ts.sparqlHttpExtendedConstruct(sparqlExtendedConstructRequest) + case SparqlConstructFileRequest( + sparql: String, + graphIri: IRI, + outputFile: Path, + outputFormat: QuadFormat + ) => + ts.sparqlHttpConstructFile(sparql, graphIri, outputFile, outputFormat) + case NamedGraphFileRequest( + graphIri: IRI, + outputFile: Path, + outputFormat: QuadFormat + ) => + ts.sparqlHttpGraphFile(graphIri, outputFile, outputFormat) + case NamedGraphDataRequest(graphIri: IRI) => ts.sparqlHttpGraphData(graphIri) + case SparqlUpdateRequest(sparql: String) => ts.sparqlHttpUpdate(sparql) + case SparqlAskRequest(sparql: String) => ts.sparqlHttpAsk(sparql) + case ResetRepositoryContent(rdfDataObjects: Seq[RdfDataObject], prependDefaults: Boolean) => + ts.resetTripleStoreContent(rdfDataObjects, prependDefaults) + case DropAllTRepositoryContent() => ts.dropAllTriplestoreContent() + case InsertRepositoryContent(rdfDataObjects: Seq[RdfDataObject]) => + ts.insertDataIntoTriplestore(rdfDataObjects, true) + case CheckTriplestoreRequest() => ts.checkTriplestore() + case DownloadRepositoryRequest(outputFile: Path) => ts.downloadRepository(outputFile) + case UploadRepositoryRequest(inputFile: Path) => ts.uploadRepository(inputFile) + case InsertGraphDataContentRequest(graphContent: String, graphName: String) => + ts.insertDataGraphRequest(graphContent, graphName) + case SimulateTimeoutRequest() => ts.doSimulateTimeout() + case other => + ZIO.die(UnexpectedMessageException(s"Unexpected message $other of type ${other.getClass.getCanonicalName}")) + } +} + +object TriplestoreServiceManager { + val layer: ZLayer[TriplestoreService & RepositoryUpdater, Nothing, TriplestoreServiceManager] = { + ZLayer { + for { + ts <- ZIO.service[TriplestoreService] + updater <- ZIO.service[RepositoryUpdater] + } yield TriplestoreServiceManager(ts, updater) + } + } +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/api/TriplestoreService.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/api/TriplestoreService.scala new file mode 100644 index 0000000000..bf316ba7c9 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/api/TriplestoreService.scala @@ -0,0 +1,177 @@ +package org.knora.webapi.store.triplestore.api + +import org.knora.webapi._ +import org.knora.webapi.messages.store.triplestoremessages.CheckTriplestoreResponse +import org.knora.webapi.messages.store.triplestoremessages.DropAllRepositoryContentACK +import org.knora.webapi.messages.store.triplestoremessages.FileWrittenResponse +import org.knora.webapi.messages.store.triplestoremessages.InsertGraphDataContentResponse +import org.knora.webapi.messages.store.triplestoremessages.InsertTriplestoreContentACK +import org.knora.webapi.messages.store.triplestoremessages.NamedGraphDataResponse +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.RepositoryUploadedResponse +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContentACK +import org.knora.webapi.messages.store.triplestoremessages.SparqlAskResponse +import org.knora.webapi.messages.store.triplestoremessages.SparqlConstructRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlConstructResponse +import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstructRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstructResponse +import org.knora.webapi.messages.store.triplestoremessages.SparqlUpdateResponse +import org.knora.webapi.messages.util.rdf.QuadFormat +import org.knora.webapi.messages.util.rdf.SparqlSelectResult +import zio._ +import zio.macros.accessible + +import java.nio.file.Path + +@accessible +trait TriplestoreService { + + /** + * Simulates a read timeout. + */ + def doSimulateTimeout(): UIO[SparqlSelectResult] + + /** + * Given a SPARQL SELECT query string, runs the query, returning the result as a [[SparqlSelectResult]]. + * + * @param sparql the SPARQL SELECT query string. + * @param simulateTimeout if `true`, simulate a read timeout. + * @return a [[SparqlSelectResult]]. + */ + def sparqlHttpSelect(sparql: String, simulateTimeout: Boolean = false): UIO[SparqlSelectResult] + + /** + * Given a SPARQL CONSTRUCT query string, runs the query, returning the result as a [[SparqlConstructResponse]]. + * + * @param sparqlConstructRequest the request message. + * @return a [[SparqlConstructResponse]] + */ + def sparqlHttpConstruct(sparqlConstructRequest: SparqlConstructRequest): UIO[SparqlConstructResponse] + + /** + * Given a SPARQL CONSTRUCT query string, runs the query, returns the result as a [[SparqlExtendedConstructResponse]]. + * + * @param sparqlExtendedConstructRequest the request message. + * @return a [[SparqlExtendedConstructResponse]] + */ + def sparqlHttpExtendedConstruct( + sparqlExtendedConstructRequest: SparqlExtendedConstructRequest + ): UIO[SparqlExtendedConstructResponse] + + /** + * Given a SPARQL CONSTRUCT query string, runs the query, saving the result in a file. + * + * @param sparql the SPARQL CONSTRUCT query string. + * @param graphIri the named graph IRI to be used in the output file. + * @param outputFile the output file. + * @param outputFormat the output file format. + * @return a [[FileWrittenResponse]]. + */ + def sparqlHttpConstructFile( + sparql: String, + graphIri: IRI, + outputFile: Path, + outputFormat: QuadFormat + ): UIO[FileWrittenResponse] + + /** + * Performs a SPARQL update operation. + * + * @param sparqlUpdate the SPARQL update. + * @return a [[SparqlUpdateResponse]]. + */ + def sparqlHttpUpdate(sparqlUpdate: String): UIO[SparqlUpdateResponse] + + /** + * Performs a SPARQL ASK query. + * + * @param sparql the SPARQL ASK query. + * @return a [[SparqlAskResponse]]. + */ + def sparqlHttpAsk(sparql: String): UIO[SparqlAskResponse] + + /** + * Requests the contents of a named graph, saving the response in a file. + * + * @param graphIri the IRI of the named graph. + * @param outputFile the file to be written. + * @param outputFormat the output file format. + * + * @return a string containing the contents of the graph in N-Quads format. + */ + def sparqlHttpGraphFile( + graphIri: IRI, + outputFile: Path, + outputFormat: QuadFormat + ): UIO[FileWrittenResponse] + + /** + * Requests the contents of a named graph, returning the response as Turtle. + * + * @param graphIri the IRI of the named graph. + * @return a string containing the contents of the graph in Turtle format. + */ + def sparqlHttpGraphData(graphIri: IRI): UIO[NamedGraphDataResponse] + + /** + * Resets the content of the triplestore with the data supplied with the request. + * First performs `dropAllTriplestoreContent` and afterwards `insertDataIntoTriplestore`. + * + * @param rdfDataObjects a sequence of paths and graph names referencing data that needs to be inserted. + * @param prependDefaults denotes if the rdfDataObjects list should be prepended with a default set. Default is `true`. + */ + def resetTripleStoreContent( + rdfDataObjects: List[RdfDataObject], + prependDefaults: Boolean = true + ): UIO[ResetRepositoryContentACK] + + /** + * Drops (deletes) all data from the triplestore. + */ + def dropAllTriplestoreContent(): UIO[DropAllRepositoryContentACK] + + /** + * Inserts the data referenced inside the `rdfDataObjects` by appending it to a default set of `rdfDataObjects` + * based on the list defined in `application.conf` under the `app.triplestore.default-rdf-data` key. + * + * @param rdfDataObjects a sequence of paths and graph names referencing data that needs to be inserted. + * @param prependDefaults denotes if the rdfDataObjects list should be prepended with a default set. Default is `true`. + * @return [[InsertTriplestoreContentACK]] + */ + def insertDataIntoTriplestore( + rdfDataObjects: List[RdfDataObject], + prependDefaults: Boolean + ): UIO[InsertTriplestoreContentACK] + + /** + * Checks the Fuseki triplestore if it is available and configured correctly. If it is not + * configured, tries to automatically configure (initialize) the required dataset. + */ + def checkTriplestore(): UIO[CheckTriplestoreResponse] + + /** + * Dumps the whole repository in N-Quads format, saving the response in a file. + * + * @param outputFile the output file. + * @return a string containing the contents of the graph in N-Quads format. + */ + def downloadRepository( + outputFile: Path + ): UIO[FileWrittenResponse] + + /** + * Uploads repository content from an N-Quads file. + * + * @param inputFile an N-Quads file containing the content to be uploaded to the repository. + */ + def uploadRepository(inputFile: Path): UIO[RepositoryUploadedResponse] + + /** + * Puts a data graph into the repository. + * + * @param graphContent a data graph in Turtle format to be inserted into the repository. + * @param graphName the name of the graph. + */ + def insertDataGraphRequest(graphContent: String, graphName: String): UIO[InsertGraphDataContentResponse] + +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/defaults/DefaultRdfData.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/defaults/DefaultRdfData.scala new file mode 100644 index 0000000000..ed2612678d --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/defaults/DefaultRdfData.scala @@ -0,0 +1,81 @@ +package org.knora.webapi.store.triplestore.defaults + +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import zio.NonEmptyChunk + +object DefaultRdfData { + + /** + * This data is automatically loaded during resetting of the triple store content initiated + * through the `ResetTriplestoreContent` message. The main usage is in unit testing, where + * we want a known state of the triple store data. If additional triples need to be loaded, + * then a list of `RdfDataObject` instances containing the path and the name of the named graph + * can be supplied to the `ResetTriplestoreContent` message. + */ + val data = NonEmptyChunk( + RdfDataObject( + path = "knora-ontologies/knora-admin.ttl", + name = "http://www.knora.org/ontology/knora-admin" + ), + RdfDataObject( + path = "knora-ontologies/knora-base.ttl", + name = "http://www.knora.org/ontology/knora-base" + ), + RdfDataObject( + path = "knora-ontologies/standoff-onto.ttl", + name = "http://www.knora.org/ontology/standoff" + ), + RdfDataObject( + path = "knora-ontologies/standoff-data.ttl", + name = "http://www.knora.org/data/standoff" + ), + RdfDataObject( + path = "knora-ontologies/salsah-gui.ttl", + name = "http://www.knora.org/ontology/salsah-gui" + ), + RdfDataObject( + path = "test_data/all_data/admin-data.ttl", + name = "http://www.knora.org/data/admin" + ), + RdfDataObject( + path = "test_data/all_data/permissions-data.ttl", + name = "http://www.knora.org/data/permissions" + ), + RdfDataObject( + path = "test_data/all_data/system-data.ttl", + name = "http://www.knora.org/data/0000/SystemProject" + ), + RdfDataObject( + path = "test_data/ontologies/anything-onto.ttl", + name = "http://www.knora.org/ontology/0001/anything" + ), + RdfDataObject( + path = "test_data/ontologies/something-onto.ttl", + name = "http://www.knora.org/ontology/0001/something" + ), + RdfDataObject( + path = "test_data/ontologies/images-onto.ttl", + name = "http://www.knora.org/ontology/00FF/images" + ), + RdfDataObject( + path = "test_data/ontologies/beol-onto.ttl", + name = "http://www.knora.org/ontology/0801/beol" + ), + RdfDataObject( + path = "test_data/ontologies/biblio-onto.ttl", + name = "http://www.knora.org/ontology/0801/biblio" + ), + RdfDataObject( + path = "test_data/ontologies/incunabula-onto.ttl", + name = "http://www.knora.org/ontology/0803/incunabula" + ), + RdfDataObject( + path = "test_data/ontologies/dokubib-onto.ttl", + name = "http://www.knora.org/ontology/0804/dokubib" + ), + RdfDataObject( + path = "test_data/ontologies/webern-onto.ttl", + name = "http://www.knora.org/ontology/0806/webern" + ) + ) +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala deleted file mode 100644 index 1b6daf5ce7..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala +++ /dev/null @@ -1,1105 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.triplestore.http - -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.ActorSystem -import akka.actor.Status -import com.typesafe.scalalogging.Logger -import org.apache.commons.lang3.StringUtils -import org.apache.http.Consts -import org.apache.http.HttpEntity -import org.apache.http.HttpHost -import org.apache.http.HttpRequest -import org.apache.http.NameValuePair -import org.apache.http.auth.AuthScope -import org.apache.http.auth.UsernamePasswordCredentials -import org.apache.http.client.AuthCache -import org.apache.http.client.config.RequestConfig -import org.apache.http.client.entity.UrlEncodedFormEntity -import org.apache.http.client.methods.CloseableHttpResponse -import org.apache.http.client.methods.HttpGet -import org.apache.http.client.methods.HttpPost -import org.apache.http.client.methods.HttpPut -import org.apache.http.client.protocol.HttpClientContext -import org.apache.http.client.utils.URIBuilder -import org.apache.http.entity.ContentType -import org.apache.http.entity.FileEntity -import org.apache.http.entity.StringEntity -import org.apache.http.impl.auth.BasicScheme -import org.apache.http.impl.client.BasicAuthCache -import org.apache.http.impl.client.BasicCredentialsProvider -import org.apache.http.impl.client.CloseableHttpClient -import org.apache.http.impl.client.HttpClients -import org.apache.http.message.BasicNameValuePair -import org.apache.http.util.EntityUtils -import org.knora.webapi._ -import dsp.errors._ -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.instrumentation.InstrumentationSupport -import org.knora.webapi.messages.store.triplestoremessages.SparqlResultProtocol._ -import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.messages.util.FakeTriplestore -import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.store.triplestore.RdfDataObjectFactory -import org.knora.webapi.util.ActorUtil._ -import org.knora.webapi.util.FileUtil -import spray.json._ - -import java.io.BufferedInputStream -import java.net.URI -import java.nio.charset.StandardCharsets -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import java.nio.file.StandardCopyOption -import java.util -import scala.collection.mutable -import scala.concurrent.ExecutionContext -import scala.jdk.CollectionConverters._ -import scala.util.Failure -import scala.util.Success -import scala.util.Try - -/** - * Submits SPARQL queries and updates to a triplestore over HTTP. Supports different triplestores, which can be configured in - * `application.conf`. - */ -class HttpTriplestoreConnector extends Actor with InstrumentationSupport { - - // MIME type constants. - private val mimeTypeApplicationJson = "application/json" - private val mimeTypeApplicationSparqlResultsJson = "application/sparql-results+json" - private val mimeTypeTextTurtle = "text/turtle" - private val mimeTypeApplicationSparqlUpdate = "application/sparql-update" - private val mimeTypeApplicationNQuads = "application/n-quads" - - private implicit val system: ActorSystem = context.system - private val settings = KnoraSettings(system) - implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraBlockingDispatcher) - val log: Logger = Logger(this.getClass) - - private val targetHost: HttpHost = new HttpHost(settings.triplestoreHost, settings.triplestorePort, "http") - - private val credsProvider: BasicCredentialsProvider = new BasicCredentialsProvider - credsProvider.setCredentials( - new AuthScope(targetHost.getHostName, targetHost.getPort), - new UsernamePasswordCredentials(settings.triplestoreUsername, settings.triplestorePassword) - ) - - // Reading data should be quick, except when it is not ;-) - private val queryTimeoutMillis = settings.triplestoreQueryTimeout.toMillis.toInt - - private val queryRequestConfig = RequestConfig - .custom() - .setConnectTimeout(queryTimeoutMillis) - .setConnectionRequestTimeout(queryTimeoutMillis) - .setSocketTimeout(queryTimeoutMillis) - .build - - private val queryHttpClient: CloseableHttpClient = HttpClients.custom - .setDefaultCredentialsProvider(credsProvider) - .setDefaultRequestConfig(queryRequestConfig) - .build - - // Some updates could take a while. - private val updateTimeoutMillis = settings.triplestoreUpdateTimeout.toMillis.toInt - - private val updateTimeoutConfig = RequestConfig - .custom() - .setConnectTimeout(updateTimeoutMillis) - .setConnectionRequestTimeout(updateTimeoutMillis) - .setSocketTimeout(updateTimeoutMillis) - .build - - private val updateHttpClient: CloseableHttpClient = HttpClients.custom - .setDefaultCredentialsProvider(credsProvider) - .setDefaultRequestConfig(updateTimeoutConfig) - .build - - // For updates that could take a very long time. - private val longTimeoutMillis = settings.triplestoreUpdateTimeout.toMillis.toInt * 10 - - private val longRequestConfig = RequestConfig - .custom() - .setConnectTimeout(longTimeoutMillis) - .setConnectionRequestTimeout(longTimeoutMillis) - .setSocketTimeout(longTimeoutMillis) - .build - - private val longRequestClient: CloseableHttpClient = HttpClients.custom - .setDefaultCredentialsProvider(credsProvider) - .setDefaultRequestConfig(longRequestConfig) - .build - - private val queryPath: String = s"/${settings.triplestoreDatabaseName}/query" - - private val sparqlUpdatePath: String = s"/${settings.triplestoreDatabaseName}/update" - - private val checkRepositoryPath: String = "/$/server" - - private val graphPath: String = s"/${settings.triplestoreDatabaseName}/get" - - private val repositoryDownloadPath = s"/${settings.triplestoreDatabaseName}" - - private val repositoryUploadPath = repositoryDownloadPath - - private val logDelimiter = "\n" + StringUtils.repeat('=', 80) + "\n" - - private val dataInsertPath = s"/${settings.triplestoreDatabaseName}/data" - - /** - * Receives a message requesting a SPARQL select or update, and returns an appropriate response message or - * [[Status.Failure]]. If a serious error occurs (i.e. an error that isn't the client's fault), this - * method first returns `Failure` to the sender, then throws an exception. - */ - def receive: PartialFunction[Any, Unit] = { - case SparqlSelectRequest(sparql: String) => try2Message(sender(), sparqlHttpSelect(sparql), log) - case sparqlConstructRequest: SparqlConstructRequest => - try2Message(sender(), sparqlHttpConstruct(sparqlConstructRequest), log) - case sparqlExtendedConstructRequest: SparqlExtendedConstructRequest => - try2Message(sender(), sparqlHttpExtendedConstruct(sparqlExtendedConstructRequest), log) - case SparqlConstructFileRequest( - sparql: String, - graphIri: IRI, - outputFile: Path, - outputFormat: QuadFormat, - featureFactoryConfig: FeatureFactoryConfig - ) => - try2Message( - sender(), - sparqlHttpConstructFile(sparql, graphIri, outputFile, outputFormat, featureFactoryConfig), - log - ) - case NamedGraphFileRequest( - graphIri: IRI, - outputFile: Path, - outputFormat: QuadFormat, - featureFactoryConfig: FeatureFactoryConfig - ) => - try2Message(sender(), sparqlHttpGraphFile(graphIri, outputFile, outputFormat, featureFactoryConfig), log) - case NamedGraphDataRequest(graphIri: IRI) => try2Message(sender(), sparqlHttpGraphData(graphIri), log) - case SparqlUpdateRequest(sparql: String) => try2Message(sender(), sparqlHttpUpdate(sparql), log) - case SparqlAskRequest(sparql: String) => try2Message(sender(), sparqlHttpAsk(sparql), log) - case ResetRepositoryContent(rdfDataObjects: Seq[RdfDataObject], prependDefaults: Boolean) => - try2Message(sender(), resetTripleStoreContent(rdfDataObjects, prependDefaults), log) - case DropAllTRepositoryContent() => try2Message(sender(), dropAllTriplestoreContent(), log) - case InsertRepositoryContent(rdfDataObjects: Seq[RdfDataObject]) => - try2Message(sender(), insertDataIntoTriplestore(rdfDataObjects), log) - case HelloTriplestore(msg: String) if msg == settings.triplestoreType => - sender() ! HelloTriplestore(settings.triplestoreType) - case CheckTriplestoreRequest() => try2Message(sender(), checkTriplestore(), log) - case SearchIndexUpdateRequest(subjectIri: Option[String]) => - try2Message(sender(), Success(SparqlUpdateResponse()), log) - case DownloadRepositoryRequest(outputFile: Path, featureFactoryConfig: FeatureFactoryConfig) => - try2Message(sender(), downloadRepository(outputFile, featureFactoryConfig), log) - case UploadRepositoryRequest(inputFile: Path) => try2Message(sender(), uploadRepository(inputFile), log) - case InsertGraphDataContentRequest(graphContent: String, graphName: String) => - try2Message(sender(), insertDataGraphRequest(graphContent, graphName), log) - case SimulateTimeoutRequest() => try2Message(sender(), doSimulateTimeout(), log) - case other => - sender() ! Status.Failure( - UnexpectedMessageException(s"Unexpected message $other of type ${other.getClass.getCanonicalName}") - ) - } - - /** - * Simulates a read timeout. - */ - private def doSimulateTimeout(): Try[SparqlSelectResult] = { - val sparql = """SELECT ?foo WHERE { - | BIND("foo" AS ?foo) - |}""".stripMargin - - sparqlHttpSelect(sparql = sparql, simulateTimeout = true) - } - - /** - * Given a SPARQL SELECT query string, runs the query, returning the result as a [[SparqlSelectResult]]. - * - * @param sparql the SPARQL SELECT query string. - * @param simulateTimeout if `true`, simulate a read timeout. - * @return a [[SparqlSelectResult]]. - */ - private def sparqlHttpSelect(sparql: String, simulateTimeout: Boolean = false): Try[SparqlSelectResult] = { - def parseJsonResponse(sparql: String, resultStr: String): Try[SparqlSelectResult] = { - val parseTry = Try { - resultStr.parseJson.convertTo[SparqlSelectResult] - } - - parseTry match { - case Success(parsed) => Success(parsed) - case Failure(e) => - if (resultStr.contains("## Query cancelled due to timeout during execution")) { - log.error(s"Triplestore timed out while sending a response, after sending statuscode 200. ${e.toString()}") - Failure( - TriplestoreTimeoutException( - "Triplestore timed out while sending a response, after sending statuscode 200.", - e, - log - ) - ) - } else { - log.error( - s"Couldn't parse response from triplestore:$logDelimiter$resultStr${logDelimiter}in response to SPARQL query:$logDelimiter$sparql. ${e.toString}" - ) - Failure(TriplestoreResponseException("Couldn't parse Turtle from triplestore", e, log)) - } - } - } - - for { - // Are we using the fake triplestore? - resultStr <- - if (settings.useFakeTriplestore) { - // Yes: get the response from it. - Try(FakeTriplestore.data(sparql)) - } else { - // No: get the response from the real triplestore over HTTP. - getSparqlHttpResponse(sparql, isUpdate = false, simulateTimeout = simulateTimeout) - } - - // Are we preparing a fake triplestore? - _ = if (settings.prepareFakeTriplestore) { - // Yes: add the query and the response to it. - FakeTriplestore.add(sparql, resultStr, log) - } - - // _ = println(s"SPARQL: $logDelimiter$sparql") - // _ = println(s"Result: $logDelimiter$resultStr") - - // Parse the response as a JSON object and generate a response message. - responseMessage <- parseJsonResponse(sparql, resultStr) - } yield responseMessage - } - - /** - * Given a SPARQL CONSTRUCT query string, runs the query, returning the result as a [[SparqlConstructResponse]]. - * - * @param sparqlConstructRequest the request message. - * @return a [[SparqlConstructResponse]] - */ - private def sparqlHttpConstruct(sparqlConstructRequest: SparqlConstructRequest): Try[SparqlConstructResponse] = { - // println(logDelimiter + sparql) - - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(sparqlConstructRequest.featureFactoryConfig) - - def parseTurtleResponse( - sparql: String, - turtleStr: String, - rdfFormatUtil: RdfFormatUtil - ): Try[SparqlConstructResponse] = { - val parseTry = Try { - val rdfModel: RdfModel = rdfFormatUtil.parseToRdfModel(rdfStr = turtleStr, rdfFormat = Turtle) - val statementMap: mutable.Map[IRI, Seq[(IRI, String)]] = mutable.Map.empty - - for (st: Statement <- rdfModel) { - val subjectIri = st.subj.stringValue - val predicateIri = st.pred.stringValue - val objectIri = st.obj.stringValue - val currentStatementsForSubject: Seq[(IRI, String)] = - statementMap.getOrElse(subjectIri, Vector.empty[(IRI, String)]) - statementMap += (subjectIri -> (currentStatementsForSubject :+ (predicateIri, objectIri))) - } - - SparqlConstructResponse(statementMap.toMap) - } - - parseTry match { - case Success(parsed) => Success(parsed) - case Failure(e) => - if (turtleStr.contains("## Query cancelled due to timeout during execution")) { - log.error(s"Triplestore timed out while sending a response, after sending statuscode 200. ${e.toString()}") - Failure( - TriplestoreTimeoutException( - "Triplestore timed out while sending a response, after sending statuscode 200.", - e, - log - ) - ) - } else { - log.error( - s"Couldn't parse response from triplestore:$logDelimiter$turtleStr${logDelimiter}in response to SPARQL query:$logDelimiter$sparql. ${e.toString}" - ) - Failure(TriplestoreResponseException("Couldn't parse Turtle from triplestore", e, log)) - } - } - } - - for { - turtleStr <- - getSparqlHttpResponse(sparqlConstructRequest.sparql, isUpdate = false, acceptMimeType = mimeTypeTextTurtle) - - response <- parseTurtleResponse( - sparql = sparqlConstructRequest.sparql, - turtleStr = turtleStr, - rdfFormatUtil = rdfFormatUtil - ) - } yield response - } - - /** - * Given a SPARQL CONSTRUCT query string, runs the query, saving the result in a file. - * - * @param sparql the SPARQL CONSTRUCT query string. - * @param graphIri the named graph IRI to be used in the output file. - * @param outputFile the output file. - * @param outputFormat the output file format. - * @return a [[FileWrittenResponse]]. - */ - private def sparqlHttpConstructFile( - sparql: String, - graphIri: IRI, - outputFile: Path, - outputFormat: QuadFormat, - featureFactoryConfig: FeatureFactoryConfig - ): Try[FileWrittenResponse] = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) - - for { - turtleStr <- getSparqlHttpResponse(sparql, isUpdate = false, acceptMimeType = mimeTypeTextTurtle) - - _ = rdfFormatUtil.turtleToQuadsFile( - rdfSource = RdfStringSource(turtleStr), - graphIri = graphIri, - outputFile = outputFile, - outputFormat = outputFormat - ) - } yield FileWrittenResponse() - } - - /** - * Given a SPARQL CONSTRUCT query string, runs the query, returns the result as a [[SparqlExtendedConstructResponse]]. - * - * @param sparqlExtendedConstructRequest the request message. - * @return a [[SparqlExtendedConstructResponse]] - */ - private def sparqlHttpExtendedConstruct( - sparqlExtendedConstructRequest: SparqlExtendedConstructRequest - ): Try[SparqlExtendedConstructResponse] = { - // println(sparql) - val rdfFormatUtil: RdfFormatUtil = - RdfFeatureFactory.getRdfFormatUtil(sparqlExtendedConstructRequest.featureFactoryConfig) - - val parseTry = for { - turtleStr <- getSparqlHttpResponse( - sparqlExtendedConstructRequest.sparql, - isUpdate = false, - acceptMimeType = mimeTypeTextTurtle - ) - - response <- SparqlExtendedConstructResponse.parseTurtleResponse( - turtleStr = turtleStr, - rdfFormatUtil = rdfFormatUtil, - log = log - ) - } yield response - - parseTry match { - case Success(parsed) => Success(parsed) - case Failure(timeout: TriplestoreTimeoutException) => Failure(timeout) - case Failure(e) => - Failure( - TriplestoreResponseException( - s"Couldn't parse Turtle from triplestore: ${sparqlExtendedConstructRequest}", - e, - log - ) - ) - } - } - - /** - * Performs a SPARQL update operation. - * - * @param sparqlUpdate the SPARQL update. - * @return a [[SparqlUpdateResponse]]. - */ - private def sparqlHttpUpdate(sparqlUpdate: String): Try[SparqlUpdateResponse] = - // println(logDelimiter + sparqlUpdate) - for { - // Send the request to the triplestore. - _ <- getSparqlHttpResponse(sparqlUpdate, isUpdate = true) - } yield SparqlUpdateResponse() - - /** - * Performs a SPARQL ASK query. - * - * @param sparql the SPARQL ASK query. - * @return a [[SparqlAskResponse]]. - */ - def sparqlHttpAsk(sparql: String): Try[SparqlAskResponse] = - for { - resultString <- getSparqlHttpResponse(sparql, isUpdate = false) - _ = log.debug("sparqlHttpAsk - resultString: {}", resultString) - - result: Boolean = resultString.parseJson.asJsObject.getFields("boolean").head.convertTo[Boolean] - } yield SparqlAskResponse(result) - - private def resetTripleStoreContent( - rdfDataObjects: Seq[RdfDataObject], - prependDefaults: Boolean = true - ): Try[ResetRepositoryContentACK] = { - log.debug("resetTripleStoreContent") - val resetTriplestoreResult = for { - - // drop old content - _ <- dropAllTriplestoreContent() - - // insert new content - _ <- insertDataIntoTriplestore(rdfDataObjects, prependDefaults) - - // any errors throwing exceptions until now are already covered so we can ACK the request - result = ResetRepositoryContentACK() - } yield result - - resetTriplestoreResult - } - - private def dropAllTriplestoreContent(): Try[DropAllRepositoryContentACK] = { - - log.debug("==>> Drop All Data Start") - - val dropAllSparqlString = - """ - DROP ALL - """ - - val response: Try[DropAllRepositoryContentACK] = for { - result: String <- getSparqlHttpResponse(dropAllSparqlString, isUpdate = true) - _ = log.debug(s"==>> Drop All Data End, Result: $result") - } yield DropAllRepositoryContentACK() - - response.recover { case t: Exception => - throw TriplestoreResponseException("Reset: Failed to execute DROP ALL", t, log) - } - } - - /** - * Inserts the data referenced inside the `rdfDataObjects` by appending it to a default set of `rdfDataObjects` - * based on the list defined in `application.conf` under the `app.triplestore.default-rdf-data` key. - * - * @param rdfDataObjects a sequence of paths and graph names referencing data that needs to be inserted. - * @param prependDefaults denotes if the rdfDataObjects list should be prepended with a default set. Default is `true`. - * @return [[InsertTriplestoreContentACK]] - */ - private def insertDataIntoTriplestore( - rdfDataObjects: Seq[RdfDataObject], - prependDefaults: Boolean = true - ): Try[InsertTriplestoreContentACK] = { - val httpContext: HttpClientContext = makeHttpContext - - try { - log.debug("==>> Loading Data Start") - - val defaultRdfDataList = settings.tripleStoreConfig.getConfigList("default-rdf-data") - val defaultRdfDataObjectList = defaultRdfDataList.asScala.map { config => - RdfDataObjectFactory(config) - } - - val completeRdfDataObjectList = if (prependDefaults) { - //prepend default data objects like those of knora-base, knora-admin, etc. - defaultRdfDataObjectList ++ rdfDataObjects - } else { - rdfDataObjects - } - - log.debug("insertDataIntoTriplestore - completeRdfDataObjectList: {}", completeRdfDataObjectList) - - // Iterate over the list of graphs and try inserting each one. - for (elem <- completeRdfDataObjectList) { - val graphName: String = elem.name - - if (graphName.toLowerCase == "default") { - throw TriplestoreUnsupportedFeatureException("Requests to the default graph are not supported") - } - - val uriBuilder: URIBuilder = new URIBuilder(dataInsertPath) - uriBuilder.addParameter("graph", graphName) //Note: addParameter encodes the graphName URL - - val httpPost: HttpPost = new HttpPost(uriBuilder.build()) - - // Add the input file to the body of the request. - // here we need to tweak the base directory path from "webapi" - // to the parent folder where the files can be found - val inputFile = Paths.get("..", elem.path) - if (!Files.exists(inputFile)) { - throw BadRequestException(s"File ${inputFile} does not exist") - } - - val fileEntity = new FileEntity(inputFile.toFile, ContentType.create(mimeTypeTextTurtle, "UTF-8")) - httpPost.setEntity(fileEntity) - val makeResponse: CloseableHttpResponse => InsertGraphDataContentResponse = returnInsertGraphDataResponse( - graphName - ) - - // Do the post request for the graph. - doHttpRequest( - client = longRequestClient, - request = httpPost, - context = httpContext, - processResponse = makeResponse - ) - - log.debug(s"added: $graphName") - } - - log.debug("==>> Loading Data End") - - // Return success if all graphs are inserted successfully. - Success(InsertTriplestoreContentACK()) - } catch { - case e: TriplestoreUnsupportedFeatureException => Failure(e) - case e: Exception => - Failure(TriplestoreResponseException("Reset: Failed to execute insert into triplestore", e, log)) - } - } - - /** - * Checks connection to the triplestore. - */ - private def checkTriplestore(): Try[CheckTriplestoreResponse] = checkFusekiTriplestore() - - /** - * Checks the Fuseki triplestore if it is available and configured correctly. If the it is not - * configured, tries to automatically configure (initialize) the required dataset. - */ - private def checkFusekiTriplestore(afterAutoInit: Boolean = false): Try[CheckTriplestoreResponse] = { - import org.knora.webapi.messages.store.triplestoremessages.FusekiJsonProtocol._ - - try { - log.debug("checkFusekiRepository entered") - - // Call an endpoint that returns all datasets. - - val context: HttpClientContext = makeHttpContext - - val httpGet = new HttpGet(checkRepositoryPath) - httpGet.addHeader("Accept", mimeTypeApplicationJson) - - val responseStr: String = { - var maybeResponse: Option[CloseableHttpResponse] = None - - val responseTry: Try[String] = Try { - maybeResponse = Some(queryHttpClient.execute(targetHost, httpGet, context)) - EntityUtils.toString(maybeResponse.get.getEntity, StandardCharsets.UTF_8) - } - - maybeResponse.foreach(_.close()) - responseTry.get - } - - val nameShouldBe = settings.triplestoreDatabaseName - val fusekiServer: FusekiServer = JsonParser(responseStr).convertTo[FusekiServer] - val neededDataset: Option[FusekiDataset] = - fusekiServer.datasets.find(dataset => dataset.dsName == s"/$nameShouldBe" && dataset.dsState) - - if (neededDataset.nonEmpty) { - // everything looks good - Success( - CheckTriplestoreResponse( - triplestoreStatus = TriplestoreStatus.ServiceAvailable, - msg = "Triplestore is available." - ) - ) - } else { - // none of the available datasets meet our requirements - log.info(s"None of the active datasets meet our requirement of name: $nameShouldBe") - if (settings.triplestoreAutoInit) { - // try to auto-init if we didn't tried it already - if (afterAutoInit) { - // we already tried to auto-init but it wasn't successful - Success( - CheckTriplestoreResponse( - triplestoreStatus = TriplestoreStatus.NotInitialized, - msg = - s"Sorry, we tried to auto-initialize and still none of the active datasets meet our requirement of name: $nameShouldBe" - ) - ) - } else { - // try to auto-init - log.info("Triplestore auto-init is set. Trying to auto-initialize.") - initJenaFusekiTriplestore() - } - } else { - Success( - CheckTriplestoreResponse( - triplestoreStatus = TriplestoreStatus.NotInitialized, - msg = s"None of the active datasets meet our requirement of name: $nameShouldBe" - ) - ) - } - } - } catch { - case e: Exception => - // println("checkRepository - exception", e) - Success( - CheckTriplestoreResponse( - triplestoreStatus = TriplestoreStatus.ServiceUnavailable, - msg = s"Triplestore not available: ${e.getMessage}" - ) - ) - } - } - - /** - * Initialize the Jena Fuseki triplestore. Currently only works for - * 'knora-test' and 'knora-test-unit' repository names. To be used, the - * API needs to be started with 'KNORA_WEBAPI_TRIPLESTORE_AUTOINIT' set - * to 'true' (settings.triplestoreAutoInit). This is set to `true` for tests - * (`test/resources/test.conf`).Usage is only recommended for automated - * testing and not for production use. - */ - private def initJenaFusekiTriplestore(): Try[CheckTriplestoreResponse] = { - - // TODO: Needs https://github.com/scalameta/metals/issues/3623 to be resolved - // val configFileName = s"webapi/scripts/fuseki-repository-config.ttl.template" - val configFileName = s"fuseki-repository-config.ttl.template" - - val triplestoreConfig: String = - try { - // take config from the classpath and write to triplestore - FileUtil.readTextResource(configFileName).replace("@REPOSITORY@", settings.triplestoreDatabaseName) - } catch { - case _: NotFoundException => - log.error(s"Cannot initialize repository. Config $configFileName not found.") - "" - } - - val httpContext: HttpClientContext = makeHttpContext - val httpPost: HttpPost = new HttpPost("/$/datasets") - val stringEntity = new StringEntity(triplestoreConfig, ContentType.create(mimeTypeTextTurtle)) - httpPost.setEntity(stringEntity) - - doHttpRequest( - client = updateHttpClient, - request = httpPost, - context = httpContext, - processResponse = returnUploadResponse - ) - - // do the check again - checkFusekiTriplestore(true) - } - - /** - * Makes a triplestore URI for downloading a named graph. - * - * @param graphIri the IRI of the named graph. - * @return a triplestore-specific URI for downloading the named graph. - */ - private def makeNamedGraphDownloadUri(graphIri: IRI): URI = { - val uriBuilder: URIBuilder = new URIBuilder(graphPath) - uriBuilder.setParameter("graph", s"$graphIri") - uriBuilder.build() - } - - /** - * Requests the contents of a named graph, saving the response in a file. - * - * @param graphIri the IRI of the named graph. - * @param outputFile the file to be written. - * @param outputFormat the output file format. - * @param featureFactoryConfig the feature factory configuration. - * @return a string containing the contents of the graph in N-Quads format. - */ - private def sparqlHttpGraphFile( - graphIri: IRI, - outputFile: Path, - outputFormat: QuadFormat, - featureFactoryConfig: FeatureFactoryConfig - ): Try[FileWrittenResponse] = { - val httpContext: HttpClientContext = makeHttpContext - val httpGet = new HttpGet(makeNamedGraphDownloadUri(graphIri)) - httpGet.addHeader("Accept", mimeTypeTextTurtle) - - val makeResponse: CloseableHttpResponse => FileWrittenResponse = writeResponseFile( - outputFile = outputFile, - featureFactoryConfig = featureFactoryConfig, - maybeGraphIriAndFormat = Some(GraphIriAndFormat(graphIri = graphIri, quadFormat = outputFormat)) - ) - - doHttpRequest( - client = queryHttpClient, - request = httpGet, - context = httpContext, - processResponse = makeResponse - ) - } - - /** - * Requests the contents of a named graph, returning the response as Turtle. - * - * @param graphIri the IRI of the named graph. - * @return a string containing the contents of the graph in Turtle format. - */ - private def sparqlHttpGraphData(graphIri: IRI): Try[NamedGraphDataResponse] = { - val httpContext: HttpClientContext = makeHttpContext - val httpGet = new HttpGet(makeNamedGraphDownloadUri(graphIri)) - httpGet.addHeader("Accept", mimeTypeTextTurtle) - val makeResponse: CloseableHttpResponse => NamedGraphDataResponse = returnGraphDataAsTurtle(graphIri) - - doHttpRequest( - client = queryHttpClient, - request = httpGet, - context = httpContext, - processResponse = makeResponse - ) - } - - /** - * Submits a SPARQL request to the triplestore and returns the response as a string. - * - * @param sparql the SPARQL request to be submitted. - * @param isUpdate `true` if this is an update request. - * @param acceptMimeType the MIME type to be provided in the HTTP Accept header. - * @param simulateTimeout if `true`, simulate a read timeout. - * @return the triplestore's response. - */ - private def getSparqlHttpResponse( - sparql: String, - isUpdate: Boolean, - acceptMimeType: String = mimeTypeApplicationSparqlResultsJson, - simulateTimeout: Boolean = false - ): Try[String] = { - - val httpContext: HttpClientContext = makeHttpContext - - val (httpClient: CloseableHttpClient, httpPost: HttpPost) = if (isUpdate) { - // Send updates as application/sparql-update (as per SPARQL 1.1 Protocol §3.2.2, "UPDATE using POST directly"). - val requestEntity = new StringEntity(sparql, ContentType.create(mimeTypeApplicationSparqlUpdate, "UTF-8")) - val updateHttpPost = new HttpPost(sparqlUpdatePath) - updateHttpPost.setEntity(requestEntity) - (updateHttpClient, updateHttpPost) - } else { - // Send queries as application/x-www-form-urlencoded (as per SPARQL 1.1 Protocol §2.1.2, - // "query via POST with URL-encoded parameters"), so we can include the "infer" parameter when using GraphDB. - val formParams = new util.ArrayList[NameValuePair]() - formParams.add(new BasicNameValuePair("query", sparql)) - val requestEntity: UrlEncodedFormEntity = new UrlEncodedFormEntity(formParams, Consts.UTF_8) - val queryHttpPost: HttpPost = new HttpPost(queryPath) - queryHttpPost.setEntity(requestEntity) - queryHttpPost.addHeader("Accept", acceptMimeType) - (queryHttpClient, queryHttpPost) - } - - val tryRequest = doHttpRequest( - client = httpClient, - request = httpPost, - context = httpContext, - processResponse = returnResponseAsString, - simulateTimeout = simulateTimeout - ) - tryRequest match { - case Failure(exception) => - exception match { - case TriplestoreTimeoutException(_, _) => - log.error(s"Triplestore timed out after query: $sparql") - } - tryRequest - case _ => tryRequest - } - } - - /** - * Dumps the whole repository in N-Quads format, saving the response in a file. - * - * @param outputFile the output file. - * @param featureFactoryConfig the feature factory configuration. - * @return a string containing the contents of the graph in N-Quads format. - */ - private def downloadRepository( - outputFile: Path, - featureFactoryConfig: FeatureFactoryConfig - ): Try[FileWrittenResponse] = { - val httpContext: HttpClientContext = makeHttpContext - - val uriBuilder: URIBuilder = new URIBuilder(repositoryDownloadPath) - - val httpGet = new HttpGet(uriBuilder.build()) - httpGet.addHeader("Accept", mimeTypeApplicationNQuads) - val queryTimeoutMillis = settings.triplestoreQueryTimeout.toMillis.toInt * 10 - - val queryRequestConfig = RequestConfig - .custom() - .setConnectTimeout(queryTimeoutMillis) - .setConnectionRequestTimeout(queryTimeoutMillis) - .setSocketTimeout(queryTimeoutMillis) - .build - - val queryHttpClient: CloseableHttpClient = HttpClients.custom - .setDefaultCredentialsProvider(credsProvider) - .setDefaultRequestConfig(queryRequestConfig) - .build - - val makeResponse: CloseableHttpResponse => FileWrittenResponse = writeResponseFile( - outputFile = outputFile, - featureFactoryConfig = featureFactoryConfig - ) - - doHttpRequest( - client = queryHttpClient, - request = httpGet, - context = httpContext, - processResponse = makeResponse - ) - - } - - /** - * Uploads repository content from an N-Quads file. - * - * @param inputFile an N-Quads file containing the content to be uploaded to the repository. - */ - private def uploadRepository(inputFile: Path): Try[RepositoryUploadedResponse] = { - val httpContext: HttpClientContext = makeHttpContext - val httpPost: HttpPost = new HttpPost(repositoryUploadPath) - val fileEntity = new FileEntity(inputFile.toFile, ContentType.create(mimeTypeApplicationNQuads, "UTF-8")) - httpPost.setEntity(fileEntity) - - doHttpRequest( - client = longRequestClient, - request = httpPost, - context = httpContext, - processResponse = returnUploadResponse - ) - } - - /** - * Puts a data graph into the repository. - * - * @param graphContent a data graph in Turtle format to be inserted into the repository. - * @param graphName the name of the graph. - */ - private def insertDataGraphRequest(graphContent: String, graphName: String): Try[InsertGraphDataContentResponse] = { - val httpContext: HttpClientContext = makeHttpContext - val uriBuilder: URIBuilder = new URIBuilder(dataInsertPath) - uriBuilder.addParameter("graph", graphName) - val httpPut: HttpPut = new HttpPut(uriBuilder.build()) - val requestEntity = new StringEntity(graphContent, ContentType.create(mimeTypeTextTurtle, "UTF-8")) - httpPut.setEntity(requestEntity) - val makeResponse: CloseableHttpResponse => InsertGraphDataContentResponse = returnInsertGraphDataResponse(graphName) - - doHttpRequest( - client = updateHttpClient, - request = httpPut, - context = httpContext, - processResponse = makeResponse - ) - } - - /** - * Formulate HTTP context. - * - * @return httpContext with credentials and authorization - */ - private def makeHttpContext: HttpClientContext = { - val authCache: AuthCache = new BasicAuthCache - val basicAuth: BasicScheme = new BasicScheme - authCache.put(targetHost, basicAuth) - - val httpContext: HttpClientContext = HttpClientContext.create - httpContext.setCredentialsProvider(credsProvider) - httpContext.setAuthCache(authCache) - httpContext - } - - /** - * Makes an HTTP connection to the triplestore, and delegates processing of the response - * to a function. - * - * @param client the HTTP client to be used for the request. - * @param request the request to be sent. - * @param context the request context to be used. - * @param processResponse a function that processes the HTTP response. - * @param simulateTimeout if `true`, simulate a read timeout. - * @tparam T the return type of `processResponse`. - * @return the return value of `processResponse`. - */ - private def doHttpRequest[T]( - client: CloseableHttpClient, - request: HttpRequest, - context: HttpClientContext, - processResponse: CloseableHttpResponse => T, - simulateTimeout: Boolean = false - ): Try[T] = { - // Make an Option wrapper for the response, so we can close it if we get one, - // even if an error occurs. - var maybeResponse: Option[CloseableHttpResponse] = None - - val triplestoreResponseTry = Try { - if (simulateTimeout) { - throw new java.net.SocketTimeoutException("Simulated read timeout") - } - - val start = System.currentTimeMillis() - val response = client.execute(targetHost, request, context) - maybeResponse = Some(response) - val statusCode: Int = response.getStatusLine.getStatusCode - - if (statusCode == 404) { - throw NotFoundException("The requested data was not found") - } else { - val statusCategory: Int = statusCode / 100 - - if (statusCategory != 2) { - Option(response.getEntity) - .map(responseEntity => EntityUtils.toString(responseEntity, StandardCharsets.UTF_8)) match { - case Some(responseEntityStr) => - val msg = s"Triplestore responded with HTTP code $statusCode: $responseEntityStr" - log.error(msg) - if (statusCode == 503 && responseEntityStr.contains("Query timed out")) - throw TriplestoreTimeoutException(msg) - else throw TriplestoreResponseException(msg) - - case None => - log.error(s"Triplestore responded with HTTP code $statusCode") - throw TriplestoreResponseException(s"Triplestore responded with HTTP code $statusCode") - } - } - } - - val took = System.currentTimeMillis() - start - metricsLogger.info(s"[$statusCode] Triplestore query took: ${took}ms") - processResponse(response) - } - - maybeResponse.foreach(_.close) - - // TODO: Can we make Fuseki abandon the query if it takes too long? - - triplestoreResponseTry.recover { - case tre: TriplestoreResponseException => throw tre - - case socketTimeoutException: java.net.SocketTimeoutException => - val message = - "The triplestore took too long to process a request. This can happen because the triplestore needed too much time to search through the data that is currently in the triplestore. Query optimisation may help." - log.error(message + socketTimeoutException.toString()) - throw TriplestoreTimeoutException(message = message, e = socketTimeoutException, log = log) - - case timeout: TriplestoreTimeoutException => throw timeout - - case notFound: NotFoundException => throw notFound - - case e: Exception => - val message = "Failed to connect to triplestore" - log.error(message + e.toString()) - throw TriplestoreConnectionException(message = message, e = e, log = log) - } - } - - def returnResponseAsString(response: CloseableHttpResponse): String = - Option(response.getEntity) match { - case None => "" - - case Some(responseEntity) => - EntityUtils.toString(responseEntity, StandardCharsets.UTF_8) - } - - def returnGraphDataAsTurtle(graphIri: IRI)(response: CloseableHttpResponse): NamedGraphDataResponse = - Option(response.getEntity) match { - case None => - log.error(s"Triplestore returned no content for graph $graphIri") - throw TriplestoreResponseException(s"Triplestore returned no content for graph $graphIri") - - case Some(responseEntity: HttpEntity) => - NamedGraphDataResponse( - turtle = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8) - ) - } - - def returnUploadResponse: CloseableHttpResponse => RepositoryUploadedResponse = { _ => - RepositoryUploadedResponse() - } - - def returnInsertGraphDataResponse( - graphName: String - )(response: CloseableHttpResponse): InsertGraphDataContentResponse = - Option(response.getEntity) match { - case None => - log.error(s"$graphName could not be inserted into Triplestore.") - throw TriplestoreResponseException(s"$graphName could not be inserted into Triplestore.") - - case Some(_) => - InsertGraphDataContentResponse() - } - - /** - * Represents a named graph IRI and the file format that the graph should be written in. - * - * @param graphIri the named graph IRI. - * @param quadFormat the file format. - */ - case class GraphIriAndFormat(graphIri: IRI, quadFormat: QuadFormat) - - /** - * Writes an HTTP response to a file. - * - * @param outputFile the output file. - * @param featureFactoryConfig the feature factory configuration. - * @param maybeGraphIriAndFormat a graph IRI and quad format for the output file. If defined, the response - * is parsed as Turtle and converted to the output format, with the graph IRI - * added to each statement. Otherwise, the response is written as-is to the - * output file. - * @param response the response to be read. - * @return a [[FileWrittenResponse]]. - */ - def writeResponseFile( - outputFile: Path, - featureFactoryConfig: FeatureFactoryConfig, - maybeGraphIriAndFormat: Option[GraphIriAndFormat] = None - )(response: CloseableHttpResponse): FileWrittenResponse = - Option(response.getEntity) match { - case Some(responseEntity: HttpEntity) => - // Are we converting the response to a quad format? - maybeGraphIriAndFormat match { - case Some(GraphIriAndFormat(graphIri, quadFormat)) => - // Yes. Stream the HTTP entity to a temporary Turtle file. - val turtleFile = Paths.get(outputFile.toString + ".ttl") - Files.copy(responseEntity.getContent, turtleFile, StandardCopyOption.REPLACE_EXISTING) - - // Convert the Turtle to the output format. - - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) - - val processFileTry: Try[Unit] = Try { - rdfFormatUtil.turtleToQuadsFile( - rdfSource = RdfInputStreamSource(new BufferedInputStream(Files.newInputStream(turtleFile))), - graphIri = graphIri, - outputFile = outputFile, - outputFormat = quadFormat - ) - } - - Files.delete(turtleFile) - - processFileTry match { - case Success(_) => () - case Failure(ex) => throw ex - } - - case None => - // No. Stream the HTTP entity directly to the output file. - Files.copy(responseEntity.getContent, outputFile) - } - - FileWrittenResponse() - - case None => - maybeGraphIriAndFormat match { - case Some(GraphIriAndFormat(graphIri, _)) => - log.error(s"Triplestore returned no content for graph $graphIri") - throw TriplestoreResponseException(s"Triplestore returned no content for graph $graphIri") - - case None => - log.error(s"Triplestore returned no content for repository dump") - throw TriplestoreResponseException(s"Triplestore returned no content for for repository dump") - } - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImpl.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImpl.scala new file mode 100644 index 0000000000..effa86d789 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImpl.scala @@ -0,0 +1,1110 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.triplestore.impl + +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.ActorSystem +import akka.actor.Status +import akka.event.LoggingAdapter +import org.apache.commons.lang3.StringUtils +import org.apache.http.Consts +import org.apache.http.HttpEntity +import org.apache.http.HttpHost +import org.apache.http.HttpRequest +import org.apache.http.NameValuePair +import org.apache.http.auth.AuthScope +import org.apache.http.auth.UsernamePasswordCredentials +import org.apache.http.client.AuthCache +import org.apache.http.client.config.RequestConfig +import org.apache.http.client.entity.UrlEncodedFormEntity +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpGet +import org.apache.http.client.methods.HttpPost +import org.apache.http.client.methods.HttpPut +import org.apache.http.client.protocol.HttpClientContext +import org.apache.http.client.utils.URIBuilder +import org.apache.http.entity.ContentType +import org.apache.http.entity.FileEntity +import org.apache.http.entity.StringEntity +import org.apache.http.impl.auth.BasicScheme +import org.apache.http.impl.client.BasicAuthCache +import org.apache.http.impl.client.BasicCredentialsProvider +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import org.apache.http.message.BasicNameValuePair +import org.apache.http.util.EntityUtils +import org.knora.webapi._ +import dsp.errors._ +import org.knora.webapi.instrumentation.InstrumentationSupport +import org.knora.webapi.messages.store.triplestoremessages.SparqlResultProtocol._ +import org.knora.webapi.messages.store.triplestoremessages._ +import org.knora.webapi.messages.util.FakeTriplestore +import org.knora.webapi.messages.util.rdf._ +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.util.ActorUtil._ +import org.knora.webapi.util.FileUtil +import spray.json._ + +import java.io.BufferedInputStream +import java.net.URI +import java.nio.charset.StandardCharsets +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.StandardCopyOption +import java.util +import scala.collection.mutable +import scala.concurrent.ExecutionContext +import scala.jdk.CollectionConverters._ + +import org.knora.webapi.store.triplestore.api.TriplestoreService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.store.triplestore.defaults.DefaultRdfData + +import zio._ +import zio.json.ast.Json +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager +import org.apache.http.config.SocketConfig + +/** + * Submits SPARQL queries and updates to a triplestore over HTTP. Supports different triplestores, which can be configured in + * `application.conf`. + */ +case class TriplestoreServiceHttpConnectorImpl( + config: AppConfig, + httpClient: CloseableHttpClient +) extends TriplestoreService { + + // MIME type constants. + private val mimeTypeApplicationJson = "application/json" + private val mimeTypeApplicationSparqlResultsJson = "application/sparql-results+json" + private val mimeTypeTextTurtle = "text/turtle" + private val mimeTypeApplicationSparqlUpdate = "application/sparql-update" + private val mimeTypeApplicationNQuads = "application/n-quads" + + private val targetHost: HttpHost = new HttpHost(config.triplestore.host, config.triplestore.fuseki.port, "http") + + private val credsProvider: BasicCredentialsProvider = new BasicCredentialsProvider + credsProvider.setCredentials( + new AuthScope(targetHost.getHostName, targetHost.getPort), + new UsernamePasswordCredentials(config.triplestore.fuseki.username, config.triplestore.fuseki.password) + ) + + // Reading data should be quick, except when it is not ;-) + private val queryTimeoutMillis = config.triplestore.queryTimeoutAsDuration.toMillis.toInt + + private val queryRequestConfig = RequestConfig + .custom() + .setConnectTimeout(queryTimeoutMillis) + .setConnectionRequestTimeout(queryTimeoutMillis) + .setSocketTimeout(queryTimeoutMillis) + .build + + private val queryHttpClient: CloseableHttpClient = HttpClients.custom + .setDefaultCredentialsProvider(credsProvider) + .setDefaultRequestConfig(queryRequestConfig) + .build + + // Some updates could take a while. + private val updateTimeoutMillis = config.triplestore.updateTimeoutAsDuration.toMillis.toInt + + private val updateTimeoutConfig = RequestConfig + .custom() + .setConnectTimeout(updateTimeoutMillis) + .setConnectionRequestTimeout(updateTimeoutMillis) + .setSocketTimeout(updateTimeoutMillis) + .build + + private val updateHttpClient: CloseableHttpClient = HttpClients.custom + .setDefaultCredentialsProvider(credsProvider) + .setDefaultRequestConfig(updateTimeoutConfig) + .build + + // For updates that could take a very long time. + private val longUpdateTimeoutMillis = updateTimeoutMillis * 10 + + private val longRequestConfig = RequestConfig + .custom() + .setConnectTimeout(longUpdateTimeoutMillis) + .setConnectionRequestTimeout(longUpdateTimeoutMillis) + .setSocketTimeout(longUpdateTimeoutMillis) + .build + + private val longRequestClient: CloseableHttpClient = HttpClients.custom + .setDefaultCredentialsProvider(credsProvider) + .setDefaultRequestConfig(longRequestConfig) + .build + + private val dbName = config.triplestore.fuseki.repositoryName + private val queryPath = s"/${dbName}/query" + private val sparqlUpdatePath = s"/${dbName}/update" + private val graphPath = s"/${dbName}/get" + private val dataInsertPath = s"/${dbName}/data" + private val repositoryDownloadPath = s"/${dbName}" + private val checkRepositoryPath = "/$/server" + private val repositoryUploadPath = repositoryDownloadPath + private val logDelimiter = "\n" + StringUtils.repeat('=', 80) + "\n" + + /** + * Simulates a read timeout. + */ + def doSimulateTimeout(): UIO[SparqlSelectResult] = { + val sparql = """SELECT ?foo WHERE { + | BIND("foo" AS ?foo) + |}""".stripMargin + + for { + result <- sparqlHttpSelect(sparql = sparql, simulateTimeout = true) + } yield result + } + + /** + * Given a SPARQL SELECT query string, runs the query, returning the result as a [[SparqlSelectResult]]. + * + * @param sparql the SPARQL SELECT query string. + * @param simulateTimeout if `true`, simulate a read timeout. + * @return a [[SparqlSelectResult]]. + */ + def sparqlHttpSelect(sparql: String, simulateTimeout: Boolean = false): UIO[SparqlSelectResult] = { + + def parseJsonResponse(sparql: String, resultStr: String): IO[TriplestoreException, SparqlSelectResult] = + ZIO + .attemptBlocking(resultStr.parseJson.convertTo[SparqlSelectResult]) + .foldZIO( + failure => + if (resultStr.contains("## Query cancelled due to timeout during execution")) { + ZIO.logError("Triplestore timed out while sending a response, after sending statuscode 200.") *> + ZIO.fail( + TriplestoreTimeoutException( + "Triplestore timed out while sending a response, after sending statuscode 200." + ) + ) + } else { + ZIO.logError( + s"Couldn't parse response from triplestore:$logDelimiter$resultStr${logDelimiter}in response to SPARQL query:$logDelimiter$sparql" + ) *> + ZIO.fail(TriplestoreResponseException("Couldn't parse Turtle from triplestore")) + }, + ZIO.succeed(_) + ) + + for { + resultStr <- + getSparqlHttpResponse(sparql, isUpdate = false, simulateTimeout = simulateTimeout) + + // Parse the response as a JSON object and generate a response message. + responseMessage <- parseJsonResponse(sparql, resultStr).orDie + } yield responseMessage + } + + /** + * Given a SPARQL CONSTRUCT query string, runs the query, returning the result as a [[SparqlConstructResponse]]. + * + * @param sparqlConstructRequest the request message. + * @return a [[SparqlConstructResponse]] + */ + def sparqlHttpConstruct(sparqlConstructRequest: SparqlConstructRequest): UIO[SparqlConstructResponse] = { + // println(logDelimiter + sparql) + + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + + def parseTurtleResponse( + sparql: String, + turtleStr: String, + rdfFormatUtil: RdfFormatUtil + ): IO[TriplestoreException, SparqlConstructResponse] = + ZIO.attemptBlocking { + val rdfModel: RdfModel = rdfFormatUtil.parseToRdfModel(rdfStr = turtleStr, rdfFormat = Turtle) + val statementMap: mutable.Map[IRI, Seq[(IRI, String)]] = mutable.Map.empty + + for (st: Statement <- rdfModel) { + val subjectIri = st.subj.stringValue + val predicateIri = st.pred.stringValue + val objectIri = st.obj.stringValue + val currentStatementsForSubject: Seq[(IRI, String)] = + statementMap.getOrElse(subjectIri, Vector.empty[(IRI, String)]) + statementMap += (subjectIri -> (currentStatementsForSubject :+ (predicateIri, objectIri))) + } + + SparqlConstructResponse(statementMap.toMap) + }.foldZIO( + failure => + if (turtleStr.contains("## Query cancelled due to timeout during execution")) { + ZIO.logError("Triplestore timed out while sending a response, after sending statuscode 200.") *> + ZIO.fail( + TriplestoreTimeoutException( + "Triplestore timed out while sending a response, after sending statuscode 200." + ) + ) + } else { + ZIO.logError( + s"Couldn't parse response from triplestore:$logDelimiter$turtleStr${logDelimiter}in response to SPARQL query:$logDelimiter$sparql" + ) *> + ZIO.fail(TriplestoreResponseException("Couldn't parse Turtle from triplestore")) + }, + ZIO.succeed(_) + ) + + for { + turtleStr <- + getSparqlHttpResponse( + sparqlConstructRequest.sparql, + isUpdate = false, + acceptMimeType = mimeTypeTextTurtle + ) + + response <- parseTurtleResponse( + sparql = sparqlConstructRequest.sparql, + turtleStr = turtleStr, + rdfFormatUtil = rdfFormatUtil + ).orDie + } yield response + } + + /** + * Given a SPARQL CONSTRUCT query string, runs the query, saving the result in a file. + * + * @param sparql the SPARQL CONSTRUCT query string. + * @param graphIri the named graph IRI to be used in the output file. + * @param outputFile the output file. + * @param outputFormat the output file format. + * @return a [[FileWrittenResponse]]. + */ + def sparqlHttpConstructFile( + sparql: String, + graphIri: IRI, + outputFile: Path, + outputFormat: QuadFormat + ): UIO[FileWrittenResponse] = { + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + + for { + turtleStr <- getSparqlHttpResponse(sparql, isUpdate = false, acceptMimeType = mimeTypeTextTurtle) + _ <- ZIO + .attempt( + rdfFormatUtil + .turtleToQuadsFile( + rdfSource = RdfStringSource(turtleStr), + graphIri = graphIri, + outputFile = outputFile, + outputFormat = outputFormat + ) + ) + .orDie + } yield FileWrittenResponse() + } + + /** + * Given a SPARQL CONSTRUCT query string, runs the query, returns the result as a [[SparqlExtendedConstructResponse]]. + * + * @param sparqlExtendedConstructRequest the request message. + * @return a [[SparqlExtendedConstructResponse]] + */ + def sparqlHttpExtendedConstruct( + sparqlExtendedConstructRequest: SparqlExtendedConstructRequest + ): UIO[SparqlExtendedConstructResponse] = + for { + turtleStr <- getSparqlHttpResponse( + sparqlExtendedConstructRequest.sparql, + isUpdate = false, + acceptMimeType = mimeTypeTextTurtle + ) + + response <- SparqlExtendedConstructResponse + .parseTurtleResponse(turtleStr) + .foldZIO( + failure => + ZIO.die( + TriplestoreResponseException( + s"Couldn't parse Turtle from triplestore: ${sparqlExtendedConstructRequest}" + ) + ), + ZIO.succeed(_) + ) + } yield response + + /** + * Performs a SPARQL update operation. + * + * @param sparqlUpdate the SPARQL update. + * @return a [[SparqlUpdateResponse]]. + */ + def sparqlHttpUpdate(sparqlUpdate: String): UIO[SparqlUpdateResponse] = + // println(logDelimiter + sparqlUpdate) + for { + // Send the request to the triplestore. + _ <- getSparqlHttpResponse(sparqlUpdate, isUpdate = true) + } yield SparqlUpdateResponse() + + /** + * Performs a SPARQL ASK query. + * + * @param sparql the SPARQL ASK query. + * @return a [[SparqlAskResponse]]. + */ + def sparqlHttpAsk(sparql: String): UIO[SparqlAskResponse] = + for { + resultString <- getSparqlHttpResponse(sparql, isUpdate = false) + _ <- ZIO.logDebug(s"sparqlHttpAsk - resultString: ${resultString}") + result <- ZIO + .attemptBlocking( + resultString.parseJson.asJsObject.getFields("boolean").head.convertTo[Boolean] + ) + .orDie + } yield SparqlAskResponse(result) + + /** + * Resets the content of the triplestore with the data supplied with the request. + * First performs `dropAllTriplestoreContent` and afterwards `insertDataIntoTriplestore`. + * + * @param rdfDataObjects a sequence of paths and graph names referencing data that needs to be inserted. + * @param prependDefaults denotes if the rdfDataObjects list should be prepended with a default set. Default is `true`. + */ + def resetTripleStoreContent( + rdfDataObjects: List[RdfDataObject], + prependDefaults: Boolean + ): UIO[ResetRepositoryContentACK] = + for { + _ <- ZIO.logDebug("resetTripleStoreContent") + + // drop old content + _ <- dropAllTriplestoreContent() + + // insert new content + _ <- insertDataIntoTriplestore(rdfDataObjects, prependDefaults) + } yield ResetRepositoryContentACK() + + /** + * Drops (deletes) all data from the triplestore. + */ + def dropAllTriplestoreContent(): UIO[DropAllRepositoryContentACK] = { + + val DropAllSparqlString = + """ + DROP ALL + """ + + for { + _ <- ZIO.logDebug("==>> Drop All Data Start") + result <- getSparqlHttpResponse(DropAllSparqlString, isUpdate = true) + _ <- ZIO.logDebug(s"==>> Drop All Data End, Result: $result") + } yield DropAllRepositoryContentACK() + } + + /** + * Inserts the data referenced inside the `rdfDataObjects` by appending it to a default set of `rdfDataObjects` + * based on the list defined in `application.conf` under the `app.triplestore.default-rdf-data` key. + * + * @param rdfDataObjects a sequence of paths and graph names referencing data that needs to be inserted. + * @param prependDefaults denotes if the rdfDataObjects list should be prepended with a default set. Default is `true`. + * @return [[InsertTriplestoreContentACK]] + */ + def insertDataIntoTriplestore( + rdfDataObjects: List[RdfDataObject], + prependDefaults: Boolean + ): UIO[InsertTriplestoreContentACK] = { + + val calculateCompleteRdfDataObjectList: UIO[NonEmptyChunk[RdfDataObject]] = + if (prependDefaults) { // prepend + if (rdfDataObjects.isEmpty) { + ZIO.succeed(DefaultRdfData.data) + } else { + //prepend default data objects like those of knora-base, knora-admin, etc. + ZIO.succeed(DefaultRdfData.data ++ NonEmptyChunk.fromIterable(rdfDataObjects.head, rdfDataObjects.tail)) + } + } else { // don't prepend + if (rdfDataObjects.isEmpty) { + ZIO.die(BadRequestException("Cannot insert list with empty data into triplestore.")) + } else { + ZIO.succeed(NonEmptyChunk.fromIterable(rdfDataObjects.head, rdfDataObjects.tail)) + } + } + + for { + _ <- ZIO.logDebug("==>> Loading Data Start") + list <- calculateCompleteRdfDataObjectList + request <- + ZIO.foreach(list)(elem => + for { + graphName <- + if (elem.name.toLowerCase == "default") { + ZIO.die(TriplestoreUnsupportedFeatureException("Requests to the default graph are not supported")) + } else { + ZIO.succeed(elem.name) + } + + uriBuilder <- + ZIO.attempt { + val uriBuilder: URIBuilder = new URIBuilder(dataInsertPath) + uriBuilder.addParameter("graph", graphName) //Note: addParameter encodes the graphName URL + uriBuilder + }.orDie + + httpPost <- + ZIO.attempt { + val httpPost = new HttpPost(uriBuilder.build()) + // Add the input file to the body of the request. + // here we need to tweak the base directory path from "webapi" + // to the parent folder where the files can be found + val inputFile = Paths.get("..", elem.path) + if (!Files.exists(inputFile)) { + throw BadRequestException(s"File ${inputFile} does not exist") + } + val fileEntity = + new FileEntity(inputFile.toFile, ContentType.create(mimeTypeTextTurtle, "UTF-8")) + httpPost.setEntity(fileEntity) + httpPost + }.orDie + responseHandler <- ZIO.attempt(returnInsertGraphDataResponse(graphName)(_)).orDie + } yield (httpPost, responseHandler) + ) + httpContext <- makeHttpContext.orDie + _ <- ZIO.foreachDiscard(request)(elem => + doHttpRequest( + client = longRequestClient, + request = elem._1, + context = httpContext, + processResponse = elem._2 + ) + ) + _ <- ZIO.logDebug("==>> Loading Data End") + } yield InsertTriplestoreContentACK() + } + + /** + * Checks the Fuseki triplestore if it is available and configured correctly. If it is not + * configured, tries to automatically configure (initialize) the required dataset. + */ + def checkTriplestore(): UIO[CheckTriplestoreResponse] = { + + val triplestoreAvailableResponse = + ZIO.succeed( + CheckTriplestoreResponse( + triplestoreStatus = TriplestoreStatus.ServiceAvailable, + msg = "Triplestore is available." + ) + ) + + val triplestoreNotInitializedResponse = + ZIO.succeed( + CheckTriplestoreResponse( + triplestoreStatus = TriplestoreStatus.NotInitialized, + msg = s"None of the active datasets meet our requirement of name: ${config.triplestore.fuseki.repositoryName}" + ) + ) + + def triplestoreUnavailableResponse(cause: String) = + CheckTriplestoreResponse( + triplestoreStatus = TriplestoreStatus.ServiceUnavailable, + msg = s"Triplestore not available: $cause" + ) + + ZIO + .ifZIO(checkTriplestoreInitialized())( + triplestoreAvailableResponse, + if (config.triplestore.autoInit) { + ZIO + .ifZIO(attemptToInitialize())( + triplestoreAvailableResponse, + triplestoreNotInitializedResponse + ) + } else { + triplestoreNotInitializedResponse + } + ) + .catchAll(ex => ZIO.succeed(triplestoreUnavailableResponse(ex.getMessage()))) + } + + /** + * Attempt to initialize the triplestore. + */ + private def attemptToInitialize(): Task[Boolean] = + for { + _ <- initJenaFusekiTriplestore() + initialized <- checkTriplestoreInitialized() + } yield initialized + + /** + * Call an endpoint that returns all datasets and check if our required dataset is present. + */ + private def checkTriplestoreInitialized(): Task[Boolean] = { + + val httpGet = ZIO.attempt { + val httpGet = new HttpGet(checkRepositoryPath) + httpGet.addHeader("Accept", mimeTypeApplicationJson) + httpGet + } + + def checkForExpectedDataset(response: String) = ZIO.attempt { + val nameShouldBe = config.triplestore.fuseki.repositoryName + + import org.knora.webapi.messages.store.triplestoremessages.FusekiJsonProtocol._ + val fusekiServer: FusekiServer = JsonParser(response).convertTo[FusekiServer] + val neededDataset: Option[FusekiDataset] = + fusekiServer.datasets.find(dataset => dataset.dsName == s"/$nameShouldBe" && dataset.dsState) + neededDataset.nonEmpty + } + + for { + req <- httpGet + ctx <- makeHttpContext + res <- doHttpRequest( + client = updateHttpClient, + request = req, + context = ctx, + processResponse = returnResponseAsString + ) + result <- checkForExpectedDataset(res) + } yield result + } + + /** + * Initialize the Jena Fuseki triplestore. Currently only works for + * 'knora-test' and 'knora-test-unit' repository names. To be used, the + * API needs to be started with 'KNORA_WEBAPI_TRIPLESTORE_AUTOINIT' set + * to 'true' (settings.triplestoreAutoInit). This is set to `true` for tests + * (`test/resources/test.conf`). Usage is only recommended for automated + * testing and not for production use. + */ + private def initJenaFusekiTriplestore(): UIO[Unit] = { + + val httpPost = ZIO.attemptBlocking { + // TODO: Needs https://github.com/scalameta/metals/issues/3623 to be resolved + // val configFileName = s"webapi/scripts/fuseki-repository-config.ttl.template" + val configFileName = s"fuseki-repository-config.ttl.template" + + // take config from the classpath and write to triplestore + val triplestoreConfig: String = + FileUtil.readTextResource(configFileName).replace("@REPOSITORY@", config.triplestore.fuseki.repositoryName) + + val httpPost: HttpPost = new HttpPost("/$/datasets") + val stringEntity = new StringEntity(triplestoreConfig, ContentType.create(mimeTypeTextTurtle)) + httpPost.setEntity(stringEntity) + httpPost + } + + for { + request <- httpPost.orDie + httpContext <- makeHttpContext.orDie + _ <- doHttpRequest( + client = updateHttpClient, + request = request, + context = httpContext, + processResponse = returnUploadResponse + ) + } yield () + } + + /** + * Makes a triplestore URI for downloading a named graph. + * + * @param graphIri the IRI of the named graph. + * @return a triplestore-specific URI for downloading the named graph. + */ + private def makeNamedGraphDownloadUri(graphIri: IRI): URI = { + val uriBuilder: URIBuilder = new URIBuilder(graphPath) + uriBuilder.setParameter("graph", s"$graphIri") + uriBuilder.build() + } + + /** + * Requests the contents of a named graph, saving the response in a file. + * + * @param graphIri the IRI of the named graph. + * @param outputFile the file to be written. + * @param outputFormat the output file format. + * @return a string containing the contents of the graph in N-Quads format. + */ + def sparqlHttpGraphFile( + graphIri: IRI, + outputFile: Path, + outputFormat: QuadFormat + ): UIO[FileWrittenResponse] = { + + val httpGet = ZIO.attempt { + val httpGet = new HttpGet(makeNamedGraphDownloadUri(graphIri)) + httpGet.addHeader("Accept", mimeTypeTextTurtle) + httpGet + } + + for { + ctx <- makeHttpContext.orDie + req <- httpGet.orDie + res <- doHttpRequest( + client = queryHttpClient, + request = req, + context = ctx, + processResponse = writeResponseFileAsTurtleContent( + outputFile = outputFile, + graphIri = graphIri, + quadFormat = outputFormat + ) + ) + } yield res + + } + + /** + * Requests the contents of a named graph, returning the response as Turtle. + * + * @param graphIri the IRI of the named graph. + * @return a string containing the contents of the graph in Turtle format. + */ + def sparqlHttpGraphData(graphIri: IRI): UIO[NamedGraphDataResponse] = { + + val httpGet = ZIO.attempt { + val httpGet = new HttpGet(makeNamedGraphDownloadUri(graphIri)) + httpGet.addHeader("Accept", mimeTypeTextTurtle) + httpGet + } + + for { + ctx <- makeHttpContext.orDie + req <- httpGet.orDie + res <- doHttpRequest( + client = queryHttpClient, + request = req, + context = ctx, + processResponse = returnGraphDataAsTurtle(graphIri) + ) + } yield res + } + + /** + * Submits a SPARQL request to the triplestore and returns the response as a string. + * + * @param sparql the SPARQL request to be submitted. + * @param isUpdate `true` if this is an update request. + * @param acceptMimeType the MIME type to be provided in the HTTP Accept header. + * @param simulateTimeout if `true`, simulate a read timeout. + * @return the triplestore's response. + */ + private def getSparqlHttpResponse( + sparql: String, + isUpdate: Boolean, + acceptMimeType: String = mimeTypeApplicationSparqlResultsJson, + simulateTimeout: Boolean = false + ): UIO[String] = { + + val httpClient = ZIO.attempt { + if (isUpdate) { + updateHttpClient + } else { + queryHttpClient + } + } + + val httpPost = ZIO.attempt { + if (isUpdate) { + // Send updates as application/sparql-update (as per SPARQL 1.1 Protocol §3.2.2, "UPDATE using POST directly"). + val requestEntity = new StringEntity(sparql, ContentType.create(mimeTypeApplicationSparqlUpdate, "UTF-8")) + val updateHttpPost = new HttpPost(sparqlUpdatePath) + updateHttpPost.setEntity(requestEntity) + updateHttpPost + } else { + // Send queries as application/x-www-form-urlencoded (as per SPARQL 1.1 Protocol §2.1.2, + // "query via POST with URL-encoded parameters"), so we can include the "infer" parameter when using GraphDB. + val formParams = new util.ArrayList[NameValuePair]() + formParams.add(new BasicNameValuePair("query", sparql)) + val requestEntity: UrlEncodedFormEntity = new UrlEncodedFormEntity(formParams, Consts.UTF_8) + val queryHttpPost: HttpPost = new HttpPost(queryPath) + queryHttpPost.setEntity(requestEntity) + queryHttpPost.addHeader("Accept", acceptMimeType) + queryHttpPost + } + } + + for { + ctx <- makeHttpContext.orDie + clt <- httpClient.orDie + req <- httpPost.orDie + res <- doHttpRequest( + client = clt, + request = req, + context = ctx, + processResponse = returnResponseAsString, + simulateTimeout = simulateTimeout + ) + } yield res + } + + /** + * Dumps the whole repository in N-Quads format, saving the response in a file. + * + * @param outputFile the output file. + * @return a string containing the contents of the graph in N-Quads format. + */ + def downloadRepository( + outputFile: Path + ): UIO[FileWrittenResponse] = { + + val httpGet = ZIO.attempt { + val uriBuilder: URIBuilder = new URIBuilder(repositoryDownloadPath) + val httpGet = new HttpGet(uriBuilder.build()) + httpGet.addHeader("Accept", mimeTypeApplicationNQuads) + httpGet + } + + for { + ctx <- makeHttpContext.orDie + req <- httpGet.orDie + res <- doHttpRequest( + client = longRequestClient, + request = req, + context = ctx, + processResponse = writeResponseFileAsPlainContent(outputFile) + ) + } yield res + } + + /** + * Uploads repository content from an N-Quads file. + * + * @param inputFile an N-Quads file containing the content to be uploaded to the repository. + */ + def uploadRepository(inputFile: Path): UIO[RepositoryUploadedResponse] = { + + val httpPost = ZIO.attempt { + val httpPost: HttpPost = new HttpPost(repositoryUploadPath) + val fileEntity = new FileEntity(inputFile.toFile, ContentType.create(mimeTypeApplicationNQuads, "UTF-8")) + httpPost.setEntity(fileEntity) + httpPost + } + + for { + ctx <- makeHttpContext.orDie + req <- httpPost.orDie + res <- doHttpRequest( + client = longRequestClient, + request = req, + context = ctx, + processResponse = returnUploadResponse + ) + } yield res + } + + /** + * Puts a data graph into the repository. + * + * @param graphContent a data graph in Turtle format to be inserted into the repository. + * @param graphName the name of the graph. + */ + def insertDataGraphRequest(graphContent: String, graphName: String): UIO[InsertGraphDataContentResponse] = { + + val httpPut = ZIO.attempt { + val uriBuilder: URIBuilder = new URIBuilder(dataInsertPath) + uriBuilder.addParameter("graph", graphName) + val httpPut: HttpPut = new HttpPut(uriBuilder.build()) + val requestEntity = new StringEntity(graphContent, ContentType.create(mimeTypeTextTurtle, "UTF-8")) + httpPut.setEntity(requestEntity) + httpPut + } + + for { + ctx <- makeHttpContext.orDie + req <- httpPut.orDie + res <- doHttpRequest( + client = longRequestClient, + request = req, + context = ctx, + processResponse = returnInsertGraphDataResponse(graphName) + ) + } yield res + } + + /** + * Formulate HTTP context. + * + * @return httpContext with credentials and authorization + */ + private def makeHttpContext: Task[HttpClientContext] = ZIO.attempt { + val authCache: AuthCache = new BasicAuthCache + val basicAuth: BasicScheme = new BasicScheme + authCache.put(targetHost, basicAuth) + + val httpContext: HttpClientContext = HttpClientContext.create + httpContext.setCredentialsProvider(credsProvider) + httpContext.setAuthCache(authCache) + httpContext + } + + /** + * Makes an HTTP connection to the triplestore, and delegates processing of the response + * to a function. + * + * @param client the HTTP client to be used for the request. + * @param request the request to be sent. + * @param context the request context to be used. + * @param processResponse a function that processes the HTTP response. + * @param simulateTimeout if `true`, simulate a read timeout. + * @tparam T the return type of `processResponse`. + * @return the return value of `processResponse`. + */ + private def doHttpRequest[T]( + client: CloseableHttpClient, + request: HttpRequest, + context: HttpClientContext, + processResponse: CloseableHttpResponse => UIO[T], + simulateTimeout: Boolean = false + ): UIO[T] = { + + // TODO: Can we make Fuseki abandon the query if it takes too long? + + def checkSimulateTimeout(): UIO[Unit] = + if (simulateTimeout) { + ZIO.die( + TriplestoreTimeoutException( + "The triplestore took too long to process a request. This can happen because the triplestore needed too much time to search through the data that is currently in the triplestore. Query optimisation may help." + ) + ) + } else + ZIO.unit + + def executeQuery(): UIO[CloseableHttpResponse] = + ZIO + .attempt(client.execute(targetHost, request, context)) + .catchSome { + case socketTimeoutException: java.net.SocketTimeoutException => { + val message = + "The triplestore took too long to process a request. This can happen because the triplestore needed too much time to search through the data that is currently in the triplestore. Query optimisation may help." + val error = TriplestoreTimeoutException(message, socketTimeoutException) + ZIO.logError(error.toString()) *> + ZIO.die(error) + } + case e: Exception => { + val message = s"Failed to connect to triplestore." + val error = TriplestoreConnectionException(message) + ZIO.logError(error.toString()) *> + ZIO.die(error) + } + } + .orDie + + def checkResponse(response: CloseableHttpResponse, statusCode: Int): UIO[Unit] = + if (statusCode == 404) { + ZIO.die(NotFoundException("The requested data was not found")) + } else { + val statusCategory: Int = statusCode / 100 + if (statusCategory != 2) { + Option(response.getEntity) + .map(responseEntity => EntityUtils.toString(responseEntity, StandardCharsets.UTF_8)) match { + case Some(responseEntityStr) => + val msg = s"Triplestore responded with HTTP code $statusCode: $responseEntityStr" + if (statusCode == 503 && responseEntityStr.contains("Query timed out")) + ZIO.die(TriplestoreTimeoutException(msg)) + else + ZIO.die(TriplestoreResponseException(msg)) + case None => + ZIO.die(TriplestoreResponseException(s"Triplestore responded with HTTP code $statusCode")) + } + } else { + ZIO.unit + } + } + + def logTimeTook(start: Long, statusCode: Int) = + ZIO + .succeed(java.lang.System.currentTimeMillis() - start) + .flatMap(took => ZIO.logInfo(s"[$statusCode] Triplestore query took: ${took}ms")) + + (for { + _ <- checkSimulateTimeout() + // start <- ZIO.attempt(java.lang.System.currentTimeMillis()).orDie + response <- executeQuery() + statusCode <- ZIO.attempt(response.getStatusLine.getStatusCode).orDie + _ <- checkResponse(response, statusCode) + result <- processResponse(response) + _ <- ZIO.attempt(response.close()).orDie // TODO: rewrite with ensuring + // _ <- logTimeTook(start, statusCode) + } yield result) + } + + /** + * Attempts to transforms a [[CloseableHttpResponse]] to a [[String]]. + */ + private def returnResponseAsString(response: CloseableHttpResponse): UIO[String] = + Option(response.getEntity) match { + case None => ZIO.succeed("") + case Some(responseEntity) => ZIO.attempt(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8)).orDie + } + + /** + * Attempts to transforms a [[CloseableHttpResponse]] to a [[NamedGraphDataResponse]]. + */ + private def returnGraphDataAsTurtle(graphIri: IRI)(response: CloseableHttpResponse): UIO[NamedGraphDataResponse] = + Option(response.getEntity) match { + case None => ZIO.die(TriplestoreResponseException(s"Triplestore returned no content for graph $graphIri")) + case Some(responseEntity: HttpEntity) => + ZIO + .attempt(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8)) + .flatMap(entity => + ZIO.succeed( + NamedGraphDataResponse( + turtle = entity + ) + ) + ) + .orDie + } + + /** + * Attempts to transforms a [[CloseableHttpResponse]] to a [[RepositoryUploadedResponse]]. + */ + private def returnUploadResponse: CloseableHttpResponse => UIO[RepositoryUploadedResponse] = + _ => ZIO.succeed(RepositoryUploadedResponse()) + + /** + * Attempts to transforms a [[CloseableHttpResponse]] to a [[InsertGraphDataContentResponse]]. + */ + private def returnInsertGraphDataResponse( + graphName: String + )(response: CloseableHttpResponse): UIO[InsertGraphDataContentResponse] = + Option(response.getEntity) match { + case None => ZIO.die(TriplestoreResponseException(s"$graphName could not be inserted into Triplestore.")) + case Some(_) => ZIO.succeed(InsertGraphDataContentResponse()) + } + + /** + * Writes an HTTP response the response is written as-is to the output file. + * + * @param outputFile the output file. + * @param response the response to be read. + * @return a [[FileWrittenResponse]]. + */ + private def writeResponseFileAsPlainContent( + outputFile: Path + )(response: CloseableHttpResponse): UIO[FileWrittenResponse] = + Option(response.getEntity) match { + case Some(responseEntity: HttpEntity) => + ZIO.attempt { + // Stream the HTTP entity directly to the output file. + Files.copy(responseEntity.getContent, outputFile) + }.flatMap(_ => ZIO.succeed(FileWrittenResponse())).orDie + + case None => + val message = "Triplestore returned no content for repository dump" + val error = TriplestoreResponseException(s"Triplestore returned no content for for repository dump") + ZIO.logError(error.toString()) *> + ZIO.die(error) + } + + /** + * Writes an HTTP response to a file, where the response is parsed as Turtle + * and converted to the output format, with the graph IRI added to each statement. + * + * @param outputFile the output file. + * @param graphIri the IRI of the graph used in the output. + * @param quadFormat the output format. + * @param response the response to be read. + * @return a [[FileWrittenResponse]]. + */ + private def writeResponseFileAsTurtleContent( + outputFile: Path, + graphIri: IRI, + quadFormat: QuadFormat + )(response: CloseableHttpResponse): UIO[FileWrittenResponse] = + Option(response.getEntity) match { + case Some(responseEntity: HttpEntity) => + ZIO.attempt { + // Yes. Stream the HTTP entity to a temporary Turtle file. + val tempTurtleFile = Paths.get(outputFile.toString + ".ttl") + Files.copy(responseEntity.getContent, tempTurtleFile, StandardCopyOption.REPLACE_EXISTING) + + // Convert the Turtle to the output format. + + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + + rdfFormatUtil.turtleToQuadsFile( + rdfSource = RdfInputStreamSource(new BufferedInputStream(Files.newInputStream(tempTurtleFile))), + graphIri = graphIri, + outputFile = outputFile, + outputFormat = quadFormat + ) + + Files.delete(tempTurtleFile) + + FileWrittenResponse() + }.orDie + + case None => + val message = s"Triplestore returned no content for graph $graphIri" + val error = TriplestoreResponseException(message) + ZIO.logError(error.toString()) *> + ZIO.die(error) + } + +} + +object TriplestoreServiceHttpConnectorImpl { + + /** + * Acquires a configured httpClient, backed by a connection pool, + * to be used in communicating with Fuseki. + */ + private def acquire(config: AppConfig) = ZIO.attemptBlocking { + + // timeout from config + val sipiTimeoutMillis: Int = config.sipi.timeoutInSeconds.toMillis.toInt + + // Create a connection manager with custom configuration. + val connManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager() + + // Create socket configuration + val socketConfig: SocketConfig = SocketConfig + .custom() + .setTcpNoDelay(true) + .build(); + + // Configure the connection manager to use socket configuration by default. + connManager.setDefaultSocketConfig(socketConfig) + + // Validate connections after 1 sec of inactivity + connManager.setValidateAfterInactivity(1000); + + // Configure total max or per route limits for persistent connections + // that can be kept in the pool or leased by the connection manager. + connManager.setMaxTotal(100) + connManager.setDefaultMaxPerRoute(10) + + // Sipi custom default request config + val defaultRequestConfig = RequestConfig + .custom() + .setConnectTimeout(sipiTimeoutMillis) + .setConnectionRequestTimeout(sipiTimeoutMillis) + .setSocketTimeout(sipiTimeoutMillis) + .build() + + // Create an HttpClient with the given custom dependencies and configuration. + val httpClient: CloseableHttpClient = HttpClients + .custom() + .setConnectionManager(connManager) + .setDefaultRequestConfig(defaultRequestConfig) + .build() + + httpClient + }.tap(_ => ZIO.debug(">>> Acquire Triplestore Service Http Connector <<<")).orDie + + /** + * Releases the httpClient, freeing all resources. + */ + private def release(httpClient: CloseableHttpClient): URIO[Any, Unit] = + ZIO.attemptBlocking { + httpClient.close() + }.tap(_ => ZIO.debug(">>> Release Triplestore Service Http Connector <<<")).orDie + + val layer: ZLayer[AppConfig, Nothing, TriplestoreService] = { + ZLayer.scoped { + for { + config <- ZIO.service[AppConfig] + // _ <- ZIO.debug(config) + httpClient <- ZIO.acquireRelease(acquire(config))(release(_)) + } yield TriplestoreServiceHttpConnectorImpl(config, httpClient) + } + } + +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdatePlan.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdatePlan.scala index 205b1e7a69..5419eda1ed 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdatePlan.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdatePlan.scala @@ -1,7 +1,6 @@ package org.knora.webapi.store.triplestore.upgrade import com.typesafe.scalalogging.Logger -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.store.triplestore.upgrade.plugins._ /** @@ -11,29 +10,27 @@ object RepositoryUpdatePlan { /** * Constructs list of all repository update plugins in chronological order. - * - * @param featureFactoryConfig the feature factor configuration. */ - def makePluginsForVersions(featureFactoryConfig: FeatureFactoryConfig, log: Logger): Seq[PluginForKnoraBaseVersion] = + def makePluginsForVersions(log: Logger): Seq[PluginForKnoraBaseVersion] = Seq( PluginForKnoraBaseVersion( versionNumber = 1, - plugin = new UpgradePluginPR1307(featureFactoryConfig), + plugin = new UpgradePluginPR1307(), prBasedVersionString = Some("PR 1307") ), PluginForKnoraBaseVersion( versionNumber = 2, - plugin = new UpgradePluginPR1322(featureFactoryConfig), + plugin = new UpgradePluginPR1322(), prBasedVersionString = Some("PR 1322") ), PluginForKnoraBaseVersion( versionNumber = 3, - plugin = new UpgradePluginPR1367(featureFactoryConfig), + plugin = new UpgradePluginPR1367(), prBasedVersionString = Some("PR 1367") ), PluginForKnoraBaseVersion( versionNumber = 4, - plugin = new UpgradePluginPR1372(featureFactoryConfig), + plugin = new UpgradePluginPR1372(), prBasedVersionString = Some("PR 1372") ), PluginForKnoraBaseVersion( @@ -43,16 +40,16 @@ object RepositoryUpdatePlan { ), PluginForKnoraBaseVersion(versionNumber = 6, plugin = new NoopPlugin), // PR 1206 PluginForKnoraBaseVersion(versionNumber = 7, plugin = new NoopPlugin), // PR 1403 - PluginForKnoraBaseVersion(versionNumber = 8, plugin = new UpgradePluginPR1615(featureFactoryConfig)), - PluginForKnoraBaseVersion(versionNumber = 9, plugin = new UpgradePluginPR1746(featureFactoryConfig, log)), + PluginForKnoraBaseVersion(versionNumber = 8, plugin = new UpgradePluginPR1615()), + PluginForKnoraBaseVersion(versionNumber = 9, plugin = new UpgradePluginPR1746(log)), PluginForKnoraBaseVersion(versionNumber = 10, plugin = new NoopPlugin), // PR 1808 PluginForKnoraBaseVersion(versionNumber = 11, plugin = new NoopPlugin), // PR 1813 PluginForKnoraBaseVersion(versionNumber = 12, plugin = new NoopPlugin), // PR 1891 - PluginForKnoraBaseVersion(versionNumber = 13, plugin = new UpgradePluginPR1921(featureFactoryConfig, log)), + PluginForKnoraBaseVersion(versionNumber = 13, plugin = new UpgradePluginPR1921(log)), PluginForKnoraBaseVersion(versionNumber = 14, plugin = new NoopPlugin), // PR 1992 - PluginForKnoraBaseVersion(versionNumber = 20, plugin = new UpgradePluginPR2018(featureFactoryConfig, log)), - PluginForKnoraBaseVersion(versionNumber = 21, plugin = new UpgradePluginPR2079(featureFactoryConfig, log)), - PluginForKnoraBaseVersion(versionNumber = 22, plugin = new UpgradePluginPR2081(featureFactoryConfig, log)) + PluginForKnoraBaseVersion(versionNumber = 20, plugin = new UpgradePluginPR2018(log)), + PluginForKnoraBaseVersion(versionNumber = 21, plugin = new UpgradePluginPR2079(log)), + PluginForKnoraBaseVersion(versionNumber = 22, plugin = new UpgradePluginPR2081(log)) // KEEP IT ON THE BOTTOM // From "versionNumber = 6" don't use prBasedVersionString! ) diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdater.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdater.scala index 5007fcff1e..10f316d724 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdater.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdater.scala @@ -9,7 +9,6 @@ import com.typesafe.scalalogging.LazyLogging import com.typesafe.scalalogging.Logger import org.knora.webapi.IRI import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.rdf._ @@ -24,22 +23,23 @@ import java.nio.file.Path import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.reflect.io.Directory +import org.knora.webapi.config.AppConfig + +import zio._ +import org.knora.webapi.store.triplestore.api.TriplestoreService /** - * Updates a Knora repository to work with the current version of Knora. + * Updates a DSP repository to work with the current version of DSP-API. * - * @param system the Akka [[ActorSystem]]. - * @param appActor a reference to the main application actor. - * @param featureFactoryConfig the feature factory configuration. - * @param settings the Knora application settings. + * @param triplestoreService a [[TriplestoreService]] implementation. + * @param appConfig the application configureation. */ -class RepositoryUpdater( - system: ActorSystem, - appActor: ActorRef, - featureFactoryConfig: FeatureFactoryConfig, - settings: KnoraSettingsImpl +final case class RepositoryUpdater( + triplestoreService: TriplestoreService, + appConfig: AppConfig ) extends LazyLogging { - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) + + private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() // A SPARQL query to find out the knora-base version in a repository. private val knoraBaseVersionQuery = @@ -49,41 +49,53 @@ class RepositoryUpdater( | knora-base:ontologyVersion ?knoraBaseVersion . |}""".stripMargin - /** - * The execution context for futures created in Knora actors. - */ - private implicit val executionContext: ExecutionContext = - system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - /** - * A string formatter. - */ - private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - - /** - * The application's default timeout for `ask` messages. - */ - private implicit val timeout: Timeout = settings.defaultTimeout - /** * Provides logging. */ private val log: Logger = logger + private val tempDirNamePrefix: String = "knora" + /** - * A list of available plugins. + * Updates the repository, if necessary, to work with the current version of dsp-api. + * + * @return a response indicating what was done. */ - private val plugins: Seq[PluginForKnoraBaseVersion] = RepositoryUpdatePlan.makePluginsForVersions( - featureFactoryConfig = featureFactoryConfig, - log = log - ) + def maybeUpdateRepository: UIO[RepositoryUpdatedResponse] = + for { + foundRepositoryVersion <- getRepositoryVersion() + requiredRepositoryVersion <- ZIO.succeed(org.knora.webapi.KnoraBaseVersion) - private val tempDirNamePrefix: String = "knora" + // Is the repository up to date? + repositoryUpToDate <- ZIO.succeed(foundRepositoryVersion.contains(requiredRepositoryVersion)) + + repositoryUpdatedResponse <- + if (repositoryUpToDate) { + // Yes. Nothing more to do. + ZIO.succeed(RepositoryUpdatedResponse(s"Repository is up to date at $requiredRepositoryVersion")) + } else { + for { + // No. Construct the list of updates that it needs. + _ <- + ZIO.logInfo( + s"Repository not up-to-date. Found: ${foundRepositoryVersion.getOrElse("None")}, Required: $requiredRepositoryVersion" + ) + _ <- deleteTempDirectories() + selectedPlugins <- selectPluginsForNeededUpdates(foundRepositoryVersion) + _ <- ZIO.logInfo( + s"Updating repository with transformations: ${selectedPlugins.map(_.versionString).mkString(", ")}" + ) + + // Update it with those plugins. + result <- updateRepositoryWithSelectedPlugins(selectedPlugins) + } yield result + } + } yield repositoryUpdatedResponse /** * Deletes directories inside temp directory starting with `tempDirNamePrefix`. */ - def deleteTempDirectories(): Unit = { + private def deleteTempDirectories(): UIO[Unit] = ZIO.attempt { val rootDir = new File("/tmp/") val getTempToDelete = rootDir.listFiles.filter(_.getName.startsWith(tempDirNamePrefix)) @@ -94,58 +106,23 @@ class RepositoryUpdater( } log.info(s"Deleted temp directories: ${getTempToDelete.map(_.getName()).mkString(", ")}") } - } - - /** - * Updates the repository, if necessary, to work with the current version of Knora. - * - * @return a response indicating what was done. - */ - def maybeUpdateRepository: Future[RepositoryUpdatedResponse] = - for { - foundRepositoryVersion: Option[String] <- getRepositoryVersion - requiredRepositoryVersion = org.knora.webapi.KnoraBaseVersion - - // Is the repository up to date? - repositoryUpToDate: Boolean = foundRepositoryVersion.contains(requiredRepositoryVersion) - - repositoryUpdatedResponse: RepositoryUpdatedResponse <- - if (repositoryUpToDate) { - // Yes. Nothing more to do. - FastFuture.successful(RepositoryUpdatedResponse(s"Repository is up to date at $requiredRepositoryVersion")) - } else { - // No. Construct the list of updates that it needs. - log.info( - s"Repository not up-to-date. Found: ${foundRepositoryVersion.getOrElse("None")}, Required: $requiredRepositoryVersion" - ) - - deleteTempDirectories() - - val selectedPlugins: Seq[PluginForKnoraBaseVersion] = selectPluginsForNeededUpdates(foundRepositoryVersion) - log.info(s"Updating repository with transformations: ${selectedPlugins.map(_.versionString).mkString(", ")}") - - // Update it with those plugins. - updateRepositoryWithSelectedPlugins(selectedPlugins) - } - } yield repositoryUpdatedResponse + () + }.orDie /** * Determines the `knora-base` version in the repository. * * @return the `knora-base` version string, if any, in the repository. */ - private def getRepositoryVersion: Future[Option[String]] = + private def getRepositoryVersion(): UIO[Option[String]] = for { - repositoryVersionResponse: SparqlSelectResult <- (appActor ? SparqlSelectRequest(knoraBaseVersionQuery)) - .mapTo[SparqlSelectResult] - - bindings = repositoryVersionResponse.results.bindings - - versionString = + repositoryVersionResponse <- triplestoreService.sparqlHttpSelect(knoraBaseVersionQuery) + bindings <- ZIO.succeed(repositoryVersionResponse.results.bindings) + versionString <- if (bindings.nonEmpty) { - Some(bindings.head.rowMap("knoraBaseVersion")) + ZIO.succeed(Some(bindings.head.rowMap("knoraBaseVersion"))) } else { - None + ZIO.none } } yield versionString @@ -157,29 +134,38 @@ class RepositoryUpdater( */ private def selectPluginsForNeededUpdates( maybeRepositoryVersionString: Option[String] - ): Seq[PluginForKnoraBaseVersion] = - maybeRepositoryVersionString match { - case Some(repositoryVersion) => - // The repository has a version string. Get the plugins for all subsequent versions. - - // Make a map of version strings to plugins. - val versionsToPluginsMap: Map[String, PluginForKnoraBaseVersion] = plugins.map { plugin => - plugin.versionString -> plugin - }.toMap - - val pluginForRepositoryVersion: PluginForKnoraBaseVersion = versionsToPluginsMap.getOrElse( - repositoryVersion, - throw InconsistentRepositoryDataException(s"No such repository version $repositoryVersion") - ) - - plugins.filter { plugin => - plugin.versionNumber > pluginForRepositoryVersion.versionNumber - } - - case None => - // The repository has no version string. Include all updates. - plugins - } + ): UIO[Seq[PluginForKnoraBaseVersion]] = { + + // A list of available plugins. + val plugins: Seq[PluginForKnoraBaseVersion] = + RepositoryUpdatePlan.makePluginsForVersions(log) + + ZIO.attempt { + maybeRepositoryVersionString match { + case Some(repositoryVersion) => + // The repository has a version string. Get the plugins for all subsequent versions. + + // Make a map of version strings to plugins. + val versionsToPluginsMap: Map[String, PluginForKnoraBaseVersion] = plugins.map { plugin => + plugin.versionString -> plugin + }.toMap + + val pluginForRepositoryVersion: PluginForKnoraBaseVersion = + versionsToPluginsMap.getOrElse( + repositoryVersion, + throw InconsistentRepositoryDataException(s"No such repository version $repositoryVersion") + ) + + plugins.filter { plugin => + plugin.versionNumber > pluginForRepositoryVersion.versionNumber + } + + case None => + // The repository has no version string. Include all updates. + plugins + } + }.orDie + } /** * Updates the repository with the specified list of plugins. @@ -189,43 +175,36 @@ class RepositoryUpdater( */ private def updateRepositoryWithSelectedPlugins( pluginsForNeededUpdates: Seq[PluginForKnoraBaseVersion] - ): Future[RepositoryUpdatedResponse] = { - val downloadDir: Path = Files.createTempDirectory(tempDirNamePrefix) - log.info(s"Repository update using download directory $downloadDir") + ): UIO[RepositoryUpdatedResponse] = + (for { + downloadDir <- ZIO.attempt(Files.createTempDirectory(tempDirNamePrefix)) + _ <- ZIO.logInfo(s"Repository update using download directory $downloadDir") - // The file to save the repository in. - val downloadedRepositoryFile = downloadDir.resolve("downloaded-repository.nq") - val transformedRepositoryFile = downloadDir.resolve("transformed-repository.nq") - log.info("Downloading repository file...") + // The file to save the repository in. + downloadedRepositoryFile <- ZIO.attempt(downloadDir.resolve("downloaded-repository.nq")) + transformedRepositoryFile <- ZIO.attempt(downloadDir.resolve("transformed-repository.nq")) - for { // Ask the store actor to download the repository to the file. - _: FileWrittenResponse <- (appActor ? DownloadRepositoryRequest( - outputFile = downloadedRepositoryFile, - featureFactoryConfig = featureFactoryConfig - )).mapTo[FileWrittenResponse] + _ <- ZIO.logInfo("Downloading repository file...") + _ <- triplestoreService.downloadRepository(downloadedRepositoryFile) // Run the transformations to produce an output file. - _ = doTransformations( - downloadedRepositoryFile = downloadedRepositoryFile, - transformedRepositoryFile = transformedRepositoryFile, - pluginsForNeededUpdates = pluginsForNeededUpdates - ) - - _ = log.info("Emptying the repository...") + _ <- doTransformations( + downloadedRepositoryFile = downloadedRepositoryFile, + transformedRepositoryFile = transformedRepositoryFile, + pluginsForNeededUpdates = pluginsForNeededUpdates + ) // Empty the repository. - _: DropAllRepositoryContentACK <- (appActor ? DropAllTRepositoryContent()).mapTo[DropAllRepositoryContentACK] - - _ = log.info("Uploading transformed repository data...") + _ <- ZIO.logInfo("Emptying the repository...") + _ <- triplestoreService.dropAllTriplestoreContent() // Upload the transformed repository. - _: RepositoryUploadedResponse <- (appActor ? UploadRepositoryRequest(transformedRepositoryFile)) - .mapTo[RepositoryUploadedResponse] + _ <- ZIO.logInfo("Uploading transformed repository data...") + _ <- triplestoreService.uploadRepository(transformedRepositoryFile) } yield RepositoryUpdatedResponse( message = s"Updated repository to ${org.knora.webapi.KnoraBaseVersion}" - ) - } + )).orDie /** * Transforms a file containing a downloaded repository. @@ -238,7 +217,7 @@ class RepositoryUpdater( downloadedRepositoryFile: Path, transformedRepositoryFile: Path, pluginsForNeededUpdates: Seq[PluginForKnoraBaseVersion] - ): Unit = { + ): UIO[Unit] = ZIO.attempt { // Parse the input file. log.info("Reading repository file...") val model = rdfFormatUtil.fileToRdfModel(file = downloadedRepositoryFile, rdfFormat = NQuads) @@ -261,7 +240,7 @@ class RepositoryUpdater( file = transformedRepositoryFile, rdfFormat = NQuads ) - } + }.orDie /** * Adds Knora's built-in named graphs to an [[RdfModel]]. @@ -302,8 +281,19 @@ class RepositoryUpdater( * @param rdfFormat the file format. * @return an [[RdfModel]] representing the contents of the file. */ - def readResourceIntoModel(filename: String, rdfFormat: NonJsonLD): RdfModel = { + private def readResourceIntoModel(filename: String, rdfFormat: NonJsonLD): RdfModel = { val fileContent: String = FileUtil.readTextResource(filename) rdfFormatUtil.parseToRdfModel(fileContent, rdfFormat) } } + +object RepositoryUpdater { + val layer: ZLayer[TriplestoreService & AppConfig, Nothing, RepositoryUpdater] = { + ZLayer { + for { + ts <- ZIO.service[TriplestoreService] + config <- ZIO.service[AppConfig] + } yield RepositoryUpdater(ts, config) + } + } +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307.scala index e26b716ce6..e11138671f 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307.scala @@ -7,7 +7,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import org.knora.webapi.IRI import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin @@ -15,8 +14,8 @@ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin /** * Transforms a repository for Knora PR 1307. */ -class UpgradePluginPR1307(featureFactoryConfig: FeatureFactoryConfig) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1307() extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() // IRI objects representing the IRIs used in this transformation. private val rdfTypeIri: IriNode = nodeFactory.makeIriNode(OntologyConstants.Rdf.Type) diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala index 0b54f73326..4032a76716 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala @@ -6,7 +6,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.rdf._ @@ -15,8 +14,8 @@ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin /** * Transforms a repository for Knora PR 1322. */ -class UpgradePluginPR1322(featureFactoryConfig: FeatureFactoryConfig) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1322() extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() private implicit val stringFormatter: StringFormatter = StringFormatter.getInstanceForConstantOntologies // IRI objects representing the IRIs used in this transformation. diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367.scala index f70697436d..532e37e6fc 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367.scala @@ -5,7 +5,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin @@ -13,8 +12,8 @@ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin /** * Transforms a repository for Knora PR 1367. */ -class UpgradePluginPR1367(featureFactoryConfig: FeatureFactoryConfig) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1367() extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() override def transform(model: RdfModel): Unit = { // Fix the datatypes of decimal literals. diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372.scala index 4d4caf1880..18dfdc9577 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372.scala @@ -6,7 +6,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin @@ -14,8 +13,8 @@ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin /** * Transforms a repository for Knora PR 1372. */ -class UpgradePluginPR1372(featureFactoryConfig: FeatureFactoryConfig) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1372() extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() // IRI objects representing the IRIs used in this transformation. private val ValueCreationDateIri: IriNode = nodeFactory.makeIriNode(OntologyConstants.KnoraBase.ValueCreationDate) diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615.scala index 0fab51c031..7ba0787087 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615.scala @@ -5,15 +5,14 @@ package org.knora.webapi.store.triplestore.upgrade.plugins -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin /** * Transforms a repository for Knora PR 1615. */ -class UpgradePluginPR1615(featureFactoryConfig: FeatureFactoryConfig) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1615() extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() // IRI objects representing the IRIs used in this transformation. private val ForbiddenResourceIri: IriNode = nodeFactory.makeIriNode("http://rdfh.ch/0000/forbiddenResource") diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746.scala index b8e61f4c53..17c7f3f73a 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746.scala @@ -5,17 +5,16 @@ package org.knora.webapi.store.triplestore.upgrade.plugins -import com.typesafe.scalalogging.Logger -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin +import com.typesafe.scalalogging.Logger /** * Transforms a repository for Knora PR 1746. */ -class UpgradePluginPR1746(featureFactoryConfig: FeatureFactoryConfig, log: Logger) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1746(log: Logger) extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() private val dummyString = "FIXME" diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921.scala index c0ce2abbe4..64b674b224 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921.scala @@ -5,17 +5,16 @@ package org.knora.webapi.store.triplestore.upgrade.plugins -import com.typesafe.scalalogging.Logger -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin +import com.typesafe.scalalogging.Logger /** * Transforms a repository for Knora PR 1921. */ -class UpgradePluginPR1921(featureFactoryConfig: FeatureFactoryConfig, log: Logger) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR1921(log: Logger) extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() // Group descriptions without language attribute get language attribute defined in DEFAULT_LANG private val DEFAULT_LANG = "en" diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala index 6cbebb5bd8..369d97c097 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala @@ -7,7 +7,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import com.typesafe.scalalogging.Logger import dsp.errors.InconsistentRepositoryDataException -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants.KnoraAdmin.SystemProject import org.knora.webapi.messages.OntologyConstants.KnoraBase.AttachedToProject import org.knora.webapi.messages.OntologyConstants.KnoraBase.LastModificationDate @@ -21,8 +20,8 @@ import java.time.Instant /** * Transforms a repository for DSP-API PR 2018. */ -class UpgradePluginPR2018(featureFactoryConfig: FeatureFactoryConfig, log: Logger) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR2018(log: Logger) extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() private val newModificationDate = Instant.now.toString private val ontologyType: IriNode = nodeFactory.makeIriNode(Ontology) diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079.scala index e8ad5a1508..56a250bfa3 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079.scala @@ -6,7 +6,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import com.typesafe.scalalogging.Logger -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin @@ -15,8 +14,8 @@ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin * Transforms a repository for Knora PR 2079. * Adds missing datatype ^^ and/or value to valueHasUri */ -class UpgradePluginPR2079(featureFactoryConfig: FeatureFactoryConfig, log: Logger) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR2079(log: Logger) extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() override def transform(model: RdfModel): Unit = { val statementsToRemove: collection.mutable.Set[Statement] = collection.mutable.Set.empty diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081.scala index aba224d5ea..a751575342 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081.scala @@ -6,7 +6,6 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import com.typesafe.scalalogging.Logger -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin @@ -16,8 +15,8 @@ import java.time.Instant * Transforms a repository for Knora PR 2081. * Fixes wrong date serialisations (all `xsd:dateTime` in the database should end on `Z` rather than specifying a time zone). */ -class UpgradePluginPR2081(featureFactoryConfig: FeatureFactoryConfig, log: Logger) extends UpgradePlugin { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) +class UpgradePluginPR2081(log: Logger) extends UpgradePlugin { + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() override def transform(model: RdfModel): Unit = { val statementsToRemove: collection.mutable.Set[Statement] = collection.mutable.Set.empty diff --git a/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala b/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala index 83aab64966..72fd8b0011 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala @@ -15,6 +15,7 @@ import dsp.errors.ExceptionUtil import dsp.errors.RequestRejectedException import dsp.errors.UnexpectedMessageException import zio._ +import zio.Unsafe.unsafe import scala.concurrent.ExecutionContext import scala.concurrent.Future @@ -31,7 +32,10 @@ object ActorUtil { * allocated immediately, and not released until the `Runtime` is shut down or * the end of the application. */ - private val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) + private val runtime = + Unsafe.unsafe { implicit u => + Runtime.unsafe.fromLayer(Logging.slf4j) + } /** * Transforms ZIO Task returned to the receive method of an actor to a message. Used mainly during the refactoring @@ -45,10 +49,11 @@ object ActorUtil { * Since this is the "edge" of the ZIO world for now, we need to log all errors that ZIO has potentially accumulated */ def zio2Message[A](sender: ActorRef, zioTask: zio.Task[A], appConfig: AppConfig): Unit = - runtime - .unsafeRunTask( + Unsafe.unsafe { implicit u => + runtime.unsafe.run( zioTask.foldCauseZIO(cause => handleCause(cause, sender), success => ZIO.succeed(sender ! success)) ) + } /** * The "cause" handling part of `zio2Message`. It analyses the kind of failures and defects diff --git a/webapi/src/test/resources/logback-test.xml b/webapi/src/test/resources/logback-test.xml index 256b4dd49a..13f83bb972 100644 --- a/webapi/src/test/resources/logback-test.xml +++ b/webapi/src/test/resources/logback-test.xml @@ -44,6 +44,9 @@ + + + diff --git a/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala deleted file mode 100644 index f9cf4037c5..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.ActorRef -import akka.actor.ActorSystem -import akka.actor.Props -import com.typesafe.scalalogging.Logger -import akka.pattern.ask -import akka.stream.Materializer -import akka.testkit.ImplicitSender -import akka.testkit.TestKit -import akka.util.Timeout -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory -import org.knora.webapi.app.ApplicationActor -import org.knora.webapi.auth.JWTService -import org.knora.webapi.config.AppConfig -import org.knora.webapi.config.AppConfigForTestContainers -import org.knora.webapi.core.Core -import org.knora.webapi.core.Logging -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig -import org.knora.webapi.feature.TestFeatureFactoryConfig -import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.app.appmessages.AppStart -import org.knora.webapi.messages.app.appmessages.AppStop -import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState -import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceFlushDB -import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContent -import org.knora.webapi.messages.util.KnoraSystemInstances -import org.knora.webapi.messages.util.ResponderData -import org.knora.webapi.messages.util.rdf.RdfFeatureFactory -import org.knora.webapi.messages.v2.responder.ontologymessages.LoadOntologiesRequestV2 -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.settings._ -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings -import org.knora.webapi.store.iiif.IIIFServiceManager -import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl -import org.knora.webapi.testcontainers.SipiTestContainer -import org.knora.webapi.util.StartupUtils -import org.scalatest.BeforeAndAfterAll -import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.AsyncWordSpecLike -import zio.& -import zio.Runtime -import zio.ZEnvironment -import zio.ZIO -import zio.ZLayer - -import scala.concurrent.Await -import scala.concurrent.ExecutionContext -import scala.concurrent.duration._ -import scala.language.postfixOps -import scala.util.Failure -import scala.util.Success -import scala.util.Try -import akka.testkit.TestActorRef - -abstract class AsyncCoreSpec(_system: ActorSystem) - extends TestKit(_system) - with Core - with StartupUtils - with AsyncWordSpecLike - with Matchers - with BeforeAndAfterAll - with ImplicitSender { - - /* constructors - individual tests can override the configuration by giving their own */ - def this(name: String, config: Config) = - this( - ActorSystem( - name, - TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) - ) - ) - - def this(config: Config) = - this( - ActorSystem( - CoreSpec.getCallerName(classOf[AsyncCoreSpec]), - TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) - ) - ) - - def this(name: String) = this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()))) - - def this() = - this( - ActorSystem( - CoreSpec.getCallerName(classOf[AsyncCoreSpec]), - TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()) - ) - ) - - /* needed by the core trait */ - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) - implicit val materializer: Materializer = Materializer.matFromSystem(system) - override implicit val executionContext: ExecutionContext = - system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - // can be overridden in individual spec - lazy val rdfDataObjects = Seq.empty[RdfDataObject] - - // needs to be initialized early on - StringFormatter.initForTest() - RdfFeatureFactory.init(settings) - - val log: Logger = Logger(this.getClass) - - // The ZIO runtime used to run functional effects - val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) - - // The effect for building a cache service manager and a IIIF service manager. - val managers = for { - csm <- ZIO.service[CacheServiceManager] - iiifsm <- ZIO.service[IIIFServiceManager] - appConfig <- ZIO.service[AppConfig] - } yield (csm, iiifsm, appConfig) - - /** - * The effect layers which will be used to run the managers effect. - * Can be overriden in specs that need other implementations. - */ - val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( - CacheServiceManager.layer, - CacheServiceInMemImpl.layer, - IIIFServiceManager.layer, - IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer - AppConfigForTestContainers.testcontainers, - JWTService.layer, - // FusekiTestContainer.layer, - SipiTestContainer.layer - ) - - /** - * Create both managers by unsafe running them. - */ - val (cacheServiceManager, iiifServiceManager, appConfig) = - runtime - .unsafeRun( - managers - .provide( - effectLayers - ) - ) - - // start the Application Actor. - lazy val appActor: ActorRef = - system.actorOf( - Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), - name = APPLICATION_MANAGER_ACTOR_NAME - ) - - val responderData: ResponderData = ResponderData( - system = system, - appActor = appActor, - knoraSettings = settings, - cacheServiceSettings = new CacheServiceSettings(system.settings.config) - ) - - protected val defaultFeatureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set.empty, - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) - - final override def beforeAll(): Unit = { - // set allow reload over http - appActor ! SetAllowReloadOverHTTPState(true) - - // Start Knora, without reading data from the repository - appActor ! AppStart(ignoreRepository = true, requiresIIIFService = false) - - // waits until knora is up and running - applicationStateRunning() - - loadTestData(rdfDataObjects) - - // memusage() - } - - final override def afterAll(): Unit = - appActor ! AppStop() - - protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = { - logger.info("Loading test data started ...") - implicit val timeout: Timeout = Timeout(settings.defaultTimeout) - Try(Await.result(appActor ? ResetRepositoryContent(rdfDataObjects), 479999.milliseconds)) match { - case Success(res) => logger.info("... loading test data done.") - case Failure(e) => logger.error(s"Loading test data failed: ${e.getMessage}") - } - - logger.info("Loading ontologies into cache started ...") - Try( - Await.result( - appActor ? LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ), - 1 minute - ) - ) match { - case Success(res) => logger.info("... loading ontologies into cache done.") - case Failure(e) => logger.error(s"Loading ontologies into cache failed: ${e.getMessage}") - } - - logger.info("Flush Redis cache started ...") - Try(Await.result(appActor ? CacheServiceFlushDB(KnoraSystemInstances.Users.SystemUser), 5 seconds)) match { - case Success(res) => logger.info("... flushing Redis cache done.") - case Failure(e) => logger.error(s"Flushing Redis cache failed: ${e.getMessage}") - } - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala index f17dc87c8c..e14da19dbd 100644 --- a/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala @@ -8,7 +8,6 @@ package org.knora.webapi import akka.actor.ActorRef import akka.actor.ActorSystem import akka.actor.Props -import com.typesafe.scalalogging.Logger import akka.pattern.ask import akka.stream.Materializer import akka.testkit.ImplicitSender @@ -16,46 +15,45 @@ import akka.testkit.TestKit import akka.util.Timeout import com.typesafe.config.Config import com.typesafe.config.ConfigFactory +import com.typesafe.scalalogging.Logger import org.knora.webapi.auth.JWTService import org.knora.webapi.config.AppConfig import org.knora.webapi.config.AppConfigForTestContainers import org.knora.webapi.core.Logging -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl import org.knora.webapi.testcontainers.SipiTestContainer import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike -import zio.& -import zio.Runtime -import zio.ZEnvironment -import zio.ZIO -import zio.ZLayer +import zio._ import scala.concurrent.Await import scala.concurrent.ExecutionContext -import scala.concurrent.duration._ import scala.language.postfixOps import scala.util.Failure import scala.util.Success import scala.util.Try -import app.ApplicationActor -import core.Core -import feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig, TestFeatureFactoryConfig} -import messages.StringFormatter -import messages.app.appmessages.{AppStart, SetAllowReloadOverHTTPState} -import messages.store.cacheservicemessages.CacheServiceFlushDB -import messages.store.triplestoremessages.{RdfDataObject, ResetRepositoryContent} -import messages.util.rdf.RdfFeatureFactory -import messages.util.{KnoraSystemInstances, ResponderData} -import messages.v2.responder.ontologymessages.LoadOntologiesRequestV2 -import settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} -import store.cacheservice.settings.CacheServiceSettings -import util.StartupUtils -import akka.testkit.TestActorRef +import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.core.Core +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.app.appmessages.{AppStart, SetAllowReloadOverHTTPState} +import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceFlushDB +import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, ResetRepositoryContent} +import org.knora.webapi.messages.util.rdf.RdfFeatureFactory +import org.knora.webapi.messages.util.{KnoraSystemInstances, ResponderData} +import org.knora.webapi.messages.v2.responder.ontologymessages.LoadOntologiesRequestV2 +import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} +import org.knora.webapi.store.cache.settings.CacheServiceSettings +import org.knora.webapi.util.StartupUtils +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.store.triplestore.api.TriplestoreService object CoreSpec { @@ -93,7 +91,7 @@ abstract class CoreSpec(_system: ActorSystem) this( ActorSystem( name, - TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) + config.withFallback(CoreSpec.defaultConfig) ) ) @@ -101,17 +99,23 @@ abstract class CoreSpec(_system: ActorSystem) this( ActorSystem( CoreSpec.getCallerName(classOf[CoreSpec]), - TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) + config.withFallback(CoreSpec.defaultConfig) ) ) - def this(name: String) = this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()))) + def this(name: String) = + this( + ActorSystem( + name, + ConfigFactory.load() + ) + ) def this() = this( ActorSystem( CoreSpec.getCallerName(classOf[CoreSpec]), - TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()) + ConfigFactory.load() ) ) @@ -121,56 +125,63 @@ abstract class CoreSpec(_system: ActorSystem) implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) // can be overridden in individual spec - lazy val rdfDataObjects = Seq.empty[RdfDataObject] + lazy val rdfDataObjects = List.empty[RdfDataObject] // needs to be initialized early on StringFormatter.initForTest() - RdfFeatureFactory.init(settings) - - val log: Logger = Logger(this.getClass) - - // The ZIO runtime used to run functional effects - val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) - - // The effect for building a cache service manager and a IIIF service manager. - val managers = for { - csm <- ZIO.service[CacheServiceManager] - iiifsm <- ZIO.service[IIIFServiceManager] - appConfig <- ZIO.service[AppConfig] - } yield (csm, iiifsm, appConfig) + val log: Logger = Logger(this.getClass()) /** * The effect layers which will be used to run the managers effect. * Can be overriden in specs that need other implementations. */ lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & TriplestoreService & AppConfig]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer AppConfigForTestContainers.testcontainers, JWTService.layer, - // FusekiTestContainer.layer, - SipiTestContainer.layer + SipiTestContainer.layer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer, + Logging.slf4j ) + // The ZIO runtime used to run functional effects + lazy val runtime = + Unsafe.unsafe { implicit u => + Runtime.unsafe.fromLayer(effectLayers) + } + + // The effect for building managers and config. + lazy val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + tssm <- ZIO.service[TriplestoreServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, tssm, appConfig) + /** - * Create both managers by unsafe running them. + * Create managers and config by unsafe running them. */ - val (cacheServiceManager, iiifServiceManager, appConfig) = - runtime - .unsafeRun( - managers - .provide( - effectLayers - ) - ) + val (cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig) = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + managers + ) + .getOrElse(c => throw FiberFailure(c)) + } - // start the Application Actor. + // start the Application Actor lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig)), name = APPLICATION_MANAGER_ACTOR_NAME ) @@ -181,55 +192,59 @@ abstract class CoreSpec(_system: ActorSystem) cacheServiceSettings = new CacheServiceSettings(system.settings.config) ) - protected val defaultFeatureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set.empty, - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) - final override def beforeAll(): Unit = { - // Start Knora, without reading data from the repository - appActor.tell(AppStart(ignoreRepository = true, requiresIIIFService = false), akka.actor.ActorRef.noSender) - // set allow reload over http - appActor.tell(SetAllowReloadOverHTTPState(true), akka.actor.ActorRef.noSender) + appActor ! SetAllowReloadOverHTTPState(true) + + // Start Knora, without reading data from the repository + appActor ! AppStart(ignoreRepository = true, requiresIIIFService = false) // waits until knora is up and running applicationStateRunning() - loadTestData(rdfDataObjects) - - // memusage() + prepareRepository(rdfDataObjects) } - final override def afterAll(): Unit = - TestKit.shutdownActorSystem(system) + final override def afterAll(): Unit = { - protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = { - logger.info("Loading test data started ...") - implicit val timeout: Timeout = Timeout(settings.defaultTimeout) - Try(Await.result(appActor ? ResetRepositoryContent(rdfDataObjects), 479999.milliseconds)) match { - case Success(res) => logger.info("... loading test data done.") - case Failure(e) => logger.error(s"Loading test data failed: ${e.getMessage}") + /* Stop ZIO runtime and release resources (e.g., running docker containers) */ + Unsafe.unsafe { implicit u => + runtime.unsafe.shutdown() } - logger.info("Loading load ontologies into cache started ...") - Try( - Await.result( - appActor ? LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ), - 1 minute - ) - ) match { - case Success(res) => logger.info("... loading ontologies into cache done.") - case Failure(e) => logger.error(s"Loading ontologies into cache failed: ${e.getMessage}") - } + /* Stop the server when everything else has finished */ + TestKit.shutdownActorSystem(system) + } - logger.info("CacheServiceFlushDB started ...") - Try(Await.result(appActor ? CacheServiceFlushDB(KnoraSystemInstances.Users.SystemUser), 15 seconds)) match { - case Success(res) => logger.info("... CacheServiceFlushDB done.") - case Failure(e) => logger.error(s"CacheServiceFlushDB failed: ${e.getMessage}") + private def prepareRepository(rdfDataObjects: List[RdfDataObject]): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run { + for { + ec <- ZIO.executor.map(_.asExecutionContext) + _ <- ZIO.logInfo("Loading test data started ...") + tss <- ZIO.service[TriplestoreService] + _ <- tss.resetTripleStoreContent(rdfDataObjects).timeout(480.seconds) + _ <- ZIO.logInfo("... loading test data done.") + _ <- ZIO.logInfo("Loading load ontologies into cache started ...") + _ <- ZIO + .fromFuture(implicit ec => + appActor + .ask(LoadOntologiesRequestV2(KnoraSystemInstances.Users.SystemUser))( + akka.util.Timeout.create(2.minutes) + ) + ) + .timeout(60.seconds) + _ <- ZIO.logInfo("... loading ontologies into cache done.") + _ <- ZIO.logInfo("CacheServiceFlushDB started ...") + _ <- + ZIO + .fromFuture(implicit ec => + appActor + .ask(CacheServiceFlushDB(KnoraSystemInstances.Users.SystemUser))(akka.util.Timeout.create(30.seconds)) + ) + .timeout(15.seconds) + _ <- ZIO.logInfo("... CacheServiceFlushDB done.") + } yield () + } } - } } diff --git a/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala index 9a4555246a..f9805aa31c 100644 --- a/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala @@ -8,23 +8,19 @@ package org.knora.webapi import akka.actor.ActorRef import akka.actor.ActorSystem import akka.actor.Props -import com.typesafe.scalalogging.Logger import akka.http.scaladsl.client.RequestBuilding import akka.http.scaladsl.model._ import akka.stream.Materializer import akka.testkit.TestKit import com.typesafe.config.Config import com.typesafe.config.ConfigFactory -import com.typesafe.scalalogging.LazyLogging +import com.typesafe.scalalogging._ import org.knora.webapi.auth.JWTService import org.knora.webapi.config.AppConfig import org.knora.webapi.config.AppConfigForTestContainers import org.knora.webapi.core.Core import org.knora.webapi.core.Logging import dsp.errors.FileWriteException -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig -import org.knora.webapi.feature.TestFeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.app.appmessages.AppStart import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState @@ -34,10 +30,11 @@ import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtoc import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.settings._ -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.testcontainers.FusekiTestContainer import org.knora.webapi.testcontainers.SipiTestContainer import org.knora.webapi.testservices.FileToUpload import org.knora.webapi.testservices.TestClientService @@ -66,7 +63,11 @@ import scala.concurrent.Future import scala.concurrent.duration.FiniteDuration import app.ApplicationActor -import akka.testkit.TestActorRef +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.testservices.TestActorSystemService object E2ESpec { val defaultConfig: Config = ConfigFactory.load() @@ -76,7 +77,7 @@ object E2ESpec { * This class can be used in End-to-End testing. It starts the Knora-API server * and provides access to settings and logging. */ -class E2ESpec(_system: ActorSystem) +abstract class E2ESpec(_system: ActorSystem) extends TestKit(_system) with Core with StartupUtils @@ -86,21 +87,20 @@ class E2ESpec(_system: ActorSystem) with Matchers with ScalaFutures with BeforeAndAfterAll - with RequestBuilding - with LazyLogging { + with RequestBuilding { /* constructors */ def this(name: String, config: Config) = - this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(config.withFallback(E2ESpec.defaultConfig)))) + this(ActorSystem(name, config.withFallback(E2ESpec.defaultConfig))) def this(config: Config) = this( - ActorSystem("E2ETest", TestContainerFuseki.PortConfig.withFallback(config.withFallback(E2ESpec.defaultConfig))) + ActorSystem("E2ETest", config.withFallback(E2ESpec.defaultConfig)) ) - def this(name: String) = this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(E2ESpec.defaultConfig))) + def this(name: String) = this(ActorSystem(name, E2ESpec.defaultConfig)) - def this() = this(ActorSystem("E2ETest", TestContainerFuseki.PortConfig.withFallback(E2ESpec.defaultConfig))) + def this() = this(ActorSystem("E2ETest", E2ESpec.defaultConfig)) /* needed by the core trait */ implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) @@ -112,52 +112,56 @@ class E2ESpec(_system: ActorSystem) /* Needs to be initialized before any responders */ StringFormatter.initForTest() - RdfFeatureFactory.init(settings) - val log: Logger = Logger(this.getClass) - // The ZIO runtime used to run functional effects - val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) - // The effect for building a cache service manager and a IIIF service manager. lazy val managers = for { csm <- ZIO.service[CacheServiceManager] iiifsm <- ZIO.service[IIIFServiceManager] + tssm <- ZIO.service[TriplestoreServiceManager] appConfig <- ZIO.service[AppConfig] - } yield (csm, iiifsm, appConfig) + } yield (csm, iiifsm, tssm, appConfig) /** * The effect layers which will be used to run the managers effect. * Can be overriden in specs that need other implementations. */ lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TestClientService]( CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer AppConfigForTestContainers.testcontainers, JWTService.layer, - // FusekiTestContainer.layer, - SipiTestContainer.layer + SipiTestContainer.layer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer, + Logging.slf4j, + TestClientService.layer, + TestActorSystemService.layer ) + // The ZIO runtime used to run functional effects + lazy val runtime = + Unsafe.unsafe { implicit u => + Runtime.unsafe.fromLayer(effectLayers ++ Runtime.removeDefaultLoggers) + } + /** * Create both managers by unsafe running them. */ - lazy val (cacheServiceManager, iiifServiceManager, appConfig) = - runtime - .unsafeRun( - managers - .provide( - effectLayers - ) - ) + lazy val (cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig) = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(managers).getOrElse(c => throw FiberFailure(c)) + } - // start the Application Actor. + // start the Application Actor lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig)), name = APPLICATION_MANAGER_ACTOR_NAME ) @@ -168,12 +172,7 @@ class E2ESpec(_system: ActorSystem) protected val baseApiUrl: String = appConfig.knoraApi.internalKnoraApiBaseUrl - protected val defaultFeatureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set.empty, - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) - - override def beforeAll(): Unit = { + final override def beforeAll(): Unit = { // create temp data dir if not present createTmpFileDir() @@ -191,65 +190,101 @@ class E2ESpec(_system: ActorSystem) loadTestData(rdfDataObjects) } - override def afterAll(): Unit = + final override def afterAll(): Unit = { + + /* Stop ZIO runtime and release resources (e.g., running docker containers) */ + Unsafe.unsafe { implicit u => + runtime.unsafe.shutdown() + } + /* Stop the server when everything else has finished */ TestKit.shutdownActorSystem(system) + } + protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.loadTestData(rdfDataObjects) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.loadTestData(rdfDataObjects) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } - protected def singleAwaitingRequest(request: HttpRequest, duration: zio.Duration = 15.seconds): HttpResponse = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.singleAwaitingRequest(request, duration) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + protected def singleAwaitingRequest(request: HttpRequest, duration: zio.Duration = 30.seconds): HttpResponse = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.singleAwaitingRequest(request, duration) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def getResponseAsString(request: HttpRequest): String = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.getResponseString(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseString(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def checkResponseOK(request: HttpRequest): Unit = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.checkResponseOK(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.checkResponseOK(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def getResponseAsJson(request: HttpRequest): JsObject = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.getResponseJson(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJson(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def getResponseAsJsonLD(request: HttpRequest): JsonLDDocument = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.getResponseJsonLD(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJsonLD(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def uploadToSipi(loginToken: String, filesToUpload: Seq[FileToUpload]): SipiUploadResponse = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.uploadToSipi(loginToken, filesToUpload) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.uploadToSipi(loginToken, filesToUpload) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def responseToJsonLDDocument(httpResponse: HttpResponse): JsonLDDocument = { val responseBodyFuture: Future[String] = @@ -271,17 +306,17 @@ class E2ESpec(_system: ActorSystem) } protected def parseTrig(trigStr: String): RdfModel = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() rdfFormatUtil.parseToRdfModel(rdfStr = trigStr, rdfFormat = TriG) } protected def parseTurtle(turtleStr: String): RdfModel = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() rdfFormatUtil.parseToRdfModel(rdfStr = turtleStr, rdfFormat = Turtle) } protected def parseRdfXml(rdfXmlStr: String): RdfModel = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() rdfFormatUtil.parseToRdfModel(rdfStr = rdfXmlStr, rdfFormat = RdfXml) } @@ -320,5 +355,4 @@ class E2ESpec(_system: ActorSystem) } } } - } diff --git a/webapi/src/test/scala/org/knora/webapi/ExampleCoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/ExampleCoreSpec.scala deleted file mode 100644 index 184486a80f..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/ExampleCoreSpec.scala +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.testkit.ImplicitSender -import com.typesafe.config.ConfigFactory -import com.typesafe.config.Config -import org.knora.webapi.messages.app.appmessages.ActorReady -import org.knora.webapi.messages.app.appmessages.ActorReadyAck -import scala.concurrent.duration._ - -object ExampleCoreSpec { - - val config: Config = ConfigFactory.parseString(""" - akka.loglevel = "DEBUG" - akka.stdout-loglevel = "DEBUG" - """.stripMargin) -} - -class ExampleCoreSpec extends CoreSpec(ExampleCoreSpec.config) with ImplicitSender { - - private val timeout = 5.seconds - - "The ExampleCoreSpec " when { - "testing something" should { - "return true" in { - appActor ! ActorReady() - val response = expectMsgType[ActorReadyAck](timeout) - } - } - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala b/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala index 00f3bc30a6..4089715c74 100644 --- a/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala @@ -31,12 +31,13 @@ import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtoc import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.RdfFeatureFactory import org.knora.webapi.settings._ -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl import org.knora.webapi.testcontainers.SipiTestContainer import org.knora.webapi.testservices.FileToUpload +import org.knora.webapi.testservices.TestActorSystemService import org.knora.webapi.testservices.TestClientService import org.knora.webapi.util.StartupUtils import org.scalatest.BeforeAndAfterAll @@ -44,14 +45,13 @@ import org.scalatest.Suite import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike import spray.json._ -import zio.& -import zio.Runtime -import zio.ZEnvironment -import zio.ZIO -import zio.ZLayer import zio._ import scala.concurrent.ExecutionContext +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.testcontainers.FusekiTestContainer object ITKnoraLiveSpec { val defaultConfig: Config = ConfigFactory.load() @@ -61,7 +61,7 @@ object ITKnoraLiveSpec { * This class can be used in End-to-End testing. It starts the Knora server and * provides access to settings and logging. */ -class ITKnoraLiveSpec(_system: ActorSystem) +abstract class ITKnoraLiveSpec(_system: ActorSystem) extends TestKit(_system) with Core with StartupUtils @@ -76,19 +76,21 @@ class ITKnoraLiveSpec(_system: ActorSystem) /* constructors */ def this(name: String, config: Config) = this( - ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(config.withFallback(ITKnoraLiveSpec.defaultConfig))) + ActorSystem(name, config.withFallback(ITKnoraLiveSpec.defaultConfig)) ) + def this(config: Config) = this( ActorSystem( "IntegrationTests", - TestContainerFuseki.PortConfig.withFallback(config.withFallback(ITKnoraLiveSpec.defaultConfig)) + config.withFallback(ITKnoraLiveSpec.defaultConfig) ) ) def this(name: String) = - this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(ITKnoraLiveSpec.defaultConfig))) + this(ActorSystem(name, ITKnoraLiveSpec.defaultConfig)) + def this() = - this(ActorSystem("IntegrationTests", TestContainerFuseki.PortConfig.withFallback(ITKnoraLiveSpec.defaultConfig))) + this(ActorSystem("IntegrationTests", ITKnoraLiveSpec.defaultConfig)) /* needed by the core trait (represents the KnoraTestCore trait)*/ implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) @@ -100,55 +102,59 @@ class ITKnoraLiveSpec(_system: ActorSystem) /* Needs to be initialized before any responders */ StringFormatter.initForTest() - RdfFeatureFactory.init(settings) - val log: Logger = Logger(this.getClass) - // The ZIO runtime used to run functional effects - val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) - /** * The effect for building a cache service manager, a IIIF service manager, * and the sipi test client. */ - val managers = for { + lazy val managers = for { csm <- ZIO.service[CacheServiceManager] iiifsm <- ZIO.service[IIIFServiceManager] + tssm <- ZIO.service[TriplestoreServiceManager] appConfig <- ZIO.service[AppConfig] - } yield (csm, iiifsm, appConfig) + } yield (csm, iiifsm, tssm, appConfig) /** * The effect layers which will be used to run the managers effect. * Can be overriden in specs that need other implementations. */ - val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TestClientService]( CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer AppConfigForTestContainers.testcontainers, JWTService.layer, - // FusekiTestContainer.layer, - SipiTestContainer.layer + SipiTestContainer.layer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer, + Logging.slf4j, + TestClientService.layer, + TestActorSystemService.layer ) + // The ZIO runtime used to run functional effects + lazy val runtime = + Unsafe.unsafe { implicit u => + Runtime.unsafe.fromLayer(effectLayers ++ Runtime.removeDefaultLoggers) + } + /** * Create both managers and the sipi client by unsafe running them. */ - val (cacheServiceManager, iiifServiceManager, appConfig) = - runtime - .unsafeRun( - managers - .provide( - effectLayers - ) - ) + val (cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig) = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(managers).getOrElse(c => throw FiberFailure(c)) + } // start the Application Actor lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig)), name = APPLICATION_MANAGER_ACTOR_NAME ) @@ -156,7 +162,7 @@ class ITKnoraLiveSpec(_system: ActorSystem) protected val baseInternalSipiUrl: String = appConfig.sipi.internalBaseUrl protected val baseExternalSipiUrl: String = appConfig.sipi.externalBaseUrl - override def beforeAll(): Unit = { + final override def beforeAll(): Unit = { // set allow reload over http appActor ! SetAllowReloadOverHTTPState(true) @@ -171,67 +177,96 @@ class ITKnoraLiveSpec(_system: ActorSystem) loadTestData(rdfDataObjects) } - override def afterAll(): Unit = { - // turn on/off in logback-test.xml - log.debug(TestContainersAll.SipiContainer.getLogs()) + final override def afterAll(): Unit = { + + /* Stop ZIO runtime and release resources (e.g., running docker containers) */ + Unsafe.unsafe { implicit u => + runtime.unsafe.shutdown() + } + /* Stop the server when everything else has finished */ TestKit.shutdownActorSystem(system) + } protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.loadTestData(rdfDataObjects) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe.run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.loadTestData(rdfDataObjects) + } yield result) + ) + } protected def getResponseStringOrThrow(request: HttpRequest): String = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.getResponseString(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseString(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def checkResponseOK(request: HttpRequest): Unit = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.checkResponseOK(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe.run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.checkResponseOK(request) + } yield result) + ) + } protected def getResponseJson(request: HttpRequest): JsObject = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.getResponseJson(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJson(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def singleAwaitingRequest(request: HttpRequest, duration: zio.Duration = 15.seconds): HttpResponse = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.singleAwaitingRequest(request, duration) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.singleAwaitingRequest(request, duration) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def getResponseJsonLD(request: HttpRequest): JsonLDDocument = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.getResponseJsonLD(request) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJsonLD(request) + } yield result) + ) + .getOrElse(c => throw FiberFailure(c)) + } protected def uploadToSipi(loginToken: String, filesToUpload: Seq[FileToUpload]): SipiUploadResponse = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.uploadToSipi(loginToken, filesToUpload) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.uploadToSipi(loginToken, filesToUpload) + } yield result) + ) + .getOrThrow() + } } diff --git a/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala b/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala deleted file mode 100644 index 7a14e8d8d9..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.ActorRef -import akka.actor.ActorSystem -import akka.dispatch.MessageDispatcher -import akka.pattern.ask -import akka.util.Timeout -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory -import com.typesafe.scalalogging.LazyLogging -import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl -import org.scalatest.BeforeAndAfterAll -import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.AsyncWordSpecLike -import zio.Console.printLine -import zio.Schedule -import zio.Schedule.Decision -import zio.Schedule.WithState -import zio._ - -import scala.concurrent.Await -import scala.concurrent.ExecutionContext -import scala.util.Failure -import scala.util.Success -import scala.util.Try - -object IntegrationSpec { - - /* - Loads the following (first-listed are higher priority): - - system properties (e.g., -Dconfig.resource=fuseki.conf) - - test/resources/application.conf - - main/resources/application.conf - */ - val defaultConfig: Config = ConfigFactory.load() - - /* Copied from: akka/akka-testkit/src/test/scala/akka/testkit/AkkaSpec.scala */ - def getCallerName(clazz: Class[_]): String = { - val s = (Thread.currentThread.getStackTrace map (_.getClassName) drop 1) - .dropWhile(_ matches "(java.lang.Thread|.*UnitSpec.?$)") - val reduced = s.lastIndexWhere(_ == clazz.getName) match { - case -1 => s - case z => s drop (z + 1) - } - reduced.head.replaceFirst(""".*\.""", "").replaceAll("[^a-zA-Z_0-9]", "_") - } -} - -/** - * Defines a base class used in tests where only a running Fuseki Container is needed. - * Does not start the DSP-API server. - */ -abstract class IntegrationSpec(_config: Config) - extends AsyncWordSpecLike - with Matchers - with BeforeAndAfterAll - with LazyLogging { - - def this() = - this(UnitSpec.defaultConfig) - - implicit val system: ActorSystem = - ActorSystem( - IntegrationSpec.getCallerName(classOf[IntegrationSpec]), - TestContainerFuseki.PortConfig.withFallback(IntegrationSpec.defaultConfig) - ) - - implicit val settings: KnoraSettingsImpl = KnoraSettings(system) - override implicit val executionContext: ExecutionContext = - system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - implicit val timeout: Timeout = settings.defaultTimeout - - // needs to be initialized early on - StringFormatter.initForTest() - - protected def waitForReadyTriplestore(actorRef: ActorRef): Unit = { - logger.info("Waiting for triplestore to be ready ...") - implicit val ctx: MessageDispatcher = system.dispatchers.lookup(KnoraDispatchers.KnoraBlockingDispatcher) - val checkTriplestore: Task[Unit] = for { - checkResult <- ZIO.attemptBlocking { - Await - .result(actorRef ? CheckTriplestoreRequest(), 1.second.asScala) - .asInstanceOf[CheckTriplestoreResponse] - } - - value <- - if (checkResult.triplestoreStatus == TriplestoreStatus.ServiceAvailable) { - ZIO.succeed(logger.info("... triplestore is ready.")) - } else { - ZIO.fail( - new Exception( - s"Triplestore not ready: ${checkResult.triplestoreStatus}" - ) - ) - } - } yield value - - Runtime.default.unsafeRun( - (checkTriplestore - .retry(ScheduleUtil.schedule) - .foldZIO(ex => printLine("Exception Failed"), v => printLine(s"Succeeded with $v"))) - .provide(Console.live) - ) - } - - protected def loadTestData( - actorRef: ActorRef, - rdfDataObjects: Seq[RdfDataObject] = Seq.empty[RdfDataObject] - ): Unit = { - logger.info("Loading test data started ...") - implicit val timeout: Timeout = Timeout(settings.defaultTimeout) - Try(Await.result(actorRef ? ResetRepositoryContent(rdfDataObjects), 479999.milliseconds.asScala)) match { - case Success(res) => logger.info("... loading test data done.") - case Failure(e) => logger.error(s"Loading test data failed: ${e.getMessage}") - } - } -} - -object ScheduleUtil { - - /** - * Retry every second for 60 times, i.e., 60 seconds in total. - */ - def schedule[A]: WithState[(Long, Long), Console, Any, (Long, Long)] = Schedule.spaced(1.second) && Schedule - .recurs(60) - .onDecision({ - case (_, _, Decision.Done) => printLine(s"done trying").orDie - case (_, attempt, Decision.Continue(_)) => printLine(s"attempt #$attempt").orDie - }) -} diff --git a/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala index e23d3742f9..aea3434ade 100644 --- a/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala @@ -21,9 +21,6 @@ import org.knora.webapi.config.AppConfig import org.knora.webapi.config.AppConfigForTestContainers import org.knora.webapi.core.Core import org.knora.webapi.core.Logging -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig -import org.knora.webapi.feature.TestFeatureFactoryConfig import org.knora.webapi.http.handler import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.app.appmessages.AppStart @@ -36,27 +33,29 @@ import org.knora.webapi.settings.KnoraDispatchers import org.knora.webapi.settings.KnoraSettings import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.settings._ -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.testcontainers.FusekiTestContainer import org.knora.webapi.testcontainers.SipiTestContainer import org.knora.webapi.testservices.TestClientService +import org.knora.webapi.testservices.TestActorSystemService import org.knora.webapi.util.FileUtil import org.knora.webapi.util.StartupUtils import org.scalatest.BeforeAndAfterAll import org.scalatest.Suite import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike -import zio.& -import zio.Runtime -import zio.ZEnvironment -import zio.ZIO -import zio.ZLayer +import zio._ import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths +import java.util.concurrent.TimeUnit import scala.concurrent.Await import scala.concurrent.ExecutionContext import scala.concurrent.Future @@ -66,34 +65,25 @@ import akka.testkit.TestActorRef /** * R(oute)2R(esponder) Spec base class. Please, for any new E2E tests, use E2ESpec. */ -class R2RSpec +abstract class R2RSpec extends Core with StartupUtils with Suite with ScalatestRouteTest with AnyWordSpecLike with Matchers - with BeforeAndAfterAll - with LazyLogging { + with BeforeAndAfterAll { /* needed by the core trait */ implicit lazy val _system: ActorSystem = ActorSystem( - actorSystemNameFrom(getClass), - TestContainerFuseki.PortConfig.withFallback( - ConfigFactory.parseString(testConfigSource).withFallback(ConfigFactory.load()) - ) + actorSystemNameFrom(getClass) ) implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(_system) StringFormatter.initForTest() - RdfFeatureFactory.init(settings) - - protected val defaultFeatureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set.empty, - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) + val log: Logger = Logger(this.getClass()) lazy val executionContext: ExecutionContext = _system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) // override so that we can use our own system @@ -105,48 +95,54 @@ class R2RSpec implicit val timeout: Timeout = Timeout(settings.defaultTimeout) - // The ZIO runtime used to run functional effects - val runtime = Runtime.unsafeFromLayer(Logging.fromInfo) - // The effect for building a cache service manager and a IIIF service manager. lazy val managers = for { csm <- ZIO.service[CacheServiceManager] iiifsm <- ZIO.service[IIIFServiceManager] + tssm <- ZIO.service[TriplestoreServiceManager] appConfig <- ZIO.service[AppConfig] - } yield (csm, iiifsm, appConfig) + } yield (csm, iiifsm, tssm, appConfig) /** * The effect layers which will be used to run the managers effect. * Can be overriden in specs that need other implementations. */ lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TestClientService]( CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer AppConfigForTestContainers.testcontainers, JWTService.layer, - // FusekiTestContainer.layer, - SipiTestContainer.layer + SipiTestContainer.layer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer, + Logging.slf4j, + TestClientService.layer, + TestActorSystemService.layer ) + // The ZIO runtime used to run functional effects + lazy val runtime = + Unsafe.unsafe { implicit u => + Runtime.unsafe.fromLayer(effectLayers ++ Runtime.removeDefaultLoggers) + } + /** * Create both managers by unsafe running them. */ - lazy val (cacheServiceManager, iiifServiceManager, appConfig) = - runtime - .unsafeRun( - managers - .provide( - effectLayers - ) - ) + lazy val (cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig) = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(managers).getOrElse(c => throw FiberFailure(c)) + } - // start the Application Actor. + // start the Application Actor lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, triplestoreServiceManager, appConfig)), name = APPLICATION_MANAGER_ACTOR_NAME ) @@ -157,9 +153,7 @@ class R2RSpec lazy val rdfDataObjects = List.empty[RdfDataObject] - val log: Logger = Logger(this.getClass) - - override def beforeAll(): Unit = { + final override def beforeAll(): Unit = { // set allow reload over http appActor ! SetAllowReloadOverHTTPState(true) @@ -172,31 +166,44 @@ class R2RSpec loadTestData(rdfDataObjects) } - override def afterAll(): Unit = + final override def afterAll(): Unit = { + + /* Stop ZIO runtime and release resources (e.g., running docker containers) */ + Unsafe.unsafe { implicit u => + runtime.unsafe.shutdown() + } /* Stop the server when everything else has finished */ appActor ! AppStop() + } + protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = - runtime.unsafeRunTask( - (for { - testClient <- ZIO.service[TestClientService] - result <- testClient.loadTestData(rdfDataObjects) - } yield result).provide(TestClientService.layer(appConfig, system)) - ) + Unsafe.unsafe { implicit u => + runtime.unsafe.run( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.loadTestData(rdfDataObjects) + } yield result) + ) + } protected def responseToJsonLDDocument(httpResponse: HttpResponse): JsonLDDocument = { - val responseBodyFuture: Future[String] = httpResponse.entity.toStrict(5.seconds).map(_.data.decodeString("UTF-8")) - val responseBodyStr = Await.result(responseBodyFuture, 5.seconds) + val responseBodyFuture: Future[String] = + httpResponse.entity + .toStrict(scala.concurrent.duration.Duration(5.toLong, TimeUnit.SECONDS)) + .map(_.data.decodeString("UTF-8")) + val responseBodyStr = + Await.result(responseBodyFuture, scala.concurrent.duration.Duration(5.toLong, TimeUnit.SECONDS)) JsonLDUtil.parseJsonLD(responseBodyStr) } protected def parseTurtle(turtleStr: String): RdfModel = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() rdfFormatUtil.parseToRdfModel(rdfStr = turtleStr, rdfFormat = Turtle) } protected def parseRdfXml(rdfXmlStr: String): RdfModel = { - val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() rdfFormatUtil.parseToRdfModel(rdfStr = rdfXmlStr, rdfFormat = RdfXml) } diff --git a/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala b/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala deleted file mode 100644 index 2985a8dfa7..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory -import org.knora.webapi.http.version.BuildInfo -import org.testcontainers.containers.GenericContainer -import org.testcontainers.utility.DockerImageName - -import scala.jdk.CollectionConverters._ - -/** - * Provides the Fuseki container necessary for running tests. - */ -object TestContainerFuseki { - - val FusekiImageName: DockerImageName = DockerImageName.parse(BuildInfo.fuseki) - val FusekiContainer = new GenericContainer(FusekiImageName) - - FusekiContainer.withExposedPorts(3030) - FusekiContainer.withEnv("ADMIN_PASSWORD", "test") - FusekiContainer.withEnv("JVM_ARGS", "-Xmx3G") - FusekiContainer.start() - - private val portMap = Map( - "app.triplestore.fuseki.port" -> FusekiContainer.getFirstMappedPort - ).asJava - - // all tests need to be configured with these ports. - val PortConfig: Config = - ConfigFactory.parseMap(portMap, "Ports from RedisTestContainer").withFallback(ConfigFactory.load()) -} diff --git a/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala b/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala deleted file mode 100644 index 0c8b0181e0..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory -import org.testcontainers.containers.GenericContainer -import org.testcontainers.utility.DockerImageName - -import scala.jdk.CollectionConverters._ - -/** - * Provides the Redis container necessary for running tests. - */ -object TestContainerRedis { - - val redisImageName: DockerImageName = DockerImageName.parse("redis:5") - val redisContainer = new GenericContainer(redisImageName) - redisContainer.withExposedPorts(6379) - redisContainer.start() - - private val portMap = Map( - "app.cache-service.redis.port" -> redisContainer.getFirstMappedPort - ).asJava - - // all tests need to be configured with these ports. - val PortConfig: Config = - ConfigFactory.parseMap(portMap, "Ports from RedisTestContainer").withFallback(ConfigFactory.load()) -} diff --git a/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala b/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala deleted file mode 100644 index 34b423f1c8..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory -import org.knora.webapi.http.version.BuildInfo -import org.testcontainers.containers.BindMode -import org.testcontainers.containers.GenericContainer -import org.testcontainers.utility.DockerImageName - -import java.net.NetworkInterface -import java.net.UnknownHostException -import scala.jdk.CollectionConverters._ - -/** - * Provides all containers necessary for running tests. - */ -object TestContainersAll { - - // get local IP address, which we need for SIPI - val localIpAddress: String = NetworkInterface.getNetworkInterfaces.asScala.toSeq - .filter(!_.isLoopback) - .flatMap(_.getInetAddresses.asScala.toSeq.filter(_.getAddress.length == 4).map(_.toString)) - .headOption - .getOrElse(throw new UnknownHostException("No suitable network interface found")) - - val FusekiImageName: DockerImageName = DockerImageName.parse(BuildInfo.fuseki) - val FusekiContainer = new GenericContainer(FusekiImageName) - FusekiContainer.withExposedPorts(3030) - FusekiContainer.withEnv("ADMIN_PASSWORD", "test") - FusekiContainer.withEnv("JVM_ARGS", "-Xmx3G") - FusekiContainer.start() - - val SipiImageName: DockerImageName = DockerImageName.parse(s"daschswiss/knora-sipi:${BuildInfo.version}") - val SipiContainer = new GenericContainer(SipiImageName) - SipiContainer.withExposedPorts(1024) - SipiContainer.withEnv("KNORA_WEBAPI_KNORA_API_EXTERNAL_HOST", "0.0.0.0") - SipiContainer.withEnv("KNORA_WEBAPI_KNORA_API_EXTERNAL_PORT", "3333") - SipiContainer.withEnv("SIPI_EXTERNAL_PROTOCOL", "http") - SipiContainer.withEnv("SIPI_EXTERNAL_HOSTNAME", "0.0.0.0") - SipiContainer.withEnv("SIPI_EXTERNAL_PORT", "1024") - SipiContainer.withEnv("SIPI_WEBAPI_HOSTNAME", localIpAddress) - SipiContainer.withEnv("SIPI_WEBAPI_PORT", "3333") - - SipiContainer.withCommand("--config=/sipi/config/sipi.docker-config.lua") - - // TODO: Needs https://github.com/scalameta/metals/issues/3623 to be resolved - SipiContainer.withClasspathResourceMapping( - // "/sipi/config/sipi.docker-config.lua" - "/sipi.docker-config.lua", - "/sipi/config/sipi.docker-config.lua", - BindMode.READ_ONLY - ) - SipiContainer.start() - - // Container needs to be started to get the random IP - val sipiIp: String = SipiContainer.getHost - val sipiPort: Int = SipiContainer.getFirstMappedPort - - // The new default is the inmem cache implementation, so no need - // for a container - // - // val RedisImageName: DockerImageName = DockerImageName.parse("redis:5") - // val RedisContainer = new GenericContainer(RedisImageName) - // RedisContainer.withExposedPorts(6379) - // RedisContainer.start() - - private val portMap = Map( - "app.triplestore.fuseki.port" -> FusekiContainer.getFirstMappedPort, - "app.sipi.internal-host" -> sipiIp, - "app.sipi.internal-port" -> sipiPort - // "app.cache-service.redis.port" -> RedisContainer.getFirstMappedPort - ).asJava - - // all tests need to be configured with these ports. - val PortConfig: Config = ConfigFactory.parseMap(portMap, "Ports from TestContainers") -} diff --git a/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala b/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala deleted file mode 100644 index 9cf76d1b37..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.Props -import akka.testkit.TestProbe -import org.knora.webapi.core.ActorMaker - -/** - * This trait is part of the cake pattern used in the creation of actors. This trait provides an implementation of the - * makeActor method that creates an actor as a [[TestProbe]], which can than be used in testing. - */ -trait TestProbeMaker extends ActorMaker { - this: Actor with ActorLogging => - - lazy val probes = scala.collection.mutable.Map[String, TestProbe]() - - def makeActor(props: Props, name: String) = { - val probe = new TestProbe(context.system) - probes(name) = probe - log.debug(s"created test-probe named: $name") - context.actorOf( - Props(new Actor { - def receive = { - case msg => { - probe.ref forward msg - } - } - }), - name - ) - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala b/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala deleted file mode 100644 index d1b14aa413..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory -import com.typesafe.scalalogging.LazyLogging -import org.scalatest.BeforeAndAfterAll -import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.AnyWordSpecLike - -import messages.StringFormatter - -object UnitSpec { - - /* - Loads the following (first-listed are higher priority): - - system properties (e.g., -Dconfig.resource=fuseki.conf) - - test/resources/application.conf - - main/resources/application.conf - */ - val defaultConfig: Config = ConfigFactory.load() - - /* Copied from: akka/akka-testkit/src/test/scala/akka/testkit/AkkaSpec.scala */ - def getCallerName(clazz: Class[_]): String = { - val s = (Thread.currentThread.getStackTrace map (_.getClassName) drop 1) - .dropWhile(_ matches "(java.lang.Thread|.*UnitSpec.?$)") - val reduced = s.lastIndexWhere(_ == clazz.getName) match { - case -1 => s - case z => s drop (z + 1) - } - reduced.head.replaceFirst(""".*\.""", "").replaceAll("[^a-zA-Z_0-9]", "_") - } -} - -abstract class UnitSpec(_config: Config) extends AnyWordSpecLike with Matchers with BeforeAndAfterAll with LazyLogging { - - def this() = - this(UnitSpec.defaultConfig) - - // needs to be initialized early on - StringFormatter.initForTest() -} diff --git a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala index 297bb4b572..bb40cb9ee8 100644 --- a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala @@ -7,12 +7,49 @@ import zio.config._ import zio.config.typesafe.TypesafeConfigSource import magnolia._ +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.testcontainers.containers.GenericContainer /** * Alters the AppConfig with the TestContainer ports for Fuseki and Sipi. */ object AppConfigForTestContainers { + private def alterFusekiAndSipiPort( + oldConfig: AppConfig, + fusekiContainer: FusekiTestContainer, + sipiContainer: SipiTestContainer + ): UIO[AppConfig] = { + + val newFusekiPort = fusekiContainer.container.getFirstMappedPort() + val newSipiPort = sipiContainer.container.getFirstMappedPort() + + val alteredFuseki = oldConfig.triplestore.fuseki.copy(port = newFusekiPort) + + val alteredTriplestore = oldConfig.triplestore.copy(fuseki = alteredFuseki) + val alteredSipi = oldConfig.sipi.copy(internalPort = newSipiPort) + + val newConfig: AppConfig = oldConfig.copy(triplestore = alteredTriplestore, sipi = alteredSipi) + + ZIO.succeed(newConfig) + } + + private def alterFusekiPort( + oldConfig: AppConfig, + fusekiContainer: FusekiTestContainer + ): UIO[AppConfig] = { + + val newFusekiPort = fusekiContainer.container.getFirstMappedPort() + + val alteredFuseki = oldConfig.triplestore.fuseki.copy(port = newFusekiPort) + + val alteredTriplestore = oldConfig.triplestore.copy(fuseki = alteredFuseki) + + val newConfig: AppConfig = oldConfig.copy(triplestore = alteredTriplestore) + + ZIO.succeed(newConfig) + } + /** * Reads in the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading * the Typesafe-Config format. Reads the 'app' configuration from 'application.conf'. @@ -28,13 +65,25 @@ object AppConfigForTestContainers { /** * Altered AppConfig with ports from TestContainers for Fuseki and Sipi. */ - val testcontainers: ZLayer[SipiTestContainer, Nothing, AppConfig] = + val testcontainers: ZLayer[FusekiTestContainer & SipiTestContainer, Nothing, AppConfig] = + ZLayer { + for { + appConfig <- config + fusekiContainer <- ZIO.service[FusekiTestContainer] + sipiContainer <- ZIO.service[SipiTestContainer] + alteredConfig <- alterFusekiAndSipiPort(appConfig, fusekiContainer, sipiContainer) + } yield alteredConfig + }.tap(_ => ZIO.debug(">>> App Config for Fuseki and Sipi Testcontainers Initialized <<<")) + + /** + * Altered AppConfig with ports from TestContainers for Fuseki and Sipi. + */ + val fusekiOnlyTestcontainer: ZLayer[FusekiTestContainer, Nothing, AppConfig] = ZLayer { for { - appConfig <- config // .tapBoth(ZIO.debug(_), ZIO.debug(_)) - // fusekiContainer <- ZIO.service[FusekiTestContainer] - sipiContainer <- ZIO.service[SipiTestContainer] - alteredSipiConfig <- ZIO.succeed(appConfig.sipi.copy(internalPort = sipiContainer.container.getFirstMappedPort)) - } yield appConfig.copy(sipi = alteredSipiConfig) - }.tap(_ => ZIO.debug(">>> AppConfigForTestContainers Initialized <<<")) + appConfig <- config + fusekiContainer <- ZIO.service[FusekiTestContainer] + alteredConfig <- alterFusekiPort(appConfig, fusekiContainer) + } yield alteredConfig + }.tap(_ => ZIO.debug(">>> App Config for Fuseki only Testcontainers Initialized <<<")) } diff --git a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersSpec.scala b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersZSpec.scala similarity index 74% rename from webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersSpec.scala rename to webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersZSpec.scala index 6cd2113b47..22e4cd2602 100644 --- a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersZSpec.scala @@ -3,8 +3,9 @@ package org.knora.webapi.config import org.knora.webapi.testcontainers.SipiTestContainer import zio._ import zio.test._ +import org.knora.webapi.testcontainers.FusekiTestContainer -object AppConfigForTestContainersSpec extends ZIOSpecDefault { +object AppConfigForTestContainersZSpec extends ZIOSpecDefault { def spec = suite("AppConfigForTestContainersSpec")( test("successfully provide the adapted application configuration for using with test containers") { @@ -12,14 +13,13 @@ object AppConfigForTestContainersSpec extends ZIOSpecDefault { appConfig <- ZIO.service[AppConfig] sipiContainer <- ZIO.service[SipiTestContainer] sipiPort <- ZIO.succeed(sipiContainer.container.getFirstMappedPort) - _ <- ZIO.debug(appConfig) - _ <- ZIO.debug(sipiContainer.container.getFirstMappedPort) } yield { assertTrue(appConfig.sipi.internalPort == sipiPort) } } ).provide( AppConfigForTestContainers.testcontainers, - SipiTestContainer.layer + SipiTestContainer.layer, + FusekiTestContainer.layer ) } diff --git a/webapi/src/test/scala/org/knora/webapi/config/AppConfigSpec.scala b/webapi/src/test/scala/org/knora/webapi/config/AppConfigZSpec.scala similarity index 81% rename from webapi/src/test/scala/org/knora/webapi/config/AppConfigSpec.scala rename to webapi/src/test/scala/org/knora/webapi/config/AppConfigZSpec.scala index 057ad0a388..c7c4d672f9 100644 --- a/webapi/src/test/scala/org/knora/webapi/config/AppConfigSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigZSpec.scala @@ -6,7 +6,7 @@ import zio.test._ import java.util.concurrent.TimeUnit import scala.concurrent.duration.FiniteDuration -object AppConfigSpec extends ZIOSpec[AppConfig] { +object AppConfigZSpec extends ZIOSpec[AppConfig] { val bootstrap = ZLayer.make[AppConfig](AppConfig.live) @@ -16,8 +16,8 @@ object AppConfigSpec extends ZIOSpec[AppConfig] { appConfig <- ZIO.service[AppConfig] // _ <- ZIO.debug(appConfig) } yield { - assertTrue(appConfig.printExtendedConfig == false) - assertTrue(appConfig.jwtLongevityAsDuration == FiniteDuration(30L, TimeUnit.DAYS)) + assertTrue(appConfig.printExtendedConfig == false) && + assertTrue(appConfig.jwtLongevityAsDuration == FiniteDuration(30L, TimeUnit.DAYS)) && assertTrue(appConfig.sipi.timeoutInSeconds == FiniteDuration(120L, TimeUnit.SECONDS)) } } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala deleted file mode 100644 index a34881ffca..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.e2e - -import akka.actor.ActorSystem -import akka.http.scaladsl.model.ContentTypes -import akka.http.scaladsl.model.HttpEntity -import akka.http.scaladsl.model.HttpResponse -import akka.http.scaladsl.model.StatusCodes -import akka.http.scaladsl.model.headers.RawHeader -import akka.http.scaladsl.server.Directives.get -import akka.http.scaladsl.server.Directives.path -import akka.http.scaladsl.server.Route -import akka.http.scaladsl.testkit.RouteTestTimeout -import akka.http.scaladsl.util.FastFuture -import org.knora.webapi.R2RSpec -import org.knora.webapi.feature._ -import org.knora.webapi.http.directives.DSPApiDirectives -import org.knora.webapi.routing.KnoraRoute -import org.knora.webapi.routing.KnoraRouteData -import org.knora.webapi.routing.KnoraRouteFactory - -import scala.concurrent.ExecutionContextExecutor - -/** - * Tests feature toggles that replace implementations of API routes. - */ -class FeatureToggleR2RSpec extends R2RSpec { - // Some feature toggles for testing. - override def testConfigSource: String = - """app { - | feature-toggles { - | FeatureToggleR2RSpec-new-foo { - | description = "Replace the old foo routes with new ones." - | - | available-versions = [ 1, 2 ] - | default-version = 1 - | enabled-by-default = yes - | override-allowed = yes - | - | developer-emails = [ - | "Benjamin Geer " - | ] - | } - | - | FeatureToggleR2RSpec-new-bar { - | description = "Replace the old bar routes with new ones." - | - | available-versions = [ 1 ] - | default-version = 1 - | enabled-by-default = yes - | override-allowed = yes - | - | developer-emails = [ - | "Benjamin Geer " - | ] - | } - | - | FeatureToggleR2RSpec-new-baz { - | description = "Replace the old baz routes with new ones." - | - | available-versions = [ 1 ] - | default-version = 1 - | enabled-by-default = no - | override-allowed = no - | - | developer-emails = [ - | "Benjamin Geer " - | ] - | } - | } - |} - """.stripMargin - - /** - * A test implementation of a route feature that handles HTTP GET requests. - * - * @param pathStr the route path. - * @param featureName the name of the feature. - * @param routeData a [[KnoraRouteData]] providing access to the application. - */ - class TestRouteFeature(pathStr: String, featureName: String, routeData: KnoraRouteData) - extends KnoraRoute(routeData) - with Feature { - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = path(pathStr) { - get { requestContext => - // Return an HTTP response that says which feature implementation is being used. - val httpResponse = FastFuture.successful { - featureFactoryConfig.addHeaderToHttpResponse( - HttpResponse( - status = StatusCodes.OK, - entity = HttpEntity( - contentType = ContentTypes.`application/json`, - string = s"You are using $featureName" - ) - ) - ) - } - - requestContext.complete(httpResponse) - } - } - } - - /** - * A feature factory that constructs implementations of [[FooRoute]]. - */ - class FooRouteFeatureFactory(routeData: KnoraRouteData) extends KnoraRouteFactory(routeData) with FeatureFactory { - - // A trait for version numbers of the new 'foo' feature. - sealed trait NewFooVersion extends Version - - // Represents version 1 of the new 'foo' feature. - case object NEW_FOO_1 extends NewFooVersion - - // Represents version 2 of the new 'foo' feature. - case object NEW_FOO_2 extends NewFooVersion - - // The old 'foo' feature implementation. - private val oldFoo = new TestRouteFeature(pathStr = "foo", featureName = "the old foo", routeData = routeData) - - // The new 'foo' feature implementation, version 1. - private val newFoo1 = - new TestRouteFeature(pathStr = "foo", featureName = "the new foo, version 1", routeData = routeData) - - // The new 'foo' feature implementation, version 2. - private val newFoo2 = - new TestRouteFeature(pathStr = "foo", featureName = "the new foo, version 2", routeData = routeData) - - /** - * Constructs an implementation of the 'foo' route according to the feature factory - * configuration. - * - * @param featureFactoryConfig the per-request feature factory configuration. - * @return a route configured with the features enabled by the feature factory configuration. - */ - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { - // Get the 'new-foo' feature toggle. - val fooToggle: FeatureToggle = featureFactoryConfig.getToggle("FeatureToggleR2RSpec-new-foo") - - // Choose a route according to the toggle state. - val route: KnoraRoute = fooToggle.getMatchableState(NEW_FOO_1, NEW_FOO_2) match { - case Off => oldFoo - case On(NEW_FOO_1) => newFoo1 - case On(NEW_FOO_2) => newFoo2 - } - - // Ask the route implementation for its routing function, and return that function. - route.makeRoute(featureFactoryConfig) - } - } - - /** - * A feature factory that constructs implementations of [[BarRoute]]. - */ - class BarRouteFeatureFactory(routeData: KnoraRouteData) extends KnoraRouteFactory(routeData) with FeatureFactory { - - // The old 'bar' feature implementation. - private val oldBar = new TestRouteFeature(pathStr = "bar", featureName = "the old bar", routeData = routeData) - - // The new 'bar' feature implementation. - private val newBar = new TestRouteFeature(pathStr = "bar", featureName = "the new bar", routeData = routeData) - - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { - // Is the 'new-bar' feature toggle enabled? - val route: KnoraRoute = if (featureFactoryConfig.getToggle("FeatureToggleR2RSpec-new-bar").isEnabled) { - // Yes. Use the new implementation. - newBar - } else { - // No. Use the old implementation. - oldBar - } - - // Ask the route implementation for its routing function, and return that function. - route.makeRoute(featureFactoryConfig) - } - } - - /** - * A feature factory that constructs implementations of [[BazRoute]]. - */ - class BazRouteFeatureFactory(routeData: KnoraRouteData) extends KnoraRouteFactory(routeData) with FeatureFactory { - - // The old 'baz' feature implementation. - private val oldBaz = new TestRouteFeature(pathStr = "baz", featureName = "the old baz", routeData = routeData) - - // The new 'baz' feature implementation. - private val newBaz = new TestRouteFeature(pathStr = "baz", featureName = "the new baz", routeData = routeData) - - def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = { - // Is the 'new-baz' feature toggle enabled? - val route: KnoraRoute = if (featureFactoryConfig.getToggle("FeatureToggleR2RSpec-new-baz").isEnabled) { - // Yes. Use the new implementation. - newBaz - } else { - // No. Use the old implementation. - oldBaz - } - - route.makeRoute(featureFactoryConfig) - } - } - - /** - * A façade route that uses implementations constructed by [[FooRouteFeatureFactory]]. - */ - class FooRoute(routeData: KnoraRouteData) extends KnoraRoute(routeData) { - private val featureFactory = new FooRouteFeatureFactory(routeData) - - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - featureFactory.makeRoute(featureFactoryConfig) - } - - /** - * A façade route that uses implementations constructed by [[BarRouteFeatureFactory]]. - */ - class BarRoute(routeData: KnoraRouteData) extends KnoraRoute(routeData) { - private val featureFactory = new BarRouteFeatureFactory(routeData) - - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - featureFactory.makeRoute(featureFactoryConfig) - } - - /** - * A façade route that uses implementations constructed by [[BazRouteFeatureFactory]]. - */ - class BazRoute(routeData: KnoraRouteData) extends KnoraRoute(routeData) { - private val featureFactory = new BazRouteFeatureFactory(routeData) - - override def makeRoute(featureFactoryConfig: FeatureFactoryConfig): Route = - featureFactory.makeRoute(featureFactoryConfig) - } - - // The façade route instances that we are going to test. - private val fooRoute = DSPApiDirectives.handleErrors(system)(new FooRoute(routeData).knoraApiPath) - private val bazRoute = DSPApiDirectives.handleErrors(system)(new BazRoute(routeData).knoraApiPath) - - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) - - implicit val ec: ExecutionContextExecutor = system.dispatcher - - /** - * Parses the HTTP response header that lists the configured feature toggles. - * - * @param response the HTTP response. - * @return a string per toggle. - */ - private def parseResponseHeader(response: HttpResponse): Set[String] = - response.headers.find(_.lowercaseName == FeatureToggle.RESPONSE_HEADER_LOWERCASE) match { - case Some(header) => - header.value.split(',').toSet.filter { toggleStr => - toggleStr.contains("FeatureToggleR2RSpec") - } - - case None => Set.empty - } - - "The feature toggle framework" should { - "use default toggles" in { - Get(s"/foo") ~> fooRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.OK, responseStr) - assert(responseStr == "You are using the new foo, version 1") - assert( - parseResponseHeader(response) == Set( - "FeatureToggleR2RSpec-new-foo:1=on", - "FeatureToggleR2RSpec-new-bar:1=on", - "FeatureToggleR2RSpec-new-baz=off" - ) - ) - } - } - - "turn off a toggle" in { - Get(s"/foo") - .addHeader(RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-foo=off")) ~> fooRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.OK, responseStr) - assert(responseStr == "You are using the old foo") - assert( - parseResponseHeader(response) == Set( - "FeatureToggleR2RSpec-new-foo=off", - "FeatureToggleR2RSpec-new-bar:1=on", - "FeatureToggleR2RSpec-new-baz=off" - ) - ) - } - } - - "override the default toggle version" in { - Get(s"/foo") - .addHeader(RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-foo:2=on")) ~> fooRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.OK, responseStr) - assert(responseStr == "You are using the new foo, version 2") - assert( - parseResponseHeader(response) == Set( - "FeatureToggleR2RSpec-new-foo:2=on", - "FeatureToggleR2RSpec-new-bar:1=on", - "FeatureToggleR2RSpec-new-baz=off" - ) - ) - } - } - - "not enable a toggle without specifying the version number" in { - Get(s"/foo") - .addHeader(RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-foo=on")) ~> fooRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.BadRequest, responseStr) - assert( - responseStr.contains( - "You must specify a version number to enable feature toggle FeatureToggleR2RSpec-new-foo" - ) - ) - } - } - - "not enable a nonexistent version of a toggle" in { - Get(s"/foo") - .addHeader(RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-foo:3=on")) ~> fooRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.BadRequest, responseStr) - assert(responseStr.contains("Feature toggle FeatureToggleR2RSpec-new-foo has no version 3")) - } - } - - "not accept a version number when disabling a toggle" in { - Get(s"/foo") - .addHeader(RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-foo:2=off")) ~> fooRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.BadRequest, responseStr) - assert( - responseStr.contains( - "You cannot specify a version number when disabling feature toggle FeatureToggleR2RSpec-new-foo" - ) - ) - } - } - - "not override a default toggle if the base configuration doesn't allow it" in { - Get(s"/baz") - .addHeader(RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-baz=on")) ~> bazRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.BadRequest, responseStr) - assert(responseStr.contains("Feature toggle FeatureToggleR2RSpec-new-baz cannot be overridden")) - } - } - - "not accept two settings for the same toggle" in { - Get(s"/baz").addHeader( - RawHeader(FeatureToggle.REQUEST_HEADER, "FeatureToggleR2RSpec-new-foo=off,FeatureToggleR2RSpec-new-foo:2=on") - ) ~> bazRoute ~> check { - val responseStr = responseAs[String] - assert(status == StatusCodes.BadRequest, responseStr) - assert(responseStr.contains("You cannot set the same feature toggle more than once per request")) - } - } - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/SipiV1R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/SipiV1R2RSpec.scala index af3a6c9573..d929bca640 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/SipiV1R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/SipiV1R2RSpec.scala @@ -20,16 +20,25 @@ import org.knora.webapi.messages.v1.responder.valuemessages.CreateRichtextV1 import org.knora.webapi.routing.v1.ResourcesRouteV1 import org.knora.webapi.routing.v1.ValuesRouteV1 import org.knora.webapi.sharedtestdata.SharedTestDataV1 -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import zio.& import zio.ZLayer +import zio.Runtime import java.net.URLEncoder import java.nio.file.Files import java.nio.file.Paths +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.testservices.TestClientService +import org.knora.webapi.testservices.TestActorSystemService +import org.knora.webapi.core.Logging /** * End-to-end test specification for the resources endpoint. This specification uses the Spray Testkit as documented @@ -58,12 +67,20 @@ class SipiV1R2RSpec extends R2RSpec { /* we need to run our app with the mocked sipi implementation */ override lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TestClientService]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceMockImpl.layer, - AppConfig.live + AppConfigForTestContainers.fusekiOnlyTestcontainer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer, + Logging.slf4j, + TestClientService.layer, + TestActorSystemService.layer ) object RequestParams { diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesV2R2RSpec.scala index c3481d48cf..c31db5a293 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesV2R2RSpec.scala @@ -26,15 +26,24 @@ import org.knora.webapi.messages.util.search.SparqlQueryConstants import org.knora.webapi.routing.v2.SearchRouteV2 import org.knora.webapi.routing.v2.ValuesRouteV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util.MutableTestIri import zio.& import zio.ZLayer +import zio.Runtime import scala.concurrent.ExecutionContextExecutor +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.testservices.TestClientService +import org.knora.webapi.testservices.TestActorSystemService +import org.knora.webapi.core.Logging /** * Tests creating a still image file value using a mock Sipi. @@ -57,12 +66,20 @@ class ValuesV2R2RSpec extends R2RSpec { /* we need to run our app with the mocked sipi implementation */ override lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TestClientService]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceMockImpl.layer, - AppConfig.live + AppConfigForTestContainers.fusekiOnlyTestcontainer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer, + Logging.slf4j, + TestClientService.layer, + TestActorSystemService.layer ) private val aThingPictureIri = "http://rdfh.ch/0001/a-thing-picture" diff --git a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala index 60fa7049d6..f8ddc45483 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala @@ -350,7 +350,7 @@ class KnoraSipiIntegrationV2ITSpec ) } - "The Knora/Sipi integration" ignore { + "The Knora/Sipi integration" should { var loginToken: String = "" "not accept a token in Sipi that hasn't been signed by Knora" in { diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala index 579a0c1ccf..2f8bac568d 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala @@ -144,7 +144,6 @@ class ListsMessagesADMSpec extends CoreSpec(ListsMessagesADMSpec.config) with Li .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala index d1d6d30e6d..56ac3ff6b3 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala @@ -105,7 +105,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set(PermissionADM.ProjectAdminAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -122,7 +121,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = groupIri, hasPermissions = Set(PermissionADM.ProjectAdminAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -140,7 +138,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set(PermissionADM.ProjectAdminAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -158,7 +155,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set(PermissionADM.ProjectAdminAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -182,7 +178,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -201,7 +196,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set.empty[PermissionADM] ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -217,7 +211,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set(PermissionADM.ProjectAdminAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesReviewerUser, apiRequestID = UUID.randomUUID() ) @@ -502,7 +495,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = Some(OntologyConstants.KnoraAdmin.ProjectMember), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -519,7 +511,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = Some(groupIri), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -537,7 +528,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = Some(OntologyConstants.KnoraAdmin.ProjectMember), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -555,7 +545,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = Some(OntologyConstants.KnoraAdmin.ProjectMember), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -571,7 +560,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = Some(SharedTestDataADM.thingSearcherGroup.id), hasPermissions = Set.empty[PermissionADM] ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID() ) @@ -595,7 +583,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(SharedOntologyTestDataADM.IMAGES_TITEL_PROPERTY), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID() ) @@ -623,7 +610,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(SharedOntologyTestDataADM.IMAGES_TITEL_PROPERTY), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID() ) @@ -652,7 +638,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(SharedOntologyTestDataADM.IMAGES_TITEL_PROPERTY), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID() ) @@ -676,7 +661,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(SharedOntologyTestDataADM.IMAGES_TITEL_PROPERTY), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID() ) @@ -703,7 +687,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(SharedOntologyTestDataADM.IMAGES_TITEL_PROPERTY), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID() ) @@ -722,7 +705,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forGroup = Some(SharedTestDataADM.thingSearcherGroup.id), hasPermissions = Set(PermissionADM.restrictedViewPermission(SharedTestDataADM.thingSearcherGroup.id)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser2, apiRequestID = UUID.randomUUID() ) @@ -739,7 +721,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forResourceClass = Some(ANYTHING_THING_RESOURCE_CLASS_LocalHost), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -756,7 +737,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(ANYTHING_HasDate_PROPERTY_LocalHost), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -772,7 +752,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProperty = Some(SharedTestDataADM.customValueIRI), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -788,7 +767,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forResourceClass = Some(ANYTHING_THING_RESOURCE_CLASS_LocalHost), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -803,7 +781,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { forProject = ANYTHING_PROJECT_IRI, hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -820,7 +797,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { val caught = intercept[BadRequestException]( PermissionsForProjectGetRequestADM( projectIri = projectIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID() ) @@ -832,7 +808,6 @@ class PermissionsMessagesADMSpec extends CoreSpec() { val caught = intercept[ForbiddenException]( PermissionsForProjectGetRequestADM( projectIri = SharedTestDataADM.IMAGES_PROJECT_IRI, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser02, apiRequestID = UUID.randomUUID() ) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2Spec.scala index d0c8a5585a..d040082708 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2Spec.scala @@ -21,6 +21,8 @@ import java.nio.file.Paths import scala.concurrent.Await import scala.concurrent.Future import scala.concurrent.duration._ +import zio.Unsafe +import zio.FiberFailure /** * Tests [[ConstructResponseUtilV2]]. @@ -33,7 +35,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { private val anonymousUser = SharedTestDataADM.anonymousUser private val resourcesResponderV2SpecFullData = new ResourcesResponderV2SpecFullData private val constructResponseUtilV2SpecFullData = new ConstructResponseUtilV2SpecFullData - private val rdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + private val rdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() "ConstructResponseUtilV2" should { @@ -42,7 +44,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/Zeitglocklein.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -60,7 +69,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser ) @@ -77,7 +85,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/visibleThingWithHiddenIntValues.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -95,7 +110,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -113,7 +127,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/visibleThingWithHiddenIntValues.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -131,7 +152,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser ) @@ -149,7 +169,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/thingWithOneHiddenThing.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -167,7 +194,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -185,7 +211,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/thingWithOneHiddenThing.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -203,7 +236,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anonymousUser ) @@ -221,7 +253,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/thingWithStandoff.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -239,7 +278,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -287,7 +325,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val resourceIris: Seq[IRI] = Seq("http://rdfh.ch/0803/76570a749901", "http://rdfh.ch/0803/773f258402") val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/mainQuery1.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -305,7 +350,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser ) @@ -354,7 +398,14 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { val resourceIris: Seq[IRI] = Seq("http://rdfh.ch/0803/c5058f3a", "http://rdfh.ch/0803/ff17e5ef9601") val turtleStr: String = FileUtil.readTextFile(Paths.get("..", "test_data/constructResponseUtilV2/mainQuery2.ttl")) val resourceRequestResponse: SparqlExtendedConstructResponse = - SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr, rdfFormatUtil, log).get + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + SparqlExtendedConstructResponse.parseTurtleResponse(turtleStr) + ) + .getOrElse(c => throw FiberFailure(c)) + } + val mainResourcesAndValueRdfData: ConstructResponseUtilV2.MainResourcesAndValueRdfData = ConstructResponseUtilV2.splitMainResourcesAndValueRdfData( constructQueryResults = resourceRequestResponse, @@ -372,7 +423,6 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { appActor = appActor, targetSchema = ApiV2Complex, settings = settings, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser ) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala index 84b32e6b52..e54f0ad595 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala @@ -6,7 +6,6 @@ package org.knora.webapi.util.rdf import org.knora.webapi.CoreSpec -import org.knora.webapi.feature._ import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.util.FileUtil import spray.json.JsValue @@ -17,14 +16,10 @@ import java.nio.file.Paths /** * Tests [[JsonLDUtil]]. */ -abstract class JsonLDUtilSpec(featureToggle: FeatureToggle) extends CoreSpec { - private val featureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set(featureToggle), - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) - - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) - private val rdfModelFactory: RdfModelFactory = RdfFeatureFactory.getRdfModelFactory(featureFactoryConfig) +class JsonLDUtilSpec() extends CoreSpec { + + private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + private val rdfModelFactory: RdfModelFactory = RdfFeatureFactory.getRdfModelFactory() "The JSON-LD tool" should { "parse JSON-LD text, compact it with an empty context, convert the result to a JsonLDDocument, and convert that back to text" in { diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/KnoraResponseV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/KnoraResponseV2Spec.scala index 2b76d46a3f..5091b4d5e1 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/KnoraResponseV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/KnoraResponseV2Spec.scala @@ -6,7 +6,7 @@ package org.knora.webapi.util.rdf import org.knora.webapi._ -import org.knora.webapi.feature._ + import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.v2.responder.KnoraJsonLDResponseV2 import org.knora.webapi.messages.v2.responder.KnoraTurtleResponseV2 @@ -18,13 +18,9 @@ import java.nio.file.Paths /** * Tests the formatting of Knora API v2 responses. */ -abstract class KnoraResponseV2Spec(featureToggle: FeatureToggle) extends CoreSpec { - private val featureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set(featureToggle), - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) +class KnoraResponseV2Spec() extends CoreSpec { - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) + private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() private val turtle = """ a ; @@ -143,7 +139,6 @@ abstract class KnoraResponseV2Spec(featureToggle: FeatureToggle) extends CoreSpe rdfFormat = JsonLD, targetSchema = InternalSchema, schemaOptions = Set.empty, - featureFactoryConfig = featureFactoryConfig, settings = settings ) @@ -172,7 +167,6 @@ abstract class KnoraResponseV2Spec(featureToggle: FeatureToggle) extends CoreSpe rdfFormat = Turtle, targetSchema = ApiV2Complex, schemaOptions = Set.empty, - featureFactoryConfig = featureFactoryConfig, settings = settings ) @@ -195,7 +189,6 @@ abstract class KnoraResponseV2Spec(featureToggle: FeatureToggle) extends CoreSpe rdfFormat = JsonLD, targetSchema = ApiV2Complex, schemaOptions = Set(FlatJsonLD), - featureFactoryConfig = featureFactoryConfig, settings = settings ) @@ -210,7 +203,6 @@ abstract class KnoraResponseV2Spec(featureToggle: FeatureToggle) extends CoreSpe rdfFormat = JsonLD, targetSchema = InternalSchema, schemaOptions = Set(HierarchicalJsonLD), - featureFactoryConfig = featureFactoryConfig, settings = settings ) @@ -225,7 +217,6 @@ abstract class KnoraResponseV2Spec(featureToggle: FeatureToggle) extends CoreSpe rdfFormat = JsonLD, targetSchema = InternalSchema, schemaOptions = Set(FlatJsonLD), - featureFactoryConfig = featureFactoryConfig, settings = settings ) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala index 16a5bb81fa..3feb1aedcb 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala @@ -7,7 +7,7 @@ package org.knora.webapi.util.rdf import org.knora.webapi.CoreSpec import org.knora.webapi.IRI -import org.knora.webapi.feature._ + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.util.FileUtil @@ -22,15 +22,11 @@ import java.nio.file.Paths /** * Tests implementations of [[RdfFormatUtil]]. */ -abstract class RdfFormatUtilSpec(featureToggle: FeatureToggle) extends CoreSpec { - private val featureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set(featureToggle), - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) +class RdfFormatUtilSpec() extends CoreSpec { - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) - private val rdfNodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) - private val rdfModelFactory: RdfModelFactory = RdfFeatureFactory.getRdfModelFactory(featureFactoryConfig) + private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + private val rdfNodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() + private val rdfModelFactory: RdfModelFactory = RdfFeatureFactory.getRdfModelFactory() private val expectedThingLabelStatement = rdfNodeFactory.makeStatement( rdfNodeFactory.makeIriNode("http://www.knora.org/ontology/0001/anything#Thing"), diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala index d3375daaef..bd2de7fce9 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala @@ -8,7 +8,7 @@ package org.knora.webapi.util.rdf import org.knora.webapi.CoreSpec import org.knora.webapi.IRI import dsp.errors.AssertionException -import org.knora.webapi.feature._ + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ @@ -17,19 +17,12 @@ import java.io.FileInputStream /** * Tests implementations of [[RdfModel]]. - * - * @param featureToggle a feature toggle specifying which implementation of [[RdfModel]] should - * be used for the test. */ -abstract class RdfModelSpec(featureToggle: FeatureToggle) extends CoreSpec { - private val featureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set(featureToggle), - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) - - private val model: RdfModel = RdfFeatureFactory.getRdfModelFactory(featureFactoryConfig).makeEmptyModel - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) +class RdfModelSpec() extends CoreSpec { + + private val model: RdfModel = RdfFeatureFactory.getRdfModelFactory().makeEmptyModel + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() + private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() /** * Adds a statement, then searches for it by subject and predicate. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala index 9ea737220b..9b4660b24b 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala @@ -8,7 +8,7 @@ package org.knora.webapi.util.rdf import com.typesafe.config.ConfigFactory import org.knora.webapi.CoreSpec import dsp.errors.AssertionException -import org.knora.webapi.feature._ + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ @@ -27,22 +27,13 @@ object ShaclValidatorSpec { /** * Tests implementations of [[ShaclValidator]]. - * - * @param featureToggle a feature toggle specifying which implementation of [[ShaclValidator]] should - * be used for the test. */ -abstract class ShaclValidatorSpec(featureToggle: FeatureToggle) - extends CoreSpec(ConfigFactory.parseString(ShaclValidatorSpec.config)) { - - private val featureFactoryConfig: FeatureFactoryConfig = - new TestFeatureFactoryConfig( - testToggles = Set(featureToggle), - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) - - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) - private val shaclValidator: ShaclValidator = RdfFeatureFactory.getShaclValidator(featureFactoryConfig) +class ShaclValidatorSpec() extends CoreSpec(ConfigFactory.parseString(ShaclValidatorSpec.config)) { + + RdfFeatureFactory.init(settings) + private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() + private val shaclValidator: ShaclValidator = RdfFeatureFactory.getShaclValidator() private val conformsIri: IriNode = nodeFactory diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala deleted file mode 100644 index c7a72eb209..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.jenaimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOn -import org.knora.webapi.util.rdf.RdfFormatUtilSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.jenaimpl.JenaFormatUtil]]. - */ -class JenaFormatUtilSpec extends RdfFormatUtilSpec(FeatureToggle("jena-rdf-library", ToggleStateOn(1))) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala deleted file mode 100644 index 1411fd2e37..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.jenaimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOn -import org.knora.webapi.util.rdf.JsonLDUtilSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.JsonLDUtil]] using the Jena RDF API. - */ -class JenaJsonLDUtilSpec extends JsonLDUtilSpec(FeatureToggle("jena-rdf-library", ToggleStateOn(1))) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala deleted file mode 100644 index 6714c00a71..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.jenaimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOn -import org.knora.webapi.util.rdf.KnoraResponseV2Spec - -/** - * Tests [[org.knora.webapi.messages.v2.responder.KnoraResponseV2]] with the Jena API. - */ -class JenaKnoraResponseV2Spec extends KnoraResponseV2Spec(FeatureToggle("jena-rdf-library", ToggleStateOn(1))) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModelSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModelSpec.scala deleted file mode 100644 index 016675a1e3..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModelSpec.scala +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.jenaimpl - -import org.knora.webapi.feature._ -import org.knora.webapi.util.rdf.RdfModelSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.jenaimpl.JenaModel]]. - */ -class JenaModelSpec extends RdfModelSpec(FeatureToggle("jena-rdf-library", ToggleStateOn(1))) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala deleted file mode 100644 index b2660aa90b..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.jenaimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOn -import org.knora.webapi.util.rdf.ShaclValidatorSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.ShaclValidator]] using the Jena API. - */ -class JenaShaclValidatorSpec extends ShaclValidatorSpec(FeatureToggle("jena-rdf-library", ToggleStateOn(1))) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala deleted file mode 100644 index 474badba89..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.rdf4jimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOff -import org.knora.webapi.util.rdf.RdfFormatUtilSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.rdf4jimpl.RDF4JFormatUtil]]. - */ -class RDF4JFormatUtilSpec extends RdfFormatUtilSpec(FeatureToggle("jena-rdf-library", ToggleStateOff)) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala deleted file mode 100644 index 1e075d7748..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.rdf4jimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOff -import org.knora.webapi.util.rdf.JsonLDUtilSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.JsonLDUtil]] using the RDF4J API. - */ -class RDF4JJsonLDUtilSpec extends JsonLDUtilSpec(FeatureToggle("jena-rdf-library", ToggleStateOff)) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala deleted file mode 100644 index 8394eba752..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.rdf4jimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOff -import org.knora.webapi.util.rdf.KnoraResponseV2Spec - -/** - * Tests [[org.knora.webapi.messages.v2.responder.KnoraResponseV2]] with the RDF4J API. - */ -class RDF4JKnoraResponseV2Spec extends KnoraResponseV2Spec(FeatureToggle("jena-rdf-library", ToggleStateOff)) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModelSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModelSpec.scala deleted file mode 100644 index 556b653c6d..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModelSpec.scala +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.rdf4jimpl - -import org.knora.webapi.feature._ -import org.knora.webapi.util.rdf.RdfModelSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.rdf4jimpl.RDF4JModel]]. - */ -class RDF4JModelSpec extends RdfModelSpec(FeatureToggle("jena-rdf-library", ToggleStateOff)) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala deleted file mode 100644 index 4a9718e7da..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util.rdf.rdf4jimpl - -import org.knora.webapi.feature.FeatureToggle -import org.knora.webapi.feature.ToggleStateOff -import org.knora.webapi.util.rdf.ShaclValidatorSpec - -/** - * Tests [[org.knora.webapi.messages.util.rdf.ShaclValidator]] using the RDF4J API. - */ -class RDF4JShaclValidatorSpec extends ShaclValidatorSpec(FeatureToggle("jena-rdf-library", ToggleStateOff)) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec.scala index 8bdb5313b5..420e654d17 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec.scala @@ -3,7 +3,7 @@ package org.knora.webapi.util.search.gravsearch.prequery import akka.actor.ActorSystem import org.knora.webapi.CoreSpec import dsp.errors.AssertionException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -32,8 +32,7 @@ private object CountQueryHandler { def transformQuery( query: String, appActor: ActorRef, - responderData: ResponderData, - featureFactoryConfig: FeatureFactoryConfig + responderData: ResponderData )(implicit executionContext: ExecutionContext): SelectQuery = { val constructQuery = GravsearchParser.parseQuery(query) @@ -60,8 +59,7 @@ private object CountQueryHandler { new NonTriplestoreSpecificGravsearchToCountPrequeryTransformer( constructClause = constructQuery.constructClause, typeInspectionResult = typeInspectionResult, - querySchema = constructQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")), - featureFactoryConfig = featureFactoryConfig + querySchema = constructQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")) ) val nonTriplestoreSpecficPrequery: SelectQuery = QueryTraverser.transformConstructToSelect( @@ -344,8 +342,7 @@ class NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec extends Cor CountQueryHandler.transformQuery( inputQueryWithDecimalOptionalSortCriterionAndFilter, appActor, - responderData, - defaultFeatureFactoryConfig + responderData ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterionAndFilter) @@ -358,8 +355,7 @@ class NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec extends Cor CountQueryHandler.transformQuery( inputQueryWithDecimalOptionalSortCriterionAndFilterComplex, appActor, - responderData, - defaultFeatureFactoryConfig + responderData ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterionAndFilterComplex) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec.scala index 8033f55342..1087b0a92e 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec.scala @@ -2,7 +2,7 @@ package org.knora.webapi.util.search.gravsearch.prequery import org.knora.webapi.CoreSpec import dsp.errors.AssertionException -import org.knora.webapi.feature.FeatureFactoryConfig + import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -33,8 +33,7 @@ private object QueryHandler { query: String, appActor: ActorRef, responderData: ResponderData, - settings: KnoraSettingsImpl, - featureFactoryConfig: FeatureFactoryConfig + settings: KnoraSettingsImpl )(implicit executionContext: ExecutionContext): SelectQuery = { val constructQuery = GravsearchParser.parseQuery(query) @@ -62,8 +61,7 @@ private object QueryHandler { constructClause = constructQuery.constructClause, typeInspectionResult = typeInspectionResult, querySchema = constructQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")), - settings = settings, - featureFactoryConfig = featureFactoryConfig + settings = settings ) val nonTriplestoreSpecificPrequery: SelectQuery = QueryTraverser.transformConstructToSelect( @@ -3208,8 +3206,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithOptional, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithOptional) } @@ -3221,8 +3218,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterion, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterion) @@ -3236,8 +3232,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterionComplex, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterion) @@ -3251,8 +3246,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterionAndFilter, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterionAndFilter) @@ -3266,8 +3260,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterionAndFilterComplex, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterionAndFilter) @@ -3281,8 +3274,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterion, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterion) @@ -3296,8 +3288,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterionComplex, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterion) @@ -3311,8 +3302,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterionAndFilter, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterionAndFilter) @@ -3326,8 +3316,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterionAndFilterComplex, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterionAndFilter) @@ -3341,8 +3330,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterion, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterion) @@ -3355,8 +3343,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterionComplex, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterion) @@ -3369,8 +3356,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterionAndFilter, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterionAndFilter) @@ -3383,8 +3369,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterionAndFilterComplex, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) // TODO: user provided statements and statement generated for sorting should be unified (https://github.com/dhlab-basel/Knora/issues/1195) @@ -3397,8 +3382,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndLiteralInSimpleSchema, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery == TransformedQueryWithRdfsLabelAndLiteral) @@ -3410,8 +3394,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndLiteralInComplexSchema, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndLiteral) @@ -3423,8 +3406,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndVariableInSimpleSchema, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndVariable) @@ -3436,8 +3418,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndVariableInComplexSchema, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndVariable) @@ -3449,8 +3430,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndRegexInSimpleSchema, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndRegex) @@ -3462,8 +3442,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndRegexInComplexSchema, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndRegex) @@ -3475,8 +3454,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithUnionScopes, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithUnionScopes) @@ -3488,8 +3466,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithStandoffTagHasStartAncestor, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryWithStandoffTagHasStartAncestor) @@ -3501,8 +3478,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorder, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryToReorder) @@ -3514,8 +3490,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorderWithUnion, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === transformedQueryToReorderWithUnion) @@ -3527,8 +3502,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithOptional, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery === TransformedQueryWithOptional) @@ -3540,8 +3514,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorderWithMinus, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery == transformedQueryToReorderWithMinus) @@ -3553,8 +3526,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorderWithCycle, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert(transformedQuery == transformedQueryToReorderWithCycle) @@ -3566,8 +3538,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithKnoraApiResource, appActor, responderData, - settings, - defaultFeatureFactoryConfig + settings ) assert( diff --git a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala index b82e36e658..1886c81223 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala @@ -6,9 +6,8 @@ package org.knora.webapi.messages.v2.responder.ontologymessages import akka.util.Timeout -import org.knora.webapi.AsyncCoreSpec -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.CoreSpec + import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM @@ -20,7 +19,7 @@ import scala.concurrent.Future /** * Tests [[ChangePropertyGuiElementRequestV2Spec]]. */ -class ChangePropertyGuiElementRequestV2Spec extends AsyncCoreSpec { +class ChangePropertyGuiElementRequestV2Spec extends CoreSpec { "ChangePropertyGuiElementRequest" should { "should parse the request message correctly" in { @@ -53,8 +52,6 @@ class ChangePropertyGuiElementRequestV2Spec extends AsyncCoreSpec { implicit val timeout: Timeout = settings.defaultTimeout - val featureFactoryConfig: FeatureFactoryConfig = new KnoraSettingsFeatureFactoryConfig(settings) - val requestingUser = SharedTestDataADM.anythingUser1 val requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -68,7 +65,6 @@ class ChangePropertyGuiElementRequestV2Spec extends AsyncCoreSpec { apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - featureFactoryConfig = featureFactoryConfig, settings = settings, log = log ) diff --git a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/resourcesmessages/ResourcesMessagesV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/resourcesmessages/ResourcesMessagesV2Spec.scala index b941e7693a..d4fd863487 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/resourcesmessages/ResourcesMessagesV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/resourcesmessages/ResourcesMessagesV2Spec.scala @@ -15,7 +15,6 @@ class ResourcesMessagesV2Spec extends CoreSpec() { val caught = intercept[BadRequestException]( ProjectResourcesWithHistoryGetRequestV2( projectIri = projectIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) ) @@ -26,7 +25,6 @@ class ResourcesMessagesV2Spec extends CoreSpec() { val caught = intercept[BadRequestException]( ProjectResourcesWithHistoryGetRequestV2( projectIri = "http://rdfh.ch/0001/thing-with-history", // resource IRI instead of project IRI - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) ) @@ -40,7 +38,6 @@ class ResourcesMessagesV2Spec extends CoreSpec() { val caught = intercept[BadRequestException]( ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) ) @@ -52,7 +49,6 @@ class ResourcesMessagesV2Spec extends CoreSpec() { val caught = intercept[BadRequestException]( ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) ) diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala index df9d565d0a..a3326efeb1 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala @@ -5,7 +5,6 @@ package org.knora.webapi.models.filemodels -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter @@ -226,7 +225,6 @@ sealed abstract case class ChangeFileRequest private ( } /** - * @param featureFactoryConfig the featureFactoryConfig * @param internalMimeType internal mimetype, as provided by SIPI. Optional. * @param originalFilename original filename before the upload. Optional. * @param originalMimeType file mimetype before the upload. Optional. @@ -239,7 +237,6 @@ sealed abstract case class ChangeFileRequest private ( * @return */ def toMessage( - featureFactoryConfig: FeatureFactoryConfig, internalMimeType: Option[String] = None, originalFilename: Option[String] = None, originalMimeType: Option[String] = None, @@ -274,7 +271,6 @@ sealed abstract case class ChangeFileRequest private ( valueCreationDate = valueCreationDate, newValueVersionIri = newValueVersionIri ), - featureFactoryConfig = featureFactoryConfig, requestingUser = requestingUser, apiRequestID = UUID.randomUUID ) diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala index 691e10ade1..35f7d23164 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala @@ -649,7 +649,7 @@ class FileModelsSpec extends CoreSpec { resourceIri = resourceIRI, valueIri = valueIRI ) - val msg = documentRepresentation.toMessage(featureFactoryConfig = defaultFeatureFactoryConfig) + val msg = documentRepresentation.toMessage() msg.updateValue should equal( UpdateValueContentV2( resourceIri = resourceIRI, @@ -695,7 +695,6 @@ class FileModelsSpec extends CoreSpec { ontologyName = prefix ) val msg = documentRepresentation.toMessage( - featureFactoryConfig = defaultFeatureFactoryConfig, internalMimeType = Some(internalMimeType), originalFilename = Some(originalFileName), originalMimeType = Some(originalMimetype), diff --git a/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala b/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala index a200e36cd8..9b5e628dd8 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala @@ -5,7 +5,6 @@ package org.knora.webapi.models.standoffmodels -import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter @@ -49,13 +48,12 @@ sealed abstract case class DefineStandoffMapping private ( * Create a [[CreateMappingRequestV2]] message representation of the request. This can be used in unit tests. * * @param xml the mapping XML. - * @param featureFactoryConfig the [[FeatureFactoryConfig]]. + * * @param user the user issuing the request. * @return a [[CreateMappingRequestV2]] message representation of the request that can be processed by an Akka actor. */ def toMessage( xml: String, - featureFactoryConfig: FeatureFactoryConfig, user: UserADM ): CreateMappingRequestV2 = { val mappingMetadata = CreateMappingRequestMetadataV2( @@ -66,7 +64,6 @@ sealed abstract case class DefineStandoffMapping private ( CreateMappingRequestV2( metadata = mappingMetadata, xml = CreateMappingRequestXMLV2(xml), - featureFactoryConfig = featureFactoryConfig, requestingUser = user, apiRequestID = UUID.randomUUID() ) diff --git a/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala index fa6a196795..5603537050 100644 --- a/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala @@ -77,7 +77,6 @@ class DrawingsGodsV1Spec extends CoreSpec(DrawingsGodsV1Spec.config) with Triple appActor ! UserGetADM( identifier = UserIdentifierADM(maybeIri = Some(rootUserIri)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -86,7 +85,6 @@ class DrawingsGodsV1Spec extends CoreSpec(DrawingsGodsV1Spec.config) with Triple appActor ! UserGetADM( identifier = UserIdentifierADM(maybeIri = Some(ddd1UserIri)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -95,7 +93,6 @@ class DrawingsGodsV1Spec extends CoreSpec(DrawingsGodsV1Spec.config) with Triple appActor ! UserGetADM( UserIdentifierADM(maybeIri = Some(ddd2UserIri)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -204,7 +201,6 @@ class DrawingsGodsV1Spec extends CoreSpec(DrawingsGodsV1Spec.config) with Triple projectIri = drawingsGodsProjectIri, values = valuesToBeCreated, file = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = ddd1.get, apiRequestID = UUID.randomUUID ) @@ -214,7 +210,6 @@ class DrawingsGodsV1Spec extends CoreSpec(DrawingsGodsV1Spec.config) with Triple appActor ! ResourceFullGetRequestV1( iri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = ddd1.get ) @@ -251,7 +246,6 @@ class DrawingsGodsV1Spec extends CoreSpec(DrawingsGodsV1Spec.config) with Triple projectIri = drawingsGodsProjectIri, values = valuesToBeCreated, file = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = rootUser.get, apiRequestID = UUID.randomUUID ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala index fa2803e8b2..0a171306e5 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala @@ -50,7 +50,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit "asked about all groups" should { "return a list" in { appActor ! GroupsGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) @@ -64,7 +63,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit "return group info if the group is known " in { appActor ! GroupGetRequestADM( groupIri = imagesReviewerGroup.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) @@ -74,7 +72,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit "return 'NotFoundException' when the group is unknown " in { appActor ! GroupGetRequestADM( groupIri = "http://rdfh.ch/groups/notexisting", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) @@ -106,7 +103,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit status = GroupStatus.make(true).fold(e => throw e.head, v => v), selfjoin = GroupSelfJoin.make(false).fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -140,7 +136,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit status = GroupStatus.make(true).fold(e => throw e.head, v => v), selfjoin = GroupSelfJoin.make(false).fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -163,7 +158,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -191,7 +185,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -212,7 +205,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -231,7 +223,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit "return all members of a group identified by IRI" in { appActor ! GroupMembersGetRequestADM( groupIri = SharedTestDataADM.imagesReviewerGroup.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) @@ -246,7 +237,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit "remove all members when group is deactivated" in { appActor ! GroupMembersGetRequestADM( groupIri = SharedTestDataADM.imagesReviewerGroup.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) @@ -256,7 +246,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit appActor ! GroupChangeStatusRequestADM( groupIri = SharedTestDataADM.imagesReviewerGroup.id, changeGroupRequest = ChangeGroupApiRequestADM(status = Some(false)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -267,7 +256,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit appActor ! GroupMembersGetRequestADM( groupIri = SharedTestDataADM.imagesReviewerGroup.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) @@ -277,7 +265,6 @@ class GroupsResponderADMSpec extends CoreSpec(GroupsResponderADMSpec.config) wit "return 'NotFound' when the group IRI is unknown" in { appActor ! GroupMembersGetRequestADM( groupIri = "http://rdfh.ch/groups/notexisting", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala index 3dbfb32698..6a31d77305 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala @@ -66,7 +66,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "used to query information about lists" should { "return all lists" in { appActor ! ListsGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) @@ -78,7 +77,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "return all lists belonging to the images project" in { appActor ! ListsGetRequestADM( projectIri = Some(IMAGES_PROJECT_IRI), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) @@ -92,7 +90,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "return all lists belonging to the anything project" in { appActor ! ListsGetRequestADM( projectIri = Some(ANYTHING_PROJECT_IRI), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) @@ -106,7 +103,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "return basic list information (anything list)" in { appActor ! ListNodeInfoGetRequestADM( iri = "http://rdfh.ch/lists/0001/treeList", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -120,7 +116,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "return basic list information (anything other list)" in { appActor ! ListNodeInfoGetRequestADM( iri = "http://rdfh.ch/lists/0001/otherTreeList", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -134,7 +129,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "return basic node information (images list - sommer)" in { appActor ! ListNodeInfoGetRequestADM( iri = "http://rdfh.ch/lists/00FF/526f26ed04", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01 ) @@ -148,7 +142,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with "return a full list response" in { appActor ! ListGetRequestADM( iri = "http://rdfh.ch/lists/0001/treeList", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -179,7 +172,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .make(Seq(V2.StringLiteralV2(value = "Neuer Kommentar", language = Some("de")))) .fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -220,7 +212,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .make(Seq(V2.StringLiteralV2(value = commentWithSpecialCharacter, language = Some("de")))) .fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -275,7 +266,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -315,7 +305,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with projectIri = projectIRI, name = name ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -343,7 +332,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -398,7 +386,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -452,7 +439,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -508,7 +494,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with .fold(e => throw e.head, v => v) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -531,7 +516,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 3, parentIri = "http://rdfh.ch/lists/0001/notUsedList01" ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -546,7 +530,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 30, parentIri = "http://rdfh.ch/lists/0001/notUsedList01" ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -561,7 +544,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 30, parentIri = "http://rdfh.ch/lists/0001/notUsedList" ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -577,7 +559,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 1, parentIri = parentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -610,7 +591,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = -1, parentIri = parentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -644,7 +624,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 2, parentIri = newParentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -669,7 +648,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with /* check old parent node */ appActor ! ListGetRequestADM( iri = oldParentIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val receivedNode: ListNodeGetResponseADM = expectMsgType[ListNodeGetResponseADM](timeout) @@ -695,7 +673,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = -1, parentIri = newParentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -720,7 +697,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with /* check old parent node */ appActor ! ListGetRequestADM( iri = oldParentIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val receivedNode: ListNodeGetResponseADM = expectMsgType[ListNodeGetResponseADM](timeout) @@ -740,7 +716,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = -1, parentIri = newParentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -765,7 +740,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 2, parentIri = newParentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -790,7 +764,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 0, parentIri = parentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -810,7 +783,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 3, parentIri = parentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -830,7 +802,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 5, parentIri = parentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -850,7 +821,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with position = 0, parentIri = parentIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -867,7 +837,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeInUseIri = "http://rdfh.ch/lists/0001/treeList01" appActor ! ListItemDeleteRequestADM( nodeIri = nodeInUseIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -879,7 +848,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/treeList03" appActor ! ListItemDeleteRequestADM( nodeIri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -894,7 +862,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeInUseInOntologyIri = "http://rdfh.ch/lists/0001/treeList" appActor ! ListItemDeleteRequestADM( nodeIri = nodeInUseInOntologyIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -908,7 +875,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/notUsedList012" appActor ! ListItemDeleteRequestADM( nodeIri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -929,7 +895,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/notUsedList02" appActor ! ListItemDeleteRequestADM( nodeIri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -946,7 +911,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val listIri = "http://rdfh.ch/lists/0001/notUsedList" appActor ! ListItemDeleteRequestADM( nodeIri = listIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -961,7 +925,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeInUseIri = "http://rdfh.ch/lists/0001/treeList01" appActor ! CanDeleteListRequestADM( iri = nodeInUseIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: CanDeleteListResponseADM = expectMsgType[CanDeleteListResponseADM](timeout) @@ -973,7 +936,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/treeList03" appActor ! CanDeleteListRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: CanDeleteListResponseADM = expectMsgType[CanDeleteListResponseADM](timeout) @@ -985,7 +947,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeInUseInOntologyIri = "http://rdfh.ch/lists/0001/treeList" appActor ! CanDeleteListRequestADM( iri = nodeInUseInOntologyIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: CanDeleteListResponseADM = expectMsgType[CanDeleteListResponseADM](timeout) @@ -997,7 +958,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/notUsedList012" appActor ! CanDeleteListRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: CanDeleteListResponseADM = expectMsgType[CanDeleteListResponseADM](timeout) @@ -1009,7 +969,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/notUsedList02" appActor ! CanDeleteListRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: CanDeleteListResponseADM = expectMsgType[CanDeleteListResponseADM](timeout) @@ -1021,7 +980,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val listIri = "http://rdfh.ch/lists/0001/notUsedList" appActor ! CanDeleteListRequestADM( iri = listIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: CanDeleteListResponseADM = expectMsgType[CanDeleteListResponseADM](timeout) @@ -1035,7 +993,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/testList" appActor ! ListNodeCommentsDeleteRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) expectMsg( @@ -1047,7 +1004,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/testList01" appActor ! ListNodeCommentsDeleteRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: ListNodeCommentsDeleteResponseADM = @@ -1060,7 +1016,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/testList02" appActor ! ListNodeCommentsDeleteRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: ListNodeCommentsDeleteResponseADM = @@ -1073,7 +1028,6 @@ class ListsResponderADMSpec extends CoreSpec(ListsResponderADMSpec.config) with val nodeIri = "http://rdfh.ch/lists/0001/testList03" appActor ! ListNodeCommentsDeleteRequestADM( iri = nodeIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) expectMsg( diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala index d19a78576b..07f6fc79f4 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala @@ -82,7 +82,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.rootUser.groups, isInProjectAdminGroups = Seq.empty[IRI], isInSystemAdminGroup = true, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.rootUser.permissionData) @@ -94,7 +93,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.multiuserUser.groups, isInProjectAdminGroups = Seq(SharedTestDataADM.INCUNABULA_PROJECT_IRI, SharedTestDataADM.IMAGES_PROJECT_IRI), isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.multiuserUser.permissionData) @@ -106,7 +104,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.incunabulaProjectAdminUser.groups, isInProjectAdminGroups = Seq(SharedTestDataADM.INCUNABULA_PROJECT_IRI), isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.incunabulaProjectAdminUser.permissionData) @@ -118,7 +115,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.incunabulaCreatorUser.groups, isInProjectAdminGroups = Seq.empty[IRI], isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.incunabulaCreatorUser.permissionData) @@ -130,7 +126,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.incunabulaMemberUser.groups, isInProjectAdminGroups = Seq.empty[IRI], isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.incunabulaMemberUser.permissionData) @@ -142,7 +137,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.imagesUser01.groups, isInProjectAdminGroups = Seq(SharedTestDataADM.IMAGES_PROJECT_IRI), isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.imagesUser01.permissionData) @@ -154,7 +148,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.imagesReviewerUser.groups, isInProjectAdminGroups = Seq.empty[IRI], isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.imagesReviewerUser.permissionData) @@ -166,7 +159,6 @@ class PermissionsResponderADMSpec groupIris = SharedTestDataV1.anythingUser1.groups, isInProjectAdminGroups = Seq.empty[IRI], isInSystemAdminGroup = false, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(SharedTestDataV1.anythingUser1.permissionData) @@ -240,7 +232,6 @@ class PermissionsResponderADMSpec forGroup = OntologyConstants.KnoraAdmin.ProjectMember, hasPermissions = Set(PermissionADM.ProjectResourceCreateAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -265,7 +256,6 @@ class PermissionsResponderADMSpec forGroup = SharedTestDataADM.thingSearcherGroup.id, hasPermissions = Set(PermissionADM.ProjectResourceCreateAllPermission) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -299,7 +289,6 @@ class PermissionsResponderADMSpec forGroup = OntologyConstants.KnoraAdmin.KnownUser, hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -473,7 +462,6 @@ class PermissionsResponderADMSpec forGroup = Some(SharedTestDataADM.thingSearcherGroup.id), hasPermissions = Set(PermissionADM.restrictedViewPermission(SharedTestDataADM.thingSearcherGroup.id)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -496,7 +484,6 @@ class PermissionsResponderADMSpec forGroup = Some(OntologyConstants.KnoraAdmin.UnknownUser), hasPermissions = Set(PermissionADM.restrictedViewPermission(OntologyConstants.KnoraAdmin.UnknownUser)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -518,7 +505,6 @@ class PermissionsResponderADMSpec forResourceClass = Some(SharedOntologyTestDataADM.IMAGES_BILD_RESOURCE_CLASS), hasPermissions = Set(PermissionADM.modifyPermission(OntologyConstants.KnoraAdmin.KnownUser)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -543,7 +529,6 @@ class PermissionsResponderADMSpec forProperty = Some(SharedOntologyTestDataADM.IMAGES_TITEL_PROPERTY), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.Creator)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -566,7 +551,6 @@ class PermissionsResponderADMSpec forGroup = Some(OntologyConstants.KnoraAdmin.ProjectMember), hasPermissions = Set(PermissionADM.changeRightsPermission(OntologyConstants.KnoraAdmin.ProjectMember)) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -593,7 +577,6 @@ class PermissionsResponderADMSpec PermissionADM.modifyPermission(OntologyConstants.KnoraAdmin.ProjectMember) ) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -619,7 +602,6 @@ class PermissionsResponderADMSpec PermissionADM.modifyPermission(OntologyConstants.KnoraAdmin.KnownUser) ) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -647,7 +629,6 @@ class PermissionsResponderADMSpec PermissionADM.modifyPermission(OntologyConstants.KnoraAdmin.ProjectMember) ) ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -679,7 +660,6 @@ class PermissionsResponderADMSpec forGroup = Some(OntologyConstants.KnoraAdmin.UnknownUser), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -714,7 +694,6 @@ class PermissionsResponderADMSpec forGroup = Some(OntologyConstants.KnoraAdmin.ProjectAdmin), hasPermissions = hasPermissions ).prepareHasPermissions, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser, apiRequestID = UUID.randomUUID() ) @@ -731,7 +710,6 @@ class PermissionsResponderADMSpec // "return all permissions for 'image' project " in { // appActor ! PermissionsForProjectGetRequestADM( // projectIri = SharedTestDataADM.IMAGES_PROJECT_IRI, -// featureFactoryConfig = defaultFeatureFactoryConfig, // requestingUser = rootUser, // apiRequestID = UUID.randomUUID() // ) @@ -742,7 +720,6 @@ class PermissionsResponderADMSpec // "return all permissions for 'incunabula' project " in { // appActor ! PermissionsForProjectGetRequestADM( // projectIri = SharedTestDataADM.INCUNABULA_PROJECT_IRI, -// featureFactoryConfig = defaultFeatureFactoryConfig, // requestingUser = rootUser, // apiRequestID = UUID.randomUUID() // ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala index 8af904ecb1..ab8094c304 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala @@ -54,7 +54,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "used to query for project information" should { "return information for every project" in { appActor ! ProjectsGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val received = expectMsgType[ProjectsGetResponseADM](timeout) @@ -67,7 +66,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) /* Incunabula project */ appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(SharedTestDataADM.incunabulaProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(ProjectGetResponseADM(SharedTestDataADM.incunabulaProject)) @@ -75,7 +73,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) /* Images project */ appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(SharedTestDataADM.imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(ProjectGetResponseADM(SharedTestDataADM.imagesProject)) @@ -83,7 +80,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) /* 'SystemProject' */ appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some(SharedTestDataADM.systemProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(ProjectGetResponseADM(SharedTestDataADM.systemProject)) @@ -93,7 +89,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return information about a project identified by shortname" in { appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some(SharedTestDataADM.incunabulaProject.shortname)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(ProjectGetResponseADM(SharedTestDataADM.incunabulaProject)) @@ -102,7 +97,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFoundException' when the project IRI is unknown" in { appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some("http://rdfh.ch/projects/notexisting")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'http://rdfh.ch/projects/notexisting' not found"))) @@ -112,7 +106,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFoundException' when the project shortname is unknown " in { appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some("wrongshortname")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'wrongshortname' not found"))) @@ -121,7 +114,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFoundException' when the project shortcode is unknown " in { appActor ! ProjectGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some("9999")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project '9999' not found"))) @@ -134,7 +126,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return restricted view settings using project IRI" in { appActor ! ProjectRestrictedViewSettingsGetADM( identifier = ProjectIdentifierADM(maybeIri = Some(SharedTestDataADM.imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Some(expectedResult)) @@ -143,7 +134,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return restricted view settings using project SHORTNAME" in { appActor ! ProjectRestrictedViewSettingsGetADM( identifier = ProjectIdentifierADM(maybeShortname = Some(SharedTestDataADM.imagesProject.shortname)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Some(expectedResult)) @@ -152,7 +142,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return restricted view settings using project SHORTCODE" in { appActor ! ProjectRestrictedViewSettingsGetADM( identifier = ProjectIdentifierADM(maybeShortcode = Some(SharedTestDataADM.imagesProject.shortcode)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Some(expectedResult)) @@ -161,7 +150,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFoundException' when the project IRI is unknown" in { appActor ! ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeIri = Some("http://rdfh.ch/projects/notexisting")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'http://rdfh.ch/projects/notexisting' not found."))) @@ -170,7 +158,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFoundException' when the project SHORTCODE is unknown" in { appActor ! ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some("9999")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project '9999' not found."))) @@ -179,7 +166,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFoundException' when the project SHORTNAME is unknown" in { appActor ! ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeShortname = Some("wrongshortname")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'wrongshortname' not found."))) @@ -205,7 +191,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) status = ProjectStatus.make(true).fold(error => throw error.head, value => value), selfjoin = ProjectSelfJoin.make(false).fold(error => throw error.head, value => value) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -299,7 +284,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) status = ProjectStatus.make(true).fold(error => throw error.head, value => value), selfjoin = ProjectSelfJoin.make(false).fold(error => throw error.head, value => value) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -333,7 +317,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) status = ProjectStatus.make(true).fold(error => throw error.head, value => value), selfjoin = ProjectSelfJoin.make(false).fold(error => throw error.head, value => value) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -366,7 +349,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) status = ProjectStatus.make(true).fold(error => throw error.head, value => value), selfjoin = ProjectSelfJoin.make(false).fold(error => throw error.head, value => value) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -387,7 +369,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) status = ProjectStatus.make(true).fold(error => throw error.head, value => value), selfjoin = ProjectSelfJoin.make(false).fold(error => throw error.head, value => value) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -413,7 +394,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) status = Some(false), selfjoin = Some(true) ).validateAndEscape, - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -439,7 +419,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) appActor ! ProjectChangeRequestADM( projectIri = "http://rdfh.ch/projects/notexisting", changeProjectRequest = ChangeProjectApiRequestADM(longname = Some("new long name")).validateAndEscape, - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser, UUID.randomUUID() ) @@ -479,7 +458,7 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) actorUnderTest ! ProjectOntologyAddADM( projectIri = IMAGES_PROJECT_IRI, ontologyIri = "http://wwww.knora.org/ontology/00FF/blabla1", - featureFactoryConfig = defaultFeatureFactoryConfig, + requestingUser = KnoraSystemInstances.Users.SystemUser, apiRequestID = UUID.randomUUID() ) @@ -499,7 +478,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all members of a project identified by IRI" in { appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some(SharedTestDataADM.imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser ) val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) @@ -518,7 +496,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all members of a project identified by shortname" in { appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeShortname = Some(SharedTestDataADM.imagesProject.shortname)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) @@ -537,7 +514,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all members of a project identified by shortcode" in { appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeShortcode = Some(SharedTestDataADM.imagesProject.shortcode)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) @@ -556,7 +532,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project IRI is unknown (project membership)" in { appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some("http://rdfh.ch/projects/notexisting")), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'http://rdfh.ch/projects/notexisting' not found."))) @@ -565,7 +540,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project shortname is unknown (project membership)" in { appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeShortname = Some("wrongshortname")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'wrongshortname' not found."))) @@ -574,7 +548,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project shortcode is unknown (project membership)" in { appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeShortcode = Some("9999")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project '9999' not found."))) @@ -583,7 +556,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all project admin members of a project identified by IRI" in { appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some(SharedTestDataADM.imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser ) val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) @@ -600,7 +572,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all project admin members of a project identified by shortname" in { appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeShortname = Some(SharedTestDataADM.imagesProject.shortname)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) @@ -617,7 +588,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all project admin members of a project identified by shortcode" in { appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeShortcode = Some(SharedTestDataADM.imagesProject.shortcode)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) @@ -634,7 +604,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project IRI is unknown (project admin membership)" in { appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some("http://rdfh.ch/projects/notexisting")), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'http://rdfh.ch/projects/notexisting' not found."))) @@ -643,7 +612,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project shortname is unknown (project admin membership)" in { appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeShortname = Some("wrongshortname")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project 'wrongshortname' not found."))) @@ -652,7 +620,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project shortcode is unknown (project admin membership)" in { appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeShortcode = Some("9999")), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) expectMsg(Failure(NotFoundException(s"Project '9999' not found."))) @@ -663,7 +630,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all unique keywords for all projects" in { appActor ! ProjectsKeywordsGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser ) val received: ProjectsKeywordsGetResponseADM = expectMsgType[ProjectsKeywordsGetResponseADM](timeout) @@ -673,7 +639,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return all keywords for a single project" in { appActor ! ProjectKeywordsGetRequestADM( projectIri = SharedTestDataADM.incunabulaProject.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) val received: ProjectKeywordsGetResponseADM = expectMsgType[ProjectKeywordsGetResponseADM](timeout) @@ -683,7 +648,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return empty list for a project without keywords" in { appActor ! ProjectKeywordsGetRequestADM( projectIri = SharedTestDataADM.dokubibProject.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser ) val received: ProjectKeywordsGetResponseADM = expectMsgType[ProjectKeywordsGetResponseADM](timeout) @@ -693,7 +657,6 @@ class ProjectsResponderADMSpec extends CoreSpec(ProjectsResponderADMSpec.config) "return 'NotFound' when the project IRI is unknown" in { appActor ! ProjectKeywordsGetRequestADM( projectIri = "http://rdfh.ch/projects/notexisting", - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.rootUser ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala index b4c46e9e18..fe73e731d9 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala @@ -41,7 +41,6 @@ class SipiResponderADMSpec extends CoreSpec(SipiResponderADMSpec.config) with Im appActor ! SipiFileInfoGetRequestADM( projectID = "0803", filename = "incunabula_0000003328.jp2", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.incunabulaMemberUser ) @@ -53,7 +52,6 @@ class SipiResponderADMSpec extends CoreSpec(SipiResponderADMSpec.config) with Im appActor ! SipiFileInfoGetRequestADM( projectID = "0803", filename = "incunabula_0000003328.jp2", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala index ac7355b223..b1bae1f752 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala @@ -59,7 +59,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "asked about all users" should { "return a list if asked by SystemAdmin" in { appActor ! UsersGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val response = expectMsgType[UsersGetResponseADM](timeout) @@ -69,7 +68,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "return a list if asked by ProjectAdmin" in { appActor ! UsersGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) val response = expectMsgType[UsersGetResponseADM](timeout) @@ -79,7 +77,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "return 'ForbiddenException' if asked by normal user'" in { appActor ! UsersGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = normalUser ) expectMsg(timeout, Failure(ForbiddenException("ProjectAdmin or SystemAdmin permissions are required."))) @@ -87,7 +84,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "not return the system and anonymous users" in { appActor ! UsersGetRequestADM( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val response = expectMsgType[UsersGetResponseADM](timeout) @@ -103,7 +99,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeIri = Some(rootUser.id)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Some(rootUser.ofType(UserInformationTypeADM.Full))) @@ -113,7 +108,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeIri = Some(incunabulaUser.id)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Some(incunabulaUser.ofType(UserInformationTypeADM.Full))) @@ -123,7 +117,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetRequestADM( identifier = UserIdentifierADM(maybeIri = Some("http://rdfh.ch/users/notexisting")), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Failure(NotFoundException(s"User 'http://rdfh.ch/users/notexisting' not found"))) @@ -133,7 +126,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeIri = Some("http://rdfh.ch/users/notexisting")), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(None) @@ -145,7 +137,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeEmail = Some(rootUser.email)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Some(rootUser.ofType(UserInformationTypeADM.Full))) @@ -155,7 +146,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeEmail = Some(incunabulaUser.email)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Some(incunabulaUser.ofType(UserInformationTypeADM.Full))) @@ -165,7 +155,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetRequestADM( identifier = UserIdentifierADM(maybeEmail = Some("userwrong@example.com")), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Failure(NotFoundException(s"User 'userwrong@example.com' not found"))) @@ -175,7 +164,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeEmail = Some("userwrong@example.com")), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(None) @@ -187,7 +175,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeUsername = Some(rootUser.username)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Some(rootUser.ofType(UserInformationTypeADM.Full))) @@ -197,7 +184,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeUsername = Some(incunabulaUser.username)), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Some(incunabulaUser.ofType(UserInformationTypeADM.Full))) @@ -207,7 +193,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetRequestADM( identifier = UserIdentifierADM(maybeUsername = Some("userwrong")), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(Failure(NotFoundException(s"User 'userwrong' not found"))) @@ -217,7 +202,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGetADM( identifier = UserIdentifierADM(maybeUsername = Some("userwrong")), userInformationTypeADM = UserInformationTypeADM.Full, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) expectMsg(None) @@ -237,7 +221,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with lang = LanguageCode.make("en").fold(e => throw e.head, v => v), systemAdmin = SystemAdmin.make(false).fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser, apiRequestID = UUID.randomUUID ) @@ -262,7 +245,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with lang = LanguageCode.make("en").fold(e => throw e.head, v => v), systemAdmin = SystemAdmin.make(false).fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.anonymousUser, UUID.randomUUID ) @@ -281,7 +263,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with lang = LanguageCode.make("en").fold(e => throw e.head, v => v), systemAdmin = SystemAdmin.make(false).fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.anonymousUser, UUID.randomUUID ) @@ -297,7 +278,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with userUpdateBasicInformationPayload = UserUpdateBasicInformationPayloadADM( givenName = Some(GivenName.make("Donald").fold(e => throw e.head, v => v)) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.normalUser, apiRequestID = UUID.randomUUID ) @@ -311,7 +291,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with userUpdateBasicInformationPayload = UserUpdateBasicInformationPayloadADM( familyName = Some(FamilyName.make("Duck").fold(e => throw e.head, v => v)) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -326,7 +305,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with givenName = Some(GivenName.make(SharedTestDataADM.normalUser.givenName).fold(e => throw e.head, v => v)), familyName = Some(FamilyName.make(SharedTestDataADM.normalUser.familyName).fold(e => throw e.head, v => v)) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -344,7 +322,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with userUpdateBasicInformationPayload = UserUpdateBasicInformationPayloadADM( username = duplicateUsername ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.superUser, UUID.randomUUID ) @@ -364,7 +341,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with userUpdateBasicInformationPayload = UserUpdateBasicInformationPayloadADM( email = duplicateEmail ), - featureFactoryConfig = defaultFeatureFactoryConfig, SharedTestDataADM.superUser, UUID.randomUUID ) @@ -384,7 +360,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with requesterPassword = requesterPassword, newPassword = newPassword ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.normalUser, apiRequestID = UUID.randomUUID() ) @@ -394,8 +369,7 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with // need to be able to authenticate credentials with new password val resF = Authenticator.authenticateCredentialsV2( credentials = - Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test123456")), - featureFactoryConfig = defaultFeatureFactoryConfig + Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test123456")) )(system, appActor, executionContext) resF map { res => @@ -413,7 +387,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with requesterPassword = requesterPassword, newPassword = newPassword ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser, apiRequestID = UUID.randomUUID() ) @@ -423,8 +396,7 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with // need to be able to authenticate credentials with new password val resF = Authenticator.authenticateCredentialsV2( credentials = - Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test654321")), - featureFactoryConfig = defaultFeatureFactoryConfig + Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test654321")) )(system, appActor, executionContext) resF map { res => @@ -436,7 +408,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeStatusRequestADM( userIri = SharedTestDataADM.normalUser.id, status = UserStatus.make(false).fold(error => throw error.head, value => value), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, UUID.randomUUID() ) @@ -447,7 +418,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeStatusRequestADM( userIri = SharedTestDataADM.normalUser.id, status = UserStatus.make(true).fold(error => throw error.head, value => value), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, UUID.randomUUID() ) @@ -460,7 +430,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeSystemAdminMembershipStatusRequestADM( userIri = SharedTestDataADM.normalUser.id, systemAdmin = SystemAdmin.make(true).fold(e => throw e.head, v => v), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, UUID.randomUUID() ) @@ -471,7 +440,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeSystemAdminMembershipStatusRequestADM( userIri = SharedTestDataADM.normalUser.id, systemAdmin = SystemAdmin.make(false).fold(e => throw e.head, v => v), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, UUID.randomUUID() ) @@ -490,7 +458,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with familyName = None, lang = None ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.normalUser, UUID.randomUUID ) @@ -508,7 +475,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with requesterPassword = Password.make("test").fold(e => throw e.head, v => v), newPassword = Password.make("test123456").fold(e => throw e.head, v => v) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.normalUser, UUID.randomUUID ) @@ -523,7 +489,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeStatusRequestADM( userIri = SharedTestDataADM.superUser.id, status = UserStatus.make(false).fold(error => throw error.head, value => value), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.normalUser, UUID.randomUUID ) @@ -536,7 +501,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeSystemAdminMembershipStatusRequestADM( userIri = SharedTestDataADM.normalUser.id, systemAdmin = SystemAdmin.make(true).fold(e => throw e.head, v => v), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.normalUser, UUID.randomUUID() ) @@ -550,7 +514,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeStatusRequestADM( userIri = KnoraSystemInstances.Users.SystemUser.id, status = UserStatus.make(false).fold(error => throw error.head, value => value), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, UUID.randomUUID() ) @@ -562,7 +525,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserChangeStatusRequestADM( userIri = KnoraSystemInstances.Users.AnonymousUser.id, status = UserStatus.make(false).fold(error => throw error.head, value => value), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, UUID.randomUUID() ) @@ -575,7 +537,7 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "ADD user to project" in { // get current project memberships - appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsBeforeUpdate = expectMsgType[UserProjectMembershipsGetResponseADM](timeout) membershipsBeforeUpdate.projects should equal(Seq()) @@ -583,19 +545,17 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectMembershipAddRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) val membershipUpdateResponse = expectMsgType[UserOperationResponseADM](timeout) - appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsAfterUpdate = expectMsgType[UserProjectMembershipsGetResponseADM](timeout) membershipsAfterUpdate.projects should equal(Seq(imagesProject)) appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some(imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) @@ -604,26 +564,24 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with } "DELETE user from project" in { - appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsBeforeUpdate = expectMsgType[UserProjectMembershipsGetResponseADM](timeout) membershipsBeforeUpdate.projects should equal(Seq(imagesProject)) appActor ! UserProjectMembershipRemoveRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) expectMsgType[UserOperationResponseADM](timeout) - appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserProjectMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsAfterUpdate = expectMsgType[UserProjectMembershipsGetResponseADM](timeout) membershipsAfterUpdate.projects should equal(Seq()) appActor ! ProjectMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some(imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) @@ -636,7 +594,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectMembershipAddRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, normalUser, UUID.randomUUID() ) @@ -651,7 +608,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectMembershipRemoveRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, normalUser, UUID.randomUUID() ) @@ -669,7 +625,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "ADD user to project admin group" in { appActor ! UserProjectAdminMembershipsGetRequestADM( normalUser.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) @@ -679,7 +634,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectAdminMembershipAddRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) @@ -687,7 +641,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectAdminMembershipsGetRequestADM( normalUser.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) @@ -696,7 +649,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some(imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) @@ -707,7 +659,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "DELETE user from project admin group" in { appActor ! UserProjectAdminMembershipsGetRequestADM( normalUser.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) @@ -717,7 +668,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectAdminMembershipRemoveRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) @@ -725,7 +675,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectAdminMembershipsGetRequestADM( normalUser.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) @@ -734,7 +683,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! ProjectAdminMembersGetRequestADM( ProjectIdentifierADM(maybeIri = Some(imagesProject.id)), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) @@ -747,7 +695,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectAdminMembershipAddRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, normalUser, UUID.randomUUID() ) @@ -764,7 +711,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserProjectAdminMembershipRemoveRequestADM( normalUser.id, imagesProject.id, - defaultFeatureFactoryConfig, normalUser, UUID.randomUUID() ) @@ -782,26 +728,24 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with "asked to update the user's group membership" should { "ADD user to group" in { - appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsBeforeUpdate = expectMsgType[UserGroupMembershipsGetResponseADM](timeout) membershipsBeforeUpdate.groups should equal(Seq()) appActor ! UserGroupMembershipAddRequestADM( normalUser.id, imagesReviewerGroup.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) expectMsgType[UserOperationResponseADM](timeout) - appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsAfterUpdate = expectMsgType[UserGroupMembershipsGetResponseADM](timeout) membershipsAfterUpdate.groups.map(_.id) should equal(Seq(imagesReviewerGroup.id)) appActor ! GroupMembersGetRequestADM( groupIri = imagesReviewerGroup.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val received: GroupMembersGetResponseADM = expectMsgType[GroupMembersGetResponseADM](timeout) @@ -810,26 +754,24 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with } "DELETE user from group" in { - appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsBeforeUpdate = expectMsgType[UserGroupMembershipsGetResponseADM](timeout) membershipsBeforeUpdate.groups.map(_.id) should equal(Seq(imagesReviewerGroup.id)) appActor ! UserGroupMembershipRemoveRequestADM( normalUser.id, imagesReviewerGroup.id, - defaultFeatureFactoryConfig, rootUser, UUID.randomUUID() ) expectMsgType[UserOperationResponseADM](timeout) - appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, defaultFeatureFactoryConfig, rootUser) + appActor ! UserGroupMembershipsGetRequestADM(normalUser.id, rootUser) val membershipsAfterUpdate = expectMsgType[UserGroupMembershipsGetResponseADM](timeout) membershipsAfterUpdate.groups should equal(Seq()) appActor ! GroupMembersGetRequestADM( groupIri = imagesReviewerGroup.id, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = rootUser ) val received: GroupMembersGetResponseADM = expectMsgType[GroupMembersGetResponseADM](timeout) @@ -842,7 +784,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGroupMembershipAddRequestADM( normalUser.id, imagesReviewerGroup.id, - defaultFeatureFactoryConfig, normalUser, UUID.randomUUID() ) @@ -857,7 +798,6 @@ class UsersResponderADMSpec extends CoreSpec(UsersResponderADMSpec.config) with appActor ! UserGroupMembershipRemoveRequestADM( normalUser.id, imagesReviewerGroup.id, - defaultFeatureFactoryConfig, normalUser, UUID.randomUUID() ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala index 20498a0c25..e461aabaca 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala @@ -1077,7 +1077,6 @@ class OntologyResponderV1Spec extends CoreSpec() with ImplicitSender { "get all the vocabularies" in { appActor ! NamedGraphsGetRequestV1( - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = OntologyResponderV1Spec.userProfileWithEnglish ) @@ -1090,7 +1089,6 @@ class OntologyResponderV1Spec extends CoreSpec() with ImplicitSender { "get all the resource classes with their property types for incunabula named graph" in { appActor ! ResourceTypesForNamedGraphGetRequestV1( namedGraph = Some("http://www.knora.org/ontology/0803/incunabula"), - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = OntologyResponderV1Spec.userProfileWithEnglish ) @@ -1103,7 +1101,6 @@ class OntologyResponderV1Spec extends CoreSpec() with ImplicitSender { "get all the properties for the named graph incunabula" in { appActor ! PropertyTypesForNamedGraphGetRequestV1( namedGraph = Some("http://www.knora.org/ontology/0803/incunabula"), - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = OntologyResponderV1Spec.userProfileWithEnglish ) @@ -1115,7 +1112,6 @@ class OntologyResponderV1Spec extends CoreSpec() with ImplicitSender { "get all the properties for all vocabularies" in { appActor ! PropertyTypesForNamedGraphGetRequestV1( namedGraph = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = OntologyResponderV1Spec.userProfileWithEnglish ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala index 302bcadf69..36e2899eeb 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala @@ -44,7 +44,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w "return information for every project" in { appActor ! ProjectsGetRequestV1( - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = Some(rootUserProfileV1) ) val received = expectMsgType[ProjectsResponseV1](timeout) @@ -58,7 +57,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w /* Incunabula project */ appActor ! ProjectInfoByIRIGetRequestV1( iri = SharedTestDataV1.incunabulaProjectInfo.id, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfileV1 = Some(SharedTestDataV1.rootUser) ) expectMsg(ProjectInfoResponseV1(SharedTestDataV1.incunabulaProjectInfo)) @@ -66,7 +64,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w /* Images project */ appActor ! ProjectInfoByIRIGetRequestV1( iri = SharedTestDataV1.imagesProjectInfo.id, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfileV1 = Some(SharedTestDataV1.rootUser) ) expectMsg(ProjectInfoResponseV1(SharedTestDataV1.imagesProjectInfo)) @@ -74,7 +71,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w /* 'SystemProject' */ appActor ! ProjectInfoByIRIGetRequestV1( iri = SharedTestDataV1.systemProjectInfo.id, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfileV1 = Some(SharedTestDataV1.rootUser) ) expectMsg(ProjectInfoResponseV1(SharedTestDataV1.systemProjectInfo)) @@ -84,7 +80,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w "return information about a project identified by shortname" in { appActor ! ProjectInfoByShortnameGetRequestV1( SharedTestDataV1.incunabulaProjectInfo.shortname, - featureFactoryConfig = defaultFeatureFactoryConfig, Some(rootUserProfileV1) ) expectMsg(ProjectInfoResponseV1(SharedTestDataV1.incunabulaProjectInfo)) @@ -94,7 +89,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w appActor ! ProjectInfoByIRIGetRequestV1( iri = "http://rdfh.ch/projects/notexisting", - featureFactoryConfig = defaultFeatureFactoryConfig, userProfileV1 = Some(rootUserProfileV1) ) expectMsg(Failure(NotFoundException(s"Project 'http://rdfh.ch/projects/notexisting' not found"))) @@ -104,7 +98,6 @@ class ProjectsResponderV1Spec extends CoreSpec(ProjectsResponderV1Spec.config) w "return 'NotFoundException' when the project shortname unknown " in { appActor ! ProjectInfoByShortnameGetRequestV1( shortname = "projectwrong", - featureFactoryConfig = defaultFeatureFactoryConfig, userProfileV1 = Some(rootUserProfileV1) ) expectMsg(Failure(NotFoundException(s"Project 'projectwrong' not found"))) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1Spec.scala index fa6c36d094..6e6c93fce4 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1Spec.scala @@ -30,17 +30,24 @@ import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util._ import spray.json.JsValue import zio.& import zio.ZLayer +import zio.Runtime import java.util.UUID import scala.concurrent.duration._ +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.store.triplestore.api.TriplestoreService /** * Static data for testing [[ResourcesResponderV1]]. @@ -662,12 +669,17 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) /* we need to run our app with the mocked sipi implementation */ override lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TriplestoreService]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceMockImpl.layer, - AppConfig.live + AppConfigForTestContainers.fusekiOnlyTestcontainer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer ) // The default timeout for receiving reply messages from actors. @@ -916,7 +928,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) // http://0.0.0.0:3333/v1/resources/http%3A%2F%2Frdfh.ch%2F0803%2Fc5058f3a appActor ! ResourceFullGetRequestV1( iri = "http://rdfh.ch/0803/c5058f3a", - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.incunabulaMemberUser ) @@ -932,7 +943,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) // http://0.0.0.0:3333/v1/resources/http%3A%2F%2Frdfh.ch%2F0803%2F8a0b1e75 appActor ! ResourceFullGetRequestV1( iri = "http://rdfh.ch/0803/8a0b1e75", - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.incunabulaMemberUser ) @@ -949,7 +959,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceContextGetRequestV1( iri = "http://rdfh.ch/0803/c5058f3a", resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -963,7 +972,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceContextGetRequestV1( iri = "http://rdfh.ch/0803/8a0b1e75", resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -1103,7 +1111,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) label = "Test-Misc", projectIri = "http://rdfh.ch/projects/0803", values = valuesToBeCreated, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1144,7 +1151,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) label = "Test-Book", projectIri = "http://rdfh.ch/projects/0803", values = valuesToBeCreated, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1203,7 +1209,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) label = "Book with reference to nonexistent resource", projectIri = "http://rdfh.ch/projects/0803", values = valuesToBeCreated, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1287,7 +1292,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) label = "Test-Book", projectIri = SharedTestDataADM.INCUNABULA_PROJECT_IRI, values = valuesToBeCreated, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1306,7 +1310,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) // See if we can query the resource. appActor ! ResourceFullGetRequestV1( iri = newBookResourceIri.get, - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.incunabulaProjectAdminUser ) expectMsgPF(timeout) { case response: ResourceFullResponseV1 => @@ -1361,7 +1364,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) projectIri = SharedTestDataADM.INCUNABULA_PROJECT_IRI, values = valuesToBeCreated, file = Some(fileValue), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1383,7 +1385,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) val pageGetContext = ResourceContextGetRequestV1( iri = resIri, resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -1400,7 +1401,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) val resourceDeleteRequest = ResourceDeleteRequestV1( resourceIri = newPageResourceIri.get, deleteComment = Some("This page was deleted as a test"), - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1412,7 +1412,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) // Check that the resource is marked as deleted. appActor ! ResourceInfoGetRequestV1( iri = newPageResourceIri.get, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -1429,7 +1428,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) val propertiesGetRequest = PropertiesGetRequestV1( iri = "http://rdfh.ch/0803/021ec18f1735", - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -1445,7 +1443,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) val resourceContextPage = ResourceContextGetRequestV1( iri = "http://rdfh.ch/0803/9d626dc76c03", resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -1461,7 +1458,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceFullGetRequestV1( iri = "http://rdfh.ch/0001/project-thing-2", - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.anythingUser1 ) @@ -1475,7 +1471,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceFullGetRequestV1( iri = "http://rdfh.ch/0001/project-thing-2", - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.anythingUser2 ) @@ -1490,7 +1485,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceFullGetRequestV1( iri = "http://rdfh.ch/0001/project-thing-1", - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.anythingUser1 ) @@ -1509,7 +1503,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceFullGetRequestV1( iri = "http://rdfh.ch/0001/project-thing-1", - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.anythingUser2 ) @@ -1530,7 +1523,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceContextGetRequestV1( iri = "http://rdfh.ch/0001/containing-thing", resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.anythingUser1 ) @@ -1550,7 +1542,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceContextGetRequestV1( iri = "http://rdfh.ch/0001/containing-thing", resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.anythingUser2 ) @@ -1563,7 +1554,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ResourceContextGetRequestV1( iri = "http://rdfh.ch/0001/containing-thing", resinfo = true, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -1579,7 +1569,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) projectIri = "http://rdfh.ch/projects/0803", values = Map.empty[IRI, Seq[CreateValueV1WithComment]], file = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1596,7 +1585,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) projectIri = "http://rdfh.ch/projects/0803", values = Map.empty[IRI, Seq[CreateValueV1WithComment]], file = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1613,7 +1601,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) projectIri = OntologyConstants.KnoraAdmin.DefaultSharedOntologiesProject, values = Map.empty[IRI, Seq[CreateValueV1WithComment]], file = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -1629,7 +1616,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) appActor ! ChangeResourceLabelRequestV1( resourceIri = "http://rdfh.ch/0803/c5058f3a", label = myNewLabel, - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = SharedTestDataADM.incunabulaProjectAdminUser, apiRequestID = UUID.randomUUID ) @@ -1653,7 +1639,6 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) projectIri = "http://rdfh.ch/projects/0001", values = valuesToBeCreated, file = None, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = SharedTestDataADM.anythingUser1, apiRequestID = UUID.randomUUID ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala index dd45daf87c..aa166957b5 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala @@ -65,8 +65,7 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im "return a profile if the user (root user) is known" in { appActor ! UserProfileByIRIGetV1( userIri = rootUserIri, - UserProfileTypeV1.FULL, - featureFactoryConfig = defaultFeatureFactoryConfig + UserProfileTypeV1.FULL ) val response = expectMsgType[Option[UserProfileV1]](timeout) // println(response) @@ -76,8 +75,7 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im "return a profile if the user (incunabula user) is known" in { appActor ! UserProfileByIRIGetV1( incunabulaUserIri, - UserProfileTypeV1.FULL, - featureFactoryConfig = defaultFeatureFactoryConfig + UserProfileTypeV1.FULL ) expectMsg(Some(incunabulaUser.ofType(UserProfileTypeV1.FULL))) } @@ -86,7 +84,6 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im appActor ! UserProfileByIRIGetRequestV1( userIri = "http://rdfh.ch/users/notexisting", userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = rootUser ) expectMsg(Failure(NotFoundException(s"User 'http://rdfh.ch/users/notexisting' not found"))) @@ -95,8 +92,7 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im "return 'None' when the user is unknown " in { appActor ! UserProfileByIRIGetV1( userIri = "http://rdfh.ch/users/notexisting", - userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = defaultFeatureFactoryConfig + userProfileType = UserProfileTypeV1.RESTRICTED ) expectMsg(None) } @@ -107,8 +103,7 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im "return a profile if the user (root user) is known" in { appActor ! UserProfileByEmailGetV1( email = rootUserEmail, - userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = defaultFeatureFactoryConfig + userProfileType = UserProfileTypeV1.RESTRICTED ) expectMsg(Some(rootUser.ofType(UserProfileTypeV1.RESTRICTED))) } @@ -116,8 +111,7 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im "return a profile if the user (incunabula user) is known" in { appActor ! UserProfileByEmailGetV1( email = incunabulaUserEmail, - userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = defaultFeatureFactoryConfig + userProfileType = UserProfileTypeV1.RESTRICTED ) expectMsg(Some(incunabulaUser.ofType(UserProfileTypeV1.RESTRICTED))) } @@ -126,7 +120,6 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im appActor ! UserProfileByEmailGetRequestV1( email = "userwrong@example.com", userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = rootUser ) expectMsg(Failure(NotFoundException(s"User 'userwrong@example.com' not found"))) @@ -135,8 +128,7 @@ class UsersResponderV1Spec extends CoreSpec(UsersResponderV1Spec.config) with Im "return 'None' when the user is unknown" in { appActor ! UserProfileByEmailGetV1( email = "userwrong@example.com", - userProfileType = UserProfileTypeV1.RESTRICTED, - featureFactoryConfig = defaultFeatureFactoryConfig + userProfileType = UserProfileTypeV1.RESTRICTED ) expectMsg(None) } diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ValuesResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ValuesResponderV1Spec.scala index 356454dac0..88489afad4 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ValuesResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ValuesResponderV1Spec.scala @@ -23,17 +23,24 @@ import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util.MutableTestIri import zio.& import zio.ZLayer +import zio.Runtime import java.time.Instant import java.util.UUID import scala.concurrent.duration._ +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.store.triplestore.api.TriplestoreService /** * Static data for testing [[ValuesResponderV1]]. @@ -65,12 +72,17 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with /* we need to run our app with the mocked sipi implementation */ override lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TriplestoreService]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceMockImpl.layer, - AppConfig.live + AppConfigForTestContainers.fusekiOnlyTestcontainer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer ) override lazy val rdfDataObjects = List( @@ -302,7 +314,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = zeitglöckleinIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1(utf8str = utf8str), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -324,7 +335,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = zeitglöckleinIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1(utf8str = utf8str), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -338,7 +348,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with "query a text value without Standoff" in { appActor ! ValueGetRequestV1( valueIri = commentIri.get, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -350,7 +359,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with "query a text value containing Standoff" in { appActor ! ValueGetRequestV1( valueIri = "http://rdfh.ch/0803/e41ab5695c/values/d3398239089e04", - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -362,7 +370,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with "query a standoff link as an ordinary value" in { appActor ! ValueGetRequestV1( valueIri = "http://rdfh.ch/0001/a-thing-with-text-values/values/0", - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser ) @@ -376,7 +383,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/8a0b1e75", predicateIri = "http://www.knora.org/ontology/0803/incunabula#partOf", objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -404,7 +410,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = commentIri.get, value = TextValueSimpleV1(utf8str = utf8str), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -452,7 +457,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = commentIri.get, value = TextValueSimpleV1(utf8str = utf8str), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -469,7 +473,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = zeitglöckleinIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1(utf8str = utf8str), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -485,7 +488,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = "http://rdfh.ch/0803/c5058f3a/values/184e99ca01", value = TextValueSimpleV1(utf8str = utf8str), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -500,7 +502,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = zeitglöckleinIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1("Comment 2"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -511,7 +512,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ResourceFullGetRequestV1( iri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userADM = incunabulaUser ) @@ -538,7 +538,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! DeleteValueRequestV1( valueIri = commentIri.get, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -549,7 +548,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ValueGetRequestV1( valueIri = commentIri.get, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -567,7 +565,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/nonexistent", propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1("Comment 1"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -582,7 +579,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/9935159f67", propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1("Comment 1"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -596,7 +592,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = commentIri.get, value = TextValueSimpleV1("Comment 1c"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -611,7 +606,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/e41ab5695c", propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1("Comment 1"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -626,7 +620,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/21abac2162", propertyIri = "http://www.knora.org/ontology/0803/incunabula#pubdate", value = TextValueSimpleV1("this is not a date"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -640,7 +633,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = "http://rdfh.ch/0803/c5058f3a/values/c3295339", value = TextValueSimpleV1("Zeitglöcklein des Lebens und Leidens Christi modified"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -654,7 +646,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = "http://rdfh.ch/0803/c5058f3a/values/cfd09f1e01", value = TextValueSimpleV1("this is not a date"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -670,7 +661,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/4f11adaf", propertyIri = "http://www.knora.org/ontology/0803/incunabula#partOf", value = LinkUpdateV1(targetResourceIri = "http://rdfh.ch/0803/e41ab5695c"), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -684,7 +674,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/4f11adaf", propertyIri = "http://www.knora.org/ontology/0803/incunabula#seqnum", value = IntegerValueV1(1), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -702,7 +691,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = miscResourceIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#miscHasColor", value = ColorValueV1(color), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -719,7 +707,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( value = ColorValueV1(color), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, valueIri = currentColorValueIri.get, apiRequestID = UUID.randomUUID @@ -740,7 +727,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = miscResourceIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#miscHasGeometry", value = GeomValueV1(geom), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -760,7 +746,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( value = GeomValueV1(geom), valueIri = currentGeomValueIri.get, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -784,7 +769,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with mapping = dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping" ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -807,7 +791,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with mapping = dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping" ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -830,7 +813,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with mapping = dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping" ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -852,7 +834,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with mapping = dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping" ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -892,7 +873,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/21abac2162", propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = textValueWithResourceRef, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -906,7 +886,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/21abac2162", predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -991,7 +970,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = firstValueIriWithResourceRef.get, value = textValueWithResourceRef, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1005,7 +983,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/21abac2162", predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -1074,7 +1051,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/21abac2162", propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = textValueWithResourceRef, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1088,7 +1064,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/21abac2162", predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -1135,7 +1110,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = firstValueIriWithResourceRef.get, value = textValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1149,7 +1123,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/21abac2162", predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -1208,7 +1181,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = secondValueIriWithResourceRef.get, value = textValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1224,7 +1196,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/21abac2162", predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -1286,7 +1257,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( valueIri = firstValueIriWithResourceRef.get, value = textValueWithResourceRef, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1300,7 +1270,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = "http://rdfh.ch/0803/21abac2162", predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = zeitglöckleinIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -1346,7 +1315,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/8a0b1e75", propertyIri = "http://www.knora.org/ontology/0803/incunabula#seqnum", value = IntegerValueV1(seqnum), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1363,7 +1331,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( value = IntegerValueV1(seqnum), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, valueIri = currentSeqnumValueIri.get, apiRequestID = UUID.randomUUID @@ -1382,7 +1349,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0001/a-thing", propertyIri = "http://www.knora.org/ontology/0001/anything#hasTimeStamp", value = TimeValueV1(timeStamp), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, apiRequestID = UUID.randomUUID ) @@ -1399,7 +1365,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( value = TimeValueV1(timeStamp), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, valueIri = currentTimeValueIri.get, apiRequestID = UUID.randomUUID @@ -1424,7 +1389,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with dateprecision2 = KnoraPrecisionV1.DAY, calendar = KnoraCalendarV1.GREGORIAN ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1445,7 +1409,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with dateprecision2 = KnoraPrecisionV1.DAY, calendar = KnoraCalendarV1.JULIAN ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, valueIri = currentPubdateValueIri.get, apiRequestID = UUID.randomUUID @@ -1468,7 +1431,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with value = LinkUpdateV1( targetResourceIri = zeitglöckleinIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1512,7 +1474,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with value = LinkUpdateV1( targetResourceIri = zeitglöckleinIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1532,7 +1493,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with value = LinkUpdateV1( targetResourceIri = "http://rdfh.ch/0803/8a0b1e75" // an incunabula:page, not an incunabula:book ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1551,7 +1511,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with value = LinkUpdateV1( targetResourceIri = linkTargetIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, valueIri = linkObjLinkValueIri.get, apiRequestID = UUID.randomUUID @@ -1623,7 +1582,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! DeleteValueRequestV1( valueIri = linkObjLinkValueIri.get, deleteComment = Some(comment), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1676,7 +1634,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with value = LinkUpdateV1( targetResourceIri = linkTargetIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = userProfile, valueIri = partOfLinkValueIri.get, apiRequestID = UUID.randomUUID @@ -1703,7 +1660,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with value = LinkUpdateV1( targetResourceIri = linkTargetIri ), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = userProfile, valueIri = partOfLinkValueIri.get, // use valueIri from previous test apiRequestID = UUID.randomUUID @@ -1726,7 +1682,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = TextValueSimpleV1(utf8str = comment), comment = Some(metaComment), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1745,7 +1700,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with val changeCommentRequest = ChangeCommentRequestV1( valueIri = "http://rdfh.ch/0803/c5058f3a/values/8653a672", comment = comment, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1778,7 +1732,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = "http://rdfh.ch/0803/8a0b1e75", file = fileValue, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser ) @@ -1796,7 +1749,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ChangeValueRequestV1( value = HierarchicalListValueV1(winter), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = imagesUser, valueIri = "http://rdfh.ch/00FF/d208fb9357d5/values/bc90a9c5091004", apiRequestID = UUID.randomUUID @@ -1814,7 +1766,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = HierarchicalListValueV1(summer), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = imagesUser, propertyIri = s"$IMAGES_ONTOLOGY_IRI#jahreszeit", resourceIri = "http://rdfh.ch/00FF/691e7e2244d5", @@ -1832,7 +1783,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = decimalValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, propertyIri = "http://www.knora.org/ontology/0001/anything#hasDecimal", resourceIri = aThingIri, @@ -1852,7 +1802,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = intervalValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, propertyIri = "http://www.knora.org/ontology/0001/anything#hasInterval", resourceIri = aThingIri, @@ -1869,7 +1818,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = colorValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, propertyIri = "http://www.knora.org/ontology/0001/anything#hasColor", resourceIri = aThingIri, @@ -1923,7 +1871,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = booleanValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, propertyIri = "http://www.knora.org/ontology/0001/anything#hasBoolean", resourceIri = aThingIri, @@ -1940,7 +1887,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = uriValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, propertyIri = "http://www.knora.org/ontology/0001/anything#hasUri", resourceIri = aThingIri, @@ -1964,7 +1910,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = thingWithTextValues, predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = aThingIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser ) @@ -2004,7 +1949,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! DeleteValueRequestV1( valueIri = firstTextValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, apiRequestID = UUID.randomUUID ) @@ -2015,7 +1959,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ValueGetRequestV1( valueIri = deletedFirstTextValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser ) @@ -2033,7 +1976,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = thingWithTextValues, predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = aThingIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser ) @@ -2073,7 +2015,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! DeleteValueRequestV1( valueIri = secondTextValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, apiRequestID = UUID.randomUUID ) @@ -2084,7 +2025,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! ValueGetRequestV1( valueIri = deletedSecondTextValue, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser ) @@ -2102,7 +2042,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with subjectIri = thingWithTextValues, predicateIri = OntologyConstants.KnoraBase.HasStandoffLinkTo, objectIri = aThingIri, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser ) @@ -2167,7 +2106,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with resourceIri = zeitglöckleinIri, propertyIri = "http://www.knora.org/ontology/0803/incunabula#book_comment", value = textValueWithResourceRef, - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2181,7 +2119,6 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with appActor ! CreateValueRequestV1( value = TextValueSimpleV1(utf8str = "Hello World!", language = Some("en")), - featureFactoryConfig = defaultFeatureFactoryConfig, userProfile = anythingUser, propertyIri = "http://www.knora.org/ontology/0001/anything#hasText", resourceIri = "http://rdfh.ch/0001/a-thing-with-text-valuesLanguage", diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala index 0a8a7e76f8..894bb277fc 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala @@ -44,7 +44,6 @@ class ListsResponderV2Spec extends CoreSpec() with ImplicitSender { "return a list" in { appActor ! ListGetRequestV2( listIri = "http://rdfh.ch/lists/0001/treeList", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = userProfile ) @@ -56,7 +55,6 @@ class ListsResponderV2Spec extends CoreSpec() with ImplicitSender { "return a node" in { appActor ! NodeGetRequestV2( nodeIri = "http://rdfh.ch/lists/0001/treeList11", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = userProfile ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala index 8262f1092b..58e2205cf9 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala @@ -38,7 +38,7 @@ import scala.language.postfixOps class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - override lazy val rdfDataObjects: Seq[RdfDataObject] = + override lazy val rdfDataObjects: List[RdfDataObject] = List(exampleSharedOntology, anythingData, freeTestOntology, freeTestData) private val imagesUser = SharedTestDataADM.imagesUser01 private val imagesProjectIri = SharedTestDataADM.IMAGES_PROJECT_IRI.toSmartIri @@ -104,7 +104,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { expectMsg(5 minutes, ResetRepositoryContentACK()) appActor ! LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -119,7 +118,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The foo ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser02 ) @@ -135,7 +133,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The foo ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -157,7 +154,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { label = Some(newLabel), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -181,7 +177,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(aComment), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -207,7 +202,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(aComment), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -232,7 +226,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { label = Some(newLabel), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -254,7 +247,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ontologyIri = fooIri.get.toSmartIri.toOntologySchema(ApiV2Complex), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -278,7 +270,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { label = "The bär ontology", comment = Some("some comment"), apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -294,7 +285,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { label = "The bar ontology", comment = Some("some comment"), apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -319,7 +309,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(newComment), lastModificationDate = barLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -341,7 +330,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The foo ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -356,7 +344,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ontologyIri = "http://0.0.0.0:3333/ontology/1234/nonexistent/v2".toSmartIri, lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -371,7 +358,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ontologyIri = fooIri.get.toSmartIri.toOntologySchema(ApiV2Complex), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser02 ) @@ -386,7 +372,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ontologyIri = fooIri.get.toSmartIri.toOntologySchema(ApiV2Complex), lastModificationDate = fooLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -404,7 +389,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { // Reload the ontologies from the triplestore and check again. appActor ! LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -438,7 +422,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ontologyIri = AnythingOntologyIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -465,7 +448,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The rdfs ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -482,7 +464,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The 0000 ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -499,7 +480,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The -foo ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -516,7 +496,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The v3 ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -533,7 +512,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The ontology ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -550,7 +528,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The wrong knora ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -567,7 +544,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The simple ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -584,7 +560,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = imagesProjectIri, label = "The invalid shared ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -602,7 +577,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { isShared = true, label = "The invalid shared ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = imagesUser ) @@ -618,7 +592,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { projectIri = OntologyConstants.KnoraAdmin.DefaultSharedOntologiesProject.toSmartIri, label = "The invalid non-shared ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser ) @@ -635,7 +608,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { isShared = true, label = "a chaired ontology", apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser ) @@ -707,7 +679,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -775,7 +746,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -794,7 +764,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { // Reload the ontology cache and see if we get the same result. appActor ! LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -869,7 +838,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -909,7 +877,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { // Reload the ontology cache and see if we get the same result. appActor ! LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -993,7 +960,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = comicBookClassInfoContent, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1036,7 +1002,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = comicAuthorClassInfoContent, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1090,7 +1055,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = comicAuthorPropertyInfoContent, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1130,7 +1094,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1203,7 +1166,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1253,7 +1215,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1303,7 +1264,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1353,7 +1313,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1403,7 +1362,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1456,7 +1414,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1506,7 +1463,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1560,7 +1516,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1610,7 +1565,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1660,7 +1614,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1710,7 +1663,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1760,7 +1712,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1810,7 +1761,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1860,7 +1810,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1910,7 +1859,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -1960,7 +1908,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2010,7 +1957,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2061,7 +2007,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2120,7 +2065,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2178,7 +2122,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2204,7 +2147,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -2230,7 +2172,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2266,7 +2207,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2306,7 +2246,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -2340,7 +2279,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2384,7 +2322,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2411,7 +2348,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2437,7 +2373,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2464,7 +2399,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2490,7 +2424,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2520,7 +2453,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = linkPropertyIri, lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2593,7 +2525,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -2637,7 +2568,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2678,7 +2608,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2718,7 +2647,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2771,7 +2699,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = partThingClassInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2812,7 +2739,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = wholeThingClassInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2871,7 +2797,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = partOfPropertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2926,7 +2851,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { label = Some(newLabel), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2949,7 +2873,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -2998,7 +2921,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3085,7 +3007,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3167,7 +3088,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContentWithCardinalityToDeleteDontAllow, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3206,7 +3126,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3288,7 +3207,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContentWithCardinalityToDeleteAllow, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3330,7 +3248,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3370,7 +3287,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -3394,7 +3310,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3429,7 +3344,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3465,7 +3379,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -3494,7 +3407,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3534,7 +3446,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newObjects = newObjects, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3586,7 +3497,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3627,7 +3537,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3668,7 +3577,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3709,7 +3617,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3752,7 +3659,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3795,7 +3701,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3838,7 +3743,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3893,7 +3797,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3911,7 +3814,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasInterestingThingValue, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3930,7 +3832,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = linkPropIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -3977,7 +3878,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { // Reload the ontology cache and see if we get the same result. appActor ! LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -4044,7 +3944,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4072,7 +3971,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newGuiAttributes = Set("size=80"), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4131,7 +4029,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { newGuiAttributes = Set.empty, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4194,7 +4091,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4235,7 +4131,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4272,7 +4167,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4312,7 +4206,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4332,7 +4225,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4354,7 +4246,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -4370,7 +4261,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4410,7 +4300,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -4460,7 +4349,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4492,7 +4380,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4557,7 +4444,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4590,7 +4476,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4654,7 +4539,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4685,7 +4569,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4743,7 +4626,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4786,7 +4668,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4859,7 +4740,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -4901,7 +4781,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -4963,7 +4842,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5002,7 +4880,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5019,7 +4896,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasNothingness, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5041,7 +4917,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasNothingness, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5070,7 +4945,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -5098,7 +4972,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5130,7 +5003,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasEmptiness, lastModificationDate = anythingLastModDate.minusSeconds(60), apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5147,7 +5019,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasEmptiness, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingNonAdminUser ) @@ -5164,7 +5035,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasOtherNothing, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5184,7 +5054,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = hasEmptiness, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5206,7 +5075,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5248,7 +5116,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5287,7 +5154,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5333,7 +5199,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5383,7 +5248,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5429,7 +5293,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5466,7 +5329,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5492,7 +5354,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5536,7 +5397,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5562,7 +5422,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classIri = classIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5608,7 +5467,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5634,7 +5492,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5684,7 +5541,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5710,7 +5566,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5756,7 +5611,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5782,7 +5636,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5832,7 +5685,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5886,7 +5738,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5940,7 +5791,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -5993,7 +5843,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6030,7 +5879,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6064,7 +5912,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6135,7 +5982,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6191,7 +6037,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6247,7 +6092,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6281,7 +6125,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6319,7 +6162,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -6346,7 +6188,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6374,7 +6215,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { ), lastModificationDate = freetestLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6441,7 +6281,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6523,7 +6362,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { propertyInfoContent = propertyInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6570,7 +6408,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classWithNewCardinalityInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6637,7 +6474,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContentWithCardinalityToDeleteAllow, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6661,7 +6497,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classChangeInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) @@ -6710,7 +6545,6 @@ class OntologyResponderV2Spec extends CoreSpec() with ImplicitSender { classInfoContent = classInfoContent, lastModificationDate = anythingLastModDate, apiRequestID = UUID.randomUUID, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingAdminUser ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala index db30b32b86..abce93f316 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala @@ -27,8 +27,8 @@ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.models.filemodels._ import org.knora.webapi.responders.v2.ResourcesResponseCheckerV2.compareReadResourcesSequenceV2Response import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util._ @@ -37,11 +37,18 @@ import org.xmlunit.builder.Input import org.xmlunit.diff.Diff import zio.& import zio.ZLayer +import zio.Runtime import java.time.Instant import java.time.temporal.ChronoUnit import java.util.UUID import scala.concurrent.duration._ +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.store.triplestore.api.TriplestoreService object ResourcesResponderV2Spec { private val incunabulaUserProfile = SharedTestDataADM.incunabulaProjectAdminUser @@ -408,12 +415,17 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { /* we need to run our app with the mocked sipi implementation */ override lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TriplestoreService]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceMockImpl.layer, - AppConfig.live + AppConfigForTestContainers.fusekiOnlyTestcontainer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer ) override lazy val rdfDataObjects = List( @@ -484,7 +496,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesGetRequestV2( resourceIris = Seq(resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -568,7 +579,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { "Load test data" in { appActor ! GetMappingRequestV2( mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -584,7 +594,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIris = Seq("http://rdfh.ch/0803/c5058f3a"), versionDate = None, targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -602,7 +611,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesPreviewGetRequestV2( resourceIris = Seq("http://rdfh.ch/0803/c5058f3a"), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -621,7 +629,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIris = Seq("http://rdfh.ch/0803/2a6221216701"), versionDate = None, targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -640,7 +647,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIris = Seq("http://rdfh.ch/0803/c5058f3a", "http://rdfh.ch/0803/2a6221216701"), versionDate = None, targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -658,7 +664,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesPreviewGetRequestV2( resourceIris = Seq("http://rdfh.ch/0803/c5058f3a", "http://rdfh.ch/0803/2a6221216701"), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -677,7 +682,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIris = Seq("http://rdfh.ch/0803/2a6221216701", "http://rdfh.ch/0803/c5058f3a"), versionDate = None, targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -698,7 +702,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { Seq("http://rdfh.ch/0803/c5058f3a", "http://rdfh.ch/0803/c5058f3a", "http://rdfh.ch/0803/2a6221216701"), versionDate = None, targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile ) @@ -720,7 +723,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { mappingIri = None, gravsearchTemplateIri = None, headerXSLTIri = None, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -745,7 +747,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { mappingIri = None, gravsearchTemplateIri = None, headerXSLTIri = None, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -770,7 +771,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIris = Seq(resourceIri), versionDate = Some(versionDate), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -790,7 +790,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIri = resourceIri, startDate = None, endDate = None, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -808,7 +807,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIri = resourceIri, startDate = Some(startDate), endDate = Some(endDate), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -822,7 +820,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIris = Seq("http://rdfh.ch/0001/thing-with-history"), valueUuid = Some(stringFormatter.decodeUuid("pLlW4ODASumZfZFbJdpw1g")), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -840,7 +837,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { valueUuid = Some(stringFormatter.decodeUuid("pLlW4ODASumZfZFbJdpw1g")), versionDate = Some(Instant.parse("2019-02-12T09:05:10Z")), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -933,7 +929,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -983,7 +978,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1143,7 +1137,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1181,7 +1174,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1216,7 +1208,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1254,7 +1245,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1288,7 +1278,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile, apiRequestID = UUID.randomUUID ) @@ -1336,7 +1325,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile, apiRequestID = UUID.randomUUID ) @@ -1378,7 +1366,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile, apiRequestID = UUID.randomUUID ) @@ -1424,7 +1411,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile, apiRequestID = UUID.randomUUID ) @@ -1458,7 +1444,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1492,7 +1477,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1565,7 +1549,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1599,7 +1582,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1633,7 +1615,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1667,7 +1648,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1691,7 +1671,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1727,7 +1706,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1750,7 +1728,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile, apiRequestID = UUID.randomUUID ) @@ -1765,7 +1742,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIri = aThingIri, resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLabel = Some("new test label"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUserProfile, apiRequestID = UUID.randomUUID ) @@ -1782,7 +1758,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIri = aThingIri, resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#BlueThing".toSmartIri, maybeLabel = Some("new test label"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1804,7 +1779,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLabel = Some(newLabel), maybePermissions = Some(newPermissions), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1831,7 +1805,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIri = aThingIri, resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLabel = Some("another new test label"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1849,7 +1822,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(Instant.MIN), maybeLabel = Some("another new test label"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1869,7 +1841,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(aThingLastModificationDate), maybeLabel = Some(newLabel), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1893,7 +1864,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(aThingLastModificationDate), maybeNewModificationDate = Some(Instant.MIN), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1913,7 +1883,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(aThingLastModificationDate), maybeNewModificationDate = Some(newModificationDate), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -1939,7 +1908,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeDeleteComment = Some("This resource is too boring."), maybeDeleteDate = Some(deleteDate), maybeLastModificationDate = Some(aThingLastModificationDate), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1957,7 +1925,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeDeleteComment = Some("This resource is too boring."), maybeLastModificationDate = Some(aThingLastModificationDate), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1969,7 +1936,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesGetRequestV2( resourceIris = Seq(aThingIri), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) expectMsgPF(timeout) { case response: ReadResourcesSequenceV2 => @@ -1993,7 +1959,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeDeleteComment = Some("This resource is too boring."), maybeDeleteDate = Some(deleteDate), maybeLastModificationDate = None, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -2005,7 +1970,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesGetRequestV2( resourceIris = Seq(resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) expectMsgPF(timeout) { case response: ReadResourcesSequenceV2 => @@ -2033,7 +1997,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesReviewerUser, apiRequestID = UUID.randomUUID ) @@ -2057,7 +2020,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser, apiRequestID = UUID.randomUUID ) @@ -2079,7 +2041,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -2113,7 +2074,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesReviewerUser, apiRequestID = UUID.randomUUID ) @@ -2149,7 +2109,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser, apiRequestID = UUID.randomUUID ) @@ -2183,7 +2142,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -2224,7 +2182,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2254,7 +2211,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2290,7 +2246,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(resourceToEraseLastModificationDate), erase = true, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2331,7 +2286,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2348,7 +2302,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(resourceToEraseLastModificationDate), erase = true, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -2368,7 +2321,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = linkValuePropertyIri, valueIri = linkValue.valueIri, valueTypeIri = OntologyConstants.KnoraApiV2Complex.LinkValue.toSmartIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2384,7 +2336,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLastModificationDate = Some(resourceToEraseLastModificationDate), erase = true, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser, apiRequestID = UUID.randomUUID ) @@ -2448,7 +2399,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2511,7 +2461,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2538,7 +2487,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) val response: ResourceAndValueVersionHistoryResponseV2 = @@ -2561,7 +2509,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) val response: ResourceAndValueVersionHistoryResponseV2 = @@ -2583,7 +2530,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { valueType = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, permissions = "CR knora-admin:Creator|V knora-admin:KnownUser" ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2592,7 +2538,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) val response: ResourceAndValueVersionHistoryResponseV2 = @@ -2625,7 +2570,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = Some(newValueIri.toSmartIri), permissions = Some("CR knora-admin:Creator|V knora-admin:KnownUser") ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2634,7 +2578,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) val response: ResourceAndValueVersionHistoryResponseV2 = @@ -2670,7 +2613,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = valueToDelete, valueTypeIri = OntologyConstants.KnoraApiV2Complex.TextValue.toSmartIri, deleteComment = Some(deleteComment), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2678,7 +2620,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) val response: ResourceAndValueVersionHistoryResponseV2 = @@ -2699,7 +2640,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) @@ -2720,7 +2660,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resourceIri = resourceIri, resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing".toSmartIri, maybeLabel = Some("a new label"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile, apiRequestID = UUID.randomUUID ) @@ -2729,7 +2668,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUserProfile ) val response: ResourceAndValueVersionHistoryResponseV2 = @@ -2745,7 +2683,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ProjectResourcesWithHistoryGetRequestV2( projectIri = "http://rdfh.ch/projects/1111", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) expectMsgPF(timeout) { case msg: akka.actor.Status.Failure => @@ -2756,7 +2693,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { "return seq of full history events for each resource of a project" in { appActor ! ProjectResourcesWithHistoryGetRequestV2( projectIri = "http://rdfh.ch/projects/0001", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingAdminUser ) val response: ResourceAndValueVersionHistoryResponseV2 = diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala index b4605b2f22..9eb5a6baf1 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala @@ -53,7 +53,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { returnFiles = false, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -76,7 +75,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { returnFiles = false, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -100,7 +98,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { returnFiles = true, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -124,7 +121,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { constructQuery = searchResponderV2SpecFullData.constructQueryForBooksWithTitleZeitgloecklein, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -144,7 +140,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { constructQuery = searchResponderV2SpecFullData.constructQueryForBooksWithoutTitleZeitgloecklein, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -164,7 +159,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { limitToProject = None, limitToResourceClass = Some("http://www.knora.org/ontology/0803/incunabula#book".toSmartIri), // internal Iri! targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -182,7 +176,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { limitToProject = None, limitToResourceClass = Some("http://www.knora.org/ontology/0803/incunabula#book".toSmartIri), // internal Iri! targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -198,7 +191,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { searchValue = "Narrenschiff", limitToProject = None, limitToResourceClass = Some("http://www.knora.org/ontology/0803/incunabula#book".toSmartIri), // internal Iri! - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -214,7 +206,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { searchValue = "Das Narrenschiff", limitToProject = None, limitToResourceClass = Some("http://www.knora.org/ontology/0803/incunabula#book".toSmartIri), // internal Iri! - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) @@ -232,7 +223,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { schemaOptions = SchemaOptions.ForStandoffWithTextValues, page = 0, targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.incunabulaProjectAdminUser ) @@ -252,7 +242,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { returnFiles = false, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -275,7 +264,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { returnFiles = false, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anythingUser1 ) @@ -295,7 +283,6 @@ class SearchResponderV2Spec extends CoreSpec() with ImplicitSender { constructQuery = query, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.anonymousUser ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/StandoffResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/StandoffResponderV2Spec.scala index aa5a865800..a241a9ff8e 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/StandoffResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/StandoffResponderV2Spec.scala @@ -39,8 +39,7 @@ class StandoffResponderV2Spec extends CoreSpec() with ImplicitSender { implicit val timeout: Timeout = Duration(10, SECONDS) val resF: Future[SparqlConstructResponse] = (appActor ? SparqlConstructRequest( - sparql = getMappingSparql, - featureFactoryConfig = defaultFeatureFactoryConfig + sparql = getMappingSparql )).mapTo[SparqlConstructResponse] Await.result(resF, 10.seconds) } @@ -101,7 +100,6 @@ class StandoffResponderV2Spec extends CoreSpec() with ImplicitSender { |""".stripMargin val message = mapping.toMessage( xml = xmlContent, - featureFactoryConfig = defaultFeatureFactoryConfig, user = SharedTestDataADM.rootUser ) appActor ! message diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala index bf02220462..f17b01c5be 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala @@ -29,17 +29,24 @@ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.models.filemodels.ChangeFileRequest import org.knora.webapi.models.filemodels.FileType import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.cache.CacheServiceManager +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util.MutableTestIri import zio.& import zio.ZLayer +import zio.Runtime import java.time.Instant import java.util.UUID import scala.concurrent.duration._ +import org.knora.webapi.store.triplestore.TriplestoreServiceManager +import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.testcontainers.FusekiTestContainer +import org.knora.webapi.store.triplestore.api.TriplestoreService /** * Tests [[ValuesResponderV2]]. @@ -64,12 +71,17 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { /* we need to run our app with the mocked sipi implementation */ override lazy val effectLayers = - ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + ZLayer.make[CacheServiceManager & IIIFServiceManager & TriplestoreServiceManager & AppConfig & TriplestoreService]( + Runtime.removeDefaultLoggers, CacheServiceManager.layer, CacheServiceInMemImpl.layer, IIIFServiceManager.layer, IIIFServiceMockImpl.layer, - AppConfig.live + AppConfigForTestContainers.fusekiOnlyTestcontainer, + TriplestoreServiceManager.layer, + TriplestoreServiceHttpConnectorImpl.layer, + RepositoryUpdater.layer, + FusekiTestContainer.layer ) override lazy val rdfDataObjects = List( @@ -198,7 +210,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { constructQuery = parsedGravsearchQuery, targetSchema = ApiV2Complex, schemaOptions = SchemaOptions.ForStandoffWithTextValues, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = requestingUser ) @@ -241,7 +252,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesGetRequestV2( resourceIris = Seq(resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = requestingUser ) @@ -344,7 +354,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! ResourcesPreviewGetRequestV2( resourceIris = Seq(resourceIri), targetSchema = ApiV2Complex, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = requestingUser ) @@ -407,7 +416,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { "Load test data" in { appActor ! GetMappingRequestV2( mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping", - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = KnoraSystemInstances.Users.SystemUser ) @@ -435,7 +443,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -478,7 +485,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -519,7 +525,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -570,7 +575,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -613,7 +617,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -666,7 +669,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -709,7 +711,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -764,7 +765,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -813,7 +813,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -861,7 +860,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -889,7 +887,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -921,7 +918,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueUUID = Some(valueUUID), valueCreationDate = Some(valueCreationDate) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -969,7 +965,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), valueCreationDate = Some(valueCreationDate) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1001,7 +996,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), valueCreationDate = Some(valueCreationDate) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1052,7 +1046,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), newValueVersionIri = Some(newValueVersionIri.toSmartIri) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1096,7 +1089,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1121,7 +1113,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some(valueHasString) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1161,7 +1152,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some(valueHasString) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1188,7 +1178,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(valueHasComment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1236,7 +1225,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1285,7 +1273,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -1313,7 +1300,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasDecimal = valueHasDecimal ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1354,7 +1340,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasDecimal = valueHasDecimal ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1382,7 +1367,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasTimeStamp = valueHasTimeStamp ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1431,7 +1415,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, valueContent = submittedValueContent ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1483,7 +1466,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, valueContent = submittedValueContent ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1511,7 +1493,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasBoolean = valueHasBoolean ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1556,7 +1537,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeometry = valueHasGeometry ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1598,7 +1578,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeometry = valueHasGeometry ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1628,7 +1607,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasIntervalEnd = valueHasIntervalEnd ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1674,7 +1652,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasIntervalEnd = valueHasIntervalEnd ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1702,7 +1679,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasListNode = valueHasListNode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1745,7 +1721,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasListNode = valueHasListNode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1770,7 +1745,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasListNode = valueHasListNode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1798,7 +1772,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasColor = valueHasColor ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1841,7 +1814,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasColor = valueHasColor ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1869,7 +1841,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasUri = valueHasUri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1912,7 +1883,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasUri = valueHasUri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1940,7 +1910,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeonameCode = valueHasGeonameCode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -1983,7 +1952,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeonameCode = valueHasGeonameCode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2009,7 +1977,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = zeitglöckleinIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2053,7 +2020,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = zeitglöckleinIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2079,7 +2045,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = zeitglöckleinIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2102,7 +2067,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = generationeIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -2127,7 +2091,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2152,7 +2115,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some(valueHasString) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2177,7 +2139,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2201,7 +2162,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some("this is not a date") ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2226,7 +2186,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = "http://rdfh.ch/0803/e41ab5695c" ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2247,7 +2206,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = 1 ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2294,7 +2252,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2391,7 +2348,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2468,7 +2424,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2494,7 +2449,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2523,7 +2477,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2570,7 +2523,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser2, apiRequestID = UUID.randomUUID ) @@ -2598,7 +2550,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2626,7 +2577,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some(permissions) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2661,7 +2611,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueType = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, permissions = permissions ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2699,7 +2648,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueType = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, permissions = permissions ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser2, apiRequestID = UUID.randomUUID ) @@ -2723,7 +2671,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueType = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, permissions = permissions ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2747,7 +2694,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueType = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, permissions = permissions ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2773,7 +2719,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasInteger = intValue ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -2799,7 +2744,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some(valueHasString) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2845,7 +2789,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2915,7 +2858,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some(valueHasString) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2944,7 +2886,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -2994,7 +2935,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -3024,7 +2964,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -3074,7 +3013,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -3099,7 +3037,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { maybeValueHasString = Some(valueHasString) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -3126,7 +3063,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasDecimal = valueHasDecimal ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3168,7 +3104,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasDecimal = valueHasDecimal ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3195,7 +3130,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasTimeStamp = valueHasTimeStamp ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3237,7 +3171,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasTimeStamp = valueHasTimeStamp ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3269,7 +3202,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = dateValueIri.get, valueContent = submittedValueContent ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3322,7 +3254,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = dateValueIri.get, valueContent = submittedValueContent ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3349,7 +3280,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasBoolean = valueHasBoolean ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3391,7 +3321,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasBoolean = valueHasBoolean ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3419,7 +3348,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeometry = valueHasGeometry ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3462,7 +3390,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeometry = valueHasGeometry ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3491,7 +3418,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasIntervalEnd = valueHasIntervalEnd ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3538,7 +3464,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasIntervalEnd = valueHasIntervalEnd ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3565,7 +3490,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasListNode = valueHasListNode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3609,7 +3533,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasListNode = valueHasListNode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3635,7 +3558,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasListNode = valueHasListNode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3662,7 +3584,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasColor = valueHasColor ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3706,7 +3627,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasColor = valueHasColor ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3733,7 +3653,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasUri = valueHasUri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3777,7 +3696,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasUri = valueHasUri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3804,7 +3722,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeonameCode = valueHasGeonameCode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3848,7 +3765,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueHasGeonameCode = valueHasGeonameCode ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -3875,7 +3791,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = generationeIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -3923,7 +3838,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = generationeIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -3954,7 +3868,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -4004,7 +3917,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -4035,7 +3947,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -4086,7 +3997,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { comment = Some(comment) ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -4128,7 +4038,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { referredResourceIri = generationeIri ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -4154,7 +4063,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ontologyName = "anything" ) .toMessage( - featureFactoryConfig = defaultFeatureFactoryConfig, internalMimeType = Some(mimeTypeJP2), originalFilename = Some("test.tiff"), originalMimeType = Some(mimeTypeTIFF), @@ -4203,7 +4111,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ) val changeFileMessage = changeFileRequest .toMessage( - featureFactoryConfig = defaultFeatureFactoryConfig, resourceClassIRI = Some(thingPictureClassIri.toSmartIri), internalMimeType = Some(internalMimeType), originalMimeType = originalMimeType, @@ -4268,7 +4175,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = stillImageFileValueIri.get, valueContent = valueContent ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, // this user doesn't have the necessary permission apiRequestID = UUID.randomUUID ) @@ -4303,7 +4209,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = stillImageFileValueIri.get, valueContent = valueContent ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -4324,7 +4229,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = intValueIri.get, valueTypeIri = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, deleteComment = Some("this value was incorrect"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser2, apiRequestID = UUID.randomUUID ) @@ -4347,7 +4251,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = valueIri, valueTypeIri = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, deleteComment = Some("this value was incorrect"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -4377,7 +4280,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueTypeIri = OntologyConstants.KnoraApiV2Complex.IntValue.toSmartIri, deleteComment = deleteComment, deleteDate = Some(deleteDate), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -4401,7 +4303,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = OntologyConstants.KnoraApiV2Complex.HasStandoffLinkToValue.toSmartIri, valueIri = standoffLinkValueIri.get, valueTypeIri = OntologyConstants.KnoraApiV2Complex.LinkValue.toSmartIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.superUser, apiRequestID = UUID.randomUUID ) @@ -4422,7 +4323,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { valueIri = zeitglöckleinCommentWithStandoffIri.get, valueTypeIri = OntologyConstants.KnoraApiV2Complex.TextValue.toSmartIri, deleteComment = Some("this value was incorrect"), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -4460,7 +4360,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = linkValuePropertyIri, valueIri = linkValueIRI, valueTypeIri = OntologyConstants.KnoraApiV2Complex.LinkValue.toSmartIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaUser, apiRequestID = UUID.randomUUID ) @@ -4485,7 +4384,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { propertyIri = propertyIri, valueIri = "http://rdfh.ch/0803/c5058f3a/values/c3295339", valueTypeIri = OntologyConstants.KnoraApiV2Complex.TextValue.toSmartIri, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = incunabulaCreatorUser, apiRequestID = UUID.randomUUID ) @@ -4509,7 +4407,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -4530,7 +4427,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some("CR knora-admin:Creator") ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesReviewerUser, apiRequestID = UUID.randomUUID ) @@ -4554,7 +4450,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -4575,7 +4470,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some("CR knora-admin:Creator") ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.rootUser, apiRequestID = UUID.randomUUID ) @@ -4597,7 +4491,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! CreateResourceRequestV2( createResource = inputResource, - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -4618,7 +4511,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ), permissions = Some("CR knora-admin:Creator") ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = SharedTestDataADM.imagesUser01, apiRequestID = UUID.randomUUID ) @@ -4645,7 +4537,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -4689,7 +4580,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) @@ -4743,7 +4633,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { mapping = standardMapping ) ), - featureFactoryConfig = defaultFeatureFactoryConfig, requestingUser = anythingUser1, apiRequestID = UUID.randomUUID ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CacheSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CacheSpec.scala index dd0630d1db..9b47d9f163 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CacheSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CacheSpec.scala @@ -6,11 +6,9 @@ package org.knora.webapi.responders.v2.ontology import akka.actor.Props -import org.knora.webapi.IntegrationSpec +import org.knora.webapi.CoreSpec import org.knora.webapi.InternalSchema -import org.knora.webapi.TestContainerFuseki -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig + import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter @@ -23,7 +21,6 @@ import org.knora.webapi.messages.v2.responder.ontologymessages.PropertyInfoConte import org.knora.webapi.messages.v2.responder.ontologymessages.ReadOntologyV2 import org.knora.webapi.messages.v2.responder.ontologymessages.ReadPropertyInfoV2 import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.store.triplestore.http.HttpTriplestoreConnector import org.knora.webapi.util.cache.CacheUtil import java.time.Instant @@ -31,15 +28,17 @@ import scala.concurrent.Await import scala.concurrent.Future import scala.concurrent.duration._ import scala.language.postfixOps +import akka.util.Timeout /** * This spec is used to test [[org.knora.webapi.responders.v2.ontology.Cache]]. */ -class CacheSpec extends IntegrationSpec(TestContainerFuseki.PortConfig) { +class CacheSpec extends CoreSpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance + private implicit val timeout: Timeout = settings.defaultTimeout - val additionalTestData = List( + override lazy val rdfDataObjects = List( RdfDataObject( path = "test_data/ontologies/books-onto.ttl", name = "http://www.knora.org/ontology/0001/books" @@ -50,36 +49,12 @@ class CacheSpec extends IntegrationSpec(TestContainerFuseki.PortConfig) { ) ) - val defaultFeatureFactoryConfig: FeatureFactoryConfig = new KnoraSettingsFeatureFactoryConfig(settings) - - // start fuseki http connector actor - private val fusekiActor = system.actorOf( - Props(new HttpTriplestoreConnector()).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = "httpTriplestoreConnector" - ) - - override def beforeAll(): Unit = { - CacheUtil.createCaches(settings.caches) - waitForReadyTriplestore(fusekiActor) - loadTestData(fusekiActor, additionalTestData) - } - - override protected def afterAll(): Unit = - CacheUtil.removeAllCaches() - "The basic functionality of the ontology cache" should { - "successfully load all ontologies" in { + "successfully get the ontology cache" in { val ontologiesFromCacheFuture: Future[Map[SmartIri, ReadOntologyV2]] = for { - _ <- Cache.loadOntologies( - settings, - fusekiActor, - defaultFeatureFactoryConfig, - KnoraSystemInstances.Users.SystemUser - ) - cacheData: Cache.OntologyCacheData <- Cache.getCacheData - ontologies: Map[SmartIri, ReadOntologyV2] = cacheData.ontologies - } yield ontologies + cacheData: Cache.OntologyCacheData <- Cache.getCacheData + } yield cacheData.ontologies ontologiesFromCacheFuture map { res: Map[SmartIri, ReadOntologyV2] => res.size should equal(13) @@ -94,13 +69,14 @@ class CacheSpec extends IntegrationSpec(TestContainerFuseki.PortConfig) { "removing a property from an ontology," should { "remove the property from the cache." in { - val iri: SmartIri = stringFormatter.toSmartIri(additionalTestData.head.name) - val hasTitlePropertyIri = stringFormatter.toSmartIri(s"${additionalTestData.head.name}#hasTitle") + val iri: SmartIri = stringFormatter.toSmartIri(rdfDataObjects.head.name) + val hasTitlePropertyIri = stringFormatter.toSmartIri(s"${rdfDataObjects.head.name}#hasTitle") - val previousCacheDataFuture = Cache.getCacheData - val previousCacheData = Await.result(previousCacheDataFuture, 2 seconds) + val previousCacheDataFuture: Future[Cache.OntologyCacheData] = Cache.getCacheData + val previousCacheData: Cache.OntologyCacheData = Await.result(previousCacheDataFuture, 2 seconds) val previousBooksMaybe = previousCacheData.ontologies.get(iri) + previousBooksMaybe match { case Some(previousBooks) => // copy books-onto but remove :hasTitle property @@ -136,10 +112,10 @@ class CacheSpec extends IntegrationSpec(TestContainerFuseki.PortConfig) { previousBooks.properties should contain key hasTitlePropertyIri newCachedBooks.properties should not contain key(hasTitlePropertyIri) - case None => fail(message = CACHE_NOT_AVAILABLE_ERROR) + case None => fail("no books found in cache after update") } - case None => fail(message = CACHE_NOT_AVAILABLE_ERROR) + case None => fail("no books found in cache before update") } } } @@ -148,8 +124,8 @@ class CacheSpec extends IntegrationSpec(TestContainerFuseki.PortConfig) { "add a value property to the cache." in { - val iri: SmartIri = stringFormatter.toSmartIri(additionalTestData.head.name) - val hasDescriptionPropertyIri = stringFormatter.toSmartIri(s"${additionalTestData.head.name}#hasDescription") + val iri: SmartIri = stringFormatter.toSmartIri(rdfDataObjects.head.name) + val hasDescriptionPropertyIri = stringFormatter.toSmartIri(s"${rdfDataObjects.head.name}#hasDescription") val previousCacheDataFuture = Cache.getCacheData val previousCacheData = Await.result(previousCacheDataFuture, 2 seconds) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala index 600882a2c9..a3bd6314cb 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala @@ -5,52 +5,25 @@ package org.knora.webapi.responders.v2.ontology -import akka.actor.Props -import org.knora.webapi.IntegrationSpec +import org.knora.webapi.CoreSpec import org.knora.webapi.InternalSchema -import org.knora.webapi.TestContainerFuseki import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.store.triplestore.http.HttpTriplestoreConnector +import akka.util.Timeout /** * This spec is used to test [[org.knora.webapi.responders.v2.ontology.Cardinalities]]. - * Adding the [[TestContainerFuseki.PortConfig]] config will start the Fuseki container and make it - * available to the test. */ -class DeleteCardinalitiesFromClassSpec extends IntegrationSpec(TestContainerFuseki.PortConfig) { +class DeleteCardinalitiesFromClassSpec extends CoreSpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - - val additionalTestData = List( - RdfDataObject( - path = "test_data/ontologies/freetest-onto.ttl", - name = "http://www.knora.org/ontology/0001/freetest" - ), - RdfDataObject(path = "test_data/all_data/freetest-data.ttl", name = "http://www.knora.org/data/0001/freetest"), - RdfDataObject( - path = "test_data/ontologies/anything-onto.ttl", - name = "http://www.knora.org/ontology/0001/anything" - ), - RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") - ) - - // start fuseki http connector actor - private val fusekiActor = system.actorOf( - Props(new HttpTriplestoreConnector()).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = "httpTriplestoreConnector" - ) + private implicit val timeout: Timeout = settings.defaultTimeout val freetestOntologyIri: SmartIri = "http://0.0.0.0:3333/ontology/0001/freetest/v2".toSmartIri - override def beforeAll(): Unit = { - waitForReadyTriplestore(fusekiActor) - loadTestData(fusekiActor, additionalTestData) - } - // use started actor in tests instead of the store manager "DeleteCardinalitiesFromClass" should { "detect that property is in use, when used in a resource" in { @@ -58,7 +31,7 @@ class DeleteCardinalitiesFromClassSpec extends IntegrationSpec(TestContainerFuse val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTest").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = Cardinalities.isPropertyUsedInResources(settings, fusekiActor, internalClassIri, internalPropertyIri) + val resF = Cardinalities.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(res, "property is used in resource (instance of that resource class)") } } @@ -67,7 +40,7 @@ class DeleteCardinalitiesFromClassSpec extends IntegrationSpec(TestContainerFuse val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTestResourceClass").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = Cardinalities.isPropertyUsedInResources(settings, fusekiActor, internalClassIri, internalPropertyIri) + val resF = Cardinalities.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(!res, "property is not used in resource (instance of that resource class)") } @@ -78,7 +51,7 @@ class DeleteCardinalitiesFromClassSpec extends IntegrationSpec(TestContainerFuse val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTest").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = Cardinalities.isPropertyUsedInResources(settings, fusekiActor, internalClassIri, internalPropertyIri) + val resF = Cardinalities.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(!res, "property is not used in resource (instance of that resource class)") } @@ -90,7 +63,7 @@ class DeleteCardinalitiesFromClassSpec extends IntegrationSpec(TestContainerFuse val internalClassIri = anythingOntologyIri.makeEntityIri("Thing").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = Cardinalities.isPropertyUsedInResources(settings, fusekiActor, internalClassIri, internalPropertyIri) + val resF = Cardinalities.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(res, "property is used in resource (instance of resource class)") } } @@ -99,7 +72,7 @@ class DeleteCardinalitiesFromClassSpec extends IntegrationSpec(TestContainerFuse val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTest").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = Cardinalities.isPropertyUsedInResources(settings, fusekiActor, internalClassIri, internalPropertyIri) + val resF = Cardinalities.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(res, "property is used in a resource of subclass") } } diff --git a/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala index 2ee87e56c6..de468d26bc 100644 --- a/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala @@ -42,7 +42,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic "succeed with the correct 'email' " in { val resF = Authenticator invokePrivate getUserByIdentifier( UserIdentifierADM(maybeEmail = Some(AuthenticatorSpec.rootUserEmail)), - defaultFeatureFactoryConfig, system, appActor, timeout, @@ -56,7 +55,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic "fail with the wrong 'email' " in { val resF = Authenticator invokePrivate getUserByIdentifier( UserIdentifierADM(maybeEmail = Some("wronguser@example.com")), - defaultFeatureFactoryConfig, system, appActor, timeout, @@ -71,7 +69,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic an[BadRequestException] should be thrownBy { Authenticator invokePrivate getUserByIdentifier( UserIdentifierADM(), - defaultFeatureFactoryConfig, system, appActor, timeout, @@ -90,7 +87,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic ) val resF = Authenticator invokePrivate authenticateCredentialsV2( Some(correctPasswordCreds), - defaultFeatureFactoryConfig, system, appActor, executionContext @@ -104,7 +100,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some("wrongemail@example.com")), "wrongpassword") val resF = Authenticator invokePrivate authenticateCredentialsV2( Some(wrongPasswordCreds), - defaultFeatureFactoryConfig, system, appActor, executionContext @@ -121,7 +116,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic ) val resF = Authenticator invokePrivate authenticateCredentialsV2( Some(wrongPasswordCreds), - defaultFeatureFactoryConfig, system, appActor, executionContext @@ -140,7 +134,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic val tokenCreds = KnoraJWTTokenCredentialsV2(token) val resF = Authenticator invokePrivate authenticateCredentialsV2( Some(tokenCreds), - defaultFeatureFactoryConfig, system, appActor, executionContext @@ -160,7 +153,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic CacheUtil.put(AUTHENTICATION_INVALIDATION_CACHE_NAME, tokenCreds.jwtToken, tokenCreds.jwtToken) val resF = Authenticator invokePrivate authenticateCredentialsV2( Some(tokenCreds), - defaultFeatureFactoryConfig, system, appActor, executionContext @@ -173,7 +165,6 @@ class AuthenticatorSpec extends CoreSpec("AuthenticationTestSystem") with Implic val tokenCreds = KnoraJWTTokenCredentialsV2("123456") val resF = Authenticator invokePrivate authenticateCredentialsV2( Some(tokenCreds), - defaultFeatureFactoryConfig, system, appActor, executionContext diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/CacheServiceManagerSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cache/CacheServiceManagerSpec.scala similarity index 94% rename from webapi/src/test/scala/org/knora/webapi/store/cacheservice/CacheServiceManagerSpec.scala rename to webapi/src/test/scala/org/knora/webapi/store/cache/CacheServiceManagerSpec.scala index c78de1c96a..b6a074664e 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/CacheServiceManagerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cache/CacheServiceManagerSpec.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice +package org.knora.webapi.store.cache import com.typesafe.config.ConfigFactory import org.knora.webapi._ @@ -24,7 +24,7 @@ object CacheServiceManagerSpec { } /** - * This spec is used to test [[org.knora.webapi.store.cacheservice.serialization.CacheSerialization]]. + * This spec is used to test [[org.knora.webapi.store.cache.serialization.CacheSerialization]]. */ class CacheServiceManagerSpec extends CoreSpec(CacheServiceManagerSpec.config) { diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala b/webapi/src/test/scala/org/knora/webapi/store/cache/config/RedisTestConfig.scala similarity index 81% rename from webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala rename to webapi/src/test/scala/org/knora/webapi/store/cache/config/RedisTestConfig.scala index 9fdda0222d..08453f12ca 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cache/config/RedisTestConfig.scala @@ -1,6 +1,6 @@ -package org.knora.webapi.store.cacheservice.config +package org.knora.webapi.store.cache.config -import org.knora.webapi.store.cacheservice.config.RedisConfig +import org.knora.webapi.store.cache.config.RedisConfig import org.knora.webapi.testcontainers.RedisTestContainer import zio._ diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cache/impl/CacheInMemImplZSpec.scala similarity index 86% rename from webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala rename to webapi/src/test/scala/org/knora/webapi/store/cache/impl/CacheInMemImplZSpec.scala index 85298bac6d..594771b02a 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cache/impl/CacheInMemImplZSpec.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.impl +package org.knora.webapi.store.cache.impl import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -11,15 +11,16 @@ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentif import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.api.CacheService +import org.knora.webapi.store.cache.api.CacheService import zio.ZLayer import zio.test.Assertion._ import zio.test._ +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl /** - * This spec is used to test [[org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl]]. + * This spec is used to test [[org.knora.webapi.store.cache.impl.CacheServiceInMemImpl]]. */ -object CacheInMemImplSpec extends ZIOSpec[CacheService] { +object CacheInMemImplZSpec extends ZIOSpecDefault { StringFormatter.initForTest() implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -39,13 +40,13 @@ object CacheInMemImplSpec extends ZIOSpec[CacheService] { /** * Defines a layer which encompases all dependencies that are needed for - * running the tests. `bootstrap` overrides the base layer of ZIOApp. + * running the tests. */ - val bootstrap = ZLayer.make[CacheService](CacheServiceInMemImpl.layer) + val testLayers = ZLayer.make[CacheService](CacheServiceInMemImpl.layer) - def spec = (userTests + projectTests + otherTests) + def spec = (userTests + projectTests + otherTests).provideLayerShared(testLayers) @@ TestAspect.sequential - val userTests = suite("CacheInMemImplSpec - user")( + val userTests = suite("CacheInMemImplZSpec - user")( test("successfully store a user and retrieve by IRI") { for { _ <- CacheService.putUserADM(user) @@ -72,7 +73,7 @@ object CacheInMemImplSpec extends ZIOSpec[CacheService] { ) ) - val projectTests = suite("CacheInMemImplSpec - project")( + val projectTests = suite("CacheInMemImplZSpec - project")( test("successfully store a project and retrieve by IRI")( for { _ <- CacheService.putProjectADM(project) @@ -95,7 +96,7 @@ object CacheInMemImplSpec extends ZIOSpec[CacheService] { ) ) - val otherTests = suite("CacheInMemImplSpec - other")( + val otherTests = suite("CacheInMemImplZSpec - other")( test("successfully store string value")( for { _ <- CacheService.putStringValue("my-new-key", "my-new-value") diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cache/impl/CacheRedisImplZSpec.scala similarity index 83% rename from webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala rename to webapi/src/test/scala/org/knora/webapi/store/cache/impl/CacheRedisImplZSpec.scala index df8746c546..95ab752a2b 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cache/impl/CacheRedisImplZSpec.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.impl +package org.knora.webapi.store.cache.impl import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM @@ -11,18 +11,17 @@ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentif import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.cacheservice.api.CacheService -import org.knora.webapi.store.cacheservice.config.RedisTestConfig +import org.knora.webapi.store.cache.api.CacheService +import org.knora.webapi.store.cache.config.RedisTestConfig import org.knora.webapi.testcontainers.RedisTestContainer import zio._ import zio.test.Assertion._ -import zio.test.TestAspect._ import zio.test._ /** - * This spec is used to test [[org.knora.webapi.store.cacheservice.impl.CacheServiceRedisImpl]]. + * This spec is used to test [[org.knora.webapi.store.cache.impl.CacheServiceRedisImpl]]. */ -object CacheRedisImplSpec extends ZIOSpec[CacheService & zio.test.Annotations] { +object CacheRedisImplZSpec extends ZIOSpecDefault { StringFormatter.initForTest() implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -32,16 +31,16 @@ object CacheRedisImplSpec extends ZIOSpec[CacheService & zio.test.Annotations] { /** * Defines a layer which encompases all dependencies that are needed for - * for running the tests. `bootstrap` overrides the base layer of ZIOApp. + * for running the tests. */ - val bootstrap = ZLayer.make[CacheService & zio.test.Annotations]( + val testLayers = ZLayer.make[CacheService & zio.test.Annotations]( CacheServiceRedisImpl.layer, RedisTestConfig.redisTestContainer, zio.test.Annotations.live, RedisTestContainer.layer ) - def spec = (userTests + projectTests) + def spec = (userTests + projectTests).provideLayerShared(testLayers) @@ TestAspect.sequential val userTests = suite("CacheRedisImplSpec - user")( test("successfully store a user and retrieve by IRI") { @@ -49,19 +48,19 @@ object CacheRedisImplSpec extends ZIOSpec[CacheService & zio.test.Annotations] { _ <- CacheService.putUserADM(user) retrievedUser <- CacheService.getUserADM(UserIdentifierADM(maybeIri = Some(user.id))) } yield assert(retrievedUser)(equalTo(Some(user))) - } @@ ignore + + } @@ TestAspect.ignore + test("successfully store a user and retrieve by USERNAME")( for { _ <- CacheService.putUserADM(user) retrievedUser <- CacheService.getUserADM(UserIdentifierADM(maybeUsername = Some(user.username))) } yield assert(retrievedUser)(equalTo(Some(user))) - ) @@ ignore + + ) @@ TestAspect.ignore + test("successfully store a user and retrieve by EMAIL")( for { _ <- CacheService.putUserADM(user) retrievedUser <- CacheService.getUserADM(UserIdentifierADM(maybeEmail = Some(user.email))) } yield assert(retrievedUser)(equalTo(Some(user))) - ) @@ ignore + ) @@ TestAspect.ignore ) val projectTests = suite("CacheRedisImplSpec - project")( diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cache/serialization/CacheSerializationZSpec.scala similarity index 87% rename from webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala rename to webapi/src/test/scala/org/knora/webapi/store/cache/serialization/CacheSerializationZSpec.scala index 36dec9198b..8f1a27daa3 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cache/serialization/CacheSerializationZSpec.scala @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.knora.webapi.store.cacheservice.serialization +package org.knora.webapi.store.cache.serialization import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -11,11 +11,12 @@ import org.knora.webapi.sharedtestdata.SharedTestDataADM import zio.test.Assertion._ import zio.test.TestAspect.ignore import zio.test._ +import org.knora.webapi.store.cache.serialization.CacheSerialization /** * This spec is used to test [[CacheSerialization]]. */ -object CacheSerializationSpec extends ZIOSpecDefault { +object CacheSerializationZSpec extends ZIOSpecDefault { private val user = SharedTestDataADM.imagesUser01 private val project = SharedTestDataADM.imagesProject diff --git a/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala b/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala index 5a6d3f6fb8..92a94c2f93 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala @@ -15,7 +15,7 @@ import zio._ * Can be used in place of [[IIIFServiceSipiImpl]] for tests without an actual Sipi server, by returning hard-coded * responses simulating responses from Sipi. */ -case class IIIFServiceMockImpl(str: String) extends IIIFService { +case class IIIFServiceMockImpl() extends IIIFService { /** * A request with this filename will always cause a Sipi error. @@ -60,11 +60,9 @@ case class IIIFServiceMockImpl(str: String) extends IIIFService { object IIIFServiceMockImpl { val layer: ZLayer[Any, Nothing, IIIFService] = { - ZLayer { - for { - _ <- ZIO.debug("blub") - } yield IIIFServiceMockImpl("blub") - }.tap(_ => ZIO.debug(">>> Mock Sipi IIIF Service Initialized <<<")) + ZLayer + .succeed(IIIFServiceMockImpl()) + .tap(_ => ZIO.debug(">>> Mock Sipi IIIF Service Initialized <<<")) } } diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/AllTriplestoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/AllTriplestoreSpec.scala deleted file mode 100644 index 03536bdd3a..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/AllTriplestoreSpec.scala +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.triplestore - -import akka.testkit.ImplicitSender -import com.typesafe.config.ConfigFactory -import org.knora.webapi.CoreSpec -import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.messages.util.rdf.SparqlSelectResult - -import scala.concurrent.duration._ -import scala.language.postfixOps - -object AllTriplestoreSpec { - - private val config = ConfigFactory.parseString(""" - # akka.loglevel = "DEBUG" - # akka.stdout-loglevel = "DEBUG" - """.stripMargin) -} - -/* - * In this simple test case, we start our actor under test, send it a message, and test if the message - * we got in response is the one we expexted. - * - * The naming is usualy the class name appended by the word 'spec' all in camel case. - * - * All test cases are subclasses of CoreSpec and need to provide parameters - * providing the actor system name and config. - * - * to execute, type 'test' in sbt - */ -class AllTriplestoreSpec extends CoreSpec(AllTriplestoreSpec.config) with ImplicitSender { - - private val timeout = 30.seconds - - // println(system.settings.config.getConfig("app").root().render()) - // println(system.settings.config.getConfig("app.triplestore").root().render()) - - override lazy val rdfDataObjects = List( - RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") - ) - - val countTriplesQuery: String = - """ - SELECT (COUNT(*) AS ?no) - WHERE - { - ?s ?p ?o . - } - """ - - val namedGraphQuery: String = - """ - SELECT ?namedGraph ?s ?p ?o ?lang - WHERE { - { - GRAPH ?namedGraph { - BIND(IRI("http://www.knora.org/ontology/0001/anything#Thing") as ?s) - ?s ?p ?obj - BIND(str(?obj) as ?o) - BIND(lang(?obj) as ?lang) - } - } - } - """.stripMargin - - val insertQuery: String = - """ - prefix rdf: - prefix sub: - - INSERT DATA - { - GRAPH - { - sub:tries "something" ; - sub:hopes "success" ; - rdf:type sub:Me . - } - } - """ - - val graphDataContent: String = - """ - prefix rdf: - prefix jedi: - - jedi:tries "force for the first time" ; - jedi:hopes "to power the lightsaber" ; - rdf:type jedi:Skywalker . - """ - - val checkInsertQuery: String = - """ - prefix rdf: - prefix sub: - - SELECT * - WHERE { - GRAPH - { - ?s rdf:type sub:Me . - ?s ?p ?o . - } - } - """ - - val revertInsertQuery: String = - """ - prefix rdf: - prefix sub: - - WITH - DELETE { ?s ?p ?o } - WHERE - { - ?s rdf:type sub:Me . - ?s ?p ?o . - } - """ - - val searchURI: String = "" - - val textSearchQueryFusekiValueHasString: String = - s""" - PREFIX knora-base: - - SELECT DISTINCT * - WHERE { - ?iri 'test' . - ?iri knora-base:valueHasString ?literal . - } - """ - - val textSearchQueryFusekiDRFLabel: String = - s""" - PREFIX rdfs: - - SELECT DISTINCT * - WHERE { - ?iri 'Papa' . - ?iri rdfs:label ?literal . - } - """ - - var afterLoadCount: Int = -1 - var afterChangeCount: Int = -1 - var afterChangeRevertCount: Int = -1 - - /* - * Send message to actor under test and check the result. - * All must complete under 1 second or the test will fail - * The Akka documentation describes a bunch of other methods - * but this is the one I the most - */ - s"The Triplestore ($settings.triplestoreType) Actor " when { - "started " should { - "only start answering after initialization has finished " in { - appActor ! CheckTriplestoreRequest() - val response = expectMsgType[CheckTriplestoreResponse](1.second) - - response.triplestoreStatus should be(TriplestoreStatus.ServiceAvailable) - } - } - - "receiving a Hello " should { - "reply " in { - within(1.seconds) { - appActor ! HelloTriplestore(settings.triplestoreType) - expectMsg(HelloTriplestore(settings.triplestoreType)) - } - } - } - "receiving a 'ResetTriplestoreContent' request " should { - "reset the data " in { - //println("==>> Reset test case start") - appActor ! ResetRepositoryContent(rdfDataObjects) - expectMsg(5 minutes, ResetRepositoryContentACK()) - //println("==>> Reset test case end") - - appActor ! SparqlSelectRequest(countTriplesQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println(msg) - afterLoadCount = msg.results.bindings.head.rowMap("no").toInt - (afterLoadCount > 0) should ===(true) - } - } - } - "receiving a Named Graph request " should { - "provide data " in { - //println("==>> Named Graph test case start") - appActor ! SparqlSelectRequest(namedGraphQuery) - //println(result) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println(msg) - msg.results.bindings.nonEmpty should ===(true) - } - //println("==>> Named Graph test case end") - } - } - "receiving an update request " should { - "execute the update " in { - //println("==>> Update 1 test case start") - - appActor ! SparqlSelectRequest(countTriplesQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println("vor insert: " + msg) - msg.results.bindings.head.rowMap("no").toInt should ===(afterLoadCount) - } - - appActor ! SparqlUpdateRequest(insertQuery) - expectMsg(SparqlUpdateResponse()) - - appActor ! SparqlSelectRequest(checkInsertQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println(msg) - msg.results.bindings.size should ===(3) - } - - appActor ! SparqlSelectRequest(countTriplesQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println("nach instert" + msg) - afterChangeCount = msg.results.bindings.head.rowMap("no").toInt - (afterChangeCount - afterLoadCount) should ===(3) - } - //println("==>> Update 1 test case end") - } - "revert back " in { - //println("==>> Update 2 test case start") - - appActor ! SparqlSelectRequest(countTriplesQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println("vor revert: " + msg) - msg.results.bindings.head.rowMap("no").toInt should ===(afterChangeCount) - } - - appActor ! SparqlUpdateRequest(revertInsertQuery) - expectMsg(SparqlUpdateResponse()) - - appActor ! SparqlSelectRequest(countTriplesQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println("nach revert: " + msg) - msg.results.bindings.head.rowMap("no").toInt should ===(afterLoadCount) - } - - appActor ! SparqlSelectRequest(checkInsertQuery) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println("check: " + msg) - msg.results.bindings.size should ===(0) - } - - //println("==>> Update 2 test case end") - } - } - "receiving a search request " should { - "execute the search with the lucene index for 'knora-base:valueHasString' properties" in { - within(1000.millis) { - appActor ! SparqlSelectRequest(textSearchQueryFusekiValueHasString) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println(msg) - msg.results.bindings.size should ===(3) - } - } - } - - "execute the search with the lucene index for 'rdfs:label' properties" in { - within(1000.millis) { - appActor ! SparqlSelectRequest(textSearchQueryFusekiDRFLabel) - expectMsgPF(timeout) { case msg: SparqlSelectResult => - //println(msg) - msg.results.bindings.size should ===(1) - } - } - } - } - - "receiving insert rdf data objects request" should { - "insert RDF DataObjects" in { - appActor ! InsertRepositoryContent(rdfDataObjects) - expectMsg(5 minutes, InsertTriplestoreContentACK()) - } - - } - - "receiving named graph data requests" should { - "put the graph data as turtle" in { - appActor ! InsertGraphDataContentRequest(graphContent = graphDataContent, "http://jedi.org/graph") - expectMsgType[InsertGraphDataContentResponse](10.second) - } - - "read the graph data as turtle" in { - appActor ! NamedGraphDataRequest(graphIri = "http://jedi.org/graph") - val response = expectMsgType[NamedGraphDataResponse](1.second) - response.turtle.length should be > 0 - } - } - } - -} diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/HttpTriplestoreConnectorSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/HttpTriplestoreConnectorSpec.scala deleted file mode 100644 index 3be8353578..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/HttpTriplestoreConnectorSpec.scala +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.triplestore - -import akka.testkit.ImplicitSender -import org.knora.webapi.CoreSpec -import dsp.errors.TriplestoreTimeoutException -import org.knora.webapi.messages.store.triplestoremessages.SimulateTimeoutRequest - -import scala.concurrent.duration._ - -class HttpTriplestoreConnectorSpec extends CoreSpec() with ImplicitSender { - private val timeout = 10.seconds - - "The HttpTriplestoreConnector" should { - "report a connection timeout with an appropriate error message" in { - appActor ! SimulateTimeoutRequest() - - expectMsgPF(timeout) { case msg: akka.actor.Status.Failure => - assert(msg.cause.isInstanceOf[TriplestoreTimeoutException]) - assert( - msg.cause.getMessage == "The triplestore took too long to process a request. This can happen because the triplestore needed too much time to search through the data that is currently in the triplestore. Query optimisation may help." - ) - } - } - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManagerSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManagerSpec.scala new file mode 100644 index 0000000000..f55d88dec7 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/TriplestoreServiceManagerSpec.scala @@ -0,0 +1,259 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.triplestore + +import akka.testkit.ImplicitSender +import org.knora.webapi.CoreSpec +import dsp.errors.TriplestoreTimeoutException +import org.knora.webapi.messages.store.triplestoremessages.SimulateTimeoutRequest + +import scala.concurrent.duration._ +import org.knora.webapi.messages.store.triplestoremessages.CheckTriplestoreRequest +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContent +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContentACK +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.CheckTriplestoreResponse +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreStatus +import org.knora.webapi.messages.store.triplestoremessages.SparqlSelectRequest +import org.knora.webapi.messages.util.rdf.SparqlSelectResult +import org.knora.webapi.messages.store.triplestoremessages.SparqlUpdateRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlUpdateResponse +import org.knora.webapi.messages.store.triplestoremessages.InsertRepositoryContent +import org.knora.webapi.messages.store.triplestoremessages.InsertTriplestoreContentACK +import org.knora.webapi.messages.store.triplestoremessages.InsertGraphDataContentRequest +import org.knora.webapi.messages.store.triplestoremessages.InsertGraphDataContentResponse +import org.knora.webapi.messages.store.triplestoremessages.NamedGraphDataRequest +import org.knora.webapi.messages.store.triplestoremessages.NamedGraphDataResponse + +class TriplestoreServiceManagerSpec extends CoreSpec() with ImplicitSender { + + private val timeout = 30.seconds + + override lazy val rdfDataObjects = List( + RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") + ) + + val countTriplesQuery: String = + """ + SELECT (COUNT(*) AS ?no) + WHERE + { + ?s ?p ?o . + } + """ + + val namedGraphQuery: String = + """ + SELECT ?namedGraph ?s ?p ?o ?lang + WHERE { + { + GRAPH ?namedGraph { + BIND(IRI("http://www.knora.org/ontology/0001/anything#Thing") as ?s) + ?s ?p ?obj + BIND(str(?obj) as ?o) + BIND(lang(?obj) as ?lang) + } + } + } + """.stripMargin + + val insertQuery: String = + """ + prefix rdf: + prefix sub: + + INSERT DATA + { + GRAPH + { + sub:tries "something" ; + sub:hopes "success" ; + rdf:type sub:Me . + } + } + """ + + val graphDataContent: String = + """ + prefix rdf: + prefix jedi: + + jedi:tries "force for the first time" ; + jedi:hopes "to power the lightsaber" ; + rdf:type jedi:Skywalker . + """ + + val checkInsertQuery: String = + """ + prefix rdf: + prefix sub: + + SELECT * + WHERE { + GRAPH + { + ?s rdf:type sub:Me . + ?s ?p ?o . + } + } + """ + + val revertInsertQuery: String = + """ + prefix rdf: + prefix sub: + + WITH + DELETE { ?s ?p ?o } + WHERE + { + ?s rdf:type sub:Me . + ?s ?p ?o . + } + """ + + val searchURI: String = "" + + val textSearchQueryFusekiValueHasString: String = + s""" + PREFIX knora-base: + + SELECT DISTINCT * + WHERE { + ?iri 'test' . + ?iri knora-base:valueHasString ?literal . + } + """ + + val textSearchQueryFusekiDRFLabel: String = + s""" + PREFIX rdfs: + + SELECT DISTINCT * + WHERE { + ?iri 'Papa' . + ?iri rdfs:label ?literal . + } + """ + + var afterLoadCount: Int = -1 + var afterChangeCount: Int = -1 + var afterChangeRevertCount: Int = -1 + + "The TriplestoreServiceManager" should { + + "only start answering after initialization has finished " in { + appActor ! CheckTriplestoreRequest() + val response = expectMsgType[CheckTriplestoreResponse](1.second) + + response.triplestoreStatus should be(TriplestoreStatus.ServiceAvailable) + } + + "reset the data after receiving a 'ResetTriplestoreContent' request" in { + appActor ! ResetRepositoryContent(rdfDataObjects) + expectMsg(5.minutes, ResetRepositoryContentACK()) + + appActor ! SparqlSelectRequest(countTriplesQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + afterLoadCount = msg.results.bindings.head.rowMap("no").toInt + (afterLoadCount > 0) should ===(true) + } + } + + "provide data receiving a Named Graph request" in { + appActor ! SparqlSelectRequest(namedGraphQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.nonEmpty should ===(true) + } + } + + "execute an update" in { + appActor ! SparqlSelectRequest(countTriplesQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.head.rowMap("no").toInt should ===(afterLoadCount) + } + + appActor ! SparqlUpdateRequest(insertQuery) + expectMsg(SparqlUpdateResponse()) + + appActor ! SparqlSelectRequest(checkInsertQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.size should ===(3) + } + + appActor ! SparqlSelectRequest(countTriplesQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + afterChangeCount = msg.results.bindings.head.rowMap("no").toInt + (afterChangeCount - afterLoadCount) should ===(3) + } + } + + "revert back " in { + appActor ! SparqlSelectRequest(countTriplesQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.head.rowMap("no").toInt should ===(afterChangeCount) + } + + appActor ! SparqlUpdateRequest(revertInsertQuery) + expectMsg(SparqlUpdateResponse()) + + appActor ! SparqlSelectRequest(countTriplesQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.head.rowMap("no").toInt should ===(afterLoadCount) + } + + appActor ! SparqlSelectRequest(checkInsertQuery) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.size should ===(0) + } + } + + "execute the search with the lucene index for 'knora-base:valueHasString' properties" in { + within(1000.millis) { + appActor ! SparqlSelectRequest(textSearchQueryFusekiValueHasString) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.size should ===(3) + } + } + } + + "execute the search with the lucene index for 'rdfs:label' properties" in { + within(1000.millis) { + appActor ! SparqlSelectRequest(textSearchQueryFusekiDRFLabel) + expectMsgPF(timeout) { case msg: SparqlSelectResult => + msg.results.bindings.size should ===(1) + } + } + } + + "insert RDF DataObjects" in { + appActor ! InsertRepositoryContent(rdfDataObjects) + expectMsg(5.minutes, InsertTriplestoreContentACK()) + } + + "put the graph data as turtle" in { + appActor ! InsertGraphDataContentRequest(graphContent = graphDataContent, "http://jedi.org/graph") + expectMsgType[InsertGraphDataContentResponse](10.second) + } + + "read the graph data as turtle" in { + appActor ! NamedGraphDataRequest(graphIri = "http://jedi.org/graph") + val response = expectMsgType[NamedGraphDataResponse](1.second) + response.turtle.length should be > 0 + } + + "report a connection timeout with an appropriate error message" in { + appActor ! SimulateTimeoutRequest() + + expectMsgPF(timeout) { case msg: akka.actor.Status.Failure => + assert(msg.cause.isInstanceOf[TriplestoreTimeoutException]) + assert( + msg.cause.getMessage == "The triplestore took too long to process a request. This can happen because the triplestore needed too much time to search through the data that is currently in the triplestore. Query optimisation may help." + ) + } + } + } +} diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImplZSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImplZSpec.scala new file mode 100644 index 0000000000..682550f24e --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/impl/TriplestoreServiceHttpConnectorImplZSpec.scala @@ -0,0 +1,53 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.triplestore.impl + +import akka.http.javadsl.server.AuthenticationFailedRejection +import org.knora.webapi.config.AppConfig +import org.knora.webapi.config.AppConfigForTestContainers +import dsp.errors.TriplestoreTimeoutException +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.store.cache.api.CacheService +import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl +import org.knora.webapi.store.triplestore.api.TriplestoreService +import org.knora.webapi.testcontainers.FusekiTestContainer +import zio._ +import zio.test.Assertion._ +import zio.test._ + +/** + * This spec is used to test [[org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl]]. + */ +object TriplestoreServiceHttpConnectorImplZSpec extends ZIOSpecDefault { + + /** + * Defines a layer which encompases all dependencies that are needed for + * running the tests. `bootstrap` overrides the base layer of ZIOApp. + */ + val testLayer = + ZLayer.make[TriplestoreService]( + TriplestoreServiceHttpConnectorImpl.layer, + AppConfigForTestContainers.fusekiOnlyTestcontainer, + FusekiTestContainer.layer + ) + + def spec = suite("TriplestoreServiceHttpConnectorImplSpec")( + test("successfully simulate a timeout") { + for { + result <- TriplestoreService.doSimulateTimeout().exit + } yield assertTrue( + result.is(_.die) == TriplestoreTimeoutException( + "The triplestore took too long to process a request. This can happen because the triplestore needed too much time to search through the data that is currently in the triplestore. Query optimisation may help." + ) + ) + } + ).provideLayer(testLayer) @@ TestAspect.sequential +} diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala index 7e33f2518c..ba32c9d1e3 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala @@ -14,7 +14,7 @@ class UpgradePluginPR1307Spec extends UpgradePluginSpec { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1307.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1307(defaultFeatureFactoryConfig) + val plugin = new UpgradePluginPR1307() plugin.transform(model) // Make an in-memory repository containing the transformed model. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322Spec.scala index 6e109fa05a..7448b55c23 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322Spec.scala @@ -14,7 +14,7 @@ class UpgradePluginPR1322Spec extends UpgradePluginSpec { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1322.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1322(defaultFeatureFactoryConfig) + val plugin = new UpgradePluginPR1322() plugin.transform(model) // Make an in-memory repository containing the transformed model. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367Spec.scala index 83d3494cb4..6419fa9c01 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1367Spec.scala @@ -10,7 +10,7 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ class UpgradePluginPR1367Spec extends UpgradePluginSpec { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(defaultFeatureFactoryConfig) + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() "Upgrade plugin PR1367" should { "fix the datatypes of decimal literals" in { @@ -18,7 +18,7 @@ class UpgradePluginPR1367Spec extends UpgradePluginSpec { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1367.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1367(defaultFeatureFactoryConfig) + val plugin = new UpgradePluginPR1367() plugin.transform(model) // Check that the decimal datatype was fixed. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala index 28ffb8e215..248f85e0a8 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala @@ -14,7 +14,7 @@ class UpgradePluginPR1372Spec extends UpgradePluginSpec { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1372.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1372(defaultFeatureFactoryConfig) + val plugin = new UpgradePluginPR1372() plugin.transform(model) // Make an in-memory repository containing the transformed model. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala index 2011844012..aacc52d430 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala @@ -14,7 +14,7 @@ class UpgradePluginPR1615Spec extends UpgradePluginSpec { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1615.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1615(defaultFeatureFactoryConfig) + val plugin = new UpgradePluginPR1615() plugin.transform(model) // Make an in-memory repository containing the transformed model. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746Spec.scala index 2d75505354..782d0d7d53 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1746Spec.scala @@ -11,7 +11,7 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ class UpgradePluginPR1746Spec extends UpgradePluginSpec with LazyLogging { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(defaultFeatureFactoryConfig) + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() private def checkLiteral(model: RdfModel, subj: IriNode, pred: IriNode, expectedObj: RdfLiteral): Unit = model @@ -37,7 +37,7 @@ class UpgradePluginPR1746Spec extends UpgradePluginSpec with LazyLogging { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1746.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1746(defaultFeatureFactoryConfig, logger) + val plugin = new UpgradePluginPR1746(log) plugin.transform(model) // Check that the empty valueHasString is replaced with FIXME. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921Spec.scala index 92156da8d7..012c645c0d 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1921Spec.scala @@ -10,7 +10,7 @@ import dsp.errors.AssertionException import org.knora.webapi.messages.util.rdf._ class UpgradePluginPR1921Spec extends UpgradePluginSpec with LazyLogging { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(defaultFeatureFactoryConfig) + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() private def checkLiteral(model: RdfModel, subj: IriNode, pred: IriNode, expectedObj: RdfLiteral): Unit = model @@ -34,7 +34,7 @@ class UpgradePluginPR1921Spec extends UpgradePluginSpec with LazyLogging { // Parse the input file. val model: RdfModel = trigFileToModel("../test_data/upgrade/pr1921.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR1921(defaultFeatureFactoryConfig, logger) + val plugin = new UpgradePluginPR1921(log) plugin.transform(model) "replace simple strings in group descriptions with language strings" in { diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018Spec.scala index 783dc68135..79ec3e22d5 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018Spec.scala @@ -12,7 +12,7 @@ class UpgradePluginPR2018Spec extends UpgradePluginSpec with LazyLogging { "Upgrade plugin PR2018" should { "add lastModificationDate to ontology not attached to SystemProject" in { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr2018.trig") - val plugin = new UpgradePluginPR2018(defaultFeatureFactoryConfig, logger) + val plugin = new UpgradePluginPR2018(log) plugin.transform(model) val repository: RdfRepository = model.asRepository diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079Spec.scala index 3881f32eae..4c7079b26d 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2079Spec.scala @@ -11,7 +11,7 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ class UpgradePluginPR2079Spec extends UpgradePluginSpec with LazyLogging { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(defaultFeatureFactoryConfig) + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() "Upgrade plugin PR2079" should { "fix the missing valueHasUri datatype" in { @@ -19,7 +19,7 @@ class UpgradePluginPR2079Spec extends UpgradePluginSpec with LazyLogging { val model: RdfModel = trigFileToModel("../test_data/upgrade/pr2079.trig") // Use the plugin to transform the input. - val plugin = new UpgradePluginPR2079(defaultFeatureFactoryConfig, log) + val plugin = new UpgradePluginPR2079(log) plugin.transform(model) // Check that the datatype was fixed. diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081Spec.scala index fc1c869cba..0e13a02098 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2081Spec.scala @@ -11,7 +11,7 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ class UpgradePluginPR2081Spec extends UpgradePluginSpec with LazyLogging { - private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(defaultFeatureFactoryConfig) + private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory() private def getDateValue(model: RdfModel, subj: IriNode, pred: IriNode): String = { val statement = model.find(subj = Some(subj), pred = Some(pred), obj = None).toSet.head @@ -44,7 +44,7 @@ class UpgradePluginPR2081Spec extends UpgradePluginSpec with LazyLogging { val resource3DeletionDate = getDateValue(model, resource3, deletionDate) // Use the plugin to transform the input. - val plugin = new UpgradePluginPR2081(defaultFeatureFactoryConfig, log) + val plugin = new UpgradePluginPR2081(log) plugin.transform(model) // get the new values after transformation diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala index 96e9e2117d..3ce7dfb19b 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala @@ -11,12 +11,18 @@ import org.knora.webapi.messages.util.rdf._ import java.io.BufferedInputStream import java.io.FileInputStream +import org.scalatest.wordspec.AnyWordSpecLike +import org.scalatest.matchers.should.Matchers +import com.typesafe.scalalogging.Logger /** * Provides helper methods for specs that test upgrade plugins. */ -abstract class UpgradePluginSpec extends CoreSpec() { - protected val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) +abstract class UpgradePluginSpec extends AnyWordSpecLike with Matchers { + + protected val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() + + val log: Logger = Logger(this.getClass()) /** * Parses a TriG file and returns it as an [[RdfModel]]. diff --git a/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala b/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala index ac2b2b6be6..7d799ad451 100644 --- a/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala +++ b/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala @@ -31,18 +31,17 @@ object FusekiTestContainer { fusekiContainer.withEnv("JVM_ARGS", "-Xmx3G") fusekiContainer.start() fusekiContainer - }.orDie.tap(_ => ZIO.debug(">>> Acquire Fuseki TestContainer executed <<<")) + }.orDie.tap(_ => ZIO.debug(">>> Acquire Fuseki TestContainer <<<")) - def release(container: GenericContainer[Nothing]): URIO[Any, Unit] = ZIO.attemptBlocking { + def release(container: GenericContainer[Nothing]): UIO[Unit] = ZIO.attemptBlocking { container.stop() - }.orDie.tap(_ => ZIO.debug(">>> Release Fuseki TestContainer executed <<<")) + }.orDie.tap(_ => ZIO.debug(">>> Release Fuseki TestContainer <<<")) val layer: ZLayer[Any, Nothing, FusekiTestContainer] = { - ZLayer { + ZLayer.scoped { for { - // tc <- ZIO.acquireRelease(acquire)(release(_)).orDie - tc <- acquire.orDie + tc <- ZIO.acquireRelease(acquire)(release(_)).orDie } yield FusekiTestContainer(tc) - }.tap(_ => ZIO.debug(">>> Fuseki Test Container Initialized <<<")) + } } } diff --git a/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala b/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala index e77d092448..e9d31c4bef 100644 --- a/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala +++ b/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala @@ -17,17 +17,17 @@ object RedisTestContainer { container.withExposedPorts(6379) container.start() container - }.orDie.tap(_ => ZIO.debug(">>> acquireRedisTestContainer executed <<<")) + }.orDie.tap(_ => ZIO.debug(">>> Acquire Redis TestContainer <<<")) def releaseRedisTestContainer(container: GenericContainer[Nothing]): URIO[Any, Unit] = ZIO.attemptBlocking { container.stop() - }.orDie.tap(_ => ZIO.debug(">>> releaseRedisTestContainer executed <<<")) + }.orDie.tap(_ => ZIO.debug(">>> Release Redis TestContainer <<<")) val layer: ZLayer[Any, Nothing, RedisTestContainer] = { ZLayer.scoped { for { tc <- ZIO.acquireRelease(acquireRedisTestContainer)(releaseRedisTestContainer(_)).orDie } yield RedisTestContainer(tc) - }.tap(_ => ZIO.debug(">>> Redis Test Container Initialized <<<")) + } } } diff --git a/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala b/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala index eb4cee9168..4dbf8d2d80 100644 --- a/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala +++ b/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala @@ -47,18 +47,17 @@ object SipiTestContainer { ) sipiContainer.start() sipiContainer - }.tap(_ => ZIO.debug(">>> Acquire Sipi TestContainer executed <<<")) + }.tap(_ => ZIO.debug(">>> Acquire Sipi TestContainer <<<")) - def release(container: GenericContainer[Nothing]): Task[Unit] = ZIO.attemptBlocking { + def release(container: GenericContainer[Nothing]): UIO[Unit] = ZIO.attemptBlocking { container.stop() - }.tap(_ => ZIO.debug(">>> Release Sipi TestContainer executed <<<")) + }.orDie.tap(_ => ZIO.debug(">>> Release Sipi TestContainer <<<")) val layer: ZLayer[Any, Nothing, SipiTestContainer] = { - ZLayer { + ZLayer.scoped { for { - // tc <- ZIO.acquireRelease(acquire)(release(_)).orDie - tc <- acquire.orDie + tc <- ZIO.acquireRelease(acquire)(release(_)).orDie } yield SipiTestContainer(tc) - }.tap(_ => ZIO.debug(">>> Sipi TestContainer initialized <<<")) + } } } diff --git a/webapi/src/test/scala/org/knora/webapi/testservices/TestActorSystemService.scala b/webapi/src/test/scala/org/knora/webapi/testservices/TestActorSystemService.scala new file mode 100644 index 0000000000..74d546bcb8 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/testservices/TestActorSystemService.scala @@ -0,0 +1,51 @@ +package org.knora.webapi.testservices + +import akka.actor.ActorSystem +import zio._ + +import java.util.concurrent.TimeUnit +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.duration.FiniteDuration +import com.typesafe.config.ConfigFactory +import dsp.errors.InternalServerException + +final case class TestActorSystemService(actorSystem: ActorSystem) { + + /** + * Get ActorSystem + */ + val getActorSystem: ActorSystem = actorSystem +} + +object TestActorSystemService { + + /** + * Acquires an ActorSystem + */ + private def acquire() = (for { + ec <- ZIO.executor.map(_.asExecutionContext) + system <- ZIO.attempt( + ActorSystem("TestActorSystemService", Some(ConfigFactory.load()), None, Some(ec)) + ) + + } yield system).tap(_ => ZIO.logDebug(">>> Acquire Test Actor System Service <<<")).orDie + + /** + * Releases the ActorSystem + */ + private def release(system: ActorSystem) = + (for { + ec <- ZIO.executor.map(_.asExecutionContext) + _ <- ZIO.fromFuture(implicit ec => system.terminate()).timeout(5.seconds).orDie + } yield ()).tap(_ => ZIO.logDebug(">>> Release Test Actor System Service <<<")) + + val layer: ZLayer[Any, Nothing, TestActorSystemService] = { + ZLayer.scoped { + for { + system <- ZIO.acquireRelease(acquire())(release(_)) + } yield TestActorSystemService(system) + } + } + +} diff --git a/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala b/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala index cad780a025..2fc7a40b6f 100644 --- a/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala +++ b/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala @@ -84,9 +84,9 @@ final case class TestClientService(config: AppConfig, httpClient: CloseableHttpC ) for { - _ <- ZIO.debug("Loading test data started ...") + _ <- ZIO.logInfo("Loading test data started ...") _ <- singleAwaitingRequest(loadRequest, 101.seconds) - _ <- ZIO.debug("... loading test data done.") + _ <- ZIO.logInfo("... loading test data done.") } yield () } @@ -95,7 +95,7 @@ final case class TestClientService(config: AppConfig, httpClient: CloseableHttpC */ def singleAwaitingRequest( request: akka.http.scaladsl.model.HttpRequest, - duration: zio.Duration = 60.seconds + duration: zio.Duration = 666.seconds ): Task[akka.http.scaladsl.model.HttpResponse] = ZIO .fromFuture[akka.http.scaladsl.model.HttpResponse](executionContext => @@ -357,14 +357,14 @@ object TestClientService { httpClient.close() }.tap(_ => ZIO.logDebug(">>> Release Test Client Service <<<")).orDie - def layer(config: AppConfig, actorSystem: ActorSystem): ZLayer[Any, Nothing, TestClientService] = { - implicit val system = actorSystem - + val layer: ZLayer[AppConfig & TestActorSystemService, Nothing, TestClientService] = { ZLayer.scoped { for { // _ <- ZIO.debug(config.sipi) - httpClient <- ZIO.acquireRelease(acquire(config))(release(_)) - } yield TestClientService(config, httpClient, actorSystem) + config <- ZIO.service[AppConfig] + tass <- ZIO.service[TestActorSystemService] + httpClient <- ZIO.acquireRelease(acquire(config))(release(_)(tass.getActorSystem)) + } yield TestClientService(config, httpClient, tass.getActorSystem) }.tap(_ => ZIO.logDebug(">>> Test Client Service initialized <<<")) } diff --git a/webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportSpec.scala b/webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportSpec.scala deleted file mode 100644 index f423bf2076..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportSpec.scala +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util - -import org.knora.webapi._ - -class ApacheLuceneSupportSpec extends CoreSpec() { - - "The ApacheLuceneSupport class" should { - - "leave a Lucene query unchanged" in { - - val searchString = "Reise Land" - val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString - - assert(searchExpression == "Reise Land") - } - - "leave a Lucene query unchanged (2)" in { - - val searchString = "Reise ins Land" - val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString - - assert(searchExpression == "Reise ins Land") - } - - "leave a Lucene query containing phrases and terms unchanged" in { - - val searchString = "\"Leonhard Euler\" Bernoulli" - val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString - - assert(searchExpression == "\"Leonhard Euler\" Bernoulli") - - } - - "leave a Lucene query containing two phrases and one term unchanged" in { - - val searchString = "\"Leonhard Euler\" \"Daniel Bernoulli\" formula" - val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString - - assert(searchExpression == "\"Leonhard Euler\" \"Daniel Bernoulli\" formula") - - } - - "leave a Lucene query containing two phrases and two terms unchanged" in { - - val searchString = "\"Leonhard Euler\" \"Daniel Bernoulli\" formula geometria" - val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString - - assert(searchExpression == "\"Leonhard Euler\" \"Daniel Bernoulli\" formula geometria") - - } - - "get terms contained in a Lucene query" in { - - val searchString = "Reise Land" - val singleTerms: Seq[String] = ApacheLuceneSupport.LuceneQueryString(searchString).getSingleTerms - - assert(singleTerms.size === 2) - - } - - "handle one phrase correctly" in { - - val searchString = "\"Leonhard Euler\"" - val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString - - assert(searchExpression == "\"Leonhard Euler\"") - - } - - "combine space separated words with a logical AND and add a wildcard to the last word (non exact sequence)" in { - - val searchString = "Reise ins Heilige Lan" - val searchExpression = - ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithoutExactSequence - - assert(searchExpression == "Reise AND ins AND Heilige AND Lan*") - - } - - "add a wildcard to the word if the search string only contains one word (non exact sequence)" in { - - val searchString = "Reis" - val searchExpression = - ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithoutExactSequence - - assert(searchExpression == "Reis*") - - } - - "combine all space separated words to a phrase but the last one and add a wildcard to it (exact sequence)" in { - - val searchString = "Reise ins Heilige Lan" - val searchExpression = - ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithExactSequence - - assert(searchExpression == """"Reise ins Heilige" AND Lan*""") - - } - - "add a wildcard to the word if the search string only contains one word (exact sequence)" in { - - val searchString = "Reis" - val searchExpression = - ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithExactSequence - - assert(searchExpression == "Reis*") - - } - - "create a regex FILTER expression for an exact match" in { - - val searchString = "Reise ins Heilige Lan" - val searchExpression = ApacheLuceneSupport - .MatchStringWhileTyping(searchString) - .generateRegexFilterStatementForExactSequenceMatch("firstProp") - - assert(searchExpression == "FILTER regex(?firstProp, 'Reise ins Heilige Lan*', 'i')") - - } - - "not create a regex FILTER expression for an exact match when only one word is provided" in { - - val searchString = "Reise" - val searchExpression = ApacheLuceneSupport - .MatchStringWhileTyping(searchString) - .generateRegexFilterStatementForExactSequenceMatch("firstProp") - - assert(searchExpression == "") - - } - - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportZSpec.scala b/webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportZSpec.scala new file mode 100644 index 0000000000..f9ec1cb355 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/util/ApacheLuceneSupportZSpec.scala @@ -0,0 +1,144 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.util + +import org.knora.webapi._ +import zio.test.ZIOSpecDefault +import zio._ +import zio.test._ + +object ApacheLuceneSupportZSpec extends ZIOSpecDefault { + + def spec: Spec[TestEnvironment with Scope, Any] = + suite("The ApacheLuceneSupport class")( + test("leave a Lucene query unchanged") { + + val searchString = "Reise Land" + val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString + + assertTrue(searchExpression == "Reise Land") + } + + + test("leave a Lucene query unchanged (2)") { + + val searchString = "Reise ins Land" + val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString + + assertTrue(searchExpression == "Reise ins Land") + } + + + test("leave a Lucene query containing phrases and terms unchanged") { + + val searchString = "\"Leonhard Euler\" Bernoulli" + val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString + + assertTrue(searchExpression == "\"Leonhard Euler\" Bernoulli") + + } + + + test("leave a Lucene query containing two phrases and one term unchanged") { + + val searchString = "\"Leonhard Euler\" \"Daniel Bernoulli\" formula" + val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString + + assertTrue(searchExpression == "\"Leonhard Euler\" \"Daniel Bernoulli\" formula") + + } + + + test("leave a Lucene query containing two phrases and two terms unchanged") { + + val searchString = "\"Leonhard Euler\" \"Daniel Bernoulli\" formula geometria" + val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString + + assertTrue(searchExpression == "\"Leonhard Euler\" \"Daniel Bernoulli\" formula geometria") + + } + + + test("get terms contained in a Lucene query") { + + val searchString = "Reise Land" + val singleTerms: Seq[String] = ApacheLuceneSupport.LuceneQueryString(searchString).getSingleTerms + + assertTrue(singleTerms.size == 2) + + } + + + test("handle one phrase correctly") { + + val searchString = "\"Leonhard Euler\"" + val searchExpression: String = ApacheLuceneSupport.LuceneQueryString(searchString).getQueryString + + assertTrue(searchExpression == "\"Leonhard Euler\"") + + } + + + test( + "combine space separated words with a logical AND and add a wildcard to the last word (non exact sequence)" + ) { + + val searchString = "Reise ins Heilige Lan" + val searchExpression = + ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithoutExactSequence + + assertTrue(searchExpression == "Reise AND ins AND Heilige AND Lan*") + + } + + + test("add a wildcard to the word if the search string only contains one word (non exact sequence)") { + + val searchString = "Reis" + val searchExpression = + ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithoutExactSequence + + assertTrue(searchExpression == "Reis*") + + } + + + test( + "combine all space separated words to a phrase but the last one and add a wildcard to it (exact sequence)" + ) { + + val searchString = "Reise ins Heilige Lan" + val searchExpression = + ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithExactSequence + + assertTrue(searchExpression == """"Reise ins Heilige" AND Lan*""") + + } + + + test("add a wildcard to the word if the search string only contains one word (exact sequence)") { + + val searchString = "Reis" + val searchExpression = + ApacheLuceneSupport.MatchStringWhileTyping(searchString).generateLiteralForLuceneIndexWithExactSequence + + assertTrue(searchExpression == "Reis*") + + } + + + test("create a regex FILTER expression for an exact match") { + + val searchString = "Reise ins Heilige Lan" + val searchExpression = ApacheLuceneSupport + .MatchStringWhileTyping(searchString) + .generateRegexFilterStatementForExactSequenceMatch("firstProp") + + assertTrue(searchExpression == "FILTER regex(?firstProp, 'Reise ins Heilige Lan*', 'i')") + + } + + + test("not create a regex FILTER expression for an exact match when only one word is provided") { + + val searchString = "Reise" + val searchExpression = ApacheLuceneSupport + .MatchStringWhileTyping(searchString) + .generateRegexFilterStatementForExactSequenceMatch("firstProp") + + assertTrue(searchExpression == "") + + } + ) +} diff --git a/webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitSpec.scala b/webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitSpec.scala deleted file mode 100644 index 5f437c6785..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitSpec.scala +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.util - -import org.knora.webapi.CoreSpec - -/** - * Tests [[Base64UrlCheckDigit]]. - */ -class Base64UrlCheckDigitSpec extends CoreSpec { - private val base64UrlCheckDigit = new Base64UrlCheckDigit - private val correctResourceID = "cmfk1DMHRBiR4-_6HXpEFA" - private val correctResourceIDCheckDigit = "n" - - "Base64UrlCheckDigit" should { - "reject a string without a check digit" in { - assert(!base64UrlCheckDigit.isValid(correctResourceID)) - } - - "calculate a check digit for a string and validate it" in { - val checkDigit = base64UrlCheckDigit.calculate(correctResourceID) - assert(checkDigit == correctResourceIDCheckDigit) - - val correctResourceIDWithCorrectCheckDigit = correctResourceID + checkDigit - assert(base64UrlCheckDigit.isValid(correctResourceIDWithCorrectCheckDigit)) - } - - "reject a string with an incorrect check digit" in { - val correctResourceIDWithIncorrectCheckDigit = correctResourceID + "m" - assert(!base64UrlCheckDigit.isValid(correctResourceIDWithIncorrectCheckDigit)) - } - - "reject a string with a missing character" in { - val resourceIDWithMissingCharacter = "cmfk1DMHRBiR4-6HXpEFA" - val resourceIDWithMissingCharacterAndCorrectCheckDigit = - resourceIDWithMissingCharacter + correctResourceIDCheckDigit - assert(!base64UrlCheckDigit.isValid(resourceIDWithMissingCharacterAndCorrectCheckDigit)) - } - - "reject a string with an incorrect character" in { - val resourceIDWithIncorrectCharacter = "cmfk1DMHRBir4-_6HXpEFA" - val resourceIDWithIncorrectCharacterAndCorrectCheckDigit = - resourceIDWithIncorrectCharacter + correctResourceIDCheckDigit - assert(!base64UrlCheckDigit.isValid(resourceIDWithIncorrectCharacterAndCorrectCheckDigit)) - } - - "reject a string with swapped characters" in { - val resourceIDWithSwappedCharacters = "cmfk1DMHRBiR4_-6HXpEFA" - val resourceIDWithSwappedCharactersAndCorrectCheckDigit = - resourceIDWithSwappedCharacters + correctResourceIDCheckDigit - assert(!base64UrlCheckDigit.isValid(resourceIDWithSwappedCharactersAndCorrectCheckDigit)) - } - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitZSpec.scala b/webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitZSpec.scala new file mode 100644 index 0000000000..86d5907505 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/util/Base64UrlCheckDigitZSpec.scala @@ -0,0 +1,60 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.util + +import zio.test.ZIOSpecDefault +import zio.Scope +import zio.test._ +import zio.test.Spec +import zio.test.TestEnvironment + +/** + * Tests [[Base64UrlCheckDigit]]. + */ +object Base64UrlCheckDigitZSpec extends ZIOSpecDefault { + private val base64UrlCheckDigit = new Base64UrlCheckDigit + private val correctResourceID = "cmfk1DMHRBiR4-_6HXpEFA" + private val correctResourceIDCheckDigit = "n" + + def spec = suite("Base64UrlCheckDigitZSpec")( + test("reject a string without a check digit") { + assertTrue(!base64UrlCheckDigit.isValid(correctResourceID)) + } + + test("calculate a check digit for a string and validate it") { + val checkDigit = base64UrlCheckDigit.calculate(correctResourceID) + val correctResourceIDWithCorrectCheckDigit = correctResourceID + checkDigit + + assertTrue(checkDigit == correctResourceIDCheckDigit) && + assertTrue(base64UrlCheckDigit.isValid(correctResourceIDWithCorrectCheckDigit)) + } + + test("reject a string with an incorrect check digit") { + val correctResourceIDWithIncorrectCheckDigit = correctResourceID + "m" + + assertTrue(!base64UrlCheckDigit.isValid(correctResourceIDWithIncorrectCheckDigit)) + } + + test("reject a string with a missing character") { + val resourceIDWithMissingCharacter = "cmfk1DMHRBiR4-6HXpEFA" + val resourceIDWithMissingCharacterAndCorrectCheckDigit = + resourceIDWithMissingCharacter + correctResourceIDCheckDigit + + assertTrue(!base64UrlCheckDigit.isValid(resourceIDWithMissingCharacterAndCorrectCheckDigit)) + } + + test("reject a string with an incorrect character") { + val resourceIDWithIncorrectCharacter = "cmfk1DMHRBir4-_6HXpEFA" + val resourceIDWithIncorrectCharacterAndCorrectCheckDigit = + resourceIDWithIncorrectCharacter + correctResourceIDCheckDigit + + assertTrue(!base64UrlCheckDigit.isValid(resourceIDWithIncorrectCharacterAndCorrectCheckDigit)) + } + + test("reject a string with swapped characters") { + val resourceIDWithSwappedCharacters = "cmfk1DMHRBiR4_-6HXpEFA" + val resourceIDWithSwappedCharactersAndCorrectCheckDigit = + resourceIDWithSwappedCharacters + correctResourceIDCheckDigit + + assertTrue(!base64UrlCheckDigit.isValid(resourceIDWithSwappedCharactersAndCorrectCheckDigit)) + } + ) +} diff --git a/webapi/src/test/scala/org/knora/webapi/util/cache/CacheUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/util/cache/CacheUtilSpec.scala index 990c522690..68663a5c1a 100644 --- a/webapi/src/test/scala/org/knora/webapi/util/cache/CacheUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/util/cache/CacheUtilSpec.scala @@ -41,10 +41,10 @@ class CacheUtilSpec private val cacheName = Authenticator.AUTHENTICATION_INVALIDATION_CACHE_NAME private val sessionId = System.currentTimeMillis().toString - override protected def beforeAll(): Unit = + final override def beforeAll(): Unit = CacheUtil.createCaches(settings.caches) - override def afterAll(): Unit = { + final override def afterAll(): Unit = { CacheUtil.removeAllCaches() TestKit.shutdownActorSystem(system) }