diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000000..bfdc9877d9 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,8 @@ +coverage: + status: + project: + default: + informational: true + patch: + default: + informational: true diff --git a/Makefile b/Makefile index c1e4e67607..0c0cd15866 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ env-file: ## write the env file used by knora-stack. ################################# .PHONY: stack-up -stack-up: docker-build env-file ## starts the knora-stack: fuseki, sipi, redis, api. +stack-up: docker-build env-file ## starts the knora-stack: fuseki, sipi, api. @docker compose -f docker-compose.yml up -d db $(CURRENT_DIR)/webapi/scripts/wait-for-db.sh @docker compose -f docker-compose.yml up -d @@ -98,12 +98,16 @@ stack-up-fast: docker-build-knora-api-image env-file ## starts the knora-stack b .PHONY: stack-up-ci stack-up-ci: KNORA_DB_REPOSITORY_NAME := knora-test-unit -stack-up-ci: docker-build env-file print-env-file ## starts the knora-stack using 'knora-test-unit' repository: fuseki, sipi, redis, api. +stack-up-ci: docker-build env-file print-env-file ## starts the knora-stack using 'knora-test-unit' repository: fuseki, sipi, api. docker-compose -f docker-compose.yml up -d .PHONY: stack-restart -stack-restart: stack-up ## re-starts the knora-stack: fuseki, sipi, redis, api. - @docker compose -f docker-compose.yml restart +stack-restart: ## re-starts the knora-stack: fuseki, sipi, api. + @docker compose -f docker-compose.yml down + @docker compose -f docker-compose.yml up -d db + $(CURRENT_DIR)/webapi/scripts/wait-for-db.sh + @docker compose -f docker-compose.yml up -d + $(CURRENT_DIR)/webapi/scripts/wait-for-knora.sh .PHONY: stack-restart-api stack-restart-api: ## re-starts the api. Usually used after loading data into fuseki. @@ -130,10 +134,6 @@ stack-logs-sipi: ## prints out and follows the logs of the 'sipi' container runn stack-logs-sipi-no-follow: ## prints out the logs of the 'sipi' container running in knora-stack. @docker compose -f docker-compose.yml logs sipi -.PHONY: stack-logs-redis -stack-logs-redis: ## prints out and follows the logs of the 'redis' container running in knora-stack. - @docker compose -f docker-compose.yml logs -f redis - .PHONY: stack-logs-api stack-logs-api: ## prints out and follows the logs of the 'api' container running in knora-stack. @docker compose -f docker-compose.yml logs -f api @@ -164,11 +164,11 @@ stack-config: env-file ## stack without api .PHONY: stack-without-api -stack-without-api: stack-up ## starts the knora-stack without knora-api: fuseki, sipi, redis. +stack-without-api: stack-up ## starts the knora-stack without knora-api: fuseki and sipi only. @docker compose -f docker-compose.yml stop api .PHONY: stack-without-api-and-sipi -stack-without-api-and-sipi: stack-up ## starts the knora-stack without knora-api and sipi: fuseki, redis. +stack-without-api-and-sipi: stack-up ## starts the knora-stack without knora-api and sipi: fuseki only. @docker compose -f docker-compose.yml stop api @docker compose -f docker-compose.yml stop sipi @@ -348,11 +348,11 @@ clean-sipi-projects: ## deletes all files uploaded within a project @rm -rf sipi/images/originals/[0-9A-F][0-9A-F][0-9A-F][0-9A-F] .PHONY: check -check: # Run code formating check +check: ## Run code formating check @sbt "check" .PHONY: fmt -fmt: # Run code formating fix +fmt: ## Run code formating fix @sbt "fmt" diff --git a/docs/05-internals/design/principles/design-overview.md b/docs/05-internals/design/principles/design-overview.md index e79b970764..c33e8b530d 100644 --- a/docs/05-internals/design/principles/design-overview.md +++ b/docs/05-internals/design/principles/design-overview.md @@ -7,301 +7,36 @@ ## Introduction -Knora's responsibilities include: +DSP-API's responsibilites are: -- Receiving, validating, authenticating, and authorising HTTP requests from - clients (which may be web browsers or other software) to query or update - data in a Knora repository. -- Querying and updating the repository on behalf of clients. -- Filtering query results according to the user's permissions. -- Transforming query results into DSP-API responses. -- Ensuring that ontologies and data in the triplestore are consistent and - conform to the requirements of the - [knora-base](../../../02-knora-ontologies/knora-base.md) ontology. -- Managing the versioning of data in the triplestore. -- Working with [Sipi](http://sipi.io) to store files that cannot be stored - as RDF data. +- Querying, creating, updating, and deleting data +- Creating, updating and deleting data models (ontologies) +- Managing projects and users +- Authentication of clients +- Authorisation of clients' requests -Knora is written in [Scala](http://www.scala-lang.org/), using the +DSP-API is developed with [Scala](http://www.scala-lang.org/) and uses the [Akka](http://akka.io/) framework for message-based concurrency. It is -designed to work with any standards-compliant triplestore via -the [SPARQL 1.1 Protocol](http://www.w3.org/TR/sparql11-protocol/), but is currently -tested only with [Apache Jena Fuseki](https://jena.apache.org) (with support -for other triplestores coming soon). +designed to work with the [Apache Jena Fuseki](https://jena.apache.org) triplestore +which is compliant to the [SPARQL 1.1 Protocol](http://www.w3.org/TR/sparql11-protocol/). +For file storage, it uses [Sipi](http://sipi.io). -## Knora APIs +## DSP-API Versions -Knora supports different versions of its API for working with humanities data: +DSP-API supports different versions of its API for working with humanities data: -- [DSP-API v2](../../../03-apis/api-v2/index.md), a standards-based - API currently under development. -- [DSP-API v1](../../../03-apis/api-v1/index.md), a stable, legacy API - that focuses on maintaining compatibility with applications that used - Knora's prototype software. +- [DSP-API v2](../../../03-apis/api-v2/index.md), the actual DSP-API that should be used +- [DSP-API v1](../../../03-apis/api-v1/index.md), legacy API compatibile with applications + that used the prototype software. There is also a [Knora admin API](../../../03-apis/api-admin/index.md) for -administering Knora repositories. +administering DSP projects. -The Knora code base includes some functionality that is shared by these different +The DSP-API code base includes some functionality that is shared by these different APIs, as well as separate packages for each API. Internally, Knora APIs v1 and v2 both use functionality in the admin API. DSP-API v1 uses some functionality from API v2, but API v2 does not depend on API v1. -## Design Diagram - -![A high-level diagram of Knora.](figures/design-diagram.png "A high-level diagram of Knora.") - -## Modules - -### HTTP Module - -- `org.knora.webapi.routing`: Knora's [Akka HTTP](https://doc.akka.io/docs/akka-http/current/index.html) routes. - Each routing class matches URL patterns for requests involving some particular - type of data in the repository. Routes are API-specific. For example, - `ResourcesRouteV2` matches URL paths starting with `/v2/resources`, which - represent requests involving Knora resources. -- `org.knora.webapi.http`: a few HTTP-related constants and utilities. - -### Responders Module - -- `org.knora.webapi.responders`: Each responder is an actor that is responsible for managing - some particular type of data in the repository. A responder receives messages from - a route, does some work (e.g. querying the triplestore), and returns a reply - message. Responders are API-specific and can communicate with other responders - via messages. For example, in API v2, `ResourcesResponderV2` handles requests - involving resources, and delegates some of its tasks to `ValuesResponderV2`, - which is responsible for requests involving values. - -### Store Module - -- `org.knora.webapi.store`: Contains actors that connect to triplestores. The - most important one is `HttpTriplestoreConnector`, which communicates with - triplestores via the - [SPARQL 1.1 Protocol](http://www.w3.org/TR/sparql11-protocol/). - -### Shared Between Modules - -- `org.knora.webapi`: Contains core classes such as `Main`, which starts the - Knora server, and `SettingsImpl`, which represents the application settings - that are loaded using the [Typesafe Config](https://github.com/lightbend/config) - library. -- `org.knora.webapi.util`: Utilities needed by different parts of the application, - such as parsing and formatting tools. -- `org.knora.webapi.messages`: The Akka messages used by each responder. -- `org.knora.webapi.messages.twirl`: Text-generation templates for use with - [the Twirl template engine](https://github.com/playframework/twirl). Knora - uses Twirl to generate SPARQL requests and other types of text documents. - -## Actor Supervision and Creation - -At system start, the main application supervisor actor is created in -`LiveCore.scala`: - -```scala - /** - * The main application supervisor actor which is at the top of the actor - * hierarchy. All other actors are instantiated as child actors. Further, - * this actor is responsible for the execution of the startup and shutdown - * sequences. - */ - lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with LiveManagers) - .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) -``` - -and through mixin also the store and responder manager actors: - -```scala - /** - * The actor that forwards messages to actors that deal with persistent storage. - */ - lazy val storeManager: ActorRef = context.actorOf( - Props(new StoreManager(self) with LiveActorMaker) - .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = StoreManagerActorName - ) - - /** - * The actor that forwards messages to responder actors to handle API requests. - */ - lazy val responderManager: ActorRef = context.actorOf( - Props(new ResponderManager(self) with LiveActorMaker) - .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = RESPONDER_MANAGER_ACTOR_NAME - ) -``` - - -The `ApplicationActor` is the first actor in the application. All other actors -are children of this actor and thus it takes also the role of the supervisor -actor. It accepts messages for starting and stopping the Knora-API, holds the -current state of the application, and is responsible for coordination of -the startup and shutdown sequence. Further, it forwards any messages meant -for responders or the store to the respective actor. - -In most cases, there is only one instance of each supervised actor; such -actors do their work asynchronously in futures, so there would be no -advantage in using an actor pool. A few actors do have pools of instances, -because they do their work synchronously; this allows concurrency to be controlled -by setting the size of each pool. These pools are configured in `application.conf` -under `akka.actor.deployment`. - -The `ApplicationActor` also starts the HTTP service as part of the startup -sequence: - -```scala - /** - * Starts the Knora-API server. - * - * @param ignoreRepository if `true`, don't read anything from the repository on startup. - * @param requiresIIIFService if `true`, ensure that the IIIF service is started. - * @param retryCnt how many times was this command tried - */ - def appStart(ignoreRepository: Boolean, requiresIIIFService: Boolean, retryCnt: Int): Unit = { - - val bindingFuture: Future[Http.ServerBinding] = Http() - .bindAndHandle( - Route.handlerFlow(apiRoutes), - knoraSettings.internalKnoraApiHost, - knoraSettings.internalKnoraApiPort - ) - - bindingFuture onComplete { - case Success(_) => - - // Transition to ready state - self ! AppReady() - - if (knoraSettings.prometheusEndpoint) { - // Load Kamon monitoring - Kamon.loadModules() - } - - // Kick of startup procedure. - self ! InitStartUp(ignoreRepository, requiresIIIFService) - - case Failure(ex) => - if (retryCnt < 5) { - logger.error( - "Failed to bind to {}:{}! - {} - retryCnt: {}", - knoraSettings.internalKnoraApiHost, - knoraSettings.internalKnoraApiPort, - ex.getMessage, - retryCnt - ) - self ! AppStart(ignoreRepository, requiresIIIFService, retryCnt + 1) - } else { - logger.error( - "Failed to bind to {}:{}! - {}", - knoraSettings.internalKnoraApiHost, - knoraSettings.internalKnoraApiPort, - ex.getMessage - ) - self ! AppStop() - } - } - } -``` - - -## Coordinated Application Startup - -To coordinate necessary startup tasks, the application goes through a few states at startup: - - - Stopped: Application starting. Http layer is still not started. - - StartingUp: Http layer is started. Only '/health' and monitoring routes are working. - - WaitingForRepository: Repository check is initiated but not yet finished. - - RepositoryReady: Repository check has finished and repository is available. - - CreatingCaches: Creating caches is initiated but not yet finished. - - CachesReady: Caches are created and ready for use. - - LoadingOntologies: Loading of ontologies is initiated but not yet finished. - - OntologiesReady: Ontologies are loaded. - - MaintenanceMode: During backup or other maintenance tasks, so that access to the API is closed - - Running: Running state. All APIs are open. - -During the `WaitingForRepository` state, if the repository is not configured or -available, the system will indefinitely retry to access it. This allows for -prolonged startup times of the repository. Also, if checking the repository -returns an error, e.g., because the repository data needs to be migrated first, -the application will shutdown. - -## Concurrency - -In general, Knora is written in a functional style, avoiding shared mutable -state. This makes it easier to reason about concurrency, and -eliminates an important potential source of bugs (see [Out of the Tar Pit](http://curtclifton.net/papers/MoseleyMarks06a.pdf)). - -The routes and actors in Knora use Akka's `ask` pattern, -rather than the `tell` pattern, to send messages and receive responses, -because this simplifies the code considerably (using `tell` would -require actors to maintain complex mutable state), with no apparent -reduction in performance. - -To manage asynchronous communication between actors, the DSP-API -server uses Scala's `Future` monad extensively. See -[Futures with Akka](futures-with-akka.md) for details. - -We use Akka's asynchronous logging interface (see [Akka Logging](http://doc.akka.io/docs/akka/current/scala/logging.html)). - -## What the Responders Do - -In Knora, a responder is an actor that receives a -request message (a Scala case class) in the `ask` pattern, does some work -(e.g. getting data from the triplestore), and returns a reply message (another -case class). These reply messages are are defined in `org.knora.webapi.messages`. -A responder can produce a reply representing a complete API -response, or part of a response that will be used by another responder. -If it's a complete API response, there is an API-specific mechanism for -converting it into the response format that the client expects. - -## Store Module (org.knora.webapi.store package) - -The store module is used for accessing the triplestore and other -external storage providers. - -All access to the Store module goes through the `StoreManager` -supervisor actor. The `StoreManager` creates pools of actors, such as -`HttpTriplestoreActor`, that interface with the storage providers. - -The contents of the `store` package are not used directly by other -packages, which interact with the `store` package only by sending -messages to `StoreManager`. - -Parsing of SPARQL query results is handled by this module. - -See [Store Module](store-module.md) for a more detailed discussion. - -## Triplestore Access - -SPARQL queries are generated from templates, using the -[Twirl](https://github.com/playframework/twirl) template engine. For -example, if we're querying a resource, the template will contain a -placeholder for the resource's IRI. The templates can be found under -`src/main/twirl/queries/sparql`. - -To perform a SPARQL SELECT query, a responder sends a `SparqlSelectRequest` -message to the `storeManager` actor, like this: - -```scala - for { - isEntityUsedSparql <- Future(queries.sparql.v2.txt.isEntityUsed( - entityIri = entityIri, - ignoreKnoraConstraints = ignoreKnoraConstraints, - ignoreRdfSubjectAndObject = ignoreRdfSubjectAndObject - ).toString()) - - isEntityUsedResponse: SparqlSelectResponse <- (storeManager ? SparqlSelectRequest(isEntityUsedSparql)).mapTo[SparqlSelectResponse] -``` - - -The reply message, `SparqlSelectResponse`, is a data structure containing the rows -that were returned as the query result. - -To perform a SPARQL CONSTRUCT query, you can use `SparqlExtendedConstructRequest`, -and the response will be a `SparqlExtendedConstructResponse`. - ## Error Handling The error-handling design has these aims: @@ -320,9 +55,6 @@ The error-handling design has these aims: by bad input. 6. When logging errors, include the full JVM stack trace. -The design does not yet include, but could easily accommodate, -translations of error messages into different languages. - A hierarchy of exception classes is defined in `Exceptions.scala`, representing different sorts of errors that could occur. The hierarchy has two main branches: diff --git a/docs/05-internals/design/principles/figures/design-diagram.key b/docs/05-internals/design/principles/figures/design-diagram.key deleted file mode 100644 index 3ef3887025..0000000000 Binary files a/docs/05-internals/design/principles/figures/design-diagram.key and /dev/null differ diff --git a/docs/05-internals/design/principles/figures/design-diagram.png b/docs/05-internals/design/principles/figures/design-diagram.png deleted file mode 100644 index 4bd51e95f4..0000000000 Binary files a/docs/05-internals/design/principles/figures/design-diagram.png and /dev/null differ diff --git a/dsp-project/interface/src/main/scala/dsp/project/listener/external/ProjectListenerExternal.scala b/dsp-project/interface/src/main/scala/dsp/project/listener/external/ProjectListenerExternal.scala index 24dd0971ac..157ae36e49 100644 --- a/dsp-project/interface/src/main/scala/dsp/project/listener/external/ProjectListenerExternal.scala +++ b/dsp-project/interface/src/main/scala/dsp/project/listener/external/ProjectListenerExternal.scala @@ -4,3 +4,5 @@ */ package dsp.project.listener.external + +object placeholder diff --git a/dsp-project/interface/src/main/scala/dsp/project/listener/internal/ProjectListenerInternal.scala b/dsp-project/interface/src/main/scala/dsp/project/listener/internal/ProjectListenerInternal.scala index d1250b9f2a..398153be93 100644 --- a/dsp-project/interface/src/main/scala/dsp/project/listener/internal/ProjectListenerInternal.scala +++ b/dsp-project/interface/src/main/scala/dsp/project/listener/internal/ProjectListenerInternal.scala @@ -4,3 +4,5 @@ */ package dsp.project.listener.internal + +object placeholder diff --git a/dsp-project/interface/src/main/scala/dsp/project/route/ProjectRoute.scala b/dsp-project/interface/src/main/scala/dsp/project/route/ProjectRoute.scala index 13b9eaef43..2d623e467d 100644 --- a/dsp-project/interface/src/main/scala/dsp/project/route/ProjectRoute.scala +++ b/dsp-project/interface/src/main/scala/dsp/project/route/ProjectRoute.scala @@ -4,3 +4,5 @@ */ package dsp.project.route + +object placeholder diff --git a/dsp-project/interface/src/test/scala/dsp/project/listener/external/ProjectListenerExternalSpec.scala b/dsp-project/interface/src/test/scala/dsp/project/listener/external/ProjectListenerExternalSpec.scala index 24dd0971ac..157ae36e49 100644 --- a/dsp-project/interface/src/test/scala/dsp/project/listener/external/ProjectListenerExternalSpec.scala +++ b/dsp-project/interface/src/test/scala/dsp/project/listener/external/ProjectListenerExternalSpec.scala @@ -4,3 +4,5 @@ */ package dsp.project.listener.external + +object placeholder diff --git a/dsp-project/interface/src/test/scala/dsp/project/listener/internal/ProjectListenerInternalSpec.scala b/dsp-project/interface/src/test/scala/dsp/project/listener/internal/ProjectListenerInternalSpec.scala index d1250b9f2a..398153be93 100644 --- a/dsp-project/interface/src/test/scala/dsp/project/listener/internal/ProjectListenerInternalSpec.scala +++ b/dsp-project/interface/src/test/scala/dsp/project/listener/internal/ProjectListenerInternalSpec.scala @@ -4,3 +4,5 @@ */ package dsp.project.listener.internal + +object placeholder diff --git a/dsp-project/interface/src/test/scala/dsp/project/route/ProjectRouteSpec.scala b/dsp-project/interface/src/test/scala/dsp/project/route/ProjectRouteSpec.scala index 13b9eaef43..2d623e467d 100644 --- a/dsp-project/interface/src/test/scala/dsp/project/route/ProjectRouteSpec.scala +++ b/dsp-project/interface/src/test/scala/dsp/project/route/ProjectRouteSpec.scala @@ -4,3 +4,5 @@ */ package dsp.project.route + +object placeholder diff --git a/dsp-project/repo/src/main/scala/dsp/project/repo/impl/ProjectRepoLive.scala b/dsp-project/repo/src/main/scala/dsp/project/repo/impl/ProjectRepoLive.scala index c5b61615cc..b6c9446ea1 100644 --- a/dsp-project/repo/src/main/scala/dsp/project/repo/impl/ProjectRepoLive.scala +++ b/dsp-project/repo/src/main/scala/dsp/project/repo/impl/ProjectRepoLive.scala @@ -73,7 +73,7 @@ final case class ProjectRepoLive( (for { exists <- lookupTableShortCodeToUuid.contains(shortCode).commit _ <- if (exists) ZIO.fail(None) // project shortcode does exist - else ZIO.succeed(()) // project shortcode does not exist + else ZIO.unit // project shortcode does not exist } yield ()).tapBoth( _ => ZIO.logInfo(s"Checked for project with shortCode '${shortCode.value}', project not found."), uuid => ZIO.logInfo(s"Checked for project with shortCode '${shortCode.value}', found project with UUID '$uuid'.") diff --git a/dsp-project/repo/src/test/scala/dsp/project/repo/impl/ProjectRepoMock.scala b/dsp-project/repo/src/test/scala/dsp/project/repo/impl/ProjectRepoMock.scala index b430f0fa0e..cc35fe84c3 100644 --- a/dsp-project/repo/src/test/scala/dsp/project/repo/impl/ProjectRepoMock.scala +++ b/dsp-project/repo/src/test/scala/dsp/project/repo/impl/ProjectRepoMock.scala @@ -73,7 +73,7 @@ final case class ProjectRepoMock( (for { exists <- lookupTableShortCodeToUuid.contains(shortCode).commit _ <- if (exists) ZIO.fail(None) // project shortcode does exist - else ZIO.succeed(()) // project shortcode does not exist + else ZIO.unit // project shortcode does not exist } yield ()).tapBoth( _ => ZIO.logInfo(s"Checked for project with shortCode '$shortCode', project not found."), uuid => ZIO.logInfo(s"Checked for project with shortCode '$shortCode', found project with UUID '$uuid'.") diff --git a/dsp-role/core/src/test/scala/dsp/role/api/RoleApiSpec.scala b/dsp-role/core/src/test/scala/dsp/role/api/RoleApiSpec.scala index 4f52163360..f0ac5ab9c7 100644 --- a/dsp-role/core/src/test/scala/dsp/role/api/RoleApiSpec.scala +++ b/dsp-role/core/src/test/scala/dsp/role/api/RoleApiSpec.scala @@ -8,4 +8,4 @@ package dsp.role.api /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-role/interface/src/main/scala/dsp/role/listener/external/RoleListenerExternal.scala b/dsp-role/interface/src/main/scala/dsp/role/listener/external/RoleListenerExternal.scala index 034906962c..3525ba5667 100644 --- a/dsp-role/interface/src/main/scala/dsp/role/listener/external/RoleListenerExternal.scala +++ b/dsp-role/interface/src/main/scala/dsp/role/listener/external/RoleListenerExternal.scala @@ -8,4 +8,4 @@ package dsp.role.listener.external /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-role/interface/src/main/scala/dsp/role/listener/internal/RoleListenerInternal.scala b/dsp-role/interface/src/main/scala/dsp/role/listener/internal/RoleListenerInternal.scala index 7cae25efca..31e05a1fd0 100644 --- a/dsp-role/interface/src/main/scala/dsp/role/listener/internal/RoleListenerInternal.scala +++ b/dsp-role/interface/src/main/scala/dsp/role/listener/internal/RoleListenerInternal.scala @@ -8,4 +8,4 @@ package dsp.role.listener.internal /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-role/interface/src/main/scala/dsp/role/route/RoleRoute.scala b/dsp-role/interface/src/main/scala/dsp/role/route/RoleRoute.scala index 66c2294cc2..d0c8f759ec 100644 --- a/dsp-role/interface/src/main/scala/dsp/role/route/RoleRoute.scala +++ b/dsp-role/interface/src/main/scala/dsp/role/route/RoleRoute.scala @@ -8,4 +8,4 @@ package dsp.role.route /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-role/interface/src/test/scala/dsp/role/listener/external/RoleListenerExternalSpec.scala b/dsp-role/interface/src/test/scala/dsp/role/listener/external/RoleListenerExternalSpec.scala index 034906962c..3525ba5667 100644 --- a/dsp-role/interface/src/test/scala/dsp/role/listener/external/RoleListenerExternalSpec.scala +++ b/dsp-role/interface/src/test/scala/dsp/role/listener/external/RoleListenerExternalSpec.scala @@ -8,4 +8,4 @@ package dsp.role.listener.external /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-role/interface/src/test/scala/dsp/role/listener/internal/RoleListenerInternalSpec.scala b/dsp-role/interface/src/test/scala/dsp/role/listener/internal/RoleListenerInternalSpec.scala index 7cae25efca..31e05a1fd0 100644 --- a/dsp-role/interface/src/test/scala/dsp/role/listener/internal/RoleListenerInternalSpec.scala +++ b/dsp-role/interface/src/test/scala/dsp/role/listener/internal/RoleListenerInternalSpec.scala @@ -8,4 +8,4 @@ package dsp.role.listener.internal /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-role/interface/src/test/scala/dsp/role/route/RoleRouteSpec.scala b/dsp-role/interface/src/test/scala/dsp/role/route/RoleRouteSpec.scala index 66c2294cc2..d0c8f759ec 100644 --- a/dsp-role/interface/src/test/scala/dsp/role/route/RoleRouteSpec.scala +++ b/dsp-role/interface/src/test/scala/dsp/role/route/RoleRouteSpec.scala @@ -8,4 +8,4 @@ package dsp.role.route /** * To be implemented... */ -object placeholder {} +object placeholder diff --git a/dsp-user/core/src/test/scala/dsp/user/api/UserApiSpec.scala b/dsp-user/core/src/test/scala/dsp/user/api/UserApiSpec.scala index 752c5a7093..742aa581ba 100644 --- a/dsp-user/core/src/test/scala/dsp/user/api/UserApiSpec.scala +++ b/dsp-user/core/src/test/scala/dsp/user/api/UserApiSpec.scala @@ -7,4 +7,4 @@ package dsp.user.api // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/interface/src/main/scala/dsp/user/listener/external/UserListenerExternal.scala b/dsp-user/interface/src/main/scala/dsp/user/listener/external/UserListenerExternal.scala index 707ab682b1..e705fb991c 100644 --- a/dsp-user/interface/src/main/scala/dsp/user/listener/external/UserListenerExternal.scala +++ b/dsp-user/interface/src/main/scala/dsp/user/listener/external/UserListenerExternal.scala @@ -7,4 +7,4 @@ package dsp.user.listener.external // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/interface/src/main/scala/dsp/user/listener/internal/UserListenerInternal.scala b/dsp-user/interface/src/main/scala/dsp/user/listener/internal/UserListenerInternal.scala index 6459b362ab..8c5e323b95 100644 --- a/dsp-user/interface/src/main/scala/dsp/user/listener/internal/UserListenerInternal.scala +++ b/dsp-user/interface/src/main/scala/dsp/user/listener/internal/UserListenerInternal.scala @@ -7,4 +7,4 @@ package dsp.user.listener.internal // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/interface/src/main/scala/dsp/user/route/UserRoute.scala b/dsp-user/interface/src/main/scala/dsp/user/route/UserRoute.scala index 3db4a717f2..85db86dc14 100644 --- a/dsp-user/interface/src/main/scala/dsp/user/route/UserRoute.scala +++ b/dsp-user/interface/src/main/scala/dsp/user/route/UserRoute.scala @@ -7,4 +7,4 @@ package dsp.user.route // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/interface/src/test/scala/dsp/user/listener/external/UserListenerExternalSpec.scala b/dsp-user/interface/src/test/scala/dsp/user/listener/external/UserListenerExternalSpec.scala index 707ab682b1..e705fb991c 100644 --- a/dsp-user/interface/src/test/scala/dsp/user/listener/external/UserListenerExternalSpec.scala +++ b/dsp-user/interface/src/test/scala/dsp/user/listener/external/UserListenerExternalSpec.scala @@ -7,4 +7,4 @@ package dsp.user.listener.external // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/interface/src/test/scala/dsp/user/listener/internal/UserListenerInternalSpec.scala b/dsp-user/interface/src/test/scala/dsp/user/listener/internal/UserListenerInternalSpec.scala index 6459b362ab..8c5e323b95 100644 --- a/dsp-user/interface/src/test/scala/dsp/user/listener/internal/UserListenerInternalSpec.scala +++ b/dsp-user/interface/src/test/scala/dsp/user/listener/internal/UserListenerInternalSpec.scala @@ -7,4 +7,4 @@ package dsp.user.listener.internal // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/interface/src/test/scala/dsp/user/route/UserRouteSpec.scala b/dsp-user/interface/src/test/scala/dsp/user/route/UserRouteSpec.scala index 3db4a717f2..85db86dc14 100644 --- a/dsp-user/interface/src/test/scala/dsp/user/route/UserRouteSpec.scala +++ b/dsp-user/interface/src/test/scala/dsp/user/route/UserRouteSpec.scala @@ -7,4 +7,4 @@ package dsp.user.route // this placeholder can be removed as soon as the code are there // without it there is a warning -object placeholder {} +object placeholder diff --git a/dsp-user/repo/src/main/scala/dsp/user/repo/impl/UserRepoLive.scala b/dsp-user/repo/src/main/scala/dsp/user/repo/impl/UserRepoLive.scala index 1a212ad9c2..b4a8418218 100644 --- a/dsp-user/repo/src/main/scala/dsp/user/repo/impl/UserRepoLive.scala +++ b/dsp-user/repo/src/main/scala/dsp/user/repo/impl/UserRepoLive.scala @@ -91,8 +91,8 @@ final case class UserRepoLive( (for { usernameExists <- lookupTableUsernameToUuid.contains(username).commit _ <- usernameExists match { - case false => ZIO.succeed(()) // username does not exist - case true => ZIO.fail(None) // username does exist + case false => ZIO.unit // username does not exist + case true => ZIO.fail(None) // username does exist } } yield ()).tap(_ => ZIO.logInfo(s"Username '${username.value}' was checked")) @@ -103,8 +103,8 @@ final case class UserRepoLive( (for { emailExists <- lookupTableEmailToUuid.contains(email).commit _ <- emailExists match { - case false => ZIO.succeed(()) // email does not exist - case true => ZIO.fail(None) // email does exist + case false => ZIO.unit // email does not exist + case true => ZIO.fail(None) // email does exist } } yield ()).tap(_ => ZIO.logInfo(s"Email '${email.value}' was checked")) diff --git a/dsp-user/repo/src/test/scala/dsp/user/repo/impl/UserRepoMock.scala b/dsp-user/repo/src/test/scala/dsp/user/repo/impl/UserRepoMock.scala index 29a6a9eb7a..93f92e285f 100644 --- a/dsp-user/repo/src/test/scala/dsp/user/repo/impl/UserRepoMock.scala +++ b/dsp-user/repo/src/test/scala/dsp/user/repo/impl/UserRepoMock.scala @@ -91,8 +91,8 @@ final case class UserRepoMock( (for { usernameExists <- lookupTableUsernameToUuid.contains(username).commit _ <- usernameExists match { - case false => ZIO.succeed(()) // username does not exist - case true => ZIO.fail(None) // username does exist + case false => ZIO.unit // username does not exist + case true => ZIO.fail(None) // username does exist } } yield ()).tap(_ => ZIO.logInfo(s"Username '${username.value}' was checked")) @@ -103,8 +103,8 @@ final case class UserRepoMock( (for { emailExists <- lookupTableEmailToUuid.contains(email).commit _ <- emailExists match { - case false => ZIO.succeed(()) // email does not exist - case true => ZIO.fail(None) // email does exist + case false => ZIO.unit // email does not exist + case true => ZIO.fail(None) // email does exist } } yield ()).tap(_ => ZIO.logInfo(s"Email '${email.value}' was checked")) diff --git a/webapi/src/main/resources/application.conf b/webapi/src/main/resources/application.conf index 5d1b12772c..0afd07e262 100644 --- a/webapi/src/main/resources/application.conf +++ b/webapi/src/main/resources/application.conf @@ -267,6 +267,8 @@ app { allow-reload-over-http = false allow-reload-over-http = ${?KNORA_WEBAPI_ALLOW_RELOAD_OVER_HTTP} + fallback-language = "en" + knora-api { // relevant for direct communication inside the knora stack internal-host = "0.0.0.0" @@ -304,11 +306,8 @@ app { file-server-path = "server" - v2 { - file-metadata-route = "knora.json" - move-file-route = "store" - delete-temp-file-route = "delete_temp_file" - } + move-file-route = "store" + delete-temp-file-route = "delete_temp_file" image-mime-types = ["image/tiff", "image/jpeg", "image/png", "image/jp2", "image/jpx"] document-mime-types = [ @@ -430,8 +429,8 @@ app { gui { // The default size of resource type icons. TODO: put icon sizes in the triplestore instead. default-icon-size { - dimX = 32 - dimY = 32 + dim-x = 32 + dim-y = 32 } } @@ -442,7 +441,6 @@ app { triplestore { dbtype = "fuseki" dbtype = ${?KNORA_WEBAPI_TRIPLESTORE_DBTYPE} - // dbtype = "fake-triplestore" use-https = false use-https = ${?KNORA_WEBAPI_TRIPLESTORE_USE_HTTPS} @@ -471,8 +469,6 @@ app { password = ${?KNORA_WEBAPI_TRIPLESTORE_FUSEKI_PASSWORD} } - reload-on-start = false // ignored if "memory" as it will always reload - // If true, the time taken by each SPARQL query is logged at DEBUG level. To see these messages, // set loglevel = "DEBUG" above, and // @@ -499,16 +495,16 @@ app { } } + client-test-data-service { + collect-client-test-data = false + } + monitoring { prometheus-endpoint: false prometheus-endpoint: ${?KNORA_WEBAPI_PROMETHEUS_ENDPOINT} } } -user { - default-language: "en" -} - kamon.prometheus.embedded-server { # Hostname and port used by the embedded web server to publish the diff --git a/webapi/src/main/scala/org/knora/webapi/Main.scala b/webapi/src/main/scala/org/knora/webapi/Main.scala index f8d221ec89..e84789188c 100644 --- a/webapi/src/main/scala/org/knora/webapi/Main.scala +++ b/webapi/src/main/scala/org/knora/webapi/Main.scala @@ -2,7 +2,6 @@ * 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 zio._ @@ -12,6 +11,8 @@ import org.knora.webapi.core.AppServer object Main extends ZIOApp { + override def environmentTag: EnvironmentTag[Environment] = EnvironmentTag[Environment] + /** * The `Environment` that we require to exist at startup. */ @@ -21,19 +22,13 @@ object Main extends ZIOApp { * `Bootstrap` will ensure that everything is instantiated when the Runtime is created * and cleaned up when the Runtime is shutdown. */ - override val bootstrap: ZLayer[ + override def bootstrap: ZLayer[ ZIOAppArgs with Scope, Any, Environment ] = ZLayer.empty ++ Runtime.removeDefaultLoggers ++ SLF4J.slf4j ++ core.LayersLive.dspLayersLive - /* Needed for ZIO type magic */ - override val environmentTag: EnvironmentTag[Environment] = EnvironmentTag[Environment] - /* Here we start our Application */ - override val run = - (for { - never <- ZIO.never - } yield never).provideLayer(AppServer.live) + override def run = AppServer.live.launch } diff --git a/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala b/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala index 5a60b0b962..a28ac84bfb 100644 --- a/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala +++ b/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala @@ -3,11 +3,13 @@ package org.knora.webapi.auth import spray.json.JsValue import zio._ +import scala.concurrent.duration + import org.knora.webapi._ import org.knora.webapi.config._ import org.knora.webapi.routing.JWTHelper -final case class JWTService(config: AppConfig) { +final case class JWTService(secret: String, longevity: duration.Duration, issuer: String) { /** * Creates a new JWT token for a specific user and holds some additional @@ -20,9 +22,9 @@ final case class JWTService(config: AppConfig) { ZIO.succeed { JWTHelper.createToken( userIri = id, - secret = config.jwtSecretKey, - longevity = config.jwtLongevityAsDuration, - issuer = config.knoraApi.externalKnoraApiHostPort, + secret = secret, + longevity = longevity, + issuer = issuer, content = content ) } @@ -33,6 +35,6 @@ object JWTService { ZLayer { for { config <- ZIO.service[AppConfig] - } yield JWTService(config) + } yield JWTService(config.jwtSecretKey, config.jwtLongevityAsDuration, config.knoraApi.externalKnoraApiHostPort) } } 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 4e606654e8..b05f8f24ef 100644 --- a/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala +++ b/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala @@ -4,17 +4,24 @@ import com.typesafe.config.ConfigFactory import zio._ import zio.config._ +import java.nio.file.Files +import java.nio.file.Path import java.nio.file.Paths import scala.concurrent.duration +import scala.util.Failure +import scala.util.Success +import scala.util.Try +import dsp.errors.FileWriteException import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.rdf.RdfFeatureFactory +import org.knora.webapi.util.cache.CacheUtil import typesafe._ import magnolia._ /** - * Represents (eventually) the complete configuration as defined in application.conf. + * Represents the configuration as defined in application.conf. */ final case class AppConfig( testing: Boolean = false, @@ -27,25 +34,64 @@ final case class AppConfig( jwtLongevity: String, cookieDomain: String, allowReloadOverHttp: Boolean, - knoraApi: KnoraAPI, + fallbackLanguage: String, + knoraApi: KnoraApi, sipi: Sipi, ark: Ark, + salsah1: Salsah1, + caches: List[CacheConfig], + tmpDatadir: String, + datadir: String, + maxResultsPerSearchResultPage: Int, + standoffPerPage: Int, + v2: V2, + gui: Gui, + routesToReject: List[String], triplestore: Triplestore, - shacl: Shacl + shacl: Shacl, + cacheService: CacheService, + clientTestDataService: ClientTestDataService ) { val jwtLongevityAsDuration = scala.concurrent.duration.Duration(jwtLongevity) + val defaultTimeoutAsDuration = + scala.concurrent.duration.Duration.apply(defaultTimeout).asInstanceOf[duration.FiniteDuration] + val cacheConfigs: Seq[org.knora.webapi.util.cache.CacheUtil.KnoraCacheConfig] = caches.map { c => + CacheUtil.KnoraCacheConfig( + c.cacheName, + c.maxElementsInMemory, + c.overflowToDisk, + c.eternal, + c.timeToLiveSeconds, + c.timeToIdleSeconds + ) + } + + // create the directories + val tmpDataDirCreation: Try[Path] = Try { + Files.createDirectories(Paths.get(tmpDatadir)) + } + tmpDataDirCreation match { + case Success(_) => ZIO.logInfo(s"Created tmp directory $tmpDatadir") + case Failure(e) => throw FileWriteException(s"Tmp data directory $tmpDatadir could not be created: ${e.getMessage}") + } + + val dataDirCreation: Try[Path] = Try { + Files.createDirectories(Paths.get(datadir)) + } + dataDirCreation match { + case Success(_) => ZIO.logInfo(s"Created directory $datadir") + case Failure(e) => throw FileWriteException(s"Data directory $datadir could not be created: ${e.getMessage}") + } + } -final case class KnoraAPI( +final case class KnoraApi( internalHost: String, internalPort: Int, externalProtocol: String, externalHost: String, externalPort: Int ) { - val internalKnoraApiHostPort: String = internalHost + (if (internalPort != 80) - ":" + internalPort - else "") val internalKnoraApiBaseUrl: String = "http://" + internalHost + (if (internalPort != 80) ":" + internalPort else "") @@ -79,7 +125,8 @@ final case class Sipi( externalHost: String, externalPort: Int, fileServerPath: String, - v2: V2, + moveFileRoute: String, + deleteTempFileRoute: String, imageMimeTypes: List[String], documentMimeTypes: List[String], textMimeTypes: List[String], @@ -87,26 +134,64 @@ final case class Sipi( audioMimeTypes: List[String], archiveMimeTypes: List[String] ) { - def internalBaseUrl: String = "http://" + internalHost + (if (internalPort != 80) + val internalBaseUrl: String = "http://" + internalHost + (if (internalPort != 80) ":" + internalPort else "") - def externalBaseUrl: String = "http://" + externalHost + (if (externalPort != 80) + val externalBaseUrl: String = "http://" + externalHost + (if (externalPort != 80) ":" + externalPort else "") val timeoutInSeconds: duration.Duration = scala.concurrent.duration.Duration(timeout) -} -final case class V2( - fileMetadataRoute: String, - moveFileRoute: String, - deleteTempFileRoute: String -) +} final case class Ark( resolver: String, assignedNumber: Int ) +final case class Salsah1( + baseUrl: String, + projectIconsBasepath: String +) + +final case class CacheConfig( + cacheName: String, + maxElementsInMemory: Int, + overflowToDisk: Boolean, + eternal: Boolean, + timeToLiveSeconds: Int, + timeToIdleSeconds: Int +) + +final case class V2( + resourcesSequence: ResourcesSequence, + fulltextSearch: FulltextSearch, + graphRoute: GraphRoute +) + +final case class ResourcesSequence( + resultsPerPage: Int +) + +final case class FulltextSearch( + searchValueMinLength: Int +) + +final case class GraphRoute( + defaultGraphDepth: Int, + maxGraphDepth: Int, + maxGraphBreadth: Int +) + +final case class Gui( + defaultIconSize: DefaultIconSize +) + +final case class DefaultIconSize( + dimX: Int, + dimY: Int +) + final case class Triplestore( dbtype: String, useHttps: Boolean, @@ -114,21 +199,13 @@ final case class Triplestore( queryTimeout: String, gravsearchTimeout: String, autoInit: Boolean, - profileQueries: Boolean, - fuseki: Fuseki + fuseki: Fuseki, + profileQueries: Boolean ) { val queryTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(queryTimeout)) val gravsearchTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(gravsearchTimeout)) } -/** - * Fuseki specific configuration. - * - * @param port - * @param repositoryName - * @param username - * @param password - */ final case class Fuseki( port: Int, repositoryName: String, @@ -142,6 +219,20 @@ final case class Shacl( val shapesDirPath = Paths.get(shapesDir) } +final case class CacheService( + enabled: Boolean, + redis: Redis +) + +final case class Redis( + host: String, + port: Int +) + +final case class ClientTestDataService( + collectClientTestData: Boolean +) + /** * Loads the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading * the Typesafe-Config format. @@ -158,29 +249,32 @@ object AppConfig { /** * Instantiates our config class hierarchy using the data from the 'app' configuration from 'application.conf'. */ - private val config: IO[ReadError[String], AppConfig] = read(descriptor[AppConfig].mapKey(toKebabCase) from source) + private val configFromSource: IO[ReadError[String], AppConfig] = read( + descriptor[AppConfig].mapKey(toKebabCase) from source + ) /** - * Live configuration reading from application.conf and initializing StringFormater for live + * Application configuration from application.conf */ val live: ZLayer[Any, Nothing, AppConfig] = ZLayer { for { - c <- config.orDie - _ <- ZIO.attempt(StringFormatter.init(c)).orDie // needs early init before first usage + c <- configFromSource.orDie _ <- ZIO.attempt(RdfFeatureFactory.init(c)).orDie // needs early init before first usage + _ <- ZIO.attempt(StringFormatter.init(c)).orDie // needs early init before first usage } yield c }.tap(_ => ZIO.logInfo(">>> AppConfig Live Initialized <<<")) /** - * Test configuration reading from application.conf and initializing StringFormater for tests + * Application configuration from test.conf for testing */ val test: ZLayer[Any, Nothing, AppConfig] = ZLayer { for { - c <- config.orDie - _ <- ZIO.attempt(StringFormatter.initForTest()).orDie // needs early init before first usage + c <- configFromSource.orDie _ <- ZIO.attempt(RdfFeatureFactory.init(c)).orDie // needs early init before first usage + _ <- ZIO.attempt(StringFormatter.initForTest()).orDie // needs early init before first usage } yield c }.tap(_ => ZIO.logInfo(">>> AppConfig Test Initialized <<<")) + } diff --git a/webapi/src/main/scala/org/knora/webapi/core/ActorSystem.scala b/webapi/src/main/scala/org/knora/webapi/core/ActorSystem.scala index e004baf46f..e1a527bb3b 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/ActorSystem.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/ActorSystem.scala @@ -12,27 +12,24 @@ import zio.macros.accessible import scala.concurrent.ExecutionContext import org.knora.webapi.config.AppConfig -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.cache.settings.CacheServiceSettings @accessible trait ActorSystem { val system: akka.actor.ActorSystem - val settings: KnoraSettingsImpl val cacheServiceSettings: CacheServiceSettings } object ActorSystem { - private def acquire(config: AppConfig, ec: ExecutionContext): URIO[Any, actor.ActorSystem] = + private def acquire(executionContext: ExecutionContext): URIO[Any, actor.ActorSystem] = ZIO .attempt( akka.actor.ActorSystem( name = "webapi", config = None, classLoader = None, - defaultExecutionContext = Some(ec) + defaultExecutionContext = Some(executionContext) ) ) .tap(_ => ZIO.logInfo(">>> Acquire Actor System <<<")) @@ -49,11 +46,10 @@ object ActorSystem { for { config <- ZIO.service[AppConfig] context <- ZIO.executor.map(_.asExecutionContext) - actorSystem <- ZIO.acquireRelease(acquire(config, context))(release _) + actorSystem <- ZIO.acquireRelease(acquire(context))(release _) } yield new ActorSystem { override val system: akka.actor.ActorSystem = actorSystem - override val settings: KnoraSettingsImpl = KnoraSettings(actorSystem) - override val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(actorSystem.settings.config) + override val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(config) } } } diff --git a/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala b/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala index eb3350d1ce..41a9a52885 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala @@ -12,8 +12,6 @@ import akka.util.Timeout import zio._ import zio.macros.accessible -import scala.concurrent.ExecutionContext - import org.knora.webapi.config.AppConfig import org.knora.webapi.core import org.knora.webapi.messages.util.KnoraSystemInstances @@ -45,9 +43,8 @@ object AppRouter { triplestoreServiceManager <- ZIO.service[TriplestoreServiceManager] appConfig <- ZIO.service[AppConfig] runtime <- ZIO.runtime[Any] - } yield new AppRouter { self => - implicit val system: akka.actor.ActorSystem = as.system - implicit val executionContext: ExecutionContext = system.dispatcher + } yield new AppRouter { + implicit val system: akka.actor.ActorSystem = as.system val ref: ActorRef = system.actorOf( Props( diff --git a/webapi/src/main/scala/org/knora/webapi/core/AppServer.scala b/webapi/src/main/scala/org/knora/webapi/core/AppServer.scala index 7cec85e6f0..ac805f966c 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/AppServer.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/AppServer.scala @@ -32,7 +32,7 @@ final case class AppServer( iiifs: IIIFService, cs: CacheService, hs: HttpServer, - config: AppConfig + appConfig: AppConfig ) { /** @@ -52,40 +52,48 @@ final case class AppServer( /** * Initiates repository upgrade if `requiresRepository` is `true` an logs the result. + * + * @param requiresRepository If `true`, calls the RepositoryUpdater to initiate the repository, otherwise returns () */ private def upgradeRepository(requiresRepository: Boolean): ZIO[Any, Nothing, Unit] = for { _ <- state.set(AppState.UpdatingRepository) - _ <- if (requiresRepository) - ru.maybeUpgradeRepository.flatMap(response => ZIO.logInfo(response.message)) - else - ZIO.unit + _ <- if (requiresRepository) ru.maybeUpgradeRepository.flatMap(response => ZIO.logInfo(response.message)) + else ZIO.unit _ <- state.set(AppState.RepositoryUpToDate) } yield () - /* Initiates building of all caches */ + /** + * Initiates building of all caches + */ private val buildAllCaches: ZIO[Any, Nothing, Unit] = for { _ <- state.set(AppState.CreatingCaches) _ <- ZIO.attempt { CacheUtil.removeAllCaches() - CacheUtil.createCaches(as.settings.caches) + CacheUtil.createCaches(appConfig.cacheConfigs) }.orDie _ <- state.set(AppState.CachesReady) } yield () - /* Initiates population of the ontology caches if `requiresRepository` is `true` */ + /** + * Initiates population of the ontology caches if `requiresRepository` is `true` + * + * @param requiresRepository If `true`, calls the AppRouter to populate the ontology caches, otherwise returns () + */ private def populateOntologyCaches(requiresRepository: Boolean): ZIO[Any, Nothing, Unit] = for { _ <- state.set(AppState.LoadingOntologies) - _ <- if (requiresRepository) - ar.populateOntologyCaches - else - ZIO.unit + _ <- if (requiresRepository) ar.populateOntologyCaches + else ZIO.unit _ <- state.set(AppState.OntologiesReady) } yield () - /* Checks if the IIIF service is running */ + /** + * Checks if the IIIF service is running + * + * @param requiresIIIFService If `true`, checks the status of the IIIFService instance, otherwise returns () + */ private def checkIIIFService(requiresIIIFService: Boolean): ZIO[Any, Nothing, Unit] = for { _ <- state.set(AppState.WaitingForIIIFService) @@ -105,7 +113,9 @@ final case class AppServer( _ <- state.set(AppState.IIIFServiceReady) } yield () - /* Checks if the Cache service is running */ + /** + * Checks if the Cache service is running + */ private val checkCacheService: ZIO[Any, Nothing, Unit] = for { _ <- state.set(AppState.WaitingForCacheService) @@ -122,41 +132,27 @@ final case class AppServer( } yield () /** - * Prints the welcome message - */ - private val printBanner: ZIO[Any, Nothing, Unit] = - for { - _ <- - ZIO.logInfo( - s"DSP-API Server started: ${config.knoraApi.internalKnoraApiBaseUrl}" - ) - - _ = if (config.allowReloadOverHttp) { - ZIO.logWarning("Resetting DB over HTTP is turned ON") - } - } yield () - - /** - * Initiates the startup sequence of the DSP-API server. + * Initiates the startup of the DSP-API server. * - * @param requiresRepository if `true`, check if it is running, run upgrading and loading ontology cache. - * If `false`, check if it is running but don't run upgrading AND loading ontology cache. - * @param requiresIIIFService if `true`, ensure that the IIIF service is started. + * @param requiresAdditionalRepositoryChecks If `true`, checks if repository service is running, updates data if necessary and loads ontology cache. + * If `false`, checks if repository service is running but doesn't run upgrades and doesn't load ontology cache. + * @param requiresIIIFService If `true`, ensures that the IIIF service is running. */ def start( - requiresRepository: Boolean, + requiresAdditionalRepositoryChecks: Boolean, requiresIIIFService: Boolean ) = for { _ <- ZIO.logInfo("=> Startup checks initiated") _ <- checkTriplestoreService - _ <- upgradeRepository(requiresRepository) + _ <- upgradeRepository(requiresAdditionalRepositoryChecks) _ <- buildAllCaches - _ <- populateOntologyCaches(requiresRepository) + _ <- populateOntologyCaches(requiresAdditionalRepositoryChecks) _ <- checkIIIFService(requiresIIIFService) _ <- checkCacheService _ <- ZIO.logInfo("=> Startup checks finished") - _ <- printBanner + _ <- ZIO.logInfo(s"DSP-API Server started: ${appConfig.knoraApi.internalKnoraApiBaseUrl}") + _ <- if (appConfig.allowReloadOverHttp) ZIO.logWarning("Resetting DB over HTTP is turned ON") else ZIO.unit _ <- state.set(AppState.Running) } yield () } @@ -164,7 +160,8 @@ final case class AppServer( object AppServer { private type AppServerEnvironment = - TriplestoreService + State + with TriplestoreService with RepositoryUpdater with ActorSystem with AppRouter @@ -172,29 +169,33 @@ object AppServer { with CacheService with HttpServer with AppConfig - with State - private def startup( - requiresRepository: Boolean, - requiresIIIFService: Boolean - ): ZIO[AppServerEnvironment, Nothing, Unit] = + /** + * Initializes the AppServer instance with the required services + */ + def init(): ZIO[AppServerEnvironment, Nothing, AppServer] = for { - state <- ZIO.service[State] - ts <- ZIO.service[TriplestoreService] - ru <- ZIO.service[RepositoryUpdater] - as <- ZIO.service[ActorSystem] - ar <- ZIO.service[AppRouter] - iiifs <- ZIO.service[IIIFService] - cs <- ZIO.service[CacheService] - hs <- ZIO.service[HttpServer] - config <- ZIO.service[AppConfig] - _ <- AppServer(state, ts, ru, as, ar, iiifs, cs, hs, config).start(requiresRepository, requiresIIIFService) - } yield () + state <- ZIO.service[State] + ts <- ZIO.service[TriplestoreService] + ru <- ZIO.service[RepositoryUpdater] + as <- ZIO.service[ActorSystem] + ar <- ZIO.service[AppRouter] + iiifs <- ZIO.service[IIIFService] + cs <- ZIO.service[CacheService] + hs <- ZIO.service[HttpServer] + c <- ZIO.service[AppConfig] + appServer = AppServer(state, ts, ru, as, ar, iiifs, cs, hs, c) + } yield appServer - /* Live version */ + /** + * The AppServer live layer + */ val live: ZLayer[AppServerEnvironment, Nothing, Unit] = ZLayer { - startup(true, true) + for { + appServer <- AppServer.init() + _ <- appServer.start(requiresAdditionalRepositoryChecks = true, requiresIIIFService = true) + } yield () } /** @@ -203,7 +204,10 @@ object AppServer { */ val testWithSipi: ZLayer[AppServerEnvironment, Nothing, Unit] = ZLayer { - startup(false, true) + for { + appServer <- AppServer.init() + _ <- appServer.start(requiresAdditionalRepositoryChecks = false, requiresIIIFService = true) + } yield () } /** @@ -212,6 +216,9 @@ object AppServer { */ val testWithoutSipi: ZLayer[AppServerEnvironment, Nothing, Unit] = ZLayer { - startup(false, false) + for { + appServer <- AppServer.init() + _ <- appServer.start(requiresAdditionalRepositoryChecks = false, requiresIIIFService = false) + } yield () } } diff --git a/webapi/src/main/scala/org/knora/webapi/core/HttpServer.scala b/webapi/src/main/scala/org/knora/webapi/core/HttpServer.scala index 483a0481f6..9d3a427279 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/HttpServer.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/HttpServer.scala @@ -6,15 +6,15 @@ package org.knora.webapi.core import akka.http.scaladsl.Http -import akka.stream.Materializer import zio._ -import scala.concurrent.ExecutionContext - import org.knora.webapi.config.AppConfig import org.knora.webapi.core import org.knora.webapi.routing.ApiRoutes +/** + * The Akka based HTTP server + */ trait HttpServer { val serverBinding: Http.ServerBinding } @@ -27,9 +27,7 @@ object HttpServer { config <- ZIO.service[AppConfig] apiRoutes <- ZIO.service[ApiRoutes] binding <- { - implicit val system: akka.actor.ActorSystem = as.system - implicit val materializer: Materializer = Materializer.matFromSystem(system) - implicit val executionContext: ExecutionContext = system.dispatcher + implicit val system: akka.actor.ActorSystem = as.system ZIO.acquireRelease { ZIO diff --git a/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala b/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala index 415cdd2993..82cfabe441 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala @@ -37,11 +37,11 @@ object LayersLive { with TriplestoreServiceManager with TriplestoreService - // all effect layers needed to provide the `Environment` + /** + * All effect layers needed to provide the `Environment` + */ val dspLayersLive = - ZLayer.make[ - DspEnvironmentLive - ]( + ZLayer.make[DspEnvironmentLive]( ActorSystem.layer, ApiRoutes.layer, AppConfig.live, diff --git a/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala b/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala index 40998b6f49..75ebd3dc8c 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala @@ -7,7 +7,6 @@ package org.knora.webapi.core.actors import akka.actor.Actor import akka.actor.ActorSystem -import akka.util.Timeout import com.typesafe.scalalogging.Logger import scala.concurrent.ExecutionContext @@ -62,8 +61,6 @@ import org.knora.webapi.responders.v2.ResourcesResponderV2 import org.knora.webapi.responders.v2.SearchResponderV2 import org.knora.webapi.responders.v2.StandoffResponderV2 import org.knora.webapi.responders.v2.ValuesResponderV2 -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.cache.CacheServiceManager import org.knora.webapi.store.cache.settings.CacheServiceSettings import org.knora.webapi.store.iiif.IIIFServiceManager @@ -81,32 +78,20 @@ class RoutingActor( implicit val system: ActorSystem = context.system val log: Logger = Logger(this.getClass()) - log.debug("entered the ApplicationActor constructor") - - /** - * The application's configuration. - */ - implicit val knoraSettings: KnoraSettingsImpl = KnoraSettings(system) - /** * The Cache Service's configuration. */ - implicit val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(system.settings.config) + implicit val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(appConfig) /** * Provides the default global execution context */ implicit val executionContext: ExecutionContext = context.dispatcher - /** - * Timeout definition - */ - implicit protected val timeout: Timeout = knoraSettings.defaultTimeout - /** * Data used in responders. */ - val responderData: ResponderData = ResponderData(system, self, knoraSettings, cacheServiceSettings) + val responderData: ResponderData = ResponderData(system, self, appConfig, cacheServiceSettings) // V1 responders val ckanResponderV1: CkanResponderV1 = new CkanResponderV1(responderData) @@ -138,6 +123,7 @@ class RoutingActor( def receive: Receive = { + // V1 request messages case ckanResponderRequestV1: CkanResponderRequestV1 => ActorUtil.future2Message(sender(), ckanResponderV1.receive(ckanResponderRequestV1), log) case resourcesResponderRequestV1: ResourcesResponderRequestV1 => @@ -157,7 +143,7 @@ class RoutingActor( case projectsResponderRequestV1: ProjectsResponderRequestV1 => ActorUtil.future2Message(sender(), projectsResponderV1.receive(projectsResponderRequestV1), log) - // Knora API V2 messages + // V2 request messages case ontologiesResponderRequestV2: OntologiesResponderRequestV2 => ActorUtil.future2Message(sender(), ontologiesResponderV2.receive(ontologiesResponderRequestV2), log) case searchResponderRequestV2: SearchResponderRequestV2 => @@ -171,7 +157,7 @@ class RoutingActor( case listsResponderRequestV2: ListsResponderRequestV2 => ActorUtil.future2Message(sender(), listsResponderV2.receive(listsResponderRequestV2), log) - // Knora Admin message + // Admin request messages case groupsResponderRequestADM: GroupsResponderRequestADM => ActorUtil.future2Message(sender(), groupsResponderADM.receive(groupsResponderRequestADM), log) case listsResponderRequest: ListsResponderRequestADM => diff --git a/webapi/src/main/scala/org/knora/webapi/http/directives/DSPApiDirectives.scala b/webapi/src/main/scala/org/knora/webapi/http/directives/DSPApiDirectives.scala index 08a1319134..6f09929090 100644 --- a/webapi/src/main/scala/org/knora/webapi/http/directives/DSPApiDirectives.scala +++ b/webapi/src/main/scala/org/knora/webapi/http/directives/DSPApiDirectives.scala @@ -13,8 +13,8 @@ import akka.http.scaladsl.server.ExceptionHandler import akka.http.scaladsl.server.RejectionHandler import ch.megard.akka.http.cors.scaladsl.CorsDirectives +import org.knora.webapi.config.AppConfig import org.knora.webapi.http.handler.KnoraExceptionHandler -import org.knora.webapi.settings.KnoraSettings /** * DSP-API HTTP directives, used by wrapping around a routes, to influence @@ -26,9 +26,9 @@ object DSPApiDirectives { def rejectionHandler: RejectionHandler = CorsDirectives.corsRejectionHandler.withFallback(RejectionHandler.default) // Our exception handler - def exceptionHandler(system: ActorSystem): ExceptionHandler = KnoraExceptionHandler(KnoraSettings(system)) + def exceptionHandler(system: ActorSystem, appConfig: AppConfig): ExceptionHandler = KnoraExceptionHandler(appConfig) // Combining the two handlers for convenience - def handleErrors(system: ActorSystem): server.Directive[Unit] = - handleRejections(rejectionHandler) & handleExceptions(exceptionHandler(system)) + def handleErrors(system: ActorSystem, appConfig: AppConfig): server.Directive[Unit] = + handleRejections(rejectionHandler) & handleExceptions(exceptionHandler(system, appConfig)) } 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 5a16c322b4..263973e68c 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 @@ -17,13 +17,13 @@ import spray.json.JsValue import dsp.errors.InternalServerException import dsp.errors.RequestRejectedException +import org.knora.webapi.config.AppConfig import org.knora.webapi.http.status.ApiStatusCodesV1 import org.knora.webapi.http.status.ApiStatusCodesV2 import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.JsonLDObject import org.knora.webapi.messages.util.rdf.JsonLDString -import org.knora.webapi.settings.KnoraSettingsImpl /** * The Knora exception handler is used by akka-http to convert any exceptions thrown during route processing @@ -35,7 +35,7 @@ object KnoraExceptionHandler extends LazyLogging { private val GENERIC_INTERNAL_SERVER_ERROR_MESSAGE = "The request could not be completed because of an internal server error." - def apply(settingsImpl: KnoraSettingsImpl): ExceptionHandler = ExceptionHandler { + def apply(appConfig: AppConfig): ExceptionHandler = ExceptionHandler { /* TODO: Find out which response format should be generated, by looking at what the client is requesting / accepting (issue #292) */ @@ -44,11 +44,11 @@ object KnoraExceptionHandler extends LazyLogging { val url = request.uri.path.toString if (url.startsWith("/v1")) { - complete(exceptionToJsonHttpResponseV1(rre, settingsImpl)) + complete(exceptionToJsonHttpResponseV1(rre, appConfig)) } else if (url.startsWith("/v2")) { - complete(exceptionToJsonHttpResponseV2(rre, settingsImpl)) + complete(exceptionToJsonHttpResponseV2(rre, appConfig)) } else { - complete(exceptionToJsonHttpResponseADM(rre, settingsImpl)) + complete(exceptionToJsonHttpResponseADM(rre, appConfig)) } } @@ -60,11 +60,11 @@ object KnoraExceptionHandler extends LazyLogging { logger.error(s"Internal Server Exception: Unable to run route $url", ise) if (url.startsWith("/v1")) { - complete(exceptionToJsonHttpResponseV1(ise, settingsImpl)) + complete(exceptionToJsonHttpResponseV1(ise, appConfig)) } else if (url.startsWith("/v2")) { - complete(exceptionToJsonHttpResponseV2(ise, settingsImpl)) + complete(exceptionToJsonHttpResponseV2(ise, appConfig)) } else { - complete(exceptionToJsonHttpResponseADM(ise, settingsImpl)) + complete(exceptionToJsonHttpResponseADM(ise, appConfig)) } } @@ -77,11 +77,11 @@ object KnoraExceptionHandler extends LazyLogging { logger.error(s"Unable to run route $url", other) if (url.startsWith("/v1")) { - complete(exceptionToJsonHttpResponseV1(other, settingsImpl)) + complete(exceptionToJsonHttpResponseV1(other, appConfig)) } else if (url.startsWith("/v2")) { - complete(exceptionToJsonHttpResponseV2(other, settingsImpl)) + complete(exceptionToJsonHttpResponseV2(other, appConfig)) } else { - complete(exceptionToJsonHttpResponseADM(other, settingsImpl)) + complete(exceptionToJsonHttpResponseADM(other, appConfig)) } } } @@ -92,7 +92,7 @@ object KnoraExceptionHandler extends LazyLogging { * @param ex the exception to be converted. * @return an [[HttpResponse]] in JSON format. */ - private def exceptionToJsonHttpResponseV1(ex: Throwable, settings: KnoraSettingsImpl): HttpResponse = { + private def exceptionToJsonHttpResponseV1(ex: Throwable, appConfig: AppConfig): HttpResponse = { // Get the API status code that corresponds to the exception. val apiStatus: ApiStatusCodesV1.Value = ApiStatusCodesV1.fromException(ex) @@ -110,7 +110,7 @@ object KnoraExceptionHandler extends LazyLogging { val responseFields: Map[String, JsValue] = Map( "status" -> JsNumber(apiStatus.id), - "error" -> JsString(makeClientErrorMessage(ex, settings)) + "error" -> JsString(makeClientErrorMessage(ex, appConfig)) ) ++ maybeAccess HttpResponse( @@ -125,7 +125,7 @@ object KnoraExceptionHandler extends LazyLogging { * @param ex the exception to be converted. * @return an [[HttpResponse]] in JSON format. */ - private def exceptionToJsonHttpResponseV2(ex: Throwable, settings: KnoraSettingsImpl): HttpResponse = { + private def exceptionToJsonHttpResponseV2(ex: Throwable, appConfig: AppConfig): HttpResponse = { // Get the HTTP status code that corresponds to the exception. val httpStatus: StatusCode = ApiStatusCodesV2.fromException(ex) @@ -133,7 +133,7 @@ object KnoraExceptionHandler extends LazyLogging { val jsonLDDocument = JsonLDDocument( body = JsonLDObject( - Map(OntologyConstants.KnoraApiV2Complex.Error -> JsonLDString(makeClientErrorMessage(ex, settings))) + Map(OntologyConstants.KnoraApiV2Complex.Error -> JsonLDString(makeClientErrorMessage(ex, appConfig))) ), context = JsonLDObject( Map( @@ -157,14 +157,14 @@ object KnoraExceptionHandler extends LazyLogging { * @param ex the exception to be converted. * @return an [[HttpResponse]] in JSON format. */ - private def exceptionToJsonHttpResponseADM(ex: Throwable, settings: KnoraSettingsImpl): HttpResponse = { + private def exceptionToJsonHttpResponseADM(ex: Throwable, appConfig: AppConfig): HttpResponse = { // Get the HTTP status code that corresponds to the exception. val httpStatus: StatusCode = ApiStatusCodesV2.fromException(ex) // Generate an HTTP response containing the error message ... val responseFields: Map[String, JsValue] = Map( - "error" -> JsString(makeClientErrorMessage(ex, settings)) + "error" -> JsString(makeClientErrorMessage(ex, appConfig)) ) // ... and the HTTP status code. @@ -177,16 +177,16 @@ object KnoraExceptionHandler extends LazyLogging { /** * Given an exception, returns an error message suitable for clients. * - * @param ex the exception. - * @param settings the application settings. + * @param ex the exception. + * @param appConfig the application's configuration. * @return an error message suitable for clients. */ - private def makeClientErrorMessage(ex: Throwable, settings: KnoraSettingsImpl): String = + private def makeClientErrorMessage(ex: Throwable, appConfig: AppConfig): String = ex match { case rre: RequestRejectedException => rre.toString case other => - if (settings.showInternalErrors) { + if (appConfig.showInternalErrors) { other.toString } else { GENERIC_INTERNAL_SERVER_ERROR_MESSAGE diff --git a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala index dbb061197e..4a9afa57b0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala @@ -43,7 +43,6 @@ import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1 import org.knora.webapi.messages.v2.responder.KnoraContentV2 import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.Base64UrlCheckDigit import org.knora.webapi.util.JavaUtil @@ -225,7 +224,7 @@ object StringFormatter { /** * Initialises the general instance of [[StringFormatter]]. * - * @param settings the application settings. + * @param config the application's configuration. */ def init(config: AppConfig): Unit = this.synchronized { @@ -2594,12 +2593,10 @@ class StringFormatter private ( /** * Constructs a path for accessing a file that has been uploaded to Sipi's temporary storage. * - * @param settings the application settings. * @param filename the filename. * @return a URL for accessing the file. */ - def makeSipiTempFilePath(settings: KnoraSettingsImpl, filename: String): String = - s"/tmp/$filename" + def makeSipiTempFilePath(filename: String): String = s"/tmp/$filename" /** * Checks whether an IRI already exists in the triplestore. 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 1d7de7f747..3838ae8b19 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 @@ -19,6 +19,7 @@ import dsp.errors.AssertionException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotImplementedException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -41,7 +42,6 @@ import org.knora.webapi.messages.v2.responder.standoffmessages.GetStandoffRespon import org.knora.webapi.messages.v2.responder.standoffmessages.MappingXMLtoStandoff import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffTagV2 import org.knora.webapi.messages.v2.responder.valuemessages._ -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.ActorUtil object ConstructResponseUtilV2 { @@ -1114,7 +1114,7 @@ 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 settings the application's settings. + * @param appConfig the application's configuration. * @param requestingUser the user making the request. * @return a [[LinkValueContentV2]]. */ @@ -1127,7 +1127,7 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant], appActor: ActorRef, targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, requestingUser: UserADM )(implicit stringFormatter: StringFormatter, @@ -1162,7 +1162,7 @@ object ConstructResponseUtilV2 { appActor = appActor, requestingUser = requestingUser, targetSchema = targetSchema, - settings = settings + appConfig = appConfig ) } yield linkValue.copy( nestedResource = Some(nestedResource) @@ -1183,7 +1183,7 @@ 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 settings the application's settings. + * @param appConfig the application's configuration. * @param requestingUser the user making the request. * @return a [[ValueContentV2]] representing a value. */ @@ -1195,7 +1195,7 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant] = None, appActor: ActorRef, targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, requestingUser: UserADM )(implicit stringFormatter: StringFormatter, @@ -1344,7 +1344,7 @@ object ConstructResponseUtilV2 { .mapTo[NodeGetResponseV2] } yield listNode.copy( listNodeLabel = nodeResponse.node - .getLabelInPreferredLanguage(userLang = requestingUser.lang, fallbackLang = settings.fallbackLanguage) + .getLabelInPreferredLanguage(userLang = requestingUser.lang, fallbackLang = appConfig.fallbackLanguage) ) case ApiV2Complex => FastFuture.successful(listNode) @@ -1385,7 +1385,7 @@ object ConstructResponseUtilV2 { appActor = appActor, requestingUser = requestingUser, targetSchema = targetSchema, - settings = settings + appConfig = appConfig ) case fileValueClass: IRI if OntologyConstants.KnoraBase.FileValueClasses.contains(fileValueClass) => @@ -1415,7 +1415,7 @@ 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 settings the application's settings. + * @param appConfig the application's configuration. * @param requestingUser the user making the request. * @return a [[ReadResourceV2]]. */ @@ -1427,7 +1427,7 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant], appActor: ActorRef, targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, requestingUser: UserADM )(implicit stringFormatter: StringFormatter, @@ -1496,7 +1496,7 @@ object ConstructResponseUtilV2 { appActor = appActor, requestingUser = requestingUser, targetSchema = targetSchema, - settings = settings + appConfig = appConfig ) attachedToUser = valObj.requireIriObject(OntologyConstants.KnoraBase.AttachedToUser.toSmartIri) @@ -1607,7 +1607,7 @@ 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 settings the application's settings. + * @param appConfig the application's configuration. * @param requestingUser the user making the request. * @return a collection of [[ReadResourceV2]] representing the search results. */ @@ -1621,7 +1621,7 @@ object ConstructResponseUtilV2 { versionDate: Option[Instant], appActor: ActorRef, targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, requestingUser: UserADM )(implicit stringFormatter: StringFormatter, @@ -1643,7 +1643,7 @@ object ConstructResponseUtilV2 { versionDate = versionDate, appActor = appActor, targetSchema = targetSchema, - settings = settings, + appConfig = appConfig, requestingUser = requestingUser ) }.toVector @@ -1653,7 +1653,8 @@ object ConstructResponseUtilV2 { // If we got a full page of results from the triplestore (before filtering for permissions), there // might be at least one more page of results that the user could request. - mayHaveMoreResults = calculateMayHaveMoreResults && pageSizeBeforeFiltering == settings.v2ResultsPerPage + mayHaveMoreResults = + calculateMayHaveMoreResults && pageSizeBeforeFiltering == appConfig.v2.resourcesSequence.resultsPerPage } yield ReadResourcesSequenceV2( resources = resources, hiddenResourceIris = mainResourcesAndValueRdfData.hiddenResourceIris, 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 afd749b124..54b73834a0 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 @@ -26,8 +26,7 @@ object MessageUtil { "stringFormatter", "base64Decoder", "knoraIdUtil", - "standoffLinkTagTargetResourceIris", - "knoraSettings" + "standoffLinkTagTargetResourceIris" ) /** 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 2b774df581..de158cec61 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.config.AppConfig import org.knora.webapi.store.cache.settings.CacheServiceSettings /** @@ -16,12 +16,11 @@ import org.knora.webapi.store.cache.settings.CacheServiceSettings * * @param system the actor system. * @param appActor the main application actor. - * @param knoraSetting the application settings. * @param cacheServiceSettings the cache service part of the settings. */ case class ResponderData( system: ActorSystem, appActor: ActorRef, - knoraSettings: KnoraSettingsImpl, + appConfig: AppConfig, cacheServiceSettings: CacheServiceSettings ) 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 7e9c3625c3..e4553794f7 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 @@ -16,6 +16,7 @@ import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotImplementedException import dsp.errors.OntologyConstraintException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -29,12 +30,11 @@ import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceCreateVal import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceCreateValueResponseV1 import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.settings.KnoraSettingsImpl /** * Converts data from SPARQL query results into [[ApiValueV1]] objects. */ -class ValueUtilV1(private val settings: KnoraSettingsImpl) { +class ValueUtilV1(appConfig: AppConfig) { private val stringFormatter = StringFormatter.getGeneralInstance @@ -83,7 +83,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { } def makeSipiImagePreviewGetUrlFromFilename(projectShortcode: String, filename: String): String = - s"${settings.externalSipiIIIFGetUrl}/$projectShortcode/$filename/full/!128,128/0/default.jpg" + s"${appConfig.sipi.externalBaseUrl}/$projectShortcode/$filename/full/!128,128/0/default.jpg" /** * Creates a IIIF URL for accessing an image file via Sipi. @@ -92,7 +92,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @return a Sipi IIIF URL. */ def makeSipiImageGetUrlFromFilename(imageFileValueV1: StillImageFileValueV1): String = - s"${settings.externalSipiIIIFGetUrl}/${imageFileValueV1.projectShortcode}/${imageFileValueV1.internalFilename}/full/${imageFileValueV1.dimX},${imageFileValueV1.dimY}/0/default.jpg" + s"${appConfig.sipi.externalBaseUrl}/${imageFileValueV1.projectShortcode}/${imageFileValueV1.internalFilename}/full/${imageFileValueV1.dimX},${imageFileValueV1.dimY}/0/default.jpg" /** * Creates a URL for accessing a document file via Sipi. @@ -101,7 +101,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @return a Sipi URL. */ def makeSipiDocumentGetUrlFromFilename(documentFileValueV1: DocumentFileValueV1): String = - s"${settings.externalSipiIIIFGetUrl}/${documentFileValueV1.projectShortcode}/${documentFileValueV1.internalFilename}/file" + s"${appConfig.sipi.externalBaseUrl}/${documentFileValueV1.projectShortcode}/${documentFileValueV1.internalFilename}/file" /** * Creates a URL for accessing a archive file via Sipi. @@ -110,7 +110,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @return a Sipi URL. */ def makeSipiArchiveGetUrlFromFilename(archiveFileValueV1: ArchiveFileValueV1): String = - s"${settings.externalSipiIIIFGetUrl}/${archiveFileValueV1.projectShortcode}/${archiveFileValueV1.internalFilename}/file" + s"${appConfig.sipi.externalBaseUrl}/${archiveFileValueV1.projectShortcode}/${archiveFileValueV1.internalFilename}/file" /** * Creates a URL for accessing a text file via Sipi. @@ -119,7 +119,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @return a Sipi URL. */ def makeSipiTextFileGetUrlFromFilename(textFileValue: TextFileValueV1): String = - s"${settings.externalSipiBaseUrl}/${textFileValue.projectShortcode}/${textFileValue.internalFilename}" + s"${appConfig.sipi.externalBaseUrl}/${textFileValue.projectShortcode}/${textFileValue.internalFilename}" /** * Creates a URL for accessing an audio file via Sipi. @@ -128,7 +128,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @return a Sipi URL. */ def makeSipiAudioFileGetUrlFromFilename(audioFileValue: AudioFileValueV1): String = - s"${settings.externalSipiIIIFGetUrl}/${audioFileValue.projectShortcode}/${audioFileValue.internalFilename}/file" + s"${appConfig.sipi.externalBaseUrl}/${audioFileValue.projectShortcode}/${audioFileValue.internalFilename}/file" /** * Creates a URL for accessing a video file via Sipi. @@ -137,7 +137,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { * @return a Sipi URL. */ def makeSipiVideoFileGetUrlFromFilename(videoFileValue: MovingImageFileValueV1): String = - s"${settings.externalSipiIIIFGetUrl}/${videoFileValue.projectShortcode}/${videoFileValue.internalFilename}/file" + s"${appConfig.sipi.externalBaseUrl}/${videoFileValue.projectShortcode}/${videoFileValue.internalFilename}/file" // A Map of MIME types to Knora API v1 binary format name. private val mimeType2V1Format = new ErrorHandlingMap( @@ -251,7 +251,7 @@ class ValueUtilV1(private val settings: KnoraSettingsImpl) { resourceClassIri.substring(resourceClassIri.lastIndexOf('/') + 1, resourceClassIri.lastIndexOf('#')) // create URL: combine salsah-address and port, project icons base path, ontology name, icon name - settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + ontologyName + '/' + iconsSrc + appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + ontologyName + '/' + iconsSrc } /** 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 ff812b14dc..9e7035ead4 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 @@ -23,10 +23,10 @@ object RdfFeatureFactory { /** * Initialises the [[RdfFeatureFactory]]. This method must be called once, on application startup. * - * @param settings the application settings. + * @param config the application configuration. */ def init(config: AppConfig): Unit = - // Construct the SHACL validators, which need the application settings. + // Construct the SHACL validators this.synchronized { jenaShaclValidator = Some( new JenaShaclValidator( diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/FullTextMainQueryGenerator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/FullTextMainQueryGenerator.scala index 76bef5b3a3..c4a3201429 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/FullTextMainQueryGenerator.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/FullTextMainQueryGenerator.scala @@ -6,10 +6,10 @@ package org.knora.webapi.messages.util.search import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.settings.KnoraSettingsImpl object FullTextMainQueryGenerator { @@ -64,6 +64,7 @@ object FullTextMainQueryGenerator { * @param valueObjectIris the IRIs of the value objects to be queried. * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. + * @param appConfig the application's configuration. * @return a [[ConstructQuery]]. */ def createMainQuery( @@ -71,7 +72,7 @@ object FullTextMainQueryGenerator { valueObjectIris: Set[IRI], targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - settings: KnoraSettingsImpl + appConfig: AppConfig ): ConstructQuery = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -175,7 +176,7 @@ object FullTextMainQueryGenerator { leftArg = standoffStartIndexVar, operator = CompareExpressionOperator.LESS_THAN_OR_EQUAL_TO, rightArg = XsdLiteral( - value = (settings.standoffPerPage - 1).toString, + value = (appConfig.standoffPerPage - 1).toString, datatype = OntologyConstants.Xsd.Integer.toSmartIri ) ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParser.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParser.scala index ea9ee62227..85ee164b68 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParser.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParser.scala @@ -112,22 +112,12 @@ object GravsearchParser { * @param sourceName the source name. * @return an [[algebra.Var]] representing the name or its literal value. */ - def nameToVar(sourceName: String): algebra.Var = { - val sparqlVar = new algebra.Var - sparqlVar.setName(sourceName) - + def nameToVar(sourceName: String): algebra.Var = valueConstants.get(sourceName) match { - case Some(valueConstant) => - sparqlVar.setConstant(true) - sparqlVar.setValue(valueConstant.getValue) - - case None => - sparqlVar.setConstant(false) + case Some(valueConstant) => new algebra.Var(sourceName, valueConstant.getValue(), false, true) + case None => new algebra.Var(sourceName, null, false, false) } - sparqlVar - } - // Convert each ConstructStatementWithConstants to a StatementPattern for use in the CONSTRUCT clause. val constructStatements: Seq[StatementPattern] = constructStatementsWithConstants.toVector.map { (constructStatementWithConstant: ConstructStatementWithConstants) => diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/mainquery/GravsearchMainQueryGenerator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/mainquery/GravsearchMainQueryGenerator.scala index 9489267b25..a4c9574269 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/mainquery/GravsearchMainQueryGenerator.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/mainquery/GravsearchMainQueryGenerator.scala @@ -7,6 +7,7 @@ package org.knora.webapi.messages.util.search.gravsearch.mainquery import dsp.errors.GravsearchException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.StringFormatter @@ -16,7 +17,6 @@ import org.knora.webapi.messages.util.rdf.VariableResultsRow import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.util.search.gravsearch.prequery.AbstractPrequeryGenerator import org.knora.webapi.messages.util.search.gravsearch.prequery.NonTriplestoreSpecificGravsearchToPrequeryTransformer -import org.knora.webapi.settings.KnoraSettingsImpl object GravsearchMainQueryGenerator { @@ -225,6 +225,7 @@ object GravsearchMainQueryGenerator { * @param valueObjectIris IRIs of value objects to be queried (for both main and dependent resources) * @param targetSchema the target API schema. * @param schemaOptions the schema options submitted with the request. + * @param appConfig the application's configuration. * @return the main [[ConstructQuery]] query to be executed. */ def createMainQuery( @@ -233,7 +234,7 @@ object GravsearchMainQueryGenerator { valueObjectIris: Set[IRI], targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - settings: KnoraSettingsImpl + appConfig: AppConfig ): ConstructQuery = { import GravsearchConstants._ @@ -406,7 +407,7 @@ object GravsearchMainQueryGenerator { leftArg = standoffStartIndexVar, operator = CompareExpressionOperator.LESS_THAN_OR_EQUAL_TO, rightArg = XsdLiteral( - value = (settings.standoffPerPage - 1).toString, + value = (appConfig.standoffPerPage - 1).toString, datatype = OntologyConstants.Xsd.Integer.toSmartIri ) ) 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 6ec1b456dc..4a2d27af57 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 @@ -10,13 +10,13 @@ import scala.concurrent.ExecutionContext import dsp.errors.AssertionException import dsp.errors.GravsearchException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionResult import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil import org.knora.webapi.messages.util.search.gravsearch.types.NonPropertyTypeInfo import org.knora.webapi.messages.util.search.gravsearch.types.PropertyTypeInfo -import org.knora.webapi.settings.KnoraSettingsImpl /** * Transforms a preprocessed CONSTRUCT query into a SELECT query that returns only the IRIs and sort order of the main resources that matched @@ -26,13 +26,13 @@ import org.knora.webapi.settings.KnoraSettingsImpl * @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 settings application settings. + * @param appConfig application configuration. */ class NonTriplestoreSpecificGravsearchToPrequeryTransformer( constructClause: ConstructClause, typeInspectionResult: GravsearchTypeInspectionResult, querySchema: ApiV2Schema, - settings: KnoraSettingsImpl + appConfig: AppConfig ) extends AbstractPrequeryGenerator( constructClause = constructClause, typeInspectionResult = typeInspectionResult, @@ -355,8 +355,8 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformer( * @return the LIMIT, if any. */ def getLimit: Int = - // get LIMIT from settings - settings.v2ResultsPerPage + // get LIMIT from appConfig + appConfig.v2.resourcesSequence.resultsPerPage /** * Gets the OFFSET to be used in the prequery (needed for paging). diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionRunner.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionRunner.scala index b55d619823..193117465e 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionRunner.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionRunner.scala @@ -21,6 +21,7 @@ import org.knora.webapi.settings.KnoraDispatchers /** * Runs Gravsearch type inspection using one or more type inspector implementations. * + * @param appActor a reference to the application actor * @param responderData the Knora [[ResponderData]]. * @param inferTypes if true, use type inference. */ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspector.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspector.scala index dd8c4ce350..dcf8a6bab8 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspector.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspector.scala @@ -15,8 +15,6 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.search.WhereClause import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl /** * An trait whose implementations can get type information from a parsed Gravsearch query in different ways. @@ -31,11 +29,10 @@ abstract class GravsearchTypeInspector( responderData: ResponderData ) { - protected val system: ActorSystem = responderData.system - protected val settings: KnoraSettingsImpl = KnoraSettings(system) + protected val system: ActorSystem = responderData.system protected implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - protected implicit val timeout: Timeout = settings.defaultTimeout + protected implicit val timeout: Timeout = responderData.appConfig.defaultTimeoutAsDuration /** * Given the WHERE clause from a parsed Gravsearch query, returns information about the types found diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/StandoffTagUtilV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/StandoffTagUtilV2.scala index 088cfc9c76..2ab178266a 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/StandoffTagUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/StandoffTagUtilV2.scala @@ -18,6 +18,7 @@ import scala.concurrent.Future import dsp.errors._ import dsp.schema.domain.Cardinality._ import org.knora.webapi.IRI +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -33,7 +34,6 @@ import org.knora.webapi.messages.v1.responder.valuemessages.UpdateValueV1 import org.knora.webapi.messages.v2.responder.ontologymessages.OwlCardinality._ import org.knora.webapi.messages.v2.responder.ontologymessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.settings.KnoraSettingsImpl object StandoffTagUtilV2 { @@ -1666,17 +1666,17 @@ object StandoffTagUtilV2 { * for the first page of standoff in a text value. Otherwise, returns `(None, None)`. * * @param queryStandoff `true` if standoff should be queried. - * @param settings the application settings. + * @param appConfig the application configuration. * @return a tuple containing the minimum start index and maximum start index, or `(None, None)` if standoff * is not being queried with text values. */ def getStandoffMinAndMaxStartIndexesForTextValueQuery( queryStandoff: Boolean, - settings: KnoraSettingsImpl + appConfig: AppConfig ): (Option[Int], Option[Int]) = if (queryStandoff) { // Yes. Get the first page of standoff with each text value. - (Some(0), Some(settings.standoffPerPage - 1)) + (Some(0), Some(appConfig.standoffPerPage - 1)) } else { // No. (None, None) 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 4051445460..277fed70e6 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 @@ -18,7 +18,6 @@ import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.RdfFeatureFactory import org.knora.webapi.messages.util.rdf.RdfModel import org.knora.webapi.messages.util.rdf.Turtle -import org.knora.webapi.settings.KnoraSettingsImpl /** * A trait for request messages that are constructed as an [[RdfModel]]. @@ -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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -66,7 +64,6 @@ trait KnoraJsonLDRequestReaderV2[C] { apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - 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 24f46669c3..189b980774 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,10 +14,10 @@ import org.knora.webapi.InternalSchema import org.knora.webapi.OntologySchema import org.knora.webapi.SchemaOption import org.knora.webapi.SchemaOptions +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.settings.KnoraSettingsImpl /** * A trait for Knora API V2 response messages. @@ -30,14 +30,14 @@ trait KnoraResponseV2 { * @param rdfFormat the RDF format selected for the response. * @param targetSchema the response schema. * @param schemaOptions the schema options. - * @param settings the application settings. + * @param appConfig the application configuration. * @return a formatted string representing this response message. */ def format( rdfFormat: RdfFormat, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption], - settings: KnoraSettingsImpl + appConfig: AppConfig ): String } @@ -50,7 +50,7 @@ trait KnoraJsonLDResponseV2 extends KnoraResponseV2 { rdfFormat: RdfFormat, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption], - settings: KnoraSettingsImpl + appConfig: AppConfig ): String = { val targetApiV2Schema = targetSchema match { case apiV2Schema: ApiV2Schema => apiV2Schema @@ -60,7 +60,7 @@ trait KnoraJsonLDResponseV2 extends KnoraResponseV2 { // Convert this response message to a JsonLDDocument. val jsonLDDocument: JsonLDDocument = toJsonLDDocument( targetSchema = targetApiV2Schema, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) @@ -92,7 +92,7 @@ trait KnoraJsonLDResponseV2 extends KnoraResponseV2 { */ protected def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument } @@ -112,7 +112,7 @@ trait KnoraTurtleResponseV2 extends KnoraResponseV2 { rdfFormat: RdfFormat, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption], - settings: KnoraSettingsImpl + appConfig: AppConfig ): String = { if (targetSchema != InternalSchema) { throw AssertionException(s"Response can be returned only in the internal schema") @@ -147,7 +147,7 @@ trait KnoraTurtleResponseV2 extends KnoraResponseV2 { case class SuccessResponseV2(message: String) extends KnoraJsonLDResponseV2 { def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { val (ontologyPrefixExpansion, resultProp) = targetSchema match { @@ -176,7 +176,7 @@ case class SuccessResponseV2(message: String) extends KnoraJsonLDResponseV2 { final case class CanDoResponseV2(canDo: Boolean) extends KnoraJsonLDResponseV2 { def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { if (targetSchema != ApiV2Complex) { 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 8d3e1f697f..b24063318a 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,6 +6,7 @@ package org.knora.webapi.messages.v2.responder.listsmessages import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -17,7 +18,6 @@ import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.util.rdf import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.v2.responder.KnoraJsonLDResponseV2 -import org.knora.webapi.settings.KnoraSettingsImpl /** * An abstract trait representing a Knora v2 API request message that can be sent to `ListsResponderV2`. @@ -73,7 +73,7 @@ case class ListGetResponseV2(list: ListADM, userLang: String, fallbackLang: Stri def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { @@ -201,7 +201,7 @@ case class NodeGetResponseV2(node: ListNodeInfoADM, userLang: String, fallbackLa def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { 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 3103ba5fc2..49e87a4ffd 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 @@ -25,6 +25,7 @@ import dsp.schema.domain.Cardinality._ import dsp.valueobjects.Iri import dsp.valueobjects.Schema import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -37,7 +38,6 @@ import org.knora.webapi.messages.v2.responder._ import org.knora.webapi.messages.v2.responder.ontologymessages.OwlCardinality.KnoraCardinalityInfo import org.knora.webapi.messages.v2.responder.ontologymessages.OwlCardinality.OwlCardinalityInfo import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffDataTypeClasses -import org.knora.webapi.settings.KnoraSettingsImpl /** * An abstract trait for messages that can be sent to `ResourcesResponderV2`. @@ -88,7 +88,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 settings the application settings. * @param log a logging adapter. * @return a [[CreateOntologyRequestV2]] representing the input. */ @@ -97,7 +96,6 @@ object CreateOntologyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateOntology apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateOntologyRequestV2] = Future { @@ -398,7 +396,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 settings the application settings. * @param log a logging adapter. * @return a [[CreatePropertyRequestV2]] representing the input. */ @@ -407,7 +404,6 @@ object CreatePropertyRequestV2 extends KnoraJsonLDRequestReaderV2[CreateProperty apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreatePropertyRequestV2] = Future { @@ -495,7 +491,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 settings the application settings. * @param log a logging adapter. * @return a [[CreateClassRequestV2]] representing the input. */ @@ -504,7 +499,6 @@ object CreateClassRequestV2 extends KnoraJsonLDRequestReaderV2[CreateClassReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateClassRequestV2] = Future { @@ -571,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 settings the application settings. * @param log a logging adapter. * @return an [[AddCardinalitiesToClassRequestV2]] representing the input. */ @@ -580,7 +573,6 @@ object AddCardinalitiesToClassRequestV2 extends KnoraJsonLDRequestReaderV2[AddCa apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[AddCardinalitiesToClassRequestV2] = Future { @@ -656,7 +648,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 settings the application settings. * @param log a logging adapter. * @return a [[ChangeCardinalitiesRequestV2]] representing the input. */ @@ -665,7 +656,6 @@ object ChangeCardinalitiesRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeCar apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeCardinalitiesRequestV2] = Future { @@ -724,7 +714,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 settings the application settings. * @param log a logging adapter. * @return a [[DeleteCardinalitiesFromClassRequestV2]] representing the input. */ @@ -733,7 +722,6 @@ object CanDeleteCardinalitiesFromClassRequestV2 apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CanDeleteCardinalitiesFromClassRequestV2] = Future { @@ -791,7 +779,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 settings the application settings. * @param log a logging adapter. * @return a [[DeleteCardinalitiesFromClassRequestV2]] representing the input. */ @@ -800,7 +787,6 @@ object DeleteCardinalitiesFromClassRequestV2 extends KnoraJsonLDRequestReaderV2[ apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteCardinalitiesFromClassRequestV2] = Future { @@ -927,7 +913,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change * @param apiRequestID the UUID of the API request. * @param requestingUser the user making the request. * @param appActor a reference to the application actor. - * @param settings the application settings. * @param log a logging adapter. * @return a [[ChangePropertyLabelsOrCommentsRequestV2]] representing the input. */ @@ -937,7 +922,6 @@ object ChangePropertyGuiElementRequest extends KnoraJsonLDRequestReaderV2[Change apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangePropertyGuiElementRequest] = Future { @@ -980,7 +964,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 settings the application settings. * @param log a logging adapter. * @return a [[ChangePropertyLabelsOrCommentsRequestV2]] representing the input. */ @@ -989,7 +972,6 @@ object ChangePropertyLabelsOrCommentsRequestV2 apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangePropertyLabelsOrCommentsRequestV2] = Future { @@ -1051,7 +1033,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 settings the application settings. * @param log a logging adapter. * @return a [[DeletePropertyCommentRequestV2]] representing the input. */ @@ -1060,7 +1041,6 @@ object DeletePropertyCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteP apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeletePropertyCommentRequestV2] = Future { @@ -1122,7 +1102,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 settings the application settings. * @param log a logging adapter. * @return a [[ChangeClassLabelsOrCommentsRequestV2]] representing the input. */ @@ -1131,7 +1110,6 @@ object ChangeClassLabelsOrCommentsRequestV2 extends KnoraJsonLDRequestReaderV2[C apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeClassLabelsOrCommentsRequestV2] = Future { @@ -1193,7 +1171,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 settings the application settings. * @param log a logging adapter. * @return a [[DeleteClassCommentRequestV2]] representing the input. */ @@ -1202,7 +1179,6 @@ object DeleteClassCommentRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteClas apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteClassCommentRequestV2] = Future { @@ -1245,7 +1221,6 @@ object ChangeGuiOrderRequestV2 extends KnoraJsonLDRequestReaderV2[ChangeGuiOrder apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeGuiOrderRequestV2] = Future { @@ -1314,7 +1289,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 settings the application settings. * @param log a logging adapter. * @return a [[ChangeClassLabelsOrCommentsRequestV2]] representing the input. */ @@ -1323,7 +1297,6 @@ object ChangeOntologyMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Change apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ChangeOntologyMetadataRequestV2] = Future { @@ -1668,12 +1641,12 @@ case class ReadOntologyV2( override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = - toOntologySchema(targetSchema).generateJsonLD(targetSchema, settings) + toOntologySchema(targetSchema).generateJsonLD(targetSchema, appConfig) - private def generateJsonLD(targetSchema: ApiV2Schema, settings: KnoraSettingsImpl): JsonLDDocument = { + private def generateJsonLD(targetSchema: ApiV2Schema, appConfig: AppConfig): JsonLDDocument = { // Get the ontologies of all Knora entities mentioned in class definitions. val knoraOntologiesFromClasses: Set[SmartIri] = classes.values.flatMap { classInfo => @@ -1748,7 +1721,7 @@ case class ReadOntologyV2( val jsonClasses: Vector[JsonLDObject] = classes.values.map { readClassInfo => userLang match { case Some(lang) => - readClassInfo.toJsonLDWithSingleLanguage(targetSchema = targetSchema, userLang = lang, settings = settings) + readClassInfo.toJsonLDWithSingleLanguage(targetSchema = targetSchema, userLang = lang, appConfig = appConfig) case None => readClassInfo.toJsonLDWithAllLanguages(targetSchema = targetSchema) } }.toVector @@ -1756,7 +1729,11 @@ case class ReadOntologyV2( val jsonProperties: Vector[JsonLDObject] = properties.values.map { readPropertyInfo => userLang match { case Some(lang) => - readPropertyInfo.toJsonLDWithSingleLanguage(targetSchema = targetSchema, userLang = lang, settings = settings) + readPropertyInfo.toJsonLDWithSingleLanguage( + targetSchema = targetSchema, + userLang = lang, + appConfig = appConfig + ) case None => readPropertyInfo.toJsonLDWithAllLanguages(targetSchema = targetSchema) } }.toVector @@ -1767,7 +1744,7 @@ case class ReadOntologyV2( readIndividualInfo.toJsonLDWithSingleLanguage( targetSchema = targetSchema, userLang = lang, - settings = settings + appConfig = appConfig ) case None => readIndividualInfo.toJsonLDWithAllLanguages(targetSchema = targetSchema) } @@ -2035,7 +2012,7 @@ case class ReadOntologyMetadataV2(ontologies: Set[OntologyMetadataV2]) def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = toOntologySchema(targetSchema).generateJsonLD(targetSchema) @@ -2297,12 +2274,12 @@ sealed trait EntityInfoContentV2 { */ def getPredicateAndStringLiteralObjectWithLang( predicateIri: SmartIri, - settings: KnoraSettingsImpl, + appConfig: AppConfig, userLang: String ): Option[(SmartIri, String)] = getPredicateStringLiteralObject( predicateIri = predicateIri, - preferredLangs = Some(userLang, settings.fallbackLanguage) + preferredLangs = Some(userLang, appConfig.fallbackLanguage) ).map(obj => predicateIri -> obj) /** @@ -2570,22 +2547,22 @@ sealed trait ReadEntityInfoV2 { * * @param targetSchema the API v2 schema in which the response will be returned. * @param userLang the user's preferred language. - * @param settings the application settings. + * @param appConfig the application's configuration. * @return a JSON-LD object representing the entity. */ def toJsonLDWithSingleLanguage( targetSchema: ApiV2Schema, userLang: String, - settings: KnoraSettingsImpl + appConfig: AppConfig ): JsonLDObject = { val label: Option[(IRI, JsonLDString)] = entityInfoContent - .getPredicateAndStringLiteralObjectWithLang(OntologyConstants.Rdfs.Label.toSmartIri, settings, userLang) + .getPredicateAndStringLiteralObjectWithLang(OntologyConstants.Rdfs.Label.toSmartIri, appConfig, userLang) .map { case (k: SmartIri, v: String) => (k.toString, JsonLDString(v)) } val comment: Option[(IRI, JsonLDString)] = entityInfoContent - .getPredicateAndStringLiteralObjectWithLang(OntologyConstants.Rdfs.Comment.toSmartIri, settings, userLang) + .getPredicateAndStringLiteralObjectWithLang(OntologyConstants.Rdfs.Comment.toSmartIri, appConfig, userLang) .map { case (k: SmartIri, v: String) => (k.toString, JsonLDString(v)) } 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 db894412e4..c87e9dbbc2 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 @@ -17,6 +17,7 @@ import scala.concurrent.Future import dsp.errors._ import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -35,7 +36,6 @@ import org.knora.webapi.messages.util.standoff.XMLUtil import org.knora.webapi.messages.v2.responder._ import org.knora.webapi.messages.v2.responder.standoffmessages.MappingXMLtoStandoff import org.knora.webapi.messages.v2.responder.valuemessages._ -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util._ /** @@ -108,7 +108,7 @@ case class ResourceIIIFManifestGetRequestV2( case class ResourceIIIFManifestGetResponseV2(manifest: JsonLDDocument) extends KnoraJsonLDResponseV2 { override protected def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = manifest } @@ -185,7 +185,7 @@ case class ResourceVersionHistoryResponseV2(history: Seq[ResourceHistoryEntry]) */ override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -271,7 +271,7 @@ case class ResourceTEIGetResponseV2(header: TEIHeader, body: TEIBody) { case class TEIHeader( headerInfo: ReadResourceV2, headerXSLT: Option[String], - settings: KnoraSettingsImpl + appConfig: AppConfig ) { def toXML: String = @@ -280,7 +280,7 @@ case class TEIHeader( // Convert the resource to a JsonLDDocument. val headerJsonLD: JsonLDDocument = - ReadResourcesSequenceV2(Seq(headerInfo)).toJsonLDDocument(ApiV2Complex, settings) + ReadResourcesSequenceV2(Seq(headerInfo)).toJsonLDDocument(ApiV2Complex, appConfig) // Convert the JsonLDDocument to an RdfModel. val rdfModel: RdfModel = headerJsonLD.toRdfModel(rdfFormatUtil.getRdfModelFactory) @@ -422,7 +422,7 @@ case class ReadResourceV2( def toJsonLD( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDObject = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -437,7 +437,7 @@ case class ReadResourceV2( readValue.toJsonLD( targetSchema = targetSchema, projectADM = projectADM, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) } @@ -666,7 +666,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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -675,7 +674,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateResourceRequestV2] = { @@ -784,7 +782,6 @@ object CreateResourceRequestV2 extends KnoraJsonLDRequestReaderV2[CreateResource jsonLDObject = valueJsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -880,7 +877,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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -889,7 +885,6 @@ object UpdateResourceMetadataRequestV2 extends KnoraJsonLDRequestReaderV2[Update apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UpdateResourceMetadataRequestV2] = Future { @@ -978,7 +973,7 @@ case class UpdateResourceMetadataResponseV2( */ override protected def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { @@ -1067,7 +1062,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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -1076,7 +1070,6 @@ object DeleteOrEraseResourceRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteO apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteOrEraseResourceRequestV2] = Future { @@ -1164,7 +1157,7 @@ case class ReadResourcesSequenceV2( private def generateJsonLD( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -1174,7 +1167,7 @@ case class ReadResourcesSequenceV2( val resourcesJsonObjects: Seq[JsonLDObject] = resources.map { resource: ReadResourceV2 => resource.toJsonLD( targetSchema = targetSchema, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) } @@ -1228,12 +1221,12 @@ case class ReadResourcesSequenceV2( override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] = Set.empty ): JsonLDDocument = toOntologySchema(targetSchema).generateJsonLD( targetSchema = targetSchema, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) @@ -1373,7 +1366,7 @@ case class GraphEdgeV2(source: IRI, propertyIri: SmartIri, target: IRI) extends case class GraphDataGetResponseV2(nodes: Seq[GraphNodeV2], edges: Seq[GraphEdgeV2], ontologySchema: OntologySchema) extends KnoraJsonLDResponseV2 with KnoraReadV2[GraphDataGetResponseV2] { - private def generateJsonLD(targetSchema: ApiV2Schema, settings: KnoraSettingsImpl): JsonLDDocument = { + private def generateJsonLD(targetSchema: ApiV2Schema): JsonLDDocument = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance val sortedNodesInTargetSchema: Seq[GraphNodeV2] = nodes.map(_.toOntologySchema(targetSchema)).sortBy(_.resourceIri) @@ -1453,10 +1446,10 @@ case class GraphDataGetResponseV2(nodes: Seq[GraphNodeV2], edges: Seq[GraphEdgeV override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = - toOntologySchema(targetSchema).generateJsonLD(targetSchema, settings) + toOntologySchema(targetSchema).generateJsonLD(targetSchema) override def toOntologySchema(targetSchema: ApiV2Schema): GraphDataGetResponseV2 = GraphDataGetResponseV2( @@ -1510,7 +1503,7 @@ case class ResourceEventBody( def toJsonLD( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDObject = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -1523,7 +1516,7 @@ case class ResourceEventBody( .toJsonLDValue( targetSchema = targetSchema, projectADM = projectADM, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) } @@ -1638,7 +1631,7 @@ case class ValueEventBody( def toJsonLD( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDObject = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -1649,7 +1642,7 @@ case class ValueEventBody( .toJsonLDValue( targetSchema = targetSchema, projectADM = projectADM, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) propertyIri.toString -> contentJsonLD @@ -1707,7 +1700,7 @@ case class ResourceAndValueVersionHistoryResponseV2(historyEvents: Seq[ResourceA */ override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -1721,9 +1714,9 @@ case class ResourceAndValueVersionHistoryResponseV2(historyEvents: Seq[ResourceA val historyEventsAsJsonLD: Seq[JsonLDObject] = historyEvents.map { historyEntry: ResourceAndValueHistoryEvent => // convert event body to JsonLD object val eventBodyAsJsonLD: JsonLDObject = historyEntry.eventBody match { - case valueEventBody: ValueEventBody => valueEventBody.toJsonLD(targetSchema, settings, schemaOptions) + case valueEventBody: ValueEventBody => valueEventBody.toJsonLD(targetSchema, appConfig, schemaOptions) case resourceEventBody: ResourceEventBody => - resourceEventBody.toJsonLD(targetSchema, settings, schemaOptions) + resourceEventBody.toJsonLD(targetSchema, appConfig, schemaOptions) case resourceMetadataEventBody: ResourceMetadataEventBody => resourceMetadataEventBody.toJsonLD case _ => throw NotFoundException(s"Event body is missing or has wrong type.") 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 e718d04dcf..e028921cd5 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,6 +8,7 @@ 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.config.AppConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 import org.knora.webapi.messages.SmartIri @@ -18,7 +19,6 @@ import org.knora.webapi.messages.util.rdf.JsonLDObject import org.knora.webapi.messages.util.rdf.JsonLDString import org.knora.webapi.messages.util.search.ConstructQuery import org.knora.webapi.messages.v2.responder._ -import org.knora.webapi.settings.KnoraSettingsImpl /** * An abstract trait for messages that can be sent to `SearchResponderV2`. @@ -134,7 +134,7 @@ case class SearchResourceByLabelRequestV2( case class ResourceCountV2(numberOfResources: Int) extends KnoraJsonLDResponseV2 { override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = JsonLDDocument( 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 7b504b7326..33e7401bc8 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 @@ -17,6 +17,7 @@ import scala.concurrent.Future import dsp.errors.AssertionException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -28,7 +29,6 @@ import org.knora.webapi.messages.v2.responder.KnoraContentV2 import org.knora.webapi.messages.v2.responder.KnoraJsonLDRequestReaderV2 import org.knora.webapi.messages.v2.responder.KnoraJsonLDResponseV2 import org.knora.webapi.messages.v2.responder.ontologymessages.StandoffEntityInfoGetResponseV2 -import org.knora.webapi.settings.KnoraSettingsImpl /** * An abstract trait representing a Knora v2 API request message that can be sent to `StandoffResponderV2`. @@ -84,7 +84,7 @@ case class GetStandoffResponseV2(valueIri: IRI, standoff: Seq[StandoffTagV2], ne */ override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { if (targetSchema != ApiV2Complex) { @@ -153,7 +153,6 @@ object CreateMappingRequestMetadataV2 extends KnoraJsonLDRequestReaderV2[CreateM apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateMappingRequestMetadataV2] = Future { @@ -211,7 +210,7 @@ case class CreateMappingResponseV2(mappingIri: IRI, label: String, projectIri: S def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { 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 003df3ab83..daa5e3e256 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 @@ -21,6 +21,7 @@ import dsp.errors.BadRequestException import dsp.errors.NotImplementedException import dsp.valueobjects.IriErrorMessages import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 @@ -39,8 +40,6 @@ import org.knora.webapi.messages.util.standoff.XMLUtil import org.knora.webapi.messages.v2.responder._ import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourceV2 import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.store.iiif.errors.SipiException import org.knora.webapi.util._ /** @@ -74,7 +73,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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -83,7 +81,6 @@ object CreateValueRequestV2 extends KnoraJsonLDRequestReaderV2[CreateValueReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[CreateValueRequestV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -108,7 +105,6 @@ object CreateValueRequestV2 extends KnoraJsonLDRequestReaderV2[CreateValueReques jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -188,7 +184,7 @@ case class CreateValueResponseV2( with UpdateResultInProject { override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -244,7 +240,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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -253,7 +248,6 @@ object UpdateValueRequestV2 extends KnoraJsonLDRequestReaderV2[UpdateValueReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UpdateValueRequestV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -352,7 +346,6 @@ object UpdateValueRequestV2 extends KnoraJsonLDRequestReaderV2[UpdateValueReques jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -394,7 +387,7 @@ case class UpdateValueResponseV2(valueIri: IRI, valueType: SmartIri, valueUUID: with UpdateResultInProject { override def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -455,7 +448,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 settings the application settings. * @param log a logging adapter. * @return a case class instance representing the input. */ @@ -464,7 +456,6 @@ object DeleteValueRequestV2 extends KnoraJsonLDRequestReaderV2[DeleteValueReques apiRequestID: UUID, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DeleteValueRequestV2] = Future { @@ -690,13 +681,12 @@ sealed trait ReadValueV2 extends IOValueV2 { * Converts this value to JSON-LD. * * @param targetSchema the target schema. - * @param settings the application settings. * @return a JSON-LD representation of this value. */ def toJsonLD( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -704,7 +694,7 @@ sealed trait ReadValueV2 extends IOValueV2 { val valueContentAsJsonLD = valueContent.toJsonLDValue( targetSchema = targetSchema, projectADM = projectADM, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) @@ -826,7 +816,7 @@ case class ReadTextValueV2( override def toJsonLD( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -834,7 +824,7 @@ case class ReadTextValueV2( val valueAsJsonLDValue: JsonLDValue = super.toJsonLD( targetSchema = targetSchema, projectADM = projectADM, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) @@ -1103,13 +1093,12 @@ sealed trait ValueContentV2 extends KnoraContentV2[ValueContentV2] { * A representation of the `ValueContentV2` as a [[JsonLDValue]]. * * @param targetSchema the API schema to be used. - * @param settings the configuration options. * @return a [[JsonLDValue]] that can be used to generate JSON-LD representing this value. */ def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue @@ -1154,7 +1143,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 settings the application settings. * @param log a logging adapter. * @return a subclass of [[ValueContentV2]]. */ @@ -1162,7 +1150,6 @@ trait ValueContentReaderV2[C <: ValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[C] @@ -1184,7 +1171,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 settings the application settings. * @param log a logging adapter. * @return a [[ValueContentV2]]. */ @@ -1192,7 +1178,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -1210,7 +1195,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1219,7 +1203,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1228,7 +1211,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1237,7 +1219,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1246,7 +1227,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1255,7 +1235,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1264,7 +1243,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1273,7 +1251,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1282,7 +1259,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1291,7 +1267,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1300,7 +1275,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1309,7 +1283,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1318,7 +1291,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1327,7 +1299,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1336,7 +1307,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1345,7 +1315,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1354,7 +1323,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1363,7 +1331,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1372,7 +1339,6 @@ object ValueContentV2 extends ValueContentReaderV2[ValueContentV2] { jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -1438,7 +1404,7 @@ case class DateValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -1543,8 +1509,7 @@ 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 settings the application settings. + * @param appActor a reference to the application actor. * @param log a logging adapter. * @return a [[DateValueContentV2]]. */ @@ -1552,7 +1517,6 @@ object DateValueContentV2 extends ValueContentReaderV2[DateValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DateValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -1729,7 +1693,7 @@ case class TextValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -1940,7 +1904,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 settings the application settings. * @param log a logging adapter. * @return a [[TextValueContentV2]]. */ @@ -1948,7 +1911,6 @@ object TextValueContentV2 extends ValueContentReaderV2[TextValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TextValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -2056,7 +2018,7 @@ case class IntegerValueContentV2(ontologySchema: OntologySchema, valueHasInteger override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2107,7 +2069,6 @@ object IntegerValueContentV2 extends ValueContentReaderV2[IntegerValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[IntegerValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2149,7 +2110,7 @@ case class DecimalValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { val decimalValueAsJsonLDObject = JsonLDUtil.datatypeValueToJsonLDObject( @@ -2205,7 +2166,6 @@ object DecimalValueContentV2 extends ValueContentReaderV2[DecimalValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DecimalValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2251,7 +2211,7 @@ case class BooleanValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2299,7 +2259,6 @@ object BooleanValueContentV2 extends ValueContentReaderV2[BooleanValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[BooleanValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2338,7 +2297,7 @@ case class GeomValueContentV2(ontologySchema: OntologySchema, valueHasGeometry: override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2395,7 +2354,6 @@ object GeomValueContentV2 extends ValueContentReaderV2[GeomValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[GeomValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2442,7 +2400,7 @@ case class IntervalValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2513,7 +2471,6 @@ object IntervalValueContentV2 extends ValueContentReaderV2[IntervalValueContentV jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[IntervalValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2565,7 +2522,7 @@ case class TimeValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2629,7 +2586,6 @@ object TimeValueContentV2 extends ValueContentReaderV2[TimeValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TimeValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2677,7 +2633,7 @@ case class HierarchicalListValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2744,7 +2700,6 @@ object HierarchicalListValueContentV2 extends ValueContentReaderV2[HierarchicalL jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[HierarchicalListValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2789,7 +2744,7 @@ case class ColorValueContentV2(ontologySchema: OntologySchema, valueHasColor: St override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -2846,7 +2801,6 @@ object ColorValueContentV2 extends ValueContentReaderV2[ColorValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ColorValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2887,7 +2841,7 @@ case class UriValueContentV2(ontologySchema: OntologySchema, valueHasUri: String override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { val uriAsJsonLDObject = JsonLDUtil.datatypeValueToJsonLDObject( @@ -2946,7 +2900,6 @@ object UriValueContentV2 extends ValueContentReaderV2[UriValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[UriValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -2992,7 +2945,7 @@ case class GeonameValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -3051,7 +3004,6 @@ object GeonameValueContentV2 extends ValueContentReaderV2[GeonameValueContentV2] jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[GeonameValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -3098,7 +3050,6 @@ object FileValueWithSipiMetadata { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[FileValueWithSipiMetadata] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3113,7 +3064,7 @@ object FileValueWithSipiMetadata { ) // Ask Sipi about the rest of the file's metadata. - tempFilePath = stringFormatter.makeSipiTempFilePath(settings, internalFilename) + tempFilePath = stringFormatter.makeSipiTempFilePath(internalFilename) fileMetadataResponse: GetFileMetadataResponse <- appActor .ask( GetFileMetadataRequest( @@ -3186,16 +3137,16 @@ case class StillImageFileValueContentV2( override def toOntologySchema(targetSchema: OntologySchema): StillImageFileValueContentV2 = copy(ontologySchema = targetSchema) - def makeFileUrl(projectADM: ProjectADM, settings: KnoraSettingsImpl): String = - s"${settings.externalSipiIIIFGetUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/full/$dimX,$dimY/0/default.jpg" + def makeFileUrl(projectADM: ProjectADM, url: String): String = + s"${url}/${projectADM.shortcode}/${fileValue.internalFilename}/full/$dimX,$dimY/0/default.jpg" override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { - val fileUrl: String = makeFileUrl(projectADM, settings) + val fileUrl: String = makeFileUrl(projectADM, appConfig.sipi.externalBaseUrl) targetSchema match { case ApiV2Simple => toJsonLDValueInSimpleSchema(fileUrl) @@ -3207,7 +3158,7 @@ case class StillImageFileValueContentV2( OntologyConstants.KnoraApiV2Complex.StillImageFileValueHasDimY -> JsonLDInt(dimY), OntologyConstants.KnoraApiV2Complex.StillImageFileValueHasIIIFBaseUrl -> JsonLDUtil .datatypeValueToJsonLDObject( - value = s"${settings.externalSipiIIIFGetUrl}/${projectADM.shortcode}", + value = s"${appConfig.sipi.externalBaseUrl}/${projectADM.shortcode}", datatype = OntologyConstants.Xsd.Uri.toSmartIri ) ) @@ -3235,6 +3186,7 @@ case class StillImageFileValueContentV2( case _ => throw AssertionException(s"Can't compare a <$valueType> to a <${currentVersion.valueType}>") } + } /** @@ -3245,7 +3197,6 @@ object StillImageFileValueContentV2 extends ValueContentReaderV2[StillImageFileV jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[StillImageFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3256,22 +3207,13 @@ object StillImageFileValueContentV2 extends ValueContentReaderV2[StillImageFileV jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) - - _ = if (!settings.imageMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { - throw BadRequestException( - s"File ${fileValueWithSipiMetadata.fileValue.internalFilename} has MIME type ${fileValueWithSipiMetadata.fileValue.internalMimeType}, which is not supported for still image files" - ) - } } yield StillImageFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = fileValueWithSipiMetadata.fileValue, - dimX = fileValueWithSipiMetadata.sipiFileMetadata.width - .getOrElse(throw SipiException(s"Sipi did not return the image width")), - dimY = fileValueWithSipiMetadata.sipiFileMetadata.height - .getOrElse(throw SipiException(s"Sipi did not return the image height")), + dimX = fileValueWithSipiMetadata.sipiFileMetadata.width.getOrElse(0), + dimY = fileValueWithSipiMetadata.sipiFileMetadata.height.getOrElse(0), comment = getComment(jsonLDObject) ) } @@ -3307,10 +3249,11 @@ case class DocumentFileValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { - val fileUrl: String = s"${settings.externalSipiBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" + val fileUrl: String = + s"${appConfig.sipi.externalBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" targetSchema match { case ApiV2Simple => toJsonLDValueInSimpleSchema(fileUrl) @@ -3380,10 +3323,11 @@ case class ArchiveFileValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { - val fileUrl: String = s"${settings.externalSipiBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" + val fileUrl: String = + s"${appConfig.sipi.externalBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" targetSchema match { case ApiV2Simple => toJsonLDValueInSimpleSchema(fileUrl) @@ -3424,7 +3368,6 @@ object DocumentFileValueContentV2 extends ValueContentReaderV2[DocumentFileValue jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[DocumentFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3434,15 +3377,9 @@ object DocumentFileValueContentV2 extends ValueContentReaderV2[DocumentFileValue jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) - _ = if (!settings.documentMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { - throw BadRequestException( - s"File ${fileValueWithSipiMetadata.fileValue.internalFilename} has MIME type ${fileValueWithSipiMetadata.fileValue.internalMimeType}, which is not supported for document files" - ) - } } yield DocumentFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = fileValueWithSipiMetadata.fileValue, @@ -3462,7 +3399,6 @@ object ArchiveFileValueContentV2 extends ValueContentReaderV2[ArchiveFileValueCo jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[ArchiveFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3472,15 +3408,9 @@ object ArchiveFileValueContentV2 extends ValueContentReaderV2[ArchiveFileValueCo jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) - _ = if (!settings.archiveMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { - throw BadRequestException( - s"File ${fileValueWithSipiMetadata.fileValue.internalFilename} has MIME type ${fileValueWithSipiMetadata.fileValue.internalMimeType}, which is not supported for archive files" - ) - } } yield ArchiveFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = fileValueWithSipiMetadata.fileValue, @@ -3513,10 +3443,11 @@ case class TextFileValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { - val fileUrl: String = s"${settings.externalSipiBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" + val fileUrl: String = + s"${appConfig.sipi.externalBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" targetSchema match { case ApiV2Simple => toJsonLDValueInSimpleSchema(fileUrl) @@ -3555,7 +3486,6 @@ object TextFileValueContentV2 extends ValueContentReaderV2[TextFileValueContentV jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TextFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3565,15 +3495,9 @@ object TextFileValueContentV2 extends ValueContentReaderV2[TextFileValueContentV jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) - _ = if (!settings.textMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { - throw BadRequestException( - s"File ${fileValueWithSipiMetadata.fileValue.internalFilename} has MIME type ${fileValueWithSipiMetadata.fileValue.internalMimeType}, which is not supported for text files" - ) - } } yield TextFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = fileValueWithSipiMetadata.fileValue, @@ -3606,10 +3530,11 @@ case class AudioFileValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { - val fileUrl: String = s"${settings.externalSipiBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" + val fileUrl: String = + s"${appConfig.sipi.externalBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" targetSchema match { case ApiV2Simple => toJsonLDValueInSimpleSchema(fileUrl) @@ -3648,7 +3573,6 @@ object AudioFileValueContentV2 extends ValueContentReaderV2[AudioFileValueConten jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[AudioFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3658,15 +3582,9 @@ object AudioFileValueContentV2 extends ValueContentReaderV2[AudioFileValueConten jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) - _ = if (!settings.audioMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { - throw BadRequestException( - s"File ${fileValueWithSipiMetadata.fileValue.internalFilename} has MIME type ${fileValueWithSipiMetadata.fileValue.internalMimeType}, which is not supported for audio files" - ) - } } yield AudioFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = fileValueWithSipiMetadata.fileValue, @@ -3699,10 +3617,11 @@ case class MovingImageFileValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = { - val fileUrl: String = s"${settings.externalSipiBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" + val fileUrl: String = + s"${appConfig.sipi.externalBaseUrl}/${projectADM.shortcode}/${fileValue.internalFilename}/file" targetSchema match { case ApiV2Simple => toJsonLDValueInSimpleSchema(fileUrl) @@ -3743,7 +3662,6 @@ object MovingImageFileValueContentV2 extends ValueContentReaderV2[MovingImageFil jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[MovingImageFileValueContentV2] = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance @@ -3753,15 +3671,9 @@ object MovingImageFileValueContentV2 extends ValueContentReaderV2[MovingImageFil jsonLDObject = jsonLDObject, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) - _ = if (!settings.videoMimeTypes.contains(fileValueWithSipiMetadata.fileValue.internalMimeType)) { - throw BadRequestException( - s"File ${fileValueWithSipiMetadata.fileValue.internalFilename} has MIME type ${fileValueWithSipiMetadata.fileValue.internalMimeType}, which is not supported for video files" - ) - } } yield MovingImageFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = fileValueWithSipiMetadata.fileValue, @@ -3815,7 +3727,7 @@ case class LinkValueContentV2( override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = targetSchema match { @@ -3828,7 +3740,7 @@ case class LinkValueContentV2( // include the nested resource in the response val referredResourceAsJsonLDValue: JsonLDObject = targetResource.toJsonLD( targetSchema = targetSchema, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) @@ -3889,7 +3801,6 @@ object LinkValueContentV2 extends ValueContentReaderV2[LinkValueContentV2] { jsonLDObject: JsonLDObject, requestingUser: UserADM, appActor: ActorRef, - settings: KnoraSettingsImpl, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[LinkValueContentV2] = Future(fromJsonLDObjectSync(jsonLDObject)) @@ -3933,7 +3844,7 @@ case class DeletedValueContentV2(ontologySchema: OntologySchema, comment: Option override def toJsonLDValue( targetSchema: ApiV2Schema, projectADM: ProjectADM, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDValue = JsonLDObject(Map(OntologyConstants.KnoraBase.DeletedValue -> JsonLDString("DeletedValue"))) 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 5cd8f5652d..fd534621e6 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala @@ -18,13 +18,13 @@ import scala.concurrent.ExecutionContext import scala.concurrent.Future import dsp.errors._ +import org.knora.webapi.settings.KnoraDispatchers import org.knora.webapi.store.cache.settings.CacheServiceSettings import messages.store.triplestoremessages.SparqlSelectRequest import messages.util.ResponderData import messages.util.rdf.SparqlSelectResult import messages.{SmartIri, StringFormatter} -import settings.{KnoraDispatchers, KnoraSettingsImpl} /** * Responder helper methods. @@ -62,11 +62,6 @@ abstract class Responder(responderData: ResponderData) extends LazyLogging { protected implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - /** - * The application settings. - */ - protected val settings: KnoraSettingsImpl = responderData.knoraSettings - /** * The Cache Service settings. */ @@ -85,7 +80,7 @@ abstract class Responder(responderData: ResponderData) extends LazyLogging { /** * The application's default timeout for `ask` messages. */ - protected implicit val timeout: Timeout = settings.defaultTimeout + protected implicit val timeout: Timeout = responderData.appConfig.defaultTimeoutAsDuration /** * Provides logging 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 b9a9997922..0d82c5b768 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 @@ -798,7 +798,7 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde .getNodePath( queryNodeIri = queryNodeIri, preferredLanguage = requestingUser.lang, - fallbackLanguage = settings.fallbackLanguage + fallbackLanguage = responderData.appConfig.fallbackLanguage ) .toString() } 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 87cfdd8672..d657292e91 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 @@ -63,7 +63,7 @@ class StoresResponderADM(responderData: ResponderData) extends Responder(respond for { // FIXME: need to call directly into the State service - value: Boolean <- FastFuture.successful(settings.allowReloadOverHTTP) + value: Boolean <- FastFuture.successful(responderData.appConfig.allowReloadOverHttp) _ = if (!value) { throw ForbiddenException( "The ResetTriplestoreContent operation is not allowed. Did you start the server with the right flag?" 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 211adb15cf..5b7070cc73 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 @@ -499,7 +499,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde } // hash the new password - encoder = new BCryptPasswordEncoder(settings.bcryptPasswordStrength) + encoder = new BCryptPasswordEncoder(responderData.appConfig.bcryptPasswordStrength) newHashedPassword = Password .make(encoder.encode(userUpdatePasswordPayload.newPassword.value)) .fold(e => throw e.head, value => value) @@ -1673,7 +1673,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde userIri: IRI <- checkOrCreateEntityIri(customUserIri, stringFormatter.makeRandomPersonIri) // hash password - encoder = new BCryptPasswordEncoder(settings.bcryptPasswordStrength) + encoder = new BCryptPasswordEncoder(responderData.appConfig.bcryptPasswordStrength) hashedPassword = encoder.encode(userCreatePayloadADM.password.value) // Create the new user. diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/ListsResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/ListsResponderV1.scala index ddba0610f3..0d5f0c9598 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/ListsResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/ListsResponderV1.scala @@ -147,7 +147,7 @@ class ListsResponderV1(responderData: ResponderData) extends Responder(responder .getList( rootNodeIri = rootNodeIri, preferredLanguage = userProfile.userData.lang, - fallbackLanguage = settings.fallbackLanguage + fallbackLanguage = responderData.appConfig.fallbackLanguage ) .toString() } @@ -229,7 +229,7 @@ class ListsResponderV1(responderData: ResponderData) extends Responder(responder .getNodePath( queryNodeIri = queryNodeIri, preferredLanguage = userProfile.userData.lang, - fallbackLanguage = settings.fallbackLanguage + fallbackLanguage = responderData.appConfig.fallbackLanguage ) .toString() } 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 89ff42aad7..5bd5c6be93 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 @@ -37,7 +37,7 @@ import org.knora.webapi.responders.Responder.handleUnexpectedMessage */ class OntologyResponderV1(responderData: ResponderData) extends Responder(responderData) { - private val valueUtilV1 = new ValueUtilV1(settings) + private val valueUtilV1 = new ValueUtilV1(responderData.appConfig) /** * Receives a message extending [[OntologyResponderRequestV1]], and returns an appropriate response message. @@ -240,14 +240,14 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon predicateIri = OntologyConstants.Rdfs.Label, preferredLangs = Some( userProfile.lang, - settings.fallbackLanguage + responderData.appConfig.fallbackLanguage ) ), description = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, preferredLangs = Some( userProfile.lang, - settings.fallbackLanguage + responderData.appConfig.fallbackLanguage ) ), vocabulary = entityInfo.ontologyIri, @@ -290,14 +290,14 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon predicateIri = OntologyConstants.Rdfs.Label, preferredLangs = Some( userProfile.lang, - settings.fallbackLanguage + responderData.appConfig.fallbackLanguage ) ), description = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, preferredLangs = Some( userProfile.lang, - settings.fallbackLanguage + responderData.appConfig.fallbackLanguage ) ), vocabulary = entityInfo.ontologyIri, @@ -340,11 +340,11 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon name = resourceTypeIri, label = resourceClassInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), description = resourceClassInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), iconsrc = resourceClassInfo.getPredicateObject(OntologyConstants.KnoraBase.ResourceIcon), @@ -620,11 +620,11 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon name = propertyIri, label = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), description = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), vocabulary = entityInfo.ontologyIri, valuetype_id = OntologyConstants.KnoraBase.LinkValue, @@ -652,11 +652,11 @@ class OntologyResponderV1(responderData: ResponderData) extends Responder(respon name = propertyIri, label = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), description = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), vocabulary = entityInfo.ontologyIri, valuetype_id = entityInfo 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 623aad6735..5583b3bb39 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 @@ -61,7 +61,7 @@ import org.knora.webapi.util.ApacheLuceneSupport.MatchStringWhileTyping class ResourcesResponderV1(responderData: ResponderData) extends Responder(responderData) { // Converts SPARQL query results to ApiValueV1 objects. - private val valueUtilV1 = new ValueUtilV1(settings) + private val valueUtilV1 = new ValueUtilV1(responderData.appConfig) /** * Receives a message extending [[ResourcesResponderRequestV1]], and returns an appropriate response message. @@ -435,8 +435,10 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .resourceClassInfoMap(node.nodeClass) .getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = - Some(graphDataGetRequest.userADM.lang, settings.fallbackLanguage) + preferredLangs = Some( + graphDataGetRequest.userADM.lang, + responderData.appConfig.fallbackLanguage + ) ) .getOrElse( throw InconsistentRepositoryDataException( @@ -459,8 +461,10 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo .propertyInfoMap(edge.linkProp) .getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = - Some(graphDataGetRequest.userADM.lang, settings.fallbackLanguage) + preferredLangs = Some( + graphDataGetRequest.userADM.lang, + responderData.appConfig.fallbackLanguage + ) ) .getOrElse( throw InconsistentRepositoryDataException( @@ -766,14 +770,14 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo resourceClassLabel = resourceTypeEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ) resInfo: ResourceInfoV1 = resInfoWithoutQueryingOntology.copy( restype_label = resourceClassLabel, restype_description = resourceTypeEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), restype_iconsrc = maybeResourceTypeIconSrc ) @@ -796,11 +800,11 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo resinfo = incoming.resinfo.copy( restype_label = incomingResourceTypeEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), restype_description = incomingResourceTypeEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), restype_iconsrc = incomingResourceTypeEntityInfo.getPredicateObject( OntologyConstants.KnoraBase.ResourceIcon @@ -872,7 +876,8 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo ), label = propertyEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = + Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), occurrence = Some(propsAndCardinalities(propertyIri).cardinality.value), attributes = (propertyEntityInfo.getPredicateStringObjectsWithoutLang( @@ -903,7 +908,8 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo ), label = propertyEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = + Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ), occurrence = Some(propsAndCardinalities(propertyIri).cardinality.value), attributes = propertyEntityInfo @@ -3096,11 +3102,11 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo entityInfo = entityInfoResponse.resourceClassInfoMap(resTypeIri) label = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ) description = entityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Comment, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ) iconsrc = entityInfo.getPredicateObject(OntologyConstants.KnoraBase.ResourceIcon) match { case Some(resClassIcon) => @@ -3227,7 +3233,7 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo label = propertyEntityInfo.flatMap( _.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ) ), occurrence = propertyCardinality.map(_.cardinality.value), @@ -3375,7 +3381,7 @@ class ResourcesResponderV1(responderData: ResponderData) extends Responder(respo case Some(referencedResTypeEntityInfo) => val labelOption: Option[String] = referencedResTypeEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(userProfile.lang, responderData.appConfig.fallbackLanguage) ) val resIconOption: Option[String] = referencedResTypeEntityInfo.getPredicateObject(OntologyConstants.KnoraBase.ResourceIcon) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala index 3b4796e1b4..1bd3607d4f 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala @@ -133,7 +133,7 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde valuePermissionCode: Option[Int] ) - val valueUtilV1 = new ValueUtilV1(settings) + val valueUtilV1 = new ValueUtilV1(responderData.appConfig) /** * Receives a message of type [[SearchResponderRequestV1]], and returns an appropriate response message. @@ -166,7 +166,7 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde .searchFulltext( searchTerms = LuceneQueryString(searchGetRequest.searchValue), preferredLanguage = searchGetRequest.userProfile.lang, - fallbackLanguage = settings.fallbackLanguage, + fallbackLanguage = responderData.appConfig.fallbackLanguage, projectIriOption = searchGetRequest.filterByProject, restypeIriOption = searchGetRequest.filterByRestype ) @@ -228,7 +228,7 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde val resourceEntityInfo: ClassInfoV1 = entityInfoResponse.resourceClassInfoMap(resourceClassIri) val resourceClassLabel = resourceEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(searchGetRequest.userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(searchGetRequest.userProfile.lang, responderData.appConfig.fallbackLanguage) ) val resourceClassIcon = resourceEntityInfo.getPredicateObject(OntologyConstants.KnoraBase.ResourceIcon) val resourceLabel = firstRowMap.getOrElse( @@ -259,7 +259,8 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde .propertyInfoMap(propertyIri) .getPredicateObject( OntologyConstants.Rdfs.Label, - preferredLangs = Some(searchGetRequest.userProfile.lang, settings.fallbackLanguage) + preferredLangs = + Some(searchGetRequest.userProfile.lang, responderData.appConfig.fallbackLanguage) ) match { case Some(label) => label case None => @@ -308,11 +309,11 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde value = resourceLabel +: matchingValues.map(_.literal), preview_nx = firstRowMap.get("previewDimX") match { case Some(previewDimX) => previewDimX.toInt - case None => settings.defaultIconSizeDimX + case None => responderData.appConfig.gui.defaultIconSize.dimX }, preview_ny = firstRowMap.get("previewDimY") match { case Some(previewDimY) => previewDimY.toInt - case None => settings.defaultIconSizeDimY + case None => responderData.appConfig.gui.defaultIconSize.dimY }, rights = resourcePermissionCode ) @@ -578,7 +579,7 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde .searchExtended( searchCriteria = searchCriteria, preferredLanguage = searchGetRequest.userProfile.lang, - fallbackLanguage = settings.fallbackLanguage, + fallbackLanguage = responderData.appConfig.fallbackLanguage, projectIriOption = searchGetRequest.filterByProject, restypeIriOption = searchGetRequest.filterByRestype, ownerIriOption = searchGetRequest.filterByOwner @@ -636,7 +637,7 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde val resourceEntityInfo = entityInfoResponse.resourceClassInfoMap(resourceClassIri) val resourceClassLabel = resourceEntityInfo.getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(searchGetRequest.userProfile.lang, settings.fallbackLanguage) + preferredLangs = Some(searchGetRequest.userProfile.lang, responderData.appConfig.fallbackLanguage) ) val resourceClassIcon = resourceEntityInfo.getPredicateObject(OntologyConstants.KnoraBase.ResourceIcon) val resourceLabel = firstRowMap.getOrElse( @@ -701,7 +702,8 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde .propertyInfoMap(propertyIri) .getPredicateObject( predicateIri = OntologyConstants.Rdfs.Label, - preferredLangs = Some(searchGetRequest.userProfile.lang, settings.fallbackLanguage) + preferredLangs = + Some(searchGetRequest.userProfile.lang, responderData.appConfig.fallbackLanguage) ) match { case Some(label) => label case None => @@ -759,11 +761,11 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde value = resourceLabel +: matchingValues.map(_.literal), preview_nx = firstRowMap.get("previewDimX") match { case Some(previewDimX) => previewDimX.toInt - case None => settings.defaultIconSizeDimX + case None => responderData.appConfig.gui.defaultIconSize.dimX }, preview_ny = firstRowMap.get("previewDimY") match { case Some(previewDimY) => previewDimY.toInt - case None => settings.defaultIconSizeDimY + case None => responderData.appConfig.gui.defaultIconSize.dimY }, rights = resourcePermissionCode ) @@ -830,7 +832,9 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde throw BadRequestException("Search limit must be greater than 0") } - if (limit > settings.maxResultsPerSearchResultPage) settings.maxResultsPerSearchResultPage else limit + if (limit > responderData.appConfig.maxResultsPerSearchResultPage) + responderData.appConfig.maxResultsPerSearchResultPage + else limit } /** 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 6d56e952b7..32f71ed5d7 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 @@ -98,7 +98,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder UserDataV1( lang = propsMap.get(OntologyConstants.KnoraAdmin.PreferredLanguage) match { case Some(langList) => langList - case None => settings.fallbackLanguage + case None => responderData.appConfig.fallbackLanguage }, user_id = Some(userIri), email = propsMap.get(OntologyConstants.KnoraAdmin.Email), @@ -454,7 +454,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder val userDataV1 = UserDataV1( lang = groupedUserData.get(OntologyConstants.KnoraAdmin.PreferredLanguage) match { case Some(langList) => langList.head - case None => settings.fallbackLanguage + case None => responderData.appConfig.fallbackLanguage }, user_id = Some(returnedUserIri), email = groupedUserData.get(OntologyConstants.KnoraAdmin.Email).map(_.head), @@ -494,7 +494,7 @@ class UsersResponderV1(responderData: ResponderData) extends Responder(responder val userDataV1 = UserDataV1( lang = groupedUserData.get(OntologyConstants.KnoraAdmin.PreferredLanguage) match { case Some(langList) => langList.head - case None => settings.fallbackLanguage + case None => responderData.appConfig.fallbackLanguage }, user_id = Some(returnedUserIri), email = groupedUserData.get(OntologyConstants.KnoraAdmin.Email).map(_.head), 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 d44f9055bf..0686e914c8 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 @@ -56,7 +56,7 @@ import org.knora.webapi.util._ */ class ValuesResponderV1(responderData: ResponderData) extends Responder(responderData) { // Converts SPARQL query results to ApiValueV1 objects. - val valueUtilV1 = new ValueUtilV1(settings) + val valueUtilV1 = new ValueUtilV1(responderData.appConfig) /** * Receives a message of type [[ValuesResponderRequestV1]], and returns an appropriate response message. 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 6e18d06485..217e685d8e 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 @@ -57,7 +57,11 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder ) .mapTo[ListGetResponseADM] - } yield ListGetResponseV2(list = listResponseADM.list, requestingUser.lang, settings.fallbackLanguage) + } yield ListGetResponseV2( + list = listResponseADM.list, + requestingUser.lang, + responderData.appConfig.fallbackLanguage + ) /** * Gets a single list node from the triplestore. @@ -80,6 +84,10 @@ class ListsResponderV2(responderData: ResponderData) extends Responder(responder ) ) .mapTo[ChildNodeInfoGetResponseADM] - } yield NodeGetResponseV2(node = nodeResponse.nodeinfo, requestingUser.lang, settings.fallbackLanguage) + } yield NodeGetResponseV2( + node = nodeResponse.nodeinfo, + requestingUser.lang, + responderData.appConfig.fallbackLanguage + ) } 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 c99e02bef2..a166b238f8 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 @@ -67,7 +67,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon */ def receive(msg: OntologiesResponderRequestV2) = msg match { case LoadOntologiesRequestV2(requestingUser) => - Cache.loadOntologies(settings, appActor, requestingUser) + Cache.loadOntologies(appActor, requestingUser) case EntityInfoGetRequestV2(classIris, propertyIris, requestingUser) => getEntityInfoResponseV2(classIris, propertyIris, requestingUser) case StandoffEntityInfoGetRequestV2(standoffClassIris, standoffPropertyIris, requestingUser) => @@ -293,7 +293,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon label = classInfo.entityInfoContent .getPredicateStringLiteralObject( predicateIri = OntologyConstants.Rdfs.Label.toSmartIri, - preferredLangs = Some(requestingUser.lang, settings.fallbackLanguage) + preferredLangs = Some(requestingUser.lang, responderData.appConfig.fallbackLanguage) ) .getOrElse( throw InconsistentRepositoryDataException(s"Resource class $subClassIri has no rdfs:label") @@ -508,7 +508,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Make sure the ontology doesn't already exist. existingOntologyMetadata: Option[OntologyMetadataV2] <- OntologyHelpers.loadOntologyMetadata( - settings, appActor, internalOntologyIri = internalOntologyIri ) @@ -568,7 +567,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon ).unescape maybeLoadedOntologyMetadata: Option[OntologyMetadataV2] <- OntologyHelpers.loadOntologyMetadata( - settings, appActor, internalOntologyIri = internalOntologyIri ) @@ -662,7 +660,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read its metadata. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = changeOntologyMetadataRequest.lastModificationDate @@ -724,7 +721,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedOntologyMetadata: Option[OntologyMetadataV2] <- OntologyHelpers.loadOntologyMetadata( - settings, appActor, internalOntologyIri = internalOntologyIri ) @@ -777,7 +773,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read its metadata. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deleteOntologyCommentRequestV2.lastModificationDate @@ -819,7 +814,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedOntologyMetadata: Option[OntologyMetadataV2] <- OntologyHelpers.loadOntologyMetadata( - settings, appActor, internalOntologyIri = internalOntologyIri ) @@ -869,7 +863,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = createClassRequest.lastModificationDate @@ -1004,7 +997,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -1013,7 +1005,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the data that was saved corresponds to the data that was submitted. loadedClassDef <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) @@ -1087,7 +1078,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = changeGuiOrderRequest.lastModificationDate @@ -1181,7 +1171,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -1190,7 +1179,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the data that was saved corresponds to the data that was submitted. loadedClassDef: ClassInfoContentV2 <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) @@ -1269,7 +1257,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = addCardinalitiesRequest.lastModificationDate @@ -1424,7 +1411,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -1433,7 +1419,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the data that was saved corresponds to the data that was submitted. loadedClassDef <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) @@ -1547,7 +1532,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = changeCardinalitiesRequest.lastModificationDate @@ -1673,7 +1657,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -1682,7 +1665,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the data that was saved corresponds to the data that was submitted. loadedClassDef <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) @@ -1773,7 +1755,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon iri = ONTOLOGY_CACHE_LOCK_IRI, task = () => CardinalityHandler.canDeleteCardinalitiesFromClass( - settings, appActor, deleteCardinalitiesFromClassRequest = canDeleteCardinalitiesFromClassRequest, internalClassIri = internalClassIri, @@ -1813,7 +1794,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon iri = ONTOLOGY_CACHE_LOCK_IRI, task = () => CardinalityHandler.deleteCardinalitiesFromClass( - settings, appActor, deleteCardinalitiesFromClassRequest = deleteCardinalitiesFromClassRequest, internalClassIri = internalClassIri, @@ -1864,7 +1844,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deleteClassRequest.lastModificationDate @@ -1906,7 +1885,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -2004,7 +1982,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deletePropertyRequest.lastModificationDate @@ -2074,7 +2051,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -2145,7 +2121,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon userCanUpdateOntology <- OntologyHelpers.canUserUpdateOntology(internalOntologyIri, canDeleteOntologyRequest.requestingUser) - subjectsUsingOntology <- OntologyHelpers.getSubjectsUsingOntology(settings, appActor, ontology) + subjectsUsingOntology <- OntologyHelpers.getSubjectsUsingOntology(appActor, ontology) } yield CanDoResponseV2(userCanUpdateOntology && subjectsUsingOntology.isEmpty) } @@ -2162,7 +2138,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deleteOntologyRequest.lastModificationDate @@ -2171,7 +2146,7 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that none of the entities in the ontology are used in data or in other ontologies. ontology = cacheData.ontologies(internalOntologyIri) - subjectsUsingOntology: Set[IRI] <- OntologyHelpers.getSubjectsUsingOntology(settings, appActor, ontology) + subjectsUsingOntology: Set[IRI] <- OntologyHelpers.getSubjectsUsingOntology(appActor, ontology) _ = if (subjectsUsingOntology.nonEmpty) { val sortedSubjects: Seq[IRI] = subjectsUsingOntology.map(s => "<" + s + ">").toVector.sorted @@ -2195,7 +2170,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology has been deleted. maybeOntologyMetadata <- OntologyHelpers.loadOntologyMetadata( - settings, appActor, internalOntologyIri = internalOntologyIri ) @@ -2240,7 +2214,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = createPropertyRequest.lastModificationDate @@ -2459,7 +2432,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -2469,7 +2441,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // we have to undo the SPARQL-escaping of the input. loadedPropertyDef <- OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = internalPropertyIri ) @@ -2485,7 +2456,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedLinkValuePropertyDefFuture: Option[Future[PropertyInfoContentV2]] = maybeLinkValuePropertyDef.map { linkValuePropertyDef => OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = linkValuePropertyDef.propertyIri ) @@ -2598,7 +2568,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = changePropertyGuiElementRequest.lastModificationDate @@ -2651,7 +2620,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -2661,7 +2629,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // we have to undo the SPARQL-escaping of the input. loadedPropertyDef <- OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = internalPropertyIri ) @@ -2704,7 +2671,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedLinkValuePropertyDefFuture: Option[Future[PropertyInfoContentV2]] = maybeCurrentLinkValueReadPropertyInfo.map { linkValueReadPropertyInfo => OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri ) @@ -2825,7 +2791,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = changePropertyLabelsOrCommentsRequest.lastModificationDate @@ -2872,7 +2837,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings = settings, appActor = appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -2882,7 +2846,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // we have to undo the SPARQL-escaping of the input. loadedPropertyDef <- OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = internalPropertyIri ) @@ -2908,7 +2871,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedLinkValuePropertyDefFuture: Option[Future[PropertyInfoContentV2]] = maybeCurrentLinkValueReadPropertyInfo.map { linkValueReadPropertyInfo => OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri ) @@ -3025,7 +2987,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = changeClassLabelsOrCommentsRequest.lastModificationDate @@ -3052,7 +3013,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -3062,7 +3022,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // we have to undo the SPARQL-escaping of the input. loadedClassDef: ClassInfoContentV2 <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) @@ -3156,7 +3115,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read its metadata. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deletePropertyCommentRequest.lastModificationDate @@ -3203,7 +3161,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings = settings, appActor = appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -3211,7 +3168,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the update was successful. loadedPropertyDef: PropertyInfoContentV2 <- OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = internalPropertyIri ) @@ -3232,7 +3188,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon maybeLoadedLinkValuePropertyDefFuture: Option[Future[PropertyInfoContentV2]] = maybeLinkValueOfPropertyToUpdate.map { linkValueReadPropertyInfo: ReadPropertyInfoV2 => OntologyHelpers.loadPropertyDefinition( - settings, appActor, propertyIri = linkValueReadPropertyInfo.entityInfoContent.propertyIri ) @@ -3375,7 +3330,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology exists and has not been updated by another user since the client last read its metadata. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deleteClassCommentRequest.lastModificationDate @@ -3398,7 +3352,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings = settings, appActor = appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -3406,7 +3359,6 @@ class OntologyResponderV2(responderData: ResponderData) extends Responder(respon // Check that the update was successful. loadedClassDef: ClassInfoContentV2 <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) 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 df38c49907..fa86ead457 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 @@ -7,7 +7,6 @@ package org.knora.webapi.responders.v2 import akka.http.scaladsl.util.FastFuture import akka.pattern._ -import akka.stream.Materializer import java.time.Instant import java.util.UUID @@ -66,9 +65,6 @@ import org.knora.webapi.util._ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithStandoffV2(responderData) { - /* actor materializer needed for http requests */ - implicit val materializer: Materializer = Materializer.matFromSystem(system) - /** * Represents a resource that is ready to be created and whose contents can be verified afterwards. * @@ -181,7 +177,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt ) // Check link targets and list nodes that should exist. - _ <- checkStandoffLinkTargets( values = internalCreateResource.flatValues, requestingUser = createResourceRequestV2.requestingUser @@ -198,7 +193,6 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt // Get the definitions of the resource class and its properties, as well as of the classes of all // resources that are link targets. - resourceClassEntityInfoResponse: EntityInfoGetResponseV2 <- appActor .ask( @@ -1507,7 +1501,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt val (maybeStandoffMinStartIndex: Option[Int], maybeStandoffMaxStartIndex: Option[Int]) = StandoffTagUtilV2.getStandoffMinAndMaxStartIndexesForTextValueQuery( queryStandoff = queryStandoff, - settings = settings + appConfig = responderData.appConfig ) for { @@ -1613,7 +1607,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = targetSchema, - settings = settings, + appConfig = responderData.appConfig, requestingUser = requestingUser ) @@ -1704,7 +1698,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = targetSchema, - settings = settings, + appConfig = responderData.appConfig, requestingUser = requestingUser ) @@ -1794,7 +1788,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt } gravsearchUrl: String = - s"${settings.internalSipiBaseUrl}/${resource.projectADM.shortcode}/${gravsearchFileValueContent.fileValue.internalFilename}/file" + s"${responderData.appConfig.sipi.internalBaseUrl}/${resource.projectADM.shortcode}/${gravsearchFileValueContent.fileValue.internalFilename}/file" } yield gravsearchUrl val recoveredGravsearchUrlFuture = gravsearchUrlFuture.recover { case notFound: NotFoundException => @@ -2078,7 +2072,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt header = TEIHeader( headerInfo = headerResource, headerXSLT = headerXSLT, - settings = settings + appConfig = responderData.appConfig ), body = TEIBody( bodyInfo = bodyTextValue, @@ -2177,7 +2171,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt startNodeOnly = false, maybeExcludeLinkProperty = excludePropertyInternal, outbound = outbound, // true to query outbound edges, false to query inbound edges - limit = settings.maxGraphBreadth + limit = responderData.appConfig.v2.graphRoute.maxGraphBreadth ) .toString() ) @@ -2318,7 +2312,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt maybeExcludeLinkProperty = excludePropertyInternal, startNodeOnly = true, outbound = true, - limit = settings.maxGraphBreadth + limit = responderData.appConfig.v2.graphRoute.maxGraphBreadth ) .toString() ) @@ -2567,7 +2561,10 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt } val fileUrl: String = - imageValueContent.makeFileUrl(projectADM = representation.projectADM, settings = settings) + imageValueContent.makeFileUrl( + projectADM = representation.projectADM, + responderData.appConfig.sipi.externalBaseUrl + ) JsonLDObject( Map( @@ -2608,7 +2605,7 @@ class ResourcesResponderV2(responderData: ResponderData) extends ResponderWithSt Seq( JsonLDObject( Map( - "id" -> JsonLDString(settings.externalSipiIIIFGetUrl), + "id" -> JsonLDString(responderData.appConfig.sipi.externalBaseUrl), "type" -> JsonLDString("ImageService3"), "profile" -> JsonLDString("level1") ) 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 7c638dd82a..dd9d6075d2 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 @@ -18,6 +18,7 @@ import dsp.errors.BadRequestException import dsp.errors.GravsearchException import dsp.errors.InconsistentRepositoryDataException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri @@ -52,7 +53,8 @@ import org.knora.webapi.util.ApacheLuceneSupport._ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStandoffV2(responderData) { // A Gravsearch type inspection runner. - private val gravsearchTypeInspectionRunner = new GravsearchTypeInspectionRunner(appActor, responderData) + private val gravsearchTypeInspectionRunner = + new GravsearchTypeInspectionRunner(appActor = appActor, responderData = responderData) /** * Receives a message of type [[SearchResponderRequestV2]], and returns an appropriate response message. @@ -93,7 +95,8 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand returnFiles, targetSchema, schemaOptions, - requestingUser + requestingUser, + responderData.appConfig ) case GravsearchCountRequestV2(query, requestingUser) => @@ -224,7 +227,8 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand returnFiles: Boolean, targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption], - requestingUser: UserADM + requestingUser: UserADM, + appConfig: AppConfig ): Future[ReadResourcesSequenceV2] = { import org.knora.webapi.messages.util.search.FullTextMainQueryGenerator.FullTextSearchConstants @@ -243,8 +247,8 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand limitToStandoffClass = limitToStandoffClass.map(_.toString), returnFiles = returnFiles, separator = Some(groupConcatSeparator), - limit = settings.v2ResultsPerPage, - offset = offset * settings.v2ResultsPerPage, // determine the actual offset + limit = appConfig.v2.resourcesSequence.resultsPerPage, + offset = offset * appConfig.v2.resourcesSequence.resultsPerPage, // determine the actual offset countQuery = false ) .toString() @@ -294,7 +298,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand valueObjectIris = allValueObjectIris, targetSchema = targetSchema, schemaOptions = schemaOptions, - settings = settings + appConfig = appConfig ) val queryPatternTransformerConstruct: ConstructToConstructTransformer = @@ -359,7 +363,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand calculateMayHaveMoreResults = true, versionDate = None, appActor = appActor, - settings = settings, + appConfig = appConfig, targetSchema = targetSchema, requestingUser = requestingUser ) @@ -505,7 +509,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 + appConfig = responderData.appConfig ) // TODO: if the ORDER BY criterion is a property whose occurrence is not 1, then the logic does not work correctly @@ -635,7 +639,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand valueObjectIris = allValueObjectIris, targetSchema = targetSchema, schemaOptions = schemaOptions, - settings = settings + appConfig = responderData.appConfig ) val queryPatternTransformerConstruct: ConstructToConstructTransformer = @@ -721,7 +725,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand versionDate = None, calculateMayHaveMoreResults = true, appActor = appActor, - settings = settings, + appConfig = responderData.appConfig, targetSchema = targetSchema, requestingUser = requestingUser ) @@ -830,8 +834,9 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand resourceClassIri = internalClassIri, maybeOrderByProperty = maybeInternalOrderByPropertyIri, maybeOrderByValuePredicate = maybeOrderByValuePredicate, - limit = settings.v2ResultsPerPage, - offset = resourcesInProjectGetRequestV2.page * settings.v2ResultsPerPage + limit = responderData.appConfig.v2.resourcesSequence.resultsPerPage, + offset = + resourcesInProjectGetRequestV2.page * responderData.appConfig.v2.resourcesSequence.resultsPerPage ) .toString @@ -851,7 +856,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand StandoffTagUtilV2 .getStandoffMinAndMaxStartIndexesForTextValueQuery( queryStandoff = queryStandoff, - settings = settings + appConfig = responderData.appConfig ) // Are there any matching resources? @@ -917,7 +922,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand calculateMayHaveMoreResults = true, appActor = appActor, targetSchema = resourcesInProjectGetRequestV2.targetSchema, - settings = settings, + appConfig = responderData.appConfig, requestingUser = resourcesInProjectGetRequestV2.requestingUser ) } yield readResourcesSequence @@ -1008,8 +1013,8 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand searchTerm = searchPhrase, limitToProject = limitToProject, limitToResourceClass = limitToResourceClass.map(_.toString), - limit = settings.v2ResultsPerPage, - offset = offset * settings.v2ResultsPerPage, + limit = responderData.appConfig.v2.resourcesSequence.resultsPerPage, + offset = offset * responderData.appConfig.v2.resourcesSequence.resultsPerPage, countQuery = false ) .toString() @@ -1064,7 +1069,7 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand calculateMayHaveMoreResults = true, appActor = appActor, targetSchema = targetSchema, - settings = settings, + appConfig = responderData.appConfig, 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 69748f4485..940aeb1c47 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 @@ -6,7 +6,6 @@ package org.knora.webapi.responders.v2 import akka.pattern._ -import akka.stream.Materializer import akka.util.Timeout import org.xml.sax.SAXException @@ -64,9 +63,6 @@ import org.knora.webapi.util.cache.CacheUtil */ class StandoffResponderV2(responderData: ResponderData) extends Responder(responderData) { - /* actor materializer needed for http requests */ - implicit val materializer: Materializer = Materializer.matFromSystem(system) - private def xmlMimeTypes = Set( "text/xml", "application/xml" @@ -98,7 +94,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon private val xsltCacheName = "xsltCache" private def getStandoffV2(getStandoffRequestV2: GetStandoffPageRequestV2): Future[GetStandoffResponseV2] = { - val requestMaxStartIndex = getStandoffRequestV2.offset + settings.standoffPerPage - 1 + val requestMaxStartIndex = getStandoffRequestV2.offset + responderData.appConfig.standoffPerPage - 1 for { resourceRequestSparql <- Future( @@ -155,7 +151,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon versionDate = None, appActor = appActor, targetSchema = getStandoffRequestV2.targetSchema, - settings = settings, + appConfig = responderData.appConfig, requestingUser = getStandoffRequestV2.requestingUser ) @@ -259,7 +255,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon } xsltUrl: String = - s"${settings.internalSipiBaseUrl}/${resource.projectADM.shortcode}/${xsltFileValueContent.fileValue.internalFilename}/file" + s"${responderData.appConfig.sipi.internalBaseUrl}/${resource.projectADM.shortcode}/${xsltFileValueContent.fileValue.internalFilename}/file" } yield xsltUrl @@ -1281,7 +1277,7 @@ class StandoffResponderV2(responderData: ResponderData) extends Responder(respon val firstTask = GetStandoffTask( resourceIri = getRemainingStandoffFromTextValueRequestV2.resourceIri, valueIri = getRemainingStandoffFromTextValueRequestV2.valueIri, - offset = settings.standoffPerPage, // the offset of the second page + offset = responderData.appConfig.standoffPerPage, // the offset of the second page requestingUser = getRemainingStandoffFromTextValueRequestV2.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 2e8cd17efa..5305d35dd1 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 @@ -47,7 +47,6 @@ import org.knora.webapi.messages.v2.responder.ontologymessages.ReadClassInfoV2 import org.knora.webapi.messages.v2.responder.ontologymessages.ReadOntologyV2 import org.knora.webapi.messages.v2.responder.ontologymessages.ReadPropertyInfoV2 import org.knora.webapi.responders.v2.ontology.OntologyHelpers.OntologyGraph -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.cache.CacheUtil object Cache extends LazyLogging { @@ -103,7 +102,6 @@ object Cache extends LazyLogging { * @return a [[SuccessResponseV2]]. */ def loadOntologies( - settings: KnoraSettingsImpl, appActor: ActorRef, requestingUser: UserADM )(implicit ec: ExecutionContext, stringFormat: StringFormatter, timeout: Timeout): Future[SuccessResponseV2] = { diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/CardinalityHandler.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/CardinalityHandler.scala index 314465d790..c92083a577 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/CardinalityHandler.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ontology/CardinalityHandler.scala @@ -28,7 +28,6 @@ import org.knora.webapi.messages.store.triplestoremessages.SparqlUpdateRequest import org.knora.webapi.messages.store.triplestoremessages.SparqlUpdateResponse import org.knora.webapi.messages.v2.responder.CanDoResponseV2 import org.knora.webapi.messages.v2.responder.ontologymessages._ -import org.knora.webapi.settings.KnoraSettingsImpl /** * Contains methods used for dealing with cardinalities on a class @@ -38,7 +37,6 @@ object CardinalityHandler { /** * FIXME(DSP-1856): Only works if a single cardinality is supplied. * - * @param settings the applications settings. * @param storeManager the store manager actor. * @param deleteCardinalitiesFromClassRequest the requested cardinalities to be deleted. * @param internalClassIri the Class from which the cardinalities are deleted. @@ -46,7 +44,6 @@ object CardinalityHandler { * @return a [[CanDoResponseV2]] indicating whether a class's cardinalities can be deleted. */ def canDeleteCardinalitiesFromClass( - settings: KnoraSettingsImpl, appActor: ActorRef, deleteCardinalitiesFromClassRequest: CanDeleteCardinalitiesFromClassRequestV2, internalClassIri: SmartIri, @@ -60,7 +57,6 @@ object CardinalityHandler { // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deleteCardinalitiesFromClassRequest.lastModificationDate @@ -125,7 +121,6 @@ object CardinalityHandler { submittedPropertyToDelete: SmartIri = cardinalitiesToDelete.head._1 propertyIsUsed: Boolean <- isPropertyUsedInResources( - settings, appActor, internalClassIri, submittedPropertyToDelete @@ -198,7 +193,6 @@ object CardinalityHandler { * Deletes the supplied cardinalities from a class, if the referenced properties are not used in instances * of the class and any subclasses. * - * @param settings the applications settings. * @param storeManager the store manager actor. * @param deleteCardinalitiesFromClassRequest the requested cardinalities to be deleted. * @param internalClassIri the Class from which the cardinalities are deleted. @@ -206,7 +200,6 @@ object CardinalityHandler { * @return a [[ReadOntologyV2]] in the internal schema, containing the new class definition. */ def deleteCardinalitiesFromClass( - settings: KnoraSettingsImpl, appActor: ActorRef, deleteCardinalitiesFromClassRequest: DeleteCardinalitiesFromClassRequestV2, internalClassIri: SmartIri, @@ -220,7 +213,6 @@ object CardinalityHandler { // Check that the ontology exists and has not been updated by another user since the client last read it. _ <- OntologyHelpers.checkOntologyLastModificationDateBeforeUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = deleteCardinalitiesFromClassRequest.lastModificationDate @@ -286,7 +278,6 @@ object CardinalityHandler { submittedPropertyToDelete: SmartIri = cardinalitiesToDelete.head._1 propertyIsUsed: Boolean <- isPropertyUsedInResources( - settings, appActor, internalClassIri, submittedPropertyToDelete @@ -403,7 +394,6 @@ object CardinalityHandler { // Check that the ontology's last modification date was updated. _ <- OntologyHelpers.checkOntologyLastModificationDateAfterUpdate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = currentTime @@ -412,7 +402,6 @@ object CardinalityHandler { // Check that the data that was saved corresponds to the data that was submitted. loadedClassDef <- OntologyHelpers.loadClassDefinition( - settings, appActor, classIri = internalClassIri ) @@ -448,7 +437,6 @@ object CardinalityHandler { * Check if a property entity is used in resource instances. Returns `true` if * it is used, and `false` if it is not used. * - * @param settings application settings. * @param storeManager store manager actor ref. * @param internalPropertyIri the IRI of the entity that is being checked for usage. * @param ec the execution context onto with the future will run. @@ -456,7 +444,6 @@ object CardinalityHandler { * @return a [[Boolean]] denoting if the property entity is used. */ def isPropertyUsedInResources( - settings: KnoraSettingsImpl, appActor: ActorRef, internalClassIri: SmartIri, internalPropertyIri: SmartIri 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 9b7c6dd02d..b2b1f2f075 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 @@ -39,7 +39,6 @@ import org.knora.webapi.messages.v2.responder.ontologymessages.OwlCardinality._ import org.knora.webapi.messages.v2.responder.ontologymessages._ import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffDataTypeClasses import org.knora.webapi.responders.v2.ontology.Cache.OntologyCacheData -import org.knora.webapi.settings.KnoraSettingsImpl object OntologyHelpers { @@ -125,7 +124,6 @@ object OntologyHelpers { * @return an [[OntologyMetadataV2]], or [[None]] if the ontology is not found. */ def loadOntologyMetadata( - settings: KnoraSettingsImpl, appActor: ActorRef, internalOntologyIri: SmartIri )(implicit @@ -1018,10 +1016,11 @@ object OntologyHelpers { /** * Gets the set of subjects that refer to an ontology or its entities. * + * @param appActor the store manager actor ref. * @param ontology the ontology. * @return the set of subjects that refer to the ontology or its entities. */ - def getSubjectsUsingOntology(settings: KnoraSettingsImpl, appActor: ActorRef, ontology: ReadOntologyV2)(implicit + def getSubjectsUsingOntology(appActor: ActorRef, ontology: ReadOntologyV2)(implicit ec: ExecutionContext, timeout: Timeout ): Future[Set[IRI]] = @@ -1070,12 +1069,12 @@ object OntologyHelpers { /** * Loads a property definition from the triplestore and converts it to a [[PropertyInfoContentV2]]. * + * @param appActor the store manager actor ref. * @param propertyIri the IRI of the property to be loaded. * * @return a [[PropertyInfoContentV2]] representing the property definition. */ def loadPropertyDefinition( - settings: KnoraSettingsImpl, appActor: ActorRef, propertyIri: SmartIri )(implicit ex: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[PropertyInfoContentV2] = @@ -1515,12 +1514,12 @@ object OntologyHelpers { /** * Loads a class definition from the triplestore and converts it to a [[ClassInfoContentV2]]. * + * @param appActor the store manager actor ref. * @param classIri the IRI of the class to be loaded. * * @return a [[ClassInfoContentV2]] representing the class definition. */ def loadClassDefinition( - settings: KnoraSettingsImpl, appActor: ActorRef, classIri: SmartIri )(implicit ex: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[ClassInfoContentV2] = @@ -1702,7 +1701,6 @@ object OntologyHelpers { * Checks that the last modification date of an ontology is the same as the one we expect it to be. If not, return * an error message fitting for the "before update" case. * - * @param settings the application settings. * @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. @@ -1710,13 +1708,11 @@ object OntologyHelpers { * @return a failed Future if the expected last modification date is not found. */ def checkOntologyLastModificationDateBeforeUpdate( - settings: KnoraSettingsImpl, appActor: ActorRef, internalOntologyIri: SmartIri, expectedLastModificationDate: Instant )(implicit ec: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[Unit] = checkOntologyLastModificationDate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = expectedLastModificationDate, @@ -1729,7 +1725,6 @@ object OntologyHelpers { * Checks that the last modification date of an ontology is the same as the one we expect it to be. If not, return * an error message fitting for the "after update" case. * - * @param settings the application settings. * @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. @@ -1737,13 +1732,11 @@ object OntologyHelpers { * @return a failed Future if the expected last modification date is not found. */ def checkOntologyLastModificationDateAfterUpdate( - settings: KnoraSettingsImpl, appActor: ActorRef, internalOntologyIri: SmartIri, expectedLastModificationDate: Instant )(implicit ec: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[Unit] = checkOntologyLastModificationDate( - settings, appActor, internalOntologyIri = internalOntologyIri, expectedLastModificationDate = expectedLastModificationDate, @@ -1755,7 +1748,6 @@ object OntologyHelpers { /** * Checks that the last modification date of an ontology is the same as the one we expect it to be. * - * @param settings the application settings. * @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. @@ -1764,7 +1756,6 @@ object OntologyHelpers { * @return a failed Future if the expected last modification date is not found. */ private def checkOntologyLastModificationDate( - settings: KnoraSettingsImpl, appActor: ActorRef, internalOntologyIri: SmartIri, expectedLastModificationDate: Instant, @@ -1772,7 +1763,6 @@ object OntologyHelpers { )(implicit ec: ExecutionContext, stringFormatter: StringFormatter, timeout: Timeout): Future[Unit] = for { existingOntologyMetadata: Option[OntologyMetadataV2] <- loadOntologyMetadata( - settings, appActor, internalOntologyIri = internalOntologyIri ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala b/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala index 4e92a92f35..9232b704ae 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala @@ -11,6 +11,7 @@ import ch.megard.akka.http.cors.scaladsl.CorsDirectives import ch.megard.akka.http.cors.scaladsl.settings.CorsSettings import zio._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.core import org.knora.webapi.core.ActorSystem import org.knora.webapi.core.AppRouter @@ -56,19 +57,21 @@ object ApiRoutes { /** * All routes composed together. */ - val layer: ZLayer[ActorSystem & AppRouter & core.State, Nothing, ApiRoutes] = + val layer: ZLayer[ActorSystem & AppRouter & core.State & AppConfig, Nothing, ApiRoutes] = ZLayer { for { - sys <- ZIO.service[ActorSystem] - router <- ZIO.service[AppRouter] + sys <- ZIO.service[ActorSystem] + router <- ZIO.service[AppRouter] + appConfig <- ZIO.service[AppConfig] routeData <- ZIO.succeed( KnoraRouteData( system = sys.system, - appActor = router.ref + appActor = router.ref, + appConfig = appConfig ) ) runtime <- ZIO.runtime[core.State] - } yield ApiRoutesImpl(routeData, runtime) + } yield ApiRoutesImpl(routeData, runtime, appConfig) } } @@ -79,19 +82,19 @@ object ApiRoutes { * ALL requests go through each of the routes in ORDER. * The FIRST matching route is used for handling a request. */ -private final case class ApiRoutesImpl(routeData: KnoraRouteData, runtime: Runtime[core.State]) +private final case class ApiRoutesImpl(routeData: KnoraRouteData, runtime: Runtime[core.State], appConfig: AppConfig) extends ApiRoutes with AroundDirectives { val routes = logDuration { ServerVersion.addServerHeader { - DSPApiDirectives.handleErrors(routeData.system) { + DSPApiDirectives.handleErrors(routeData.system, appConfig) { CorsDirectives.cors(CorsSettings(routeData.system)) { - DSPApiDirectives.handleErrors(routeData.system) { + DSPApiDirectives.handleErrors(routeData.system, appConfig) { new HealthRoute(routeData, runtime).makeRoute ~ new VersionRoute().makeRoute ~ - new RejectingRoute(routeData.system, runtime).makeRoute ~ + new RejectingRoute(routeData, runtime).makeRoute ~ new ResourcesRouteV1(routeData).makeRoute ~ new ValuesRouteV1(routeData).makeRoute ~ new StandoffRouteV1(routeData).makeRoute ~ 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 2b5ee161b3..26c39d81ae 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala @@ -38,6 +38,7 @@ import dsp.errors.AuthenticationException import dsp.errors.BadCredentialsException import dsp.errors.BadRequestException import org.knora.webapi.IRI +import org.knora.webapi.config.AppConfig import org.knora.webapi.instrumentation.InstrumentationSupport import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages._ @@ -47,8 +48,6 @@ import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredenti import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraPasswordCredentialsV2 import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraSessionCredentialsV2 import org.knora.webapi.messages.v2.routing.authenticationmessages._ -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.cache.CacheUtil /** @@ -76,34 +75,34 @@ trait Authenticator extends InstrumentationSupport { * @return a [[HttpResponse]] containing either a failure message or a message with a cookie header containing * the generated session id. */ - def doLoginV1(requestContext: RequestContext)(implicit + def doLoginV1(requestContext: RequestContext, appConfig: AppConfig)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext ): Future[HttpResponse] = { - val settings = KnoraSettings(system) - val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, settings) + val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, appConfig) for { userADM <- getUserADMThroughCredentialsV2( - credentials = credentials + credentials = credentials, + appConfig ) // will return or throw userProfile = userADM.asUserProfileV1 - cookieDomain = Some(settings.cookieDomain) + cookieDomain = Some(appConfig.cookieDomain) sessionToken = JWTHelper.createToken( userProfile.userData.user_id.get, - settings.jwtSecretKey, - settings.jwtLongevity, - settings.externalKnoraApiHostPort + appConfig.jwtSecretKey, + appConfig.jwtLongevityAsDuration, + appConfig.knoraApi.externalKnoraApiHostPort ) httpResponse = HttpResponse( headers = List( headers.`Set-Cookie`( HttpCookie( - calculateCookieName(settings), + calculateCookieName(appConfig), sessionToken, domain = cookieDomain, path = Some("/"), @@ -134,7 +133,7 @@ trait Authenticator extends InstrumentationSupport { * @return a [[HttpResponse]] containing either a failure message or a message with a cookie header containing * the generated session id. */ - def doLoginV2(credentials: KnoraPasswordCredentialsV2)(implicit + def doLoginV2(credentials: KnoraPasswordCredentialsV2, appConfig: AppConfig)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext @@ -145,28 +144,27 @@ trait Authenticator extends InstrumentationSupport { for { // will throw exception if not valid and thus trigger the correct response _ <- authenticateCredentialsV2( - credentials = Some(credentials) + credentials = Some(credentials), + appConfig ) - settings = KnoraSettings(system) - userADM <- getUserByIdentifier( identifier = credentials.identifier ) - cookieDomain = Some(settings.cookieDomain) + cookieDomain = Some(appConfig.cookieDomain) token = JWTHelper.createToken( userADM.id, - settings.jwtSecretKey, - settings.jwtLongevity, - settings.externalKnoraApiHostPort + appConfig.jwtSecretKey, + appConfig.jwtLongevityAsDuration, + appConfig.knoraApi.externalKnoraApiHostPort ) httpResponse = HttpResponse( headers = List( headers.`Set-Cookie`( HttpCookie( - calculateCookieName(settings), + calculateCookieName(appConfig), token, domain = cookieDomain, path = Some("/"), @@ -187,19 +185,18 @@ trait Authenticator extends InstrumentationSupport { } def presentLoginFormV2( - requestContext: RequestContext + requestContext: RequestContext, + appConfig: AppConfig )(implicit system: ActorSystem, executionContext: ExecutionContext): Future[HttpResponse] = { - val settings = KnoraSettings(system) - - val apiUrl = settings.externalKnoraApiBaseUrl + val apiUrl = appConfig.knoraApi.externalKnoraApiBaseUrl val form = s""" |
|
| """.stripMargin @@ -246,19 +243,19 @@ trait Authenticator extends InstrumentationSupport { * @param system the current [[ActorSystem]] * @return a [[RequestContext]] */ - def doAuthenticateV1(requestContext: RequestContext)(implicit + def doAuthenticateV1(requestContext: RequestContext, appConfig: AppConfig)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext ): Future[HttpResponse] = { - val settings = KnoraSettings(system) - val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, settings) + val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, appConfig) for { // will authenticate and either return or throw userADM: UserADM <- getUserADMThroughCredentialsV2( - credentials = credentials + credentials = credentials, + appConfig ) userProfile: UserProfileV1 = userADM.asUserProfileV1 @@ -284,19 +281,19 @@ trait Authenticator extends InstrumentationSupport { * @param system the current [[ActorSystem]] * @return a [[HttpResponse]] */ - def doAuthenticateV2(requestContext: RequestContext)(implicit + def doAuthenticateV2(requestContext: RequestContext, appConfig: AppConfig)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext ): Future[HttpResponse] = { - val settings = KnoraSettings(system) - val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, settings) + val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, appConfig) for { // will throw exception if not valid _ <- authenticateCredentialsV2( - credentials = credentials + credentials = credentials, + appConfig ) httpResponse = HttpResponse( @@ -319,14 +316,14 @@ trait Authenticator extends InstrumentationSupport { * Used to logout the user, i.e. returns a header deleting the cookie and puts the token on the 'invalidated' list. * * @param requestContext a [[RequestContext]] containing the http request + * @param appConfig the application's configuration * @param system the current [[ActorSystem]] * @return a [[HttpResponse]] */ - def doLogoutV2(requestContext: RequestContext)(implicit system: ActorSystem): HttpResponse = { + def doLogoutV2(requestContext: RequestContext, appConfig: AppConfig)(implicit system: ActorSystem): HttpResponse = { - val settings = KnoraSettings(system) - val credentials = extractCredentialsV2(requestContext, settings) - val cookieDomain = Some(settings.cookieDomain) + val credentials = extractCredentialsV2(requestContext, appConfig) + val cookieDomain = Some(appConfig.cookieDomain) credentials match { case Some(KnoraSessionCredentialsV2(sessionToken)) => @@ -336,7 +333,7 @@ trait Authenticator extends InstrumentationSupport { headers = List( headers.`Set-Cookie`( HttpCookie( - calculateCookieName(settings), + calculateCookieName(appConfig), "", domain = cookieDomain, path = Some("/"), @@ -362,7 +359,7 @@ trait Authenticator extends InstrumentationSupport { headers = List( headers.`Set-Cookie`( HttpCookie( - calculateCookieName(settings), + calculateCookieName(appConfig), "", domain = cookieDomain, path = Some("/"), @@ -410,14 +407,13 @@ trait Authenticator extends InstrumentationSupport { * @param system the current [[ActorSystem]] * @return a [[UserProfileV1]] */ - def getUserADM(requestContext: RequestContext)(implicit + def getUserADM(requestContext: RequestContext, appConfig: AppConfig)(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext ): Future[UserADM] = { - val settings = KnoraSettings(system) - val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, settings) + val credentials: Option[KnoraCredentialsV2] = extractCredentialsV2(requestContext, appConfig) if (credentials.isEmpty) { log.debug("getUserADM - No credentials found, returning 'anonymousUser'.") @@ -426,7 +422,8 @@ trait Authenticator extends InstrumentationSupport { for { user: UserADM <- getUserADMThroughCredentialsV2( - credentials = credentials + credentials = credentials, + appConfig ) _ = log.debug("Authenticator - getUserADM - user: {}", user) @@ -465,7 +462,7 @@ object Authenticator extends InstrumentationSupport { * to be valid. * * @param credentials the user supplied and extracted credentials. - * + * @param appConfig the application's 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. @@ -473,15 +470,14 @@ object Authenticator extends InstrumentationSupport { * when the password does not match; when the supplied token is not valid. */ def authenticateCredentialsV2( - credentials: Option[KnoraCredentialsV2] + credentials: Option[KnoraCredentialsV2], + appConfig: AppConfig )(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext ): Future[Boolean] = for { - settings <- FastFuture.successful(KnoraSettings(system)) - result <- credentials match { case Some(passCreds: KnoraPasswordCredentialsV2) => for { @@ -501,14 +497,24 @@ object Authenticator extends InstrumentationSupport { } } yield true case Some(KnoraJWTTokenCredentialsV2(jwtToken)) => - if (!JWTHelper.validateToken(jwtToken, settings.jwtSecretKey, settings.externalKnoraApiHostPort)) { + if ( + !JWTHelper.validateToken( + jwtToken, + appConfig.jwtSecretKey, + appConfig.knoraApi.externalKnoraApiHostPort + ) + ) { log.debug("authenticateCredentialsV2 - token was not valid") throw BadCredentialsException(BAD_CRED_NOT_VALID) } FastFuture.successful(true) case Some(KnoraSessionCredentialsV2(sessionToken)) => if ( - !JWTHelper.validateToken(sessionToken, settings.jwtSecretKey, settings.externalKnoraApiHostPort) + !JWTHelper.validateToken( + sessionToken, + appConfig.jwtSecretKey, + appConfig.knoraApi.externalKnoraApiHostPort + ) ) { log.debug("authenticateCredentialsV2 - session token was not valid") throw BadCredentialsException(BAD_CRED_NOT_VALID) @@ -533,14 +539,13 @@ object Authenticator extends InstrumentationSupport { */ private def extractCredentialsV2( requestContext: RequestContext, - settings: KnoraSettingsImpl + appConfig: AppConfig ): Option[KnoraCredentialsV2] = { - // log.debug("extractCredentialsV2 start ...") val credentialsFromParameters: Option[KnoraCredentialsV2] = extractCredentialsFromParametersV2(requestContext) log.debug("extractCredentialsV2 - credentialsFromParameters: {}", credentialsFromParameters) - val credentialsFromHeaders: Option[KnoraCredentialsV2] = extractCredentialsFromHeaderV2(requestContext, settings) + val credentialsFromHeaders: Option[KnoraCredentialsV2] = extractCredentialsFromHeaderV2(requestContext, appConfig) log.debug("extractCredentialsV2 - credentialsFromHeader: {}", credentialsFromHeaders) // return found credentials based on precedence: 1. url parameters, 2. header (basic auth, token) @@ -616,19 +621,19 @@ object Authenticator extends InstrumentationSupport { * 2. authorization token * 3. session token * - * @param requestContext the HTTP request context. - * @param settings the application settings. + * @param requestContext the HTTP request context. + * @param appConfig the application's configuration. * @return an optional [[KnoraCredentialsV2]]. */ private def extractCredentialsFromHeaderV2( requestContext: RequestContext, - settings: KnoraSettingsImpl + appConfig: AppConfig ): Option[KnoraCredentialsV2] = { // Session token from cookie header val cookies: Seq[HttpCookiePair] = requestContext.request.cookies val maybeSessionCreds: Option[KnoraSessionCredentialsV2] = - cookies.find(_.name == calculateCookieName(settings)) match { + cookies.find(_.name == calculateCookieName(appConfig)) match { case Some(authCookie) => val value: String = authCookie.value Some(KnoraSessionCredentialsV2(value)) @@ -704,17 +709,15 @@ object Authenticator extends InstrumentationSupport { * @throws AuthenticationException when the IRI can not be found inside the token, which is probably a bug. */ private def getUserADMThroughCredentialsV2( - credentials: Option[KnoraCredentialsV2] + credentials: Option[KnoraCredentialsV2], + appConfig: AppConfig )(implicit system: ActorSystem, appActor: ActorRef, executionContext: ExecutionContext - ): Future[UserADM] = { - - val settings = KnoraSettings(system) - + ): Future[UserADM] = for { - _ <- authenticateCredentialsV2(credentials) + _ <- authenticateCredentialsV2(credentials, appConfig) user <- credentials match { case Some(passCreds: KnoraPasswordCredentialsV2) => @@ -724,8 +727,8 @@ object Authenticator extends InstrumentationSupport { case Some(KnoraJWTTokenCredentialsV2(jwtToken)) => val userIri: IRI = JWTHelper.extractUserIriFromToken( jwtToken, - settings.jwtSecretKey, - settings.externalKnoraApiHostPort + appConfig.jwtSecretKey, + appConfig.knoraApi.externalKnoraApiHostPort ) match { case Some(iri) => iri case None => @@ -740,8 +743,8 @@ object Authenticator extends InstrumentationSupport { case Some(KnoraSessionCredentialsV2(sessionToken)) => val userIri: IRI = JWTHelper.extractUserIriFromToken( sessionToken, - settings.jwtSecretKey, - settings.externalKnoraApiHostPort + appConfig.jwtSecretKey, + appConfig.knoraApi.externalKnoraApiHostPort ) match { case Some(iri) => iri case None => @@ -758,7 +761,6 @@ object Authenticator extends InstrumentationSupport { } } yield user - } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TRIPLE STORE ACCESS @@ -809,12 +811,12 @@ object Authenticator extends InstrumentationSupport { * The default padding needs to be changed from '=' to '9' because '=' is not allowed inside the cookie!!! * This also needs to be changed in all the places that base32 is used to calculate the cookie name, e.g., sipi. * - * @param settings the application settings. + * @param appConfig the application's configuration. */ - def calculateCookieName(settings: KnoraSettingsImpl): String = { + def calculateCookieName(appConfig: AppConfig): String = { // val base32 = new Base32('9'.toByte) - "KnoraAuthentication" + base32.encodeAsString(settings.externalKnoraApiHostPort.getBytes()) + "KnoraAuthentication" + base32.encodeAsString(appConfig.knoraApi.externalKnoraApiHostPort.getBytes()) } } 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 c4170cea43..9bce509696 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala @@ -129,9 +129,12 @@ final case class HealthRoute(routeData: KnoraRouteData, runtime: Runtime[State]) _ <- ZIO.logInfo("health route start") ec <- ZIO.executor.map(_.asExecutionContext) state <- ZIO.service[State] - requestingUser <- ZIO - .fromFuture(_ => getUserADM(requestContext)(routeData.system, routeData.appActor, ec)) - .orElse(ZIO.succeed(KnoraSystemInstances.Users.AnonymousUser)) + requestingUser <- + ZIO + .fromFuture(_ => + getUserADM(requestContext, routeData.appConfig)(routeData.system, routeData.appActor, ec) + ) + .orElse(ZIO.succeed(KnoraSystemInstances.Users.AnonymousUser)) result <- healthCheck(state) _ <- ZIO.logInfo("health route finished") @@ ZIOAspect.annotated("user-id", requestingUser.id.toString()) } yield result 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 48fb6fbcf9..0667d7b44d 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala @@ -8,8 +8,6 @@ package org.knora.webapi.routing import akka.actor.ActorRef import akka.actor.ActorSystem import akka.http.scaladsl.server.Route -import akka.pattern._ -import akka.stream.Materializer import akka.util.Timeout import com.typesafe.scalalogging.Logger import zio.prelude.Validation @@ -17,41 +15,31 @@ import zio.prelude.Validation import scala.concurrent.ExecutionContext import scala.concurrent.Future -import dsp.errors.BadRequestException -import org.knora.webapi.IRI +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponseADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM -import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl /** - * Data needed to be passed to each route. + * Data that needs to be passed to each route. * - * @param system the actor system. - * @param appActor the main application actor. + * @param system the actor system. + * @param appActor the main application actor. + * @param appConfig the application's configuration. */ -case class KnoraRouteData(system: akka.actor.ActorSystem, appActor: akka.actor.ActorRef) +case class KnoraRouteData(system: akka.actor.ActorSystem, appActor: akka.actor.ActorRef, appConfig: AppConfig) /** * An abstract class providing functionality that is commonly used in implementing Knora routes. * - * @param routeData a [[KnoraRouteData]] providing access to the application. + * @param routeData a [[KnoraRouteData]] providing access to the application. */ abstract class KnoraRoute(routeData: KnoraRouteData) { implicit protected val system: ActorSystem = routeData.system - implicit protected val settings: KnoraSettingsImpl = KnoraSettings(system) - implicit protected val timeout: Timeout = settings.defaultTimeout + implicit protected val timeout: Timeout = routeData.appConfig.defaultTimeoutAsDuration implicit protected val executionContext: ExecutionContext = system.dispatcher - implicit protected val materializer: Materializer = Materializer.matFromSystem(system) implicit protected val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance implicit protected val appActor: ActorRef = routeData.appActor protected val log: Logger = Logger(this.getClass) - protected val baseApiUrl: String = settings.internalKnoraApiBaseUrl /** * Constructs a route. @@ -61,46 +49,7 @@ abstract class KnoraRoute(routeData: KnoraRouteData) { def makeRoute: Route /** - * Gets a [[ProjectADM]] corresponding to the specified project IRI. - * - * @param projectIri the project IRI. - * - * @param requestingUser the user making the request. - * @return the corresponding [[ProjectADM]]. - */ - protected def getProjectADM( - projectIri: IRI, - requestingUser: UserADM - ): Future[ProjectADM] = { - val checkedProjectIri = stringFormatter.validateAndEscapeProjectIri( - projectIri, - throw BadRequestException(s"Invalid project IRI: $projectIri") - ) - - if (stringFormatter.isKnoraBuiltInProjectIriStr(checkedProjectIri)) { - throw BadRequestException(s"Metadata cannot be updated for a built-in project") - } - - for { - projectInfoResponse: ProjectGetResponseADM <- - appActor - .ask( - ProjectGetRequestADM( - identifier = ProjectIdentifierADM(maybeIri = Some(checkedProjectIri)), - requestingUser = requestingUser - ) - ) - .mapTo[ProjectGetResponseADM] - } yield projectInfoResponse.project - } - - /** - * Helper method converting an [[Either]] to a [[Future]]. - */ - def toFuture[A](either: Either[Throwable, A]): Future[A] = either.fold(Future.failed, Future.successful) - - /** - * Helper method converting an [[zio.prelude.Validation]] to a [[scala.concurrent.Future]]. + * Helper method converting a [[zio.prelude.Validation]] to a [[scala.concurrent.Future]]. */ def toFuture[A](validation: Validation[Throwable, A]): Future[A] = validation.fold( 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 5bd9b999b3..27cf4a35f0 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala @@ -17,7 +17,6 @@ import scala.util.Success import org.knora.webapi.core.State import org.knora.webapi.core.domain.AppState -import org.knora.webapi.settings.KnoraSettings /** * A route used for rejecting requests to certain paths depending on the state of the app or the configuration. @@ -28,9 +27,8 @@ import org.knora.webapi.settings.KnoraSettings * * TODO: This should probably be refactored into a ZIO-HTTP middleware, when the transistion to ZIO-HTTP is done. */ -class RejectingRoute(system: akka.actor.ActorSystem, runtime: Runtime[State]) { self => +class RejectingRoute(routeData: KnoraRouteData, runtime: Runtime[State]) { self => - val settings = KnoraSettings(system) val log: Logger = Logger(this.getClass) /** @@ -53,7 +51,7 @@ class RejectingRoute(system: akka.actor.ActorSystem, runtime: Runtime[State]) { 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 => + val rejectSeq: Seq[Option[Boolean]] = routeData.appConfig.routesToReject.map { pathToReject: String => if (wholePath.contains(pathToReject.toCharArray)) { Some(true) } else { 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 3ee82af4db..3fbf0c16cc 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -19,7 +19,6 @@ import scala.concurrent.Future import dsp.errors.UnexpectedMessageException import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.admin.responder.KnoraResponseADM -import org.knora.webapi.settings.KnoraSettingsImpl /** * Convenience methods for Knora Admin routes. @@ -32,7 +31,6 @@ 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 settings the application's settings. * @param appActor a reference to the application actor. * @param log a logging adapter. * @param timeout a timeout for `ask` messages. @@ -42,7 +40,6 @@ object RouteUtilADM { def runJsonRoute( requestMessageF: Future[KnoraRequestADM], requestContext: RequestContext, - settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[RouteResult] = { @@ -51,11 +48,6 @@ object RouteUtilADM { requestMessage <- requestMessageF - // Optionally log the request message. TODO: move this to the testing framework. - _ = if (settings.dumpMessages) { - log.debug(requestMessage.toString) - } - // Make sure the responder sent a reply of type KnoraResponseV2. knoraResponse <- (appActor.ask(requestMessage)).map { case replyMessage: KnoraResponseADM => replyMessage @@ -68,11 +60,6 @@ object RouteUtilADM { ) } - // Optionally log the reply message. TODO: move this to the testing framework. - _ = if (settings.dumpMessages) { - log.debug(knoraResponse.toString) - } - jsonResponse = knoraResponse.toJsValue.asJsObject } yield HttpResponse( status = StatusCodes.OK, 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 301318ca38..5920892aab 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala @@ -38,7 +38,6 @@ import org.knora.webapi.messages.v1.responder.valuemessages.StillImageFileValueV import org.knora.webapi.messages.v1.responder.valuemessages.TextFileValueV1 import org.knora.webapi.messages.v2.responder.standoffmessages.GetMappingRequestV2 import org.knora.webapi.messages.v2.responder.standoffmessages.GetMappingResponseV2 -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.iiif.errors.SipiException /** @@ -51,8 +50,7 @@ object RouteUtilV1 { * * @param requestMessage a [[KnoraRequestV1]] message that should be sent to the responder manager. * @param requestContext the akka-http [[RequestContext]]. - * @param settings the application's settings. - * @param responderManager a reference to the responder manager. + * @param appActor a reference to the application actor. * @param log a logging adapter. * @param timeout a timeout for `ask` messages. * @param executionContext an execution context for futures. @@ -61,14 +59,9 @@ object RouteUtilV1 { def runJsonRoute( requestMessage: KnoraRequestV1, requestContext: RequestContext, - settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[RouteResult] = { - // Optionally log the request message. TODO: move this to the testing framework. - if (settings.dumpMessages) { - log.debug(requestMessage.toString) - } val httpResponse: Future[HttpResponse] = for { // Make sure the responder sent a reply of type KnoraResponseV1. @@ -83,11 +76,6 @@ object RouteUtilV1 { ) } - // Optionally log the reply message. TODO: move this to the testing framework. - _ = if (settings.dumpMessages) { - log.debug(knoraResponse.toString) - } - // The request was successful, so add a status of ApiStatusCodesV1.OK to the response. jsonResponseWithStatus = JsObject( @@ -110,8 +98,7 @@ object RouteUtilV1 { * * @param requestMessageF a [[Future]] containing a [[KnoraRequestV1]] message that should be sent to the responder manager. * @param requestContext the akka-http [[RequestContext]]. - * @param settings the application's settings. - * @param responderManager a reference to the responder manager. + * @param appActor a reference to the application actor. * @param log a logging adapter. * @param timeout a timeout for `ask` messages. * @param executionContext an execution context for futures. @@ -120,7 +107,6 @@ object RouteUtilV1 { def runJsonRouteWithFuture[RequestMessageT <: KnoraRequestV1]( requestMessageF: Future[RequestMessageT], requestContext: RequestContext, - settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[RouteResult] = @@ -129,7 +115,6 @@ object RouteUtilV1 { routeResult <- runJsonRoute( requestMessage = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -143,7 +128,6 @@ object RouteUtilV1 { * @param requestMessageF a [[Future]] containing the message that should be sent to the responder manager. * @param viewHandler a function that can generate HTML from the responder's reply message. * @param requestContext the [[RequestContext]]. - * @param settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. * @param timeout a timeout for `ask` messages. @@ -153,7 +137,6 @@ object RouteUtilV1 { requestMessageF: Future[RequestMessageT], viewHandler: (ReplyMessageT, ActorRef) => String, requestContext: RequestContext, - settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[RouteResult] = { @@ -162,11 +145,6 @@ object RouteUtilV1 { requestMessage <- requestMessageF - // Optionally log the request message. TODO: move this to the testing framework. - _ = if (settings.dumpMessages) { - log.debug(requestMessage.toString) - } - // Make sure the responder sent a reply of type ReplyMessageT. knoraResponse <- (appActor.ask(requestMessage)).map { case replyMessage: ReplyMessageT => replyMessage @@ -178,11 +156,6 @@ object RouteUtilV1 { throw UnexpectedMessageException(msg) } - // Optionally log the reply message. TODO: move this to the testing framework. - _ = if (settings.dumpMessages) { - log.debug(knoraResponse.toString) - } - } yield HttpResponse( status = StatusCodes.OK, entity = HttpEntity( @@ -203,8 +176,6 @@ 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 settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. * @param timeout a timeout for `ask` messages. @@ -216,7 +187,6 @@ object RouteUtilV1 { mappingIri: IRI, acceptStandoffLinksToClientIDs: Boolean, userProfile: UserADM, - settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[TextWithStandoffTagsV2] = 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 e4ac441854..89ed8990d2 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala @@ -20,6 +20,7 @@ import scala.util.control.Exception.catching import dsp.errors.BadRequestException import dsp.errors.UnexpectedMessageException import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.ResponderRequest.KnoraRequestV2 import org.knora.webapi.messages.SmartIri @@ -30,7 +31,6 @@ import org.knora.webapi.messages.util.rdf.RdfFormat import org.knora.webapi.messages.util.rdf.RdfModel import org.knora.webapi.messages.v2.responder.KnoraResponseV2 import org.knora.webapi.messages.v2.responder.resourcemessages.ResourceTEIGetResponseV2 -import org.knora.webapi.settings.KnoraSettingsImpl /** * Handles message formatting, content negotiation, and simple interactions with responders, on behalf of Knora routes. @@ -203,10 +203,11 @@ 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 settings the application's settings. - * @param responderManager a reference to the responder manager. + * @param appConfig the application's configuration + * @param appActor a reference to the application actor. * @param log a logging adapter. * @param targetSchema the API schema that should be used in the response. + * @param schemaOptions the schema options that should be used when processing the request. * @param timeout a timeout for `ask` messages. * @param executionContext an execution context for futures. * @return a [[Future]] containing a [[RouteResult]]. @@ -214,16 +215,12 @@ object RouteUtilV2 { private def runRdfRoute( requestMessage: KnoraRequestV2, requestContext: RequestContext, - settings: KnoraSettingsImpl, + appConfig: AppConfig, appActor: ActorRef, log: Logger, targetSchema: OntologySchema, schemaOptions: Set[SchemaOption] )(implicit timeout: Timeout, executionContext: ExecutionContext): Future[RouteResult] = { - // Optionally log the request message. TODO: move this to the testing framework. - if (settings.dumpMessages) { - log.debug(requestMessage.toString) - } val httpResponse: Future[HttpResponse] = for { // Make sure the responder sent a reply of type KnoraResponseV2. @@ -238,11 +235,6 @@ object RouteUtilV2 { ) } - // Optionally log the reply message. TODO: move this to the testing framework. - _ = if (settings.dumpMessages) { - log.debug(knoraResponse.toString) - } - // Choose a media type for the response. responseMediaType: MediaType.NonBinary = chooseRdfMediaTypeForResponse(requestContext) @@ -256,7 +248,7 @@ object RouteUtilV2 { formattedResponseContent: String = knoraResponse.format( rdfFormat = RdfFormat.fromMediaType(specificMediaType), targetSchema = targetSchema, - settings = settings, + appConfig = appConfig, schemaOptions = schemaOptions ) } yield HttpResponse( @@ -275,7 +267,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 settings the application's settings. * @param responderManager a reference to the responder manager. * @param log a logging adapter. * @param targetSchema the API schema that should be used in the response. @@ -286,7 +277,6 @@ object RouteUtilV2 { def runTEIXMLRoute( requestMessageF: Future[KnoraRequestV2], requestContext: RequestContext, - settings: KnoraSettingsImpl, appActor: ActorRef, log: Logger, targetSchema: ApiV2Schema @@ -325,8 +315,8 @@ 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 settings the application's settings. - * @param responderManager a reference to the responder manager. + * @param appConfig the application's configuration + * @param appActor a reference to the application actor. * @param log a logging adapter. * @param targetSchema the API schema that should be used in the response. * @param schemaOptions the schema options that should be used when processing the request. @@ -337,7 +327,7 @@ object RouteUtilV2 { def runRdfRouteWithFuture( requestMessageF: Future[KnoraRequestV2], requestContext: RequestContext, - settings: KnoraSettingsImpl, + appConfig: AppConfig, appActor: ActorRef, log: Logger, targetSchema: OntologySchema, @@ -348,7 +338,7 @@ object RouteUtilV2 { routeResult <- runRdfRoute( requestMessage = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = appConfig, appActor = appActor, log = log, targetSchema = targetSchema, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala index b87bfd4e01..52dd0710a3 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala @@ -30,7 +30,7 @@ class FilesRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit path("admin" / "files" / Segments(2)) { projectIDAndFile: Seq[String] => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) projectID = stringFormatter.validateProjectShortcode( projectIDAndFile.head, throw BadRequestException(s"Invalid project ID: '${projectIDAndFile.head}'") @@ -49,7 +49,6 @@ class FilesRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) 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 2bd5fc1644..d60343802d 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 @@ -24,6 +24,7 @@ import org.knora.webapi.routing.RouteUtilADM /** * Provides a routing function for API routes that deal with groups. */ + class GroupsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator @@ -46,13 +47,12 @@ class GroupsRouteADM(routeData: KnoraRouteData) private def getGroups(): Route = path(groupsBasePath) { get { requestContext => val requestMessage = for { - _ <- getUserADM(requestContext) + _ <- getUserADM(requestContext, routeData.appConfig) } yield GroupsGetRequestADM() RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -68,7 +68,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid custom group IRI $value")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GroupGetRequestADM( groupIri = checkedGroupIri, requestingUser = requestingUser @@ -77,7 +77,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -94,7 +93,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid group IRI $value")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GroupMembersGetRequestADM( groupIri = checkedGroupIri, requestingUser = requestingUser @@ -103,7 +102,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -128,7 +126,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) val requestMessage = for { payload <- toFuture(validatedGroupCreatePayload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GroupCreateRequestADM( createRequest = payload, requestingUser = requestingUser, @@ -138,7 +136,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -176,7 +173,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) val requestMessage = for { payload <- toFuture(validatedGroupUpdatePayload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GroupChangeRequestADM( groupIri = checkedGroupIri, changeGroupRequest = payload, @@ -187,7 +184,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -217,7 +213,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) } val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GroupChangeStatusRequestADM( groupIri = checkedGroupIri, changeGroupRequest = apiRequest, @@ -228,7 +224,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -245,7 +240,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid group IRI $value")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GroupChangeStatusRequestADM( groupIri = checkedGroupIri, changeGroupRequest = ChangeGroupApiRequestADM(status = Some(false)), @@ -256,7 +251,6 @@ class GroupsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) 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 5689aae857..a00a3e6aa4 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 @@ -34,7 +34,6 @@ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM - class ProjectsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator @@ -72,7 +71,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) log.info("All projects requested.") val requestMessage: Future[ProjectsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectsGetRequestADM( requestingUser = requestingUser @@ -81,7 +81,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -109,7 +108,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectCreateRequestADM] = for { projectCreatePayload <- toFuture(projectCreatePayload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield ProjectCreateRequestADM( createRequest = projectCreatePayload, requestingUser = requestingUser, @@ -119,7 +118,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -132,7 +130,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectsKeywordsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectsKeywordsGetRequestADM( requestingUser = requestingUser @@ -141,7 +140,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -157,7 +155,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectKeywordsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectKeywordsGetRequestADM( projectIri = checkedProjectIri, @@ -167,7 +166,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -182,7 +180,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) @@ -195,7 +194,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -210,7 +208,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) shortNameDec = stringFormatter.validateAndEscapeProjectShortname( value, @@ -225,7 +224,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -240,7 +238,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedShortcode = stringFormatter.validateAndEscapeProjectShortcode( value, @@ -255,7 +254,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -276,7 +274,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectChangeRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectChangeRequestADM( projectIri = checkedProjectIri, @@ -288,7 +287,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -307,7 +305,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ProjectChangeRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectChangeRequestADM( projectIri = checkedProjectIri, @@ -319,7 +318,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -334,7 +332,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) @@ -347,7 +346,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -362,7 +360,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) shortNameDec = stringFormatter.validateAndEscapeProjectShortname( value, @@ -377,7 +376,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -392,7 +390,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedShortcode = stringFormatter.validateAndEscapeProjectShortcode( value, @@ -407,7 +406,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -422,7 +420,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) @@ -435,7 +434,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -450,7 +448,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedShortname = stringFormatter.validateAndEscapeProjectShortname( value, @@ -465,7 +464,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -480,7 +478,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) checkedShortcode = stringFormatter.validateProjectShortcode( value, @@ -495,7 +494,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -510,7 +508,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectRestrictedViewSettingsGetRequestADM( @@ -521,7 +520,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -536,7 +534,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) shortNameDec = java.net.URLDecoder.decode(value, "utf-8") @@ -548,7 +547,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -563,7 +561,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectRestrictedViewSettingsGetRequestADM( identifier = ProjectIdentifierADM(maybeShortcode = Some(value)), @@ -573,7 +572,6 @@ class ProjectsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -602,7 +600,8 @@ class ProjectsRouteADM(routeData: KnoraRouteData) val httpEntityFuture: Future[HttpEntity.Chunked] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage = ProjectDataGetRequestADM( 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 9331b62540..e539bfb2ea 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 @@ -56,7 +56,6 @@ class StoreRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log )(timeout = 479999.milliseconds, executionContext = executionContext) 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 b1296c51e0..4b884c28b5 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 @@ -61,7 +61,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage: Future[UsersGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UsersGetRequestADM( requestingUser = requestingUser @@ -70,7 +71,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -111,7 +111,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserCreateRequestADM] = for { payload <- toFuture(validatedUserCreatePayload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield UserCreateRequestADM( userCreatePayloadADM = payload, requestingUser = requestingUser, @@ -121,7 +121,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -136,7 +135,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserGetRequestADM( identifier = UserIdentifierADM(maybeIri = Some(userIri)), @@ -147,7 +147,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -162,7 +161,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserGetRequestADM( identifier = UserIdentifierADM(maybeEmail = Some(userIri)), @@ -173,7 +173,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -188,7 +187,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserGetRequestADM( identifier = UserIdentifierADM(maybeUsername = Some(userIri)), @@ -199,7 +199,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -263,7 +262,8 @@ 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 + requestContext = requestContext, + routeData.appConfig ) } yield UserChangeBasicInformationRequestADM( userIri = checkedUserIri, @@ -275,7 +275,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -314,7 +313,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserChangePasswordRequestADM( userIri = checkedUserIri, @@ -326,7 +326,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -361,7 +360,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserChangeStatusRequestADM( userIri = checkedUserIri, @@ -373,7 +373,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -404,7 +403,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserChangeStatusRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserChangeStatusRequestADM( userIri = checkedUserIri, @@ -416,7 +416,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -450,7 +449,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UsersResponderRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserChangeSystemAdminMembershipStatusRequestADM( userIri = checkedUserIri, @@ -462,7 +462,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -483,7 +482,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectMembershipsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserProjectMembershipsGetRequestADM( userIri = checkedUserIri, @@ -493,7 +493,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -527,7 +526,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectMembershipAddRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserProjectMembershipAddRequestADM( userIri = checkedUserIri, @@ -539,7 +539,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -573,7 +572,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectMembershipRemoveRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserProjectMembershipRemoveRequestADM( userIri = checkedUserIri, @@ -585,7 +585,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -605,7 +604,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectAdminMembershipsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserProjectAdminMembershipsGetRequestADM( userIri = checkedUserIri, @@ -616,7 +616,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -650,7 +649,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectAdminMembershipAddRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserProjectAdminMembershipAddRequestADM( userIri = checkedUserIri, @@ -662,7 +662,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -696,7 +695,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserProjectAdminMembershipRemoveRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserProjectAdminMembershipRemoveRequestADM( userIri = checkedUserIri, @@ -708,7 +708,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -728,7 +727,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserGroupMembershipsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserGroupMembershipsGetRequestADM( userIri = checkedUserIri, @@ -738,7 +738,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -769,7 +768,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserGroupMembershipAddRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserGroupMembershipAddRequestADM( userIri = checkedUserIri, @@ -781,7 +781,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -812,7 +811,8 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessage: Future[UserGroupMembershipRemoveRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield UserGroupMembershipRemoveRequestADM( userIri = checkedUserIri, @@ -824,7 +824,6 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala index 25b7fe9271..27bc48cdec 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -61,7 +61,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ListRootNodeCreateRequestADM] = for { payload <- toFuture(validatedListRootNodeCreatePayload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) // check if the requesting user is allowed to perform operation _ = @@ -81,7 +81,6 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -116,7 +115,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ListChildNodeCreateRequestADM] = for { payload <- toFuture(validatedCreateChildNodePeyload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) // check if the requesting user is allowed to perform operation _ = @@ -136,7 +135,6 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - 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 2e068a7d05..3372be2583 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 @@ -45,7 +45,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list item Iri: $iri")) val requestMessage: Future[ListItemDeleteRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield ListItemDeleteRequestADM( nodeIri = nodeIri, requestingUser = requestingUser, @@ -55,7 +55,6 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -72,7 +71,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list IRI: $iri")) val requestMessage: Future[CanDeleteListRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield CanDeleteListRequestADM( iri = listIri, requestingUser = requestingUser @@ -81,7 +80,6 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -98,7 +96,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ListNodeCommentsDeleteRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield ListNodeCommentsDeleteRequestADM( iri = listIri, requestingUser = requestingUser @@ -107,7 +105,6 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala index dc60b1e20a..bff986f34b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala @@ -52,7 +52,8 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ListsGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ListsGetRequestADM( projectIri = projectIri, @@ -62,7 +63,6 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -80,7 +80,8 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[ListGetRequestADM] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ListGetRequestADM( iri = listIri, @@ -90,7 +91,6 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -106,7 +106,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) val requestMessage: Future[ListNodeInfoGetRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield ListNodeInfoGetRequestADM( iri = listIri, requestingUser = requestingUser @@ -115,7 +115,6 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -133,7 +132,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) val requestMessage: Future[ListNodeInfoGetRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield ListNodeInfoGetRequestADM( iri = listIri, requestingUser = requestingUser @@ -142,7 +141,6 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - 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 448e1eba94..0cedc75d74 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 @@ -57,7 +57,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) NodeNameChangePayloadADM(ListName.make(apiRequest.name).fold(e => throw e.head, v => v)) val requestMessage: Future[NodeNameChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield NodeNameChangeRequestADM( nodeIri = nodeIri, changeNodeNameRequest = namePayload, @@ -68,7 +68,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -90,7 +89,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) NodeLabelsChangePayloadADM(Labels.make(apiRequest.labels).fold(e => throw e.head, v => v)) val requestMessage: Future[NodeLabelsChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield NodeLabelsChangeRequestADM( nodeIri = nodeIri, changeNodeLabelsRequest = labelsPayload, @@ -101,7 +100,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -123,7 +121,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) NodeCommentsChangePayloadADM(Comments.make(apiRequest.comments).fold(e => throw e.head, v => v)) val requestMessage: Future[NodeCommentsChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield NodeCommentsChangeRequestADM( nodeIri = nodeIri, changeNodeCommentsRequest = commentsPayload, @@ -134,7 +132,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -153,7 +150,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param node IRI: $iri")) val requestMessage: Future[NodePositionChangeRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield NodePositionChangeRequestADM( nodeIri = nodeIri, changeNodePositionRequest = apiRequest, @@ -164,7 +161,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -201,7 +197,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) val requestMessage: Future[NodeInfoChangeRequestADM] = for { payload <- toFuture(validatedChangeNodeInfoPayload) - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) // check if the requesting user is allowed to perform operation _ = if ( !requestingUser.permissions.isProjectAdmin( @@ -221,7 +217,6 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - 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 1a7698e195..8933cb67e1 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 @@ -17,7 +17,6 @@ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM - class CreatePermissionRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator @@ -41,7 +40,7 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) /* create a new administrative permission */ entity(as[CreateAdministrativePermissionAPIRequestADM]) { apiRequest => requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield AdministrativePermissionCreateRequestADM( createRequest = apiRequest, requestingUser = requestingUser, @@ -51,7 +50,6 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -68,7 +66,7 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) /* create a new default object access permission */ entity(as[CreateDefaultObjectAccessPermissionAPIRequestADM]) { apiRequest => requestContext => val requestMessage: Future[DefaultObjectAccessPermissionCreateRequestADM] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield DefaultObjectAccessPermissionCreateRequestADM( createRequest = apiRequest, requestingUser = requestingUser, @@ -78,7 +76,6 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - 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 1b58a5a151..b9000a6f5a 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 @@ -16,7 +16,6 @@ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM - class DeletePermissionRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator @@ -37,7 +36,7 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) path(permissionsBasePath / Segment) { iri => delete { requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield PermissionDeleteRequestADM( permissionIri = iri, requestingUser = requestingUser, @@ -47,7 +46,6 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - 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 4a2513fe5c..53f1088810 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 @@ -16,7 +16,6 @@ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM - class GetPermissionsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator @@ -37,13 +36,12 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) path(permissionsBasePath / "ap" / Segment / Segment) { (projectIri, groupIri) => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield AdministrativePermissionForProjectGroupGetRequestADM(projectIri, groupIri, requestingUser) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -54,7 +52,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) path(permissionsBasePath / "ap" / Segment) { projectIri => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield AdministrativePermissionsForProjectGetRequestADM( projectIri = projectIri, requestingUser = requestingUser, @@ -64,7 +62,6 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -75,7 +72,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) path(permissionsBasePath / "doap" / Segment) { projectIri => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield DefaultObjectAccessPermissionsForProjectGetRequestADM( projectIri = projectIri, requestingUser = requestingUser, @@ -85,7 +82,6 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -96,7 +92,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) path(permissionsBasePath / Segment) { projectIri => get { requestContext => val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield PermissionsForProjectGetRequestADM( projectIri = projectIri, requestingUser = requestingUser, @@ -106,7 +102,6 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - 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 cb7a9ed7c7..79517ba13f 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 @@ -17,7 +17,6 @@ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM - class UpdatePermissionRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator @@ -45,7 +44,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield PermissionChangeGroupRequestADM( permissionIri = permissionIri, changePermissionGroupRequest = apiRequest, @@ -56,7 +55,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -75,7 +73,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield PermissionChangeHasPermissionsRequestADM( permissionIri = permissionIri, changePermissionHasPermissionsRequest = apiRequest, @@ -86,7 +84,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -105,7 +102,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield PermissionChangeResourceClassRequestADM( permissionIri = permissionIri, changePermissionResourceClassRequest = apiRequest, @@ -116,7 +113,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -135,7 +131,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid permission IRI: $iri")) val requestMessage = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield PermissionChangePropertyRequestADM( permissionIri = permissionIri, changePermissionPropertyRequest = apiRequest, @@ -146,7 +142,6 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) RouteUtilADM.runJsonRoute( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) 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 8dba65c2d3..b52acdbeb3 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 @@ -24,7 +24,7 @@ class AuthenticationRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeD path("v1" / "authenticate") { get { requestContext => requestContext.complete { - doAuthenticateV1(requestContext) + doAuthenticateV1(requestContext, routeData.appConfig) } } } ~ path("v1" / "session") { @@ -32,20 +32,20 @@ class AuthenticationRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeD requestContext.complete { val params = requestContext.request.uri.query().toMap if (params.contains("logout")) { - doLogoutV2(requestContext) + doLogoutV2(requestContext, routeData.appConfig) } else if (params.contains("login")) { - doLoginV1(requestContext) + doLoginV1(requestContext, routeData.appConfig) } else { - doAuthenticateV1(requestContext) + doAuthenticateV1(requestContext, routeData.appConfig) } } } ~ post { requestContext => requestContext.complete { - doLoginV1(requestContext) + doLoginV1(requestContext, routeData.appConfig) } } ~ delete { requestContext => requestContext.complete { - doLogoutV2(requestContext) + doLogoutV2(requestContext, routeData.appConfig) } } } 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 f121d7f1a5..0aea545450 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 @@ -26,7 +26,7 @@ class CkanRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with path("v1" / "ckan") { get { requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext) + userProfile <- getUserADM(requestContext, routeData.appConfig) params = requestContext.request.uri.query().toMap project: Option[Seq[String]] = params.get("project").map(_.split(",").toSeq) limit: Option[Int] = params.get("limit").map(_.toInt) @@ -41,7 +41,6 @@ class CkanRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) 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 b0aa275cd9..d1c32280fa 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 @@ -31,7 +31,7 @@ class ListsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with path("v1" / "hlists" / Segment) { iri => get { requestContext => val requestMessageFuture = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) listIri = stringFormatter.validateAndEscapeIri( iri, throw BadRequestException(s"Invalid param list IRI: $iri") @@ -47,7 +47,6 @@ class ListsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessageFuture, requestContext, - settings, appActor, log ) @@ -56,7 +55,7 @@ class ListsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with path("v1" / "selections" / Segment) { iri => get { requestContext => val requestMessageFuture = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) selIri = stringFormatter.validateAndEscapeIri( iri, throw BadRequestException(s"Invalid param list IRI: $iri") @@ -72,7 +71,6 @@ class ListsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessageFuture, requestContext, - settings, appActor, log ) 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 0b310034ab..455e569316 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 @@ -29,7 +29,7 @@ class ProjectsRouteV1(routeData: KnoraRouteData) /* returns all projects */ requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) } yield ProjectsGetRequestV1( userProfile = Some(userProfile) ) @@ -37,7 +37,6 @@ class ProjectsRouteV1(routeData: KnoraRouteData) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -49,7 +48,7 @@ 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).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) } yield ProjectInfoByShortnameGetRequestV1( shortname = shortNameDec, userProfileV1 = Some(userProfile) @@ -58,7 +57,7 @@ class ProjectsRouteV1(routeData: KnoraRouteData) val checkedProjectIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid project IRI $value")) for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) } yield ProjectInfoByIRIGetRequestV1( iri = checkedProjectIri, userProfileV1 = Some(userProfile) @@ -68,7 +67,6 @@ class ProjectsRouteV1(routeData: KnoraRouteData) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) 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 43415654f1..14005e5742 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 @@ -28,7 +28,7 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa path("v1" / "resourcetypes" / Segment) { iri => get { requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext) + userProfile <- getUserADM(requestContext, routeData.appConfig) // TODO: Check that this is the IRI of a resource type and not just any IRI resourceTypeIri = @@ -42,7 +42,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -50,7 +49,7 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "resourcetypes") { get { requestContext => val requestMessage = for { - userADM <- getUserADM(requestContext) + userADM <- getUserADM(requestContext, routeData.appConfig) params = requestContext.request.uri.query().toMap vocabularyId = params.getOrElse( @@ -77,7 +76,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -86,7 +84,7 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "propertylists") { get { requestContext => val requestMessage = for { - userADM <- getUserADM(requestContext) + userADM <- getUserADM(requestContext, routeData.appConfig) params = requestContext.request.uri.query().toMap vocabularyId: Option[String] = params.get("vocabulary") @@ -131,7 +129,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -140,13 +137,12 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "vocabularies") { get { requestContext => val requestMessage = for { - userADM <- getUserADM(requestContext) + userADM <- getUserADM(requestContext, routeData.appConfig) } yield NamedGraphsGetRequestV1(userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -155,13 +151,12 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "vocabularies" / "reload") { get { requestContext => val requestMessage = for { - userADM <- getUserADM(requestContext) + userADM <- getUserADM(requestContext, routeData.appConfig) } yield LoadOntologiesRequestV1(userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -169,7 +164,7 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa } ~ path("v1" / "subclasses" / Segment) { iri => get { requestContext => val requestMessage = for { - userADM <- getUserADM(requestContext) + userADM <- getUserADM(requestContext, routeData.appConfig) // TODO: Check that this is the IRI of a resource type and not just any IRI resourceClassIri = stringFormatter.validateAndEscapeIri( @@ -181,7 +176,6 @@ class ResourceTypesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeDa RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) 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 c0ab1d949c..eab5739cfb 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 @@ -174,7 +174,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) acceptStandoffLinksToClientIDs = acceptStandoffLinksToClientIDs, userProfile = userProfile, - settings = settings, appActor = appActor, log = log ) @@ -327,7 +326,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) file: Option[FileValueV1] <- apiRequest.file match { case Some(filename) => // Ask Sipi about the file's metadata. - val tempFilePath = stringFormatter.makeSipiTempFilePath(settings, filename) + val tempFilePath = stringFormatter.makeSipiTempFilePath(filename) for { fileMetadataResponse: GetFileMetadataResponse <- @@ -391,7 +390,7 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) convertedFile <- resourceRequest.file match { case Some(filename) => // Ask Sipi about the file's metadata. - val tempFilePath = stringFormatter.makeSipiTempFilePath(settings, filename) + val tempFilePath = stringFormatter.makeSipiTempFilePath(filename) for { fileMetadataResponse: GetFileMetadataResponse <- appActor @@ -1216,7 +1215,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) requestContext => val requestMessage = for { userProfile <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) params = requestContext.request.uri.query().toMap searchstr = params.getOrElse("searchstr", throw BadRequestException(s"required param searchstr is missing")) @@ -1269,7 +1269,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1280,7 +1279,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) entity(as[CreateResourceApiRequestV1]) { apiRequest => requestContext => val requestMessageFuture = for { userProfile <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) request <- makeCreateResourceRequestMessage( apiRequest = apiRequest, @@ -1291,7 +1291,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1303,7 +1302,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestType = reqtypeParam.getOrElse("") resinfo = resinfoParam.getOrElse(false) @@ -1317,7 +1317,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1326,14 +1325,14 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) parameters("deleteComment".?) { deleteCommentParam => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield makeResourceDeleteMessage(resIri = resIri, deleteComment = deleteCommentParam, userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1348,7 +1347,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) case "properties" => for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) resIri = stringFormatter.validateAndEscapeIri( iri, @@ -1365,7 +1365,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) requestMessageF = requestMessage, viewHandler = ResourceHtmlView.propertiesHtmlView, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1374,7 +1373,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) resIri = stringFormatter.validateAndEscapeIri( iri, @@ -1385,7 +1385,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1396,7 +1395,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) entity(as[ChangeResourceLabelApiRequestV1]) { apiRequest => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) resIri = stringFormatter.validateAndEscapeIri( iri, @@ -1416,7 +1416,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1427,7 +1426,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) parameters("depth".as[Int].?) { depth => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) resourceIri = stringFormatter.validateAndEscapeIri( iri, @@ -1438,7 +1438,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1458,7 +1457,6 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRoute( requestMessage = msg, requestContext = requestContext, - settings = settings, appActor = appActor, log = log ) @@ -1468,7 +1466,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) entity(as[String]) { xml => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) _ = if (userADM.isAnonymousUser) { @@ -1521,10 +1520,9 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV1.runJsonRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, appActor = appActor, log = log - )(timeout = settings.defaultTimeout, executionContext = executionContext) + )(timeout = routeData.appConfig.defaultTimeoutAsDuration, executionContext = executionContext) } } } ~ path("v1" / "resources" / "xmlimportschemas" / Segment) { internalOntologyIri => @@ -1549,7 +1547,8 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) ) { requestContext => val httpResponseFuture: Future[HttpResponse] = for { userProfile <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) 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 93fedabe27..29ae083cb2 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 @@ -247,14 +247,13 @@ class SearchRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit // 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) + userADM <- getUserADM(requestContext, routeData.appConfig) params: Map[String, Seq[String]] = requestContext.request.uri.query().toMultiMap } yield makeExtendedSearchRequestMessage(userADM, params) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -264,14 +263,13 @@ 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) + userADM <- getUserADM(requestContext, routeData.appConfig) params: Map[String, String] = requestContext.request.uri.query().toMap } yield makeFulltextSearchRequestMessage(userADM, searchval, params) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) 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 d23c7a9904..a3735f7813 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 @@ -67,7 +67,7 @@ class StandoffRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) w val requestMessageFuture: Future[CreateMappingRequestV1] = for { - userProfile <- getUserADM(requestContext) + userProfile <- getUserADM(requestContext, routeData.appConfig) allParts: Map[Name, String] <- allPartsFuture @@ -114,7 +114,6 @@ class StandoffRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) w RouteUtilV1.runJsonRouteWithFuture( requestMessageFuture, requestContext, - settings, appActor, log ) 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 6c5774fb34..2afe0e7905 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 @@ -36,13 +36,12 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* return all users */ requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) } yield UsersGetRequestV1(userProfile) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -55,7 +54,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* check if email or iri was supplied */ val requestMessage = if (identifier == "email") { for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) } yield UserProfileByEmailGetRequestV1( email = value, userProfileType = UserProfileTypeV1.RESTRICTED, @@ -63,7 +62,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with ) } else { for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) userIri = stringFormatter.validateAndEscapeIri( value, throw BadRequestException(s"Invalid user IRI $value") @@ -78,7 +77,6 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -90,7 +88,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* get user's project memberships */ requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) checkedUserIri = stringFormatter.validateAndEscapeIri( userIri, throw BadRequestException(s"Invalid user IRI $userIri") @@ -104,7 +102,6 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -115,7 +112,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* get user's project admin memberships */ requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) checkedUserIri = stringFormatter.validateAndEscapeIri( userIri, throw BadRequestException(s"Invalid user IRI $userIri") @@ -129,7 +126,6 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -140,7 +136,7 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with /* get user's group memberships */ requestContext => val requestMessage = for { - userProfile <- getUserADM(requestContext).map(_.asUserProfileV1) + userProfile <- getUserADM(requestContext, routeData.appConfig).map(_.asUserProfileV1) checkedUserIri = stringFormatter.validateAndEscapeIri( userIri, throw BadRequestException(s"Invalid user IRI $userIri") @@ -154,7 +150,6 @@ class UsersRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) 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 5287a3414a..16fd0654c9 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 @@ -154,7 +154,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit mappingIri = mappingIri, acceptStandoffLinksToClientIDs = false, userProfile = userADM, - settings = settings, appActor = appActor, log = log ) @@ -372,7 +371,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit mappingIri = mappingIri, acceptStandoffLinksToClientIDs = false, userProfile = userADM, - settings = settings, appActor = appActor, log = log ) @@ -582,7 +580,7 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ): Future[ChangeFileValueRequestV1] = { val resourceIri = stringFormatter.validateAndEscapeIri(resIriStr, throw BadRequestException(s"Invalid resource IRI: $resIriStr")) - val tempFilePath = stringFormatter.makeSipiTempFilePath(settings, apiRequest.file) + val tempFilePath = stringFormatter.makeSipiTempFilePath(apiRequest.file) for { fileMetadataResponse: GetFileMetadataResponse <- @@ -611,14 +609,14 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield makeVersionHistoryRequestMessage(iris = iris, userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -628,7 +626,8 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit entity(as[CreateValueApiRequestV1]) { apiRequest => requestContext => val requestMessageFuture = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) request <- makeCreateValueRequestMessage(apiRequest = apiRequest, userADM = userADM) } yield request @@ -636,7 +635,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV1.runJsonRouteWithFuture( requestMessageFuture, requestContext, - settings, appActor, log ) @@ -646,14 +644,14 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield makeGetValueRequest(valueIriStr = valueIriStr, userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -663,7 +661,8 @@ 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 + requestContext = requestContext, + routeData.appConfig ) request <- apiRequest match { case ChangeValueApiRequestV1(_, _, _, _, _, _, _, _, _, _, _, _, _, Some(comment)) => @@ -686,7 +685,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV1.runJsonRouteWithFuture( requestMessageFuture, requestContext, - settings, appActor, log ) @@ -694,7 +692,8 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } ~ delete { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) params = requestContext.request.uri.query().toMap deleteComment = params.get("deleteComment") @@ -703,7 +702,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -712,14 +710,14 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit delete { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield makeChangeCommentRequestMessage(valueIriStr = valueIriStr, comment = None, userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -729,14 +727,14 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit get { requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield makeLinkValueGetRequestMessage(iris = iris, userADM = userADM) RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) @@ -746,7 +744,8 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit entity(as[ChangeFileValueApiRequestV1]) { apiRequest => requestContext => val requestMessage = for { userADM <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) resourceIri = stringFormatter.validateAndEscapeIri( resIriStr, @@ -777,7 +776,6 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV1.runJsonRouteWithFuture( requestMessage, requestContext, - settings, appActor, log ) 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 b7fd0b9c07..72acdcf6c3 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 @@ -33,7 +33,8 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) requestContext => requestContext.complete { doAuthenticateV2( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } } ~ @@ -61,7 +62,8 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) maybeUsername = apiRequest.username ), password = apiRequest.password - ) + ), + routeData.appConfig ) } } @@ -69,7 +71,7 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) delete { // logout requestContext => requestContext.complete { - doLogoutV2(requestContext) + doLogoutV2(requestContext, routeData.appConfig) } } } ~ @@ -77,7 +79,7 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) get { // html login interface (necessary for IIIF Authentication API support) requestContext => requestContext.complete { - presentLoginFormV2(requestContext) + presentLoginFormV2(requestContext, routeData.appConfig) } } ~ post { // called by html login interface (necessary for IIIF Authentication API support) @@ -90,7 +92,8 @@ class AuthenticationRouteV2(routeData: KnoraRouteData) maybeUsername = Some(username) ), password = password - ) + ), + routeData.appConfig ) } } 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 f495b1ef12..e1c8e54145 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 @@ -37,7 +37,8 @@ class ListsRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with requestContext => val requestMessage: Future[ListGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) listIri: IRI = stringFormatter.validateAndEscapeIri( lIri, @@ -51,7 +52,7 @@ class ListsRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -66,7 +67,8 @@ class ListsRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with requestContext => val requestMessage: Future[NodeGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) nodeIri: IRI = stringFormatter.validateAndEscapeIri( nIri, @@ -80,7 +82,7 @@ class ListsRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, 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 791c355051..e2108026e7 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 @@ -85,7 +85,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // 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 + // project-specific API ontology, prefix it with routeData.appConfig.externalOntologyIriHostAndPort to get the // ontology IRI. val urlPath = requestContext.request.uri.path.toString @@ -93,7 +93,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestedOntologyStr: IRI = if (stringFormatter.isBuiltInApiV2OntologyUrlPath(urlPath)) { OntologyConstants.KnoraApi.ApiOntologyHostname + urlPath } else if (stringFormatter.isProjectSpecificApiV2OntologyUrlPath(urlPath)) { - "http://" + settings.externalOntologyIriHostAndPort + urlPath + "http://" + routeData.appConfig.knoraApi.externalOntologyIriHostAndPort + urlPath } else { throw BadRequestException(s"Invalid or unknown URL path for external ontology: $urlPath") } @@ -118,7 +118,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[OntologyEntitiesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield OntologyEntitiesGetRequestV2( ontologyIri = requestedOntology, @@ -129,7 +130,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -145,7 +146,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[OntologyMetadataGetByProjectRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield OntologyMetadataGetByProjectRequestV2( projectIris = maybeProjectIri.toSet, @@ -155,7 +157,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -173,7 +175,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ChangeOntologyMetadataRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: ChangeOntologyMetadataRequestV2 <- ChangeOntologyMetadataRequestV2.fromJsonLD( @@ -181,7 +184,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -189,7 +191,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -205,7 +207,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) get { requestContext => val requestMessageFuture: Future[OntologyMetadataGetByProjectRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) validatedProjectIris = @@ -220,7 +223,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -252,7 +255,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[OntologyEntitiesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield OntologyEntitiesGetRequestV2( ontologyIri = requestedOntologyIri, @@ -263,7 +267,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -279,7 +283,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[CreateClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -289,7 +294,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -297,7 +301,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -316,7 +320,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangeClassLabelsOrCommentsRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -326,7 +331,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -334,7 +338,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -367,7 +371,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteClassCommentRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield DeleteClassCommentRequestV2( classIri = classIri, @@ -379,7 +384,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -396,7 +401,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[AddCardinalitiesToClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -406,7 +412,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -414,7 +419,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -437,7 +442,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanChangeCardinalitiesRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield CanChangeCardinalitiesRequestV2( classIri = classIri, @@ -447,7 +453,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -465,7 +471,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangeCardinalitiesRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -475,7 +482,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -483,7 +489,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -501,7 +507,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[CanDeleteCardinalitiesFromClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -512,7 +519,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -520,7 +526,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -540,7 +546,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[DeleteCardinalitiesFromClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -550,7 +557,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -558,7 +564,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -577,7 +583,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangeGuiOrderRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -587,7 +594,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -595,7 +601,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -650,7 +656,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ClassesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ClassesGetRequestV2( classIris = classesForResponder, @@ -661,7 +668,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -682,7 +689,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanDeleteClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield CanDeleteClassRequestV2( classIri = classIri, @@ -692,7 +700,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -727,7 +735,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield DeleteClassRequestV2( classIri = classIri, @@ -739,7 +748,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -769,7 +778,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOntologyCommentRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield DeleteOntologyCommentRequestV2( ontologyIri = ontologyIri, @@ -781,7 +791,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -798,7 +808,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[CreatePropertyRequestV2] = for { - requestingUser: UserADM <- getUserADM(requestContext = requestContext) + requestingUser: UserADM <- getUserADM(requestContext = requestContext, routeData.appConfig) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -851,7 +861,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -992,7 +1001,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1011,7 +1020,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangePropertyLabelsOrCommentsRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -1022,7 +1032,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -1030,7 +1039,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1063,7 +1072,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeletePropertyCommentRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield DeletePropertyCommentRequestV2( propertyIri = propertyIri, @@ -1075,7 +1085,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1092,7 +1102,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[ChangePropertyGuiElementRequest] = for { - requestingUser: UserADM <- getUserADM(requestContext = requestContext) + requestingUser: UserADM <- getUserADM(requestContext = requestContext, routeData.appConfig) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -1155,7 +1165,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1210,7 +1220,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[PropertiesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield PropertiesGetRequestV2( propertyIris = propsForResponder, @@ -1221,7 +1232,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -1242,7 +1253,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanDeletePropertyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield CanDeletePropertyRequestV2( propertyIri = propertyIri, @@ -1252,7 +1264,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1287,7 +1299,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeletePropertyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield DeletePropertyRequestV2( propertyIri = propertyIri, @@ -1299,7 +1312,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1315,7 +1328,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) { val requestMessageFuture: Future[CreateOntologyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest) @@ -1325,7 +1339,6 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -1333,7 +1346,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1356,7 +1369,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CanDeleteOntologyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield CanDeleteOntologyRequestV2( ontologyIri = ontologyIri, @@ -1366,7 +1380,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -1398,7 +1412,8 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOntologyRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield DeleteOntologyRequestV2( ontologyIri = ontologyIri, @@ -1410,7 +1425,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, 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 978cafd58d..deadbfe32d 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 @@ -22,6 +22,13 @@ import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.messages.v2.responder.resourcemessages._ import org.knora.webapi.messages.v2.responder.searchmessages.SearchResourcesByProjectAndClassRequestV2 +import org.knora.webapi.messages.v2.responder.valuemessages.ArchiveFileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.AudioFileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.DocumentFileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.FileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.MovingImageFileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.StillImageFileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.TextFileValueContentV2 import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData @@ -74,7 +81,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourceIIIFManifestGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourceIIIFManifestGetRequestV2( resourceIri = resourceIri, @@ -84,7 +92,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -101,7 +109,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[CreateResourceRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: CreateResourceRequestV2 <- CreateResourceRequestV2.fromJsonLD( @@ -109,15 +118,19 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) + + // check for each value which represents a file value if the file's MIME type is allowed + _ <- checkMimeTypesForFileValueContents( + values = requestMessage.createResource.flatValues + ) } yield requestMessage RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -136,7 +149,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[UpdateResourceMetadataRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: UpdateResourceMetadataRequestV2 <- UpdateResourceMetadataRequestV2.fromJsonLD( @@ -144,7 +158,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -152,7 +165,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -205,7 +218,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[SearchResourcesByProjectAndClassRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield SearchResourcesByProjectAndClassRequestV2( projectIri = projectIri, @@ -220,7 +234,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -252,7 +266,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourceVersionHistoryGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourceVersionHistoryGetRequestV2( resourceIri = resourceIri, @@ -264,7 +279,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -278,7 +293,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) get { requestContext => val requestMessageFuture: Future[ResourceHistoryEventsGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourceHistoryEventsGetRequestV2( resourceIri = resourceIri, @@ -288,7 +304,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -302,7 +318,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) get { requestContext => val requestMessageFuture: Future[ProjectResourcesWithHistoryGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ProjectResourcesWithHistoryGetRequestV2( projectIri = projectIri, @@ -312,7 +329,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -323,8 +340,10 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) 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}") + if (resIris.size > routeData.appConfig.v2.resourcesSequence.resultsPerPage) + throw BadRequestException( + s"List of provided resource Iris exceeds limit of ${routeData.appConfig.v2.resourcesSequence.resultsPerPage}" + ) val resourceIris: Seq[IRI] = resIris.map { resIri: String => stringFormatter.validateAndEscapeIri(resIri, throw BadRequestException(s"Invalid resource IRI: <$resIri>")) @@ -350,7 +369,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourcesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourcesGetRequestV2( resourceIris = resourceIris, @@ -363,7 +383,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -375,8 +395,10 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) private def getResourcesPreview(): Route = path("v2" / "resourcespreview" / Segments) { resIris: Seq[String] => get { requestContext => - if (resIris.size > settings.v2ResultsPerPage) - throw BadRequestException(s"List of provided resource Iris exceeds limit of ${settings.v2ResultsPerPage}") + if (resIris.size > routeData.appConfig.v2.resourcesSequence.resultsPerPage) + throw BadRequestException( + s"List of provided resource Iris exceeds limit of ${routeData.appConfig.v2.resourcesSequence.resultsPerPage}" + ) val resourceIris: Seq[IRI] = resIris.map { resIri: String => stringFormatter.validateAndEscapeIri(resIri, throw BadRequestException(s"Invalid resource IRI: <$resIri>")) @@ -386,7 +408,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourcesPreviewGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourcesPreviewGetRequestV2( resourceIris = resourceIris, @@ -397,7 +420,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), @@ -424,7 +447,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[ResourceTEIGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourceTEIGetRequestV2( resourceIri = resourceIri, @@ -438,7 +462,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runTEIXMLRoute( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext) @@ -454,14 +477,14 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) 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 depth: Int = params.get(Depth).map(_.toInt).getOrElse(routeData.appConfig.v2.graphRoute.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}") + if (depth > routeData.appConfig.v2.graphRoute.maxGraphDepth) { + throw BadRequestException(s"$Depth cannot be greater than ${routeData.appConfig.v2.graphRoute.maxGraphDepth}") } val direction: String = params.getOrElse(Direction, Outbound) @@ -480,7 +503,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[GraphDataGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield GraphDataGetRequestV2( resourceIri = resourceIri, @@ -494,7 +518,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), @@ -511,14 +535,14 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOrEraseResourceRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: DeleteOrEraseResourceRequestV2 <- DeleteOrEraseResourceRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -526,7 +550,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -545,7 +569,8 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) val requestMessageFuture: Future[DeleteOrEraseResourceRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: DeleteOrEraseResourceRequestV2 <- DeleteOrEraseResourceRequestV2.fromJsonLD( @@ -553,7 +578,6 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage.copy(erase = true) @@ -561,7 +585,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -657,4 +681,55 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) case None => None } } + + /** + * Checks if the MIME types of the given values are allowed by the configuration + * + * @param values the values to be checked. + */ + private def checkMimeTypesForFileValueContents( + values: Iterable[CreateValueInNewResourceV2] + ): Future[Unit] = + Future { + def badRequestException(fileValueContent: FileValueContentV2): BadRequestException = + BadRequestException( + s"File ${fileValueContent.fileValue.internalFilename} has MIME type ${fileValueContent.fileValue.internalMimeType}, which is not supported for still image files" + ) + values.foreach { value => + value.valueContent match { + case fileValueContent: StillImageFileValueContentV2 => { + if (!routeData.appConfig.sipi.imageMimeTypes.contains(fileValueContent.fileValue.internalMimeType)) { + throw badRequestException(fileValueContent) + } + } + case fileValueContent: DocumentFileValueContentV2 => { + if (!routeData.appConfig.sipi.documentMimeTypes.contains(fileValueContent.fileValue.internalMimeType)) { + throw badRequestException(fileValueContent) + } + } + case fileValueContent: ArchiveFileValueContentV2 => { + if (!routeData.appConfig.sipi.archiveMimeTypes.contains(fileValueContent.fileValue.internalMimeType)) { + throw badRequestException(fileValueContent) + } + } + case fileValueContent: TextFileValueContentV2 => { + if (!routeData.appConfig.sipi.textMimeTypes.contains(fileValueContent.fileValue.internalMimeType)) { + throw badRequestException(fileValueContent) + } + } + case fileValueContent: AudioFileValueContentV2 => { + if (!routeData.appConfig.sipi.audioMimeTypes.contains(fileValueContent.fileValue.internalMimeType)) { + throw badRequestException(fileValueContent) + } + } + case fileValueContent: MovingImageFileValueContentV2 => { + if (!routeData.appConfig.sipi.videoMimeTypes.contains(fileValueContent.fileValue.internalMimeType)) { + throw badRequestException(fileValueContent) + } + } + case _ => () + + } + } + } } 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 2b8b21ec1b..1d759b3d6b 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 @@ -7,6 +7,7 @@ package org.knora.webapi.routing.v2 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route +import zio.ZIO import scala.concurrent.Future @@ -168,9 +169,9 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit throw BadRequestException(s"Invalid search string: '$searchStr'") ) - if (escapedSearchStr.length < settings.searchValueMinLength) { + if (escapedSearchStr.length < routeData.appConfig.v2.fulltextSearch.searchValueMinLength) { throw BadRequestException( - s"A search value is expected to have at least length of ${settings.searchValueMinLength}, but '$escapedSearchStr' given of length ${escapedSearchStr.length}." + s"A search value is expected to have at least length of ${routeData.appConfig.v2.fulltextSearch.searchValueMinLength}, but '$escapedSearchStr' given of length ${escapedSearchStr.length}." ) } @@ -183,7 +184,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val limitToStandoffClass: Option[SmartIri] = getStandoffClass(params) val requestMessage: Future[FullTextSearchCountRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield FullTextSearchCountRequestV2( searchValue = escapedSearchStr, limitToProject = limitToProject, @@ -195,7 +196,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), @@ -207,7 +208,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit 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 => - log.info(s"Full Text Search for string: $searchStr") + ZIO.logInfo(s"Full-text Search for string: $searchStr") if (searchStr.contains(OntologyConstants.KnoraApi.ApiOntologyHostname)) { throw BadRequestException("It looks like you are submitting a Gravsearch request to a full-text search route") @@ -219,9 +220,9 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit throw BadRequestException(s"Invalid search string: '$searchStr'") ) - if (escapedSearchStr.length < settings.searchValueMinLength) { + if (escapedSearchStr.length < routeData.appConfig.v2.fulltextSearch.searchValueMinLength) { throw BadRequestException( - s"A search value is expected to have at least length of ${settings.searchValueMinLength}, but '$escapedSearchStr' given of length ${escapedSearchStr.length}." + s"A search value is expected to have at least length of ${routeData.appConfig.v2.fulltextSearch.searchValueMinLength}, but '$escapedSearchStr' given of length ${escapedSearchStr.length}." ) } @@ -244,7 +245,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) val requestMessage: Future[FulltextSearchRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield FulltextSearchRequestV2( searchValue = escapedSearchStr, offset = offset, @@ -260,7 +261,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -276,7 +277,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val constructQuery = GravsearchParser.parseQuery(gravsearchQuery) val requestMessage: Future[GravsearchCountRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GravsearchCountRequestV2( constructQuery = constructQuery, requestingUser = requestingUser @@ -285,7 +286,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), @@ -301,7 +302,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit { val constructQuery = GravsearchParser.parseQuery(gravsearchQuery) val requestMessage: Future[GravsearchCountRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GravsearchCountRequestV2( constructQuery = constructQuery, requestingUser = requestingUser @@ -310,7 +311,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), @@ -330,7 +331,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) val requestMessage: Future[GravsearchRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GravsearchRequestV2( constructQuery = constructQuery, targetSchema = targetSchema, @@ -341,7 +342,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -359,7 +360,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val schemaOptions: Set[SchemaOption] = RouteUtilV2.getSchemaOptions(requestContext) val requestMessage: Future[GravsearchRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield GravsearchRequestV2( constructQuery = constructQuery, targetSchema = targetSchema, @@ -370,7 +371,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -391,9 +392,9 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit throw BadRequestException(s"Invalid search string: '$searchval'") ) - if (searchString.length < settings.searchValueMinLength) { + if (searchString.length < routeData.appConfig.v2.fulltextSearch.searchValueMinLength) { throw BadRequestException( - s"A search value is expected to have at least length of ${settings.searchValueMinLength}, but '$searchString' given of length ${searchString.length}." + s"A search value is expected to have at least length of ${routeData.appConfig.v2.fulltextSearch.searchValueMinLength}, but '$searchString' given of length ${searchString.length}." ) } @@ -404,7 +405,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val limitToResourceClass: Option[SmartIri] = getResourceClassFromParams(params) val requestMessage: Future[SearchResourceByLabelCountRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield SearchResourceByLabelCountRequestV2( searchValue = searchString, limitToProject = limitToProject, @@ -415,7 +416,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), @@ -434,9 +435,9 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit throw BadRequestException(s"Invalid search string: '$searchval'") ) - if (searchString.length < settings.searchValueMinLength) { + if (searchString.length < routeData.appConfig.v2.fulltextSearch.searchValueMinLength) { throw BadRequestException( - s"A search value is expected to have at least length of ${settings.searchValueMinLength}, but '$searchString' given of length ${searchString.length}." + s"A search value is expected to have at least length of ${routeData.appConfig.v2.fulltextSearch.searchValueMinLength}, but '$searchString' given of length ${searchString.length}." ) } @@ -451,7 +452,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val targetSchema: ApiV2Schema = RouteUtilV2.getOntologySchema(requestContext) val requestMessage: Future[SearchResourceByLabelRequestV2] = for { - requestingUser <- getUserADM(requestContext) + requestingUser <- getUserADM(requestContext, routeData.appConfig) } yield SearchResourceByLabelRequestV2( searchValue = searchString, offset = offset, @@ -464,7 +465,7 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessage, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = RouteUtilV2.getOntologySchema(requestContext), 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 45ab87997d..c433cef067 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 @@ -63,7 +63,8 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w val requestMessageFuture: Future[GetStandoffPageRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield GetStandoffPageRequestV2( resourceIri = resourceIri.toString, @@ -76,7 +77,7 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -121,7 +122,8 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w val requestMessageFuture: Future[CreateMappingRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) allParts: Map[Name, String] <- allPartsFuture jsonldDoc = @@ -139,7 +141,6 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w apiRequestID = apiRequestID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) @@ -160,7 +161,7 @@ class StandoffRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) w RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, 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 9a1e6f0412..d8b24fe559 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 @@ -78,7 +78,8 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[ResourcesGetRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) } yield ResourcesGetRequestV2( resourceIris = Seq(resourceIri.toString), @@ -91,7 +92,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = targetSchema, @@ -108,14 +109,14 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[CreateValueRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: CreateValueRequestV2 <- CreateValueRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -123,7 +124,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -142,14 +143,14 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[UpdateValueRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: UpdateValueRequestV2 <- UpdateValueRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -157,7 +158,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, @@ -176,14 +177,14 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit val requestMessageFuture: Future[DeleteValueRequestV2] = for { requestingUser <- getUserADM( - requestContext = requestContext + requestContext = requestContext, + routeData.appConfig ) requestMessage: DeleteValueRequestV2 <- DeleteValueRequestV2.fromJsonLD( requestDoc, apiRequestID = UUID.randomUUID, requestingUser = requestingUser, appActor = appActor, - settings = settings, log = log ) } yield requestMessage @@ -191,7 +192,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit RouteUtilV2.runRdfRouteWithFuture( requestMessageF = requestMessageFuture, requestContext = requestContext, - settings = settings, + appConfig = routeData.appConfig, appActor = appActor, log = log, targetSchema = ApiV2Complex, diff --git a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala deleted file mode 100644 index 6aaf53aa6a..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala +++ /dev/null @@ -1,276 +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.settings - -import akka.ConfigurationException -import akka.actor.ActorSystem -import akka.actor.ExtendedActorSystem -import akka.actor.Extension -import akka.actor.ExtensionId -import akka.actor.ExtensionIdProvider -import com.typesafe.config.Config -import com.typesafe.config.ConfigValue -import com.typesafe.scalalogging.Logger - -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import scala.concurrent.duration._ -import scala.jdk.CollectionConverters._ - -import dsp.errors.FileWriteException -import dsp.valueobjects.User -import org.knora.webapi.util.cache.CacheUtil.KnoraCacheConfig - -/** - * Reads application settings that come from `application.conf`. - */ -class KnoraSettingsImpl(config: Config, log: Logger) extends Extension { - - // print config - val printExtendedConfig: Boolean = config.getBoolean("app.print-extended-config") - - // used for communication inside the knora stack - val internalKnoraApiHost: String = config.getString("app.knora-api.internal-host") - val internalKnoraApiPort: Int = config.getInt("app.knora-api.internal-port") - val internalKnoraApiBaseUrl: String = - "http://" + internalKnoraApiHost + (if (internalKnoraApiPort != 80) - ":" + internalKnoraApiPort - else "") - - // used for communication between the outside and the knora stack, e.g., browser - val externalKnoraApiProtocol: String = config.getString("app.knora-api.external-protocol") - val externalKnoraApiHost: String = config.getString("app.knora-api.external-host") - val externalKnoraApiPort: Int = config.getInt("app.knora-api.external-port") - val externalKnoraApiHostPort: String = externalKnoraApiHost + (if (externalKnoraApiPort != 80) - ":" + externalKnoraApiPort - else "") - val externalKnoraApiBaseUrl: String = - externalKnoraApiProtocol + "://" + externalKnoraApiHost + (if (externalKnoraApiPort != 80) - ":" + externalKnoraApiPort - else "") - - /** - * If the external hostname is localhost or 0.0.0.0, include the configured - * external port number in ontology IRIs for manual testing. - */ - val externalOntologyIriHostAndPort: String = - if (externalKnoraApiHost == "0.0.0.0" || externalKnoraApiHost == "localhost") { - externalKnoraApiHostPort - } else { - // Otherwise, don't include any port number in IRIs, so the IRIs will work both with http - // and with https. - externalKnoraApiHost - } - - val salsah1BaseUrl: String = config.getString("app.salsah1.base-url") - val salsah1ProjectIconsBasePath: String = config.getString("app.salsah1.project-icons-basepath") - - val tmpDataDir: String = config.getString("app.tmp-datadir") - val dataDir: String = config.getString("app.datadir") - - // try to create the directories - if (!Files.exists(Paths.get(tmpDataDir))) { - try { - Files.createDirectories(Paths.get(tmpDataDir)) - } catch { - case e: Throwable => - throw FileWriteException(s"Tmp data directory $tmpDataDir could not be created: ${e.getMessage}") - } - } - - // try to create the directories - if (!Files.exists(Paths.get(dataDir))) { - try { - Files.createDirectories(Paths.get(dataDir)) - } catch { - case e: Throwable => - throw FileWriteException(s"Tmp data directory $tmpDataDir could not be created: ${e.getMessage}") - } - } - - val imageMimeTypes: Set[String] = config - .getList("app.sipi.image-mime-types") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSet - - val documentMimeTypes: Set[String] = config - .getList("app.sipi.document-mime-types") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSet - - val textMimeTypes: Set[String] = config - .getList("app.sipi.text-mime-types") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSet - - val audioMimeTypes: Set[String] = config - .getList("app.sipi.audio-mime-types") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSet - - val videoMimeTypes: Set[String] = config - .getList("app.sipi.video-mime-types") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSet - - val archiveMimeTypes: Set[String] = config - .getList("app.sipi.archive-mime-types") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSet - - val internalSipiProtocol: String = config.getString("app.sipi.internal-protocol") - val internalSipiHost: String = config.getString("app.sipi.internal-host") - val internalSipiPort: Int = config.getInt("app.sipi.internal-port") - val internalSipiBaseUrl: String = internalSipiProtocol + "://" + internalSipiHost + (if (internalSipiPort != 80) - ":" + internalSipiPort - else "") - - val sipiTimeout: FiniteDuration = getFiniteDuration("app.sipi.timeout", config) - - val externalSipiProtocol: String = config.getString("app.sipi.external-protocol") - val externalSipiHost: String = config.getString("app.sipi.external-host") - val externalSipiPort: Int = config.getInt("app.sipi.external-port") - val externalSipiBaseUrl: String = externalSipiProtocol + "://" + externalSipiHost + (if (externalSipiPort != 80) - ":" + externalSipiPort - else "") - val sipiFileServerPrefix: String = config.getString("app.sipi.file-server-path") - val externalSipiIIIFGetUrl: String = externalSipiBaseUrl - val sipiFileMetadataRouteV2: String = config.getString("app.sipi.v2.file-metadata-route") - val sipiMoveFileRouteV2: String = config.getString("app.sipi.v2.move-file-route") - val sipiDeleteTempFileRouteV2: String = config.getString("app.sipi.v2.delete-temp-file-route") - - val arkResolver: String = config.getString("app.ark.resolver") - val arkAssignedNumber: Int = config.getInt("app.ark.assigned-number") - - val caches: Vector[KnoraCacheConfig] = config - .getList("app.caches") - .iterator - .asScala - .map { cacheConfigItem: ConfigValue => - val cacheConfigMap = cacheConfigItem.unwrapped.asInstanceOf[java.util.HashMap[String, Any]].asScala - KnoraCacheConfig( - cacheConfigMap("cache-name").asInstanceOf[String], - cacheConfigMap("max-elements-in-memory").asInstanceOf[Int], - cacheConfigMap("overflow-to-disk").asInstanceOf[Boolean], - cacheConfigMap("eternal").asInstanceOf[Boolean], - cacheConfigMap("time-to-live-seconds").asInstanceOf[Int], - cacheConfigMap("time-to-idle-seconds").asInstanceOf[Int] - ) - } - .toVector - - val defaultTimeout: FiniteDuration = getFiniteDuration("app.default-timeout", config) - - val dumpMessages: Boolean = config.getBoolean("app.dump-messages") - val showInternalErrors: Boolean = config.getBoolean("app.show-internal-errors") - val maxResultsPerSearchResultPage: Int = config.getInt("app.max-results-per-search-result-page") - val standoffPerPage: Int = config.getInt("app.standoff-per-page") - val defaultIconSizeDimX: Int = config.getInt("app.gui.default-icon-size.dimX") - val defaultIconSizeDimY: Int = config.getInt("app.gui.default-icon-size.dimY") - - val v2ResultsPerPage: Int = config.getInt("app.v2.resources-sequence.results-per-page") - val searchValueMinLength: Int = config.getInt("app.v2.fulltext-search.search-value-min-length") - - val defaultGraphDepth: Int = config.getInt("app.v2.graph-route.default-graph-depth") - val maxGraphDepth: Int = config.getInt("app.v2.graph-route.max-graph-depth") - val maxGraphBreadth: Int = config.getInt("app.v2.graph-route.max-graph-breadth") - - val triplestoreType: String = config.getString("app.triplestore.dbtype") - val triplestoreHost: String = config.getString("app.triplestore.host") - - val triplestoreUseHttps: Boolean = config.getBoolean("app.triplestore.use-https") - - val triplestoreAutoInit: Boolean = config.getBoolean("app.triplestore.auto-init") - - val triplestorePort: Int = config.getInt("app.triplestore.fuseki.port") - val triplestoreDatabaseName: String = config.getString("app.triplestore.fuseki.repository-name") - val triplestoreUsername: String = config.getString("app.triplestore.fuseki.username") - val triplestorePassword: String = config.getString("app.triplestore.fuseki.password") - - // used in the store package - val tripleStoreConfig: Config = config.getConfig("app.triplestore") - - val jwtSecretKey: String = config.getString("app.jwt-secret-key") - val jwtLongevity: FiniteDuration = getFiniteDuration("app.jwt-longevity", config) - - val cookieDomain: String = config.getString("app.cookie-domain") - - val fallbackLanguage: String = config.getString("user.default-language") - - val profileQueries: Boolean = config.getBoolean("app.triplestore.profile-queries") - - val routesToReject: Seq[String] = config - .getList("app.routes-to-reject") - .iterator - .asScala - .map { mType: ConfigValue => - mType.unwrapped.toString - } - .toSeq - - val allowReloadOverHTTP: Boolean = config.getBoolean("app.allow-reload-over-http") - - val bcryptPasswordStrength = - User.PasswordStrength - .make(config.getInt("app.bcrypt-password-strength")) - .fold(e => throw new ConfigurationException(e.head), v => v) - - // Client test data service - - val collectClientTestData: Boolean = if (config.hasPath("app.client-test-data-service.collect-client-test-data")) { - config.getBoolean("app.client-test-data-service.collect-client-test-data") - } else { - false - } - - private def getFiniteDuration(path: String, underlying: Config): FiniteDuration = - Duration(underlying.getString(path)) match { - case x: FiniteDuration => x - case _ => throw new ConfigurationException(s"Config setting '$path' must be a finite duration") - } - - val prometheusEndpoint: Boolean = config.getBoolean("app.monitoring.prometheus-endpoint") - - val shaclShapesDir: Path = Paths.get(config.getString("app.shacl.shapes-dir")) -} - -object KnoraSettings extends ExtensionId[KnoraSettingsImpl] with ExtensionIdProvider { - - override def lookup: KnoraSettings.type = KnoraSettings - - override def createExtension(system: ExtendedActorSystem) = - new KnoraSettingsImpl(system.settings.config, Logger(this.getClass)) - - /** - * Java API: retrieve the Settings extension for the given system. - */ - override def get(system: ActorSystem): KnoraSettingsImpl = super.get(system) -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala index 92c46b189b..8ba1f1a251 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/CacheServiceManager.scala @@ -27,7 +27,7 @@ object CacheServiceManager { val layer: ZLayer[CacheService, Nothing, CacheServiceManager] = ZLayer { for { - cs <- ZIO.service[CacheService] + cacheService <- ZIO.service[CacheService] } yield new CacheServiceManager { val cacheServiceWriteUserTimer = Metric @@ -73,7 +73,7 @@ object CacheServiceManager { */ def putUserADM(value: UserADM): Task[Unit] = for { - res <- cs.putUserADM(value) @@ cacheServiceWriteUserTimer.trackDuration + res <- cacheService.putUserADM(value) @@ cacheServiceWriteUserTimer.trackDuration // _ <- cacheServiceWriteUserTimer.value.tap(value => ZIO.debug(value)) } yield res @@ -84,7 +84,7 @@ object CacheServiceManager { * @param id the project identifier. */ def getUserADM(id: UserIdentifierADM): Task[Option[UserADM]] = - cs.getUserADM(id) + cacheService.getUserADM(id) /** * Stores the project under the IRI and additionally the IRI under the keys @@ -98,7 +98,7 @@ object CacheServiceManager { */ def putProjectADM(value: ProjectADM): Task[Unit] = for { - res <- cs.putProjectADM(value) @@ cacheServiceWriteProjectTimer.trackDuration + res <- cacheService.putProjectADM(value) @@ cacheServiceWriteProjectTimer.trackDuration // _ <- cacheServiceWriteProjectTimer.value.tap(value => ZIO.debug(value)) } yield res @@ -109,7 +109,7 @@ object CacheServiceManager { */ def getProjectADM(id: ProjectIdentifierADM): Task[Option[ProjectADM]] = for { - res <- cs.getProjectADM(id) @@ cacheServiceReadProjectTimer.trackDuration + res <- cacheService.getProjectADM(id) @@ cacheServiceReadProjectTimer.trackDuration // _ <- cacheServiceReadProjectTimer.value.tap(value => ZIO.debug(value)) } yield res @@ -119,7 +119,7 @@ object CacheServiceManager { * @param k the key. */ def getStringValue(k: String): Task[Option[String]] = - cs.getStringValue(k) + cacheService.getStringValue(k) /** * Store string or byte array value under key. @@ -128,7 +128,7 @@ object CacheServiceManager { * @param v the value. */ def writeStringValue(k: String, v: String): Task[Unit] = - cs.putStringValue(k, v) + cacheService.putStringValue(k, v) /** * Removes values for the provided keys. Any invalid keys are ignored. @@ -136,19 +136,19 @@ object CacheServiceManager { * @param keys the keys. */ def removeValues(keys: Set[String]): Task[Unit] = - cs.removeValues(keys) + cacheService.removeValues(keys) /** * Flushes (removes) all stored content from the store. */ def flushDB(requestingUser: UserADM): Task[Unit] = - cs.flushDB(requestingUser) + cacheService.flushDB(requestingUser) /** * Pings the cache service to see if it is available. */ def ping(): UIO[CacheServiceStatusResponse] = - cs.getStatus + cacheService.getStatus } } } diff --git a/webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala b/webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala index bfedd49ea8..f8b29cf512 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cache/settings/CacheServiceSettings.scala @@ -5,13 +5,13 @@ package org.knora.webapi.store.cache.settings -import com.typesafe.config.Config +import org.knora.webapi.config.AppConfig /** * Holds the Cache Service specific settings. */ -class CacheServiceSettings(config: Config) { - val cacheServiceEnabled: Boolean = config.getBoolean("app.cache-service.enabled") - val cacheServiceRedisHost: String = config.getString("app.cache-service.redis.host") - val cacheServiceRedisPort: Int = config.getInt("app.cache-service.redis.port") +class CacheServiceSettings(appConfig: AppConfig) { + val cacheServiceEnabled: Boolean = appConfig.cacheService.enabled + val cacheServiceRedisHost: String = appConfig.cacheService.redis.host + val cacheServiceRedisPort: Int = appConfig.cacheService.redis.port } 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 5d100ae67b..0782927404 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 @@ -31,7 +31,6 @@ import dsp.errors.BadRequestException import dsp.errors.NotFoundException import org.knora.webapi.auth.JWTService import org.knora.webapi.config.AppConfig -import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.sipimessages._ import org.knora.webapi.messages.v2.responder.SuccessResponseV2 import org.knora.webapi.store.iiif.api.IIIFService @@ -41,15 +40,17 @@ import org.knora.webapi.util.SipiUtil /** * Makes requests to Sipi. + * + * @param appConfig The application's configuration + * @param jwt The JWT Service to handle JWT Tokens + * @param httpClient The HTTP Client */ case class IIIFServiceSipiImpl( - config: AppConfig, + appConfig: AppConfig, jwt: JWTService, httpClient: CloseableHttpClient ) extends IIIFService { - implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - /** * Asks Sipi for metadata about a file, served from the 'knora.json' route. * @@ -60,9 +61,8 @@ 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(appConfig.sipi.internalBaseUrl + getFileMetadataRequest.filePath + "/knora.json") + request <- ZIO.succeed(new HttpGet(url)) sipiResponseStr <- doSipiRequest(request).orDie sipiResponse <- ZIO.attempt(sipiResponseStr.parseJson.convertTo[SipiKnoraJsonResponse]).orDie } yield GetFileMetadataResponse( @@ -103,7 +103,7 @@ case class IIIFServiceSipiImpl( // builds the url for the operation def moveFileUrl(token: String) = - ZIO.succeed(s"${config.sipi.internalBaseUrl}/${config.sipi.v2.moveFileRoute}?token=$token") + ZIO.succeed(s"${appConfig.sipi.internalBaseUrl}/${appConfig.sipi.moveFileRoute}?token=$token") // build the form to send together with the request val formParams = new util.ArrayList[NameValuePair]() @@ -149,7 +149,7 @@ case class IIIFServiceSipiImpl( def deleteUrl(token: String): ZIO[Any, Nothing, String] = ZIO.succeed( - s"${config.sipi.internalBaseUrl}/${config.sipi.v2.deleteTempFileRoute}/${deleteTemporaryFileRequestV2.internalFilename}?token=$token" + s"${appConfig.sipi.internalBaseUrl}/${appConfig.sipi.deleteTempFileRoute}/${deleteTemporaryFileRequestV2.internalFilename}?token=$token" ) for { @@ -213,7 +213,7 @@ case class IIIFServiceSipiImpl( */ def getStatus(): UIO[IIIFServiceStatusResponse] = for { - request <- ZIO.succeed(new HttpGet(config.sipi.internalBaseUrl + "/server/test.html")) + request <- ZIO.succeed(new HttpGet(appConfig.sipi.internalBaseUrl + "/server/test.html")) response <- doSipiRequest(request).fold(_ => IIIFServiceStatusNOK, _ => IIIFServiceStatusOK) } yield response @@ -225,7 +225,7 @@ case class IIIFServiceSipiImpl( */ private def doSipiRequest(request: HttpRequest): Task[String] = { val targetHost: HttpHost = - new HttpHost(config.sipi.internalHost, config.sipi.internalPort, config.sipi.internalProtocol) + new HttpHost(appConfig.sipi.internalHost, appConfig.sipi.internalPort, appConfig.sipi.internalProtocol) val httpContext: HttpClientContext = HttpClientContext.create() var maybeResponse: Option[CloseableHttpResponse] = None @@ -280,7 +280,7 @@ object IIIFServiceSipiImpl { * Acquires a configured httpClient, backed by a connection pool, * to be used in communicating with SIPI. */ - private def acquire(config: AppConfig) = ZIO.attemptBlocking { + private def acquire(config: AppConfig): URIO[Any, CloseableHttpClient] = ZIO.attemptBlocking { // timeout from config val sipiTimeoutMillis: Int = config.sipi.timeoutInSeconds.toMillis.toInt @@ -313,14 +313,12 @@ object IIIFServiceSipiImpl { .setSocketTimeout(sipiTimeoutMillis) .build() - // Create an HttpClient with the given custom dependencies and configuration. - val httpClient: CloseableHttpClient = HttpClients + // Return an HttpClient with the given custom dependencies and configuration. + HttpClients .custom() .setConnectionManager(connManager) .setDefaultRequestConfig(defaultRequestConfig) .build() - - httpClient }.tap(_ => ZIO.logInfo(">>> Acquire Sipi IIIF Service <<<")).orDie /** @@ -334,12 +332,8 @@ object IIIFServiceSipiImpl { val layer: ZLayer[AppConfig & JWTService, Nothing, IIIFService] = ZLayer.scoped { for { - config <- ZIO.service[AppConfig] - // _ <- ZIO.debug(config) + config <- ZIO.service[AppConfig] jwtService <- ZIO.service[JWTService] - // 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 <- ZIO.acquireRelease(acquire(config))(release(_)) } yield IIIFServiceSipiImpl(config, jwtService, httpClient) } 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 index 6a26922a45..492df75dba 100644 --- 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 @@ -532,7 +532,7 @@ case class TriplestoreServiceHttpConnectorImpl( * 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 + * to 'true' (appConfig.triplestore.autoInit). This is set to `true` for tests * (`test/resources/test.conf`). Usage is only recommended for automated * testing and not for production use. */ 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 33d0f88727..d974ee6653 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 @@ -12,7 +12,6 @@ import scala.reflect.io.Directory import dsp.errors.InconsistentRepositoryDataException import org.knora.webapi.IRI -import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.api.TriplestoreService @@ -23,7 +22,7 @@ import org.knora.webapi.util.FileUtil trait RepositoryUpdater { /** - * Upgrades the repository, if necessary, to work with the current version of dsp-api. + * Upgrades the repository, if necessary, to work with the current version of DSP-API. * * @return a response indicating what was done. */ @@ -33,18 +32,18 @@ trait RepositoryUpdater { /** * Updates a DSP repository to work with the current version of DSP-API. * - * Depends on [[TriplestoreService]] and [[AppConfig]]. + * Depends on [[TriplestoreService]]. */ object RepositoryUpdater { - val layer: ZLayer[TriplestoreService & AppConfig, Nothing, RepositoryUpdater] = + val layer: ZLayer[TriplestoreService, Nothing, RepositoryUpdater] = ZLayer { for { - ts <- ZIO.service[TriplestoreService] - config <- ZIO.service[AppConfig] + ts <- ZIO.service[TriplestoreService] } yield new RepositoryUpdaterImpl(ts) {} } - sealed abstract private class RepositoryUpdaterImpl(ts: TriplestoreService) extends RepositoryUpdater { + sealed abstract private class RepositoryUpdaterImpl(triplestoreService: TriplestoreService) + extends RepositoryUpdater { private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil() // A SPARQL query to find out the knora-base version in a repository. @@ -60,10 +59,10 @@ object RepositoryUpdater { */ private val log: Logger = Logger(LoggerFactory.getLogger(getClass.getName)) - private val tempDirNamePrefix: String = "knora" + private val tmpDirNamePrefix: String = "knora" /** - * Updates the repository, if necessary, to work with the current version of dsp-api. + * Updates the repository, if necessary, to work with the current version of DSP-API. * * @return a response indicating what was done. */ @@ -84,9 +83,9 @@ object RepositoryUpdater { // No. Construct the list of updates that it needs. _ <- ZIO.logInfo( - s"Repository not up-to-date. Found: ${foundRepositoryVersion.getOrElse("None")}, Required: $requiredRepositoryVersion" + s"Repository not up to date. Found: ${foundRepositoryVersion.getOrElse("None")}, Required: $requiredRepositoryVersion" ) - _ <- deleteTempDirectories() + _ <- deleteTmpDirectories() selectedPlugins <- selectPluginsForNeededUpdates(foundRepositoryVersion) _ <- ZIO.logInfo( @@ -100,18 +99,18 @@ object RepositoryUpdater { } yield repositoryUpdatedResponse /** - * Deletes directories inside temp directory starting with `tempDirNamePrefix`. + * Deletes directories inside tmp directory starting with `tmpDirNamePrefix`. */ - private def deleteTempDirectories(): UIO[Unit] = ZIO.attempt { - val rootDir = new File("/tmp/") - val getTempToDelete = rootDir.listFiles.filter(_.getName.startsWith(tempDirNamePrefix)) + private def deleteTmpDirectories(): UIO[Unit] = ZIO.attempt { + val rootDir = new File("/tmp/") + val getTmpToDelete = rootDir.listFiles.filter(_.getName.startsWith(tmpDirNamePrefix)) - if (getTempToDelete.length != 0) { - getTempToDelete.foreach { dir => + if (getTmpToDelete.length != 0) { + getTmpToDelete.foreach { dir => val dirToDelete = new Directory(dir) dirToDelete.deleteRecursively() } - log.info(s"Deleted temp directories: ${getTempToDelete.map(_.getName()).mkString(", ")}") + log.info(s"Deleted tmp directories: ${getTmpToDelete.map(_.getName()).mkString(", ")}") } () }.orDie @@ -123,7 +122,7 @@ object RepositoryUpdater { */ private def getRepositoryVersion(): UIO[Option[String]] = for { - repositoryVersionResponse <- ts.sparqlHttpSelect(knoraBaseVersionQuery) + repositoryVersionResponse <- triplestoreService.sparqlHttpSelect(knoraBaseVersionQuery) bindings <- ZIO.succeed(repositoryVersionResponse.results.bindings) versionString <- if (bindings.nonEmpty) { @@ -184,7 +183,7 @@ object RepositoryUpdater { pluginsForNeededUpdates: Seq[PluginForKnoraBaseVersion] ): UIO[RepositoryUpdatedResponse] = (for { - downloadDir <- ZIO.attempt(Files.createTempDirectory(tempDirNamePrefix)) + downloadDir <- ZIO.attempt(Files.createTempDirectory(tmpDirNamePrefix)) _ <- ZIO.logInfo(s"Repository update using download directory $downloadDir") // The file to save the repository in. @@ -193,7 +192,7 @@ object RepositoryUpdater { // Ask the store actor to download the repository to the file. _ <- ZIO.logInfo("Downloading repository file...") - _ <- ts.downloadRepository(downloadedRepositoryFile) + _ <- triplestoreService.downloadRepository(downloadedRepositoryFile) // Run the transformations to produce an output file. _ <- doTransformations( @@ -204,11 +203,11 @@ object RepositoryUpdater { // Empty the repository. _ <- ZIO.logInfo("Emptying the repository...") - _ <- ts.dropAllTriplestoreContent() + _ <- triplestoreService.dropAllTriplestoreContent() // Upload the transformed repository. _ <- ZIO.logInfo("Uploading transformed repository data...") - _ <- ts.uploadRepository(transformedRepositoryFile) + _ <- triplestoreService.uploadRepository(transformedRepositoryFile) } yield RepositoryUpdatedResponse( message = s"Updated repository to ${org.knora.webapi.KnoraBaseVersion}" )).orDie diff --git a/webapi/src/main/scala/org/knora/webapi/util/FileUtil.scala b/webapi/src/main/scala/org/knora/webapi/util/FileUtil.scala index 0e8f37aba0..1e1b542bef 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/FileUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/FileUtil.scala @@ -23,7 +23,7 @@ import scala.util.Try import dsp.errors.FileWriteException import dsp.errors.NotFoundException -import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.config.AppConfig /** * Functions for reading and writing files. @@ -125,31 +125,18 @@ object FileUtil { } /** - * Saves data to a temporary file. + * Creates an empty file in the default temporary-file directory specified in the application's configuration * - * @param settings Knora application settings. - * @param binaryData the binary file data to be saved. - * @return the location where the file has been written to. - */ - def saveFileToTmpLocation(settings: KnoraSettingsImpl, binaryData: Array[Byte]): Path = { - val file = createTempFile(settings) - Files.write(file, binaryData) - file - } - - /** - * Creates an empty file in the default temporary-file directory specified in Knora's application settings. - * - * @param settings Knora's application settings. + * @param appConfig the application's configuration * @param fileExtension the extension to be used for the temporary file name, if any, * @return the location where the file has been written to. */ - def createTempFile(settings: KnoraSettingsImpl, fileExtension: Option[String] = None): Path = { - val tempDataDir = Paths.get(settings.tmpDataDir) + def createTempFile(fileExtension: Option[String] = None, appConfig: AppConfig): Path = { + val tempDataDir = Paths.get(appConfig.tmpDatadir) // check if the location for writing temporary files exists if (!Files.exists(tempDataDir)) { - throw FileWriteException(s"Data directory ${settings.tmpDataDir} does not exist on server") + throw FileWriteException(s"Data directory ${appConfig.tmpDatadir} does not exist on server") } val extension = fileExtension.getOrElse("bin") diff --git a/webapi/src/main/scala/org/knora/webapi/util/cache/CacheUtil.scala b/webapi/src/main/scala/org/knora/webapi/util/cache/CacheUtil.scala index 0be26977a5..0fe2f5c37c 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/cache/CacheUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/cache/CacheUtil.scala @@ -72,7 +72,6 @@ object CacheUtil { def removeAllCaches(): Unit = { val cacheManager = CacheManager.getInstance() cacheManager.removeAllCaches() - // println("CacheUtil: Removed all application caches") } /** @@ -85,7 +84,6 @@ object CacheUtil { Option(cacheManager.getCache(cacheName)) match { case Some(cache) => cache.removeAll() - // println(s"CacheUtil: cleared application cache '$cacheName'") case None => throw ApplicationCacheException(s"Application cache '$cacheName' not found") } diff --git a/webapi/src/test/resources/test.conf b/webapi/src/test/resources/test.conf index 577fd748e8..67af9a8283 100644 --- a/webapi/src/test/resources/test.conf +++ b/webapi/src/test/resources/test.conf @@ -2,7 +2,6 @@ include "application" akka { log-config-on-start = false - //loggers = ["akka.testkit.TestEventListener"] loggers = ["akka.event.slf4j.Slf4jLogger"] logging-filter = "akka.event.slf4j.Slf4jLoggingFilter" loglevel = "ERROR" @@ -29,17 +28,19 @@ akka { app { testing = true - print-short-config = false - triplestore.auto-init = true allow-reload-over-http = true - client-test-data-service { - # If true, collect client test data from E2E tests. - collect-client-test-data = false - collect-client-test-data = ${?KNORA_WEBAPI_COLLECT_CLIENT_TEST_DATA} + triplestore { + auto-init = true } shacl { shapes-dir = "../test_data/shacl" } + + client-test-data-service { + # If true, collect client test data from E2E tests. + collect-client-test-data = false + collect-client-test-data = ${?KNORA_WEBAPI_COLLECT_CLIENT_TEST_DATA} + } } diff --git a/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala index f280973d0c..a24652835a 100644 --- a/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala @@ -22,8 +22,6 @@ import org.knora.webapi.core.AppServer import org.knora.webapi.core.TestStartupUtils import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.ResponderData -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.cache.settings.CacheServiceSettings import org.knora.webapi.util.LogAspect @@ -84,14 +82,14 @@ abstract class CoreSpec implicit lazy val system: actor.ActorSystem = router.system implicit lazy val executionContext: ExecutionContext = system.dispatcher - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) lazy val rdfDataObjects = List.empty[RdfDataObject] val log: Logger = Logger(this.getClass()) val appActor = router.ref // needed by some tests - val cacheServiceSettings = new CacheServiceSettings(system.settings.config) - val responderData = ResponderData(system, appActor, settings, cacheServiceSettings) + val appConfig = config + val cacheServiceSettings = new CacheServiceSettings(appConfig) + val responderData = ResponderData(system, appActor, appConfig, cacheServiceSettings) final override def beforeAll(): Unit = /* Here we start our app and initialize the repository before each suit runs */ diff --git a/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala index c979df2581..b6f6691004 100644 --- a/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala @@ -38,14 +38,13 @@ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.routing.KnoraRouteData -import org.knora.webapi.settings._ import org.knora.webapi.testservices.FileToUpload import org.knora.webapi.testservices.TestClientService import org.knora.webapi.util.FileUtil import org.knora.webapi.util.LogAspect /** - * This class can be used in End-to-End testing. It starts the Knora-API server + * This class can be used in End-to-End testing. It starts the DSP stack * and provides access to settings and logging. */ abstract class E2ESpec @@ -107,14 +106,14 @@ abstract class E2ESpec implicit lazy val system: akka.actor.ActorSystem = router.system implicit lazy val executionContext: ExecutionContext = system.dispatcher - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) lazy val rdfDataObjects = List.empty[RdfDataObject] val log: Logger = Logger(this.getClass()) val appActor = router.ref // needed by some tests - val routeData = KnoraRouteData(system, appActor) - val baseApiUrl = settings.internalKnoraApiBaseUrl + val appConfig = config + val routeData = KnoraRouteData(system, appActor, appConfig) + val baseApiUrl = appConfig.knoraApi.internalKnoraApiBaseUrl final override def beforeAll(): Unit = /* Here we start our app and initialize the repository before each suit runs */ @@ -256,23 +255,23 @@ abstract class E2ESpec Files.createDirectories(newOutputFile.getParent) FileUtil.writeTextFile( newOutputFile, - responseAsString.replaceAll(settings.externalSipiIIIFGetUrl, "IIIF_BASE_URL") + responseAsString.replaceAll(appConfig.sipi.externalBaseUrl, "IIIF_BASE_URL") ) responseAsString } else { - FileUtil.readTextFile(file).replaceAll("IIIF_BASE_URL", settings.externalSipiIIIFGetUrl) + FileUtil.readTextFile(file).replaceAll("IIIF_BASE_URL", appConfig.sipi.externalBaseUrl) } private def createTmpFileDir(): Unit = { // check if tmp datadir exists and create it if not - val tmpFileDir = Path.of(settings.tmpDataDir) + val tmpFileDir = Path.of(appConfig.tmpDatadir) if (!Files.exists(tmpFileDir)) { try { Files.createDirectories(tmpFileDir) } catch { case e: Throwable => - throw FileWriteException(s"Tmp data directory ${settings.tmpDataDir} could not be created: ${e.getMessage}") + throw FileWriteException(s"Tmp data directory ${appConfig.tmpDatadir} could not be created: ${e.getMessage}") } } } diff --git a/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala b/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala index 08e2464f6a..58859618cb 100644 --- a/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala @@ -31,14 +31,13 @@ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.JsonLDUtil -import org.knora.webapi.settings._ import org.knora.webapi.testservices.FileToUpload import org.knora.webapi.testservices.TestClientService import org.knora.webapi.util.LogAspect /** - * This class can be used in End-to-End testing. It starts the Knora server and - * provides access to settings and logging. + * This class can be used in End-to-End testing. It starts the DSP stack and + * provides access to configuration and logging. */ abstract class ITKnoraLiveSpec extends AnyWordSpec @@ -99,10 +98,10 @@ abstract class ITKnoraLiveSpec implicit lazy val system: akka.actor.ActorSystem = router.system implicit lazy val executionContext: ExecutionContext = system.dispatcher - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) lazy val rdfDataObjects = List.empty[RdfDataObject] val log: Logger = Logger(this.getClass()) val appActor = router.ref + val appConfig = config // needed by some tests val baseApiUrl = config.knoraApi.internalKnoraApiBaseUrl diff --git a/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala index 46b07ebdc8..018dcdba11 100644 --- a/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala @@ -27,8 +27,6 @@ import org.knora.webapi.core.TestStartupUtils import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.routing.KnoraRouteData -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.FileUtil import org.knora.webapi.util.LogAspect @@ -90,13 +88,13 @@ abstract class R2RSpec } // main difference to other specs (no own systen and executionContext defined) - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) - lazy val rdfDataObjects = List.empty[RdfDataObject] - val log: Logger = Logger(this.getClass()) - val appActor = router.ref + lazy val rdfDataObjects = List.empty[RdfDataObject] + val log: Logger = Logger(this.getClass()) + val appActor = router.ref // needed by some tests - val routeData = KnoraRouteData(system, appActor) + val routeData = KnoraRouteData(system, appActor, config) + val appConfig = config final override def beforeAll(): Unit = /* Here we start our app and initialize the repository before each suit runs */ @@ -154,10 +152,10 @@ abstract class R2RSpec Files.createDirectories(newOutputFile.getParent) FileUtil.writeTextFile( newOutputFile, - responseAsString.replaceAll(settings.externalSipiIIIFGetUrl, "IIIF_BASE_URL") + responseAsString.replaceAll(appConfig.sipi.externalBaseUrl, "IIIF_BASE_URL") ) responseAsString } else { - FileUtil.readTextFile(file).replaceAll("IIIF_BASE_URL", settings.externalSipiIIIFGetUrl) + FileUtil.readTextFile(file).replaceAll("IIIF_BASE_URL", appConfig.sipi.externalBaseUrl) } } 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 48ae136173..1ab5ae2330 100644 --- a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala @@ -78,10 +78,10 @@ object AppConfigForTestContainers { _ <- ZIO.attempt(StringFormatter.initForTest()).orDie // needs early init before first usage _ <- ZIO.attempt(RdfFeatureFactory.init(appConfig)).orDie // needs early init before first usage } yield alteredConfig - }.tap(_ => ZIO.logInfo(">>> App Config for Fuseki and Sipi Testcontainers Initialized <<<")) + }.tap(_ => ZIO.logInfo(">>> AppConfig for Fuseki and Sipi Testcontainers Initialized <<<")) /** - * Altered AppConfig with ports from TestContainers for Fuseki and Sipi. + * Altered AppConfig with ports from TestContainers for Fuseki. */ val fusekiOnlyTestcontainer: ZLayer[FusekiTestContainer, Nothing, AppConfig] = ZLayer { @@ -92,5 +92,5 @@ object AppConfigForTestContainers { _ <- ZIO.attempt(StringFormatter.initForTest()).orDie // needs early init before first usage _ <- ZIO.attempt(RdfFeatureFactory.init(appConfig)).orDie // needs early init before first usage } yield alteredConfig - }.tap(_ => ZIO.logInfo(">>> App Config for Fuseki only Testcontainers Initialized <<<")) + }.tap(_ => ZIO.logInfo(">>> AppConfig for Fuseki only Testcontainers Initialized <<<")) } diff --git a/webapi/src/test/scala/org/knora/webapi/core/ActorSystemTest.scala b/webapi/src/test/scala/org/knora/webapi/core/ActorSystemTest.scala index 98d76ed862..662f1bff5a 100644 --- a/webapi/src/test/scala/org/knora/webapi/core/ActorSystemTest.scala +++ b/webapi/src/test/scala/org/knora/webapi/core/ActorSystemTest.scala @@ -7,20 +7,19 @@ package org.knora.webapi.core import zio._ -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.config.AppConfig import org.knora.webapi.store.cache.settings.CacheServiceSettings object ActorSystemTest { - def layer(sys: akka.actor.ActorSystem): ZLayer[Any, Nothing, ActorSystem] = - ZLayer - .succeed( - new ActorSystem { - override val system: akka.actor.ActorSystem = sys - override val settings: KnoraSettingsImpl = KnoraSettings(system) - override val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(system.settings.config) - } - ) - .tap(_ => ZIO.logInfo(">>> ActorSystemTest Initialized <<<")) + def layer(sys: akka.actor.ActorSystem): ZLayer[AppConfig, Nothing, ActorSystem] = + ZLayer.scoped { + for { + appConfig <- ZIO.service[AppConfig] + context <- ZIO.executor.map(_.asExecutionContext) + } yield new ActorSystem { + override val system: akka.actor.ActorSystem = sys + override val cacheServiceSettings: CacheServiceSettings = new CacheServiceSettings(appConfig) + } + } } diff --git a/webapi/src/test/scala/org/knora/webapi/core/LayersTest.scala b/webapi/src/test/scala/org/knora/webapi/core/LayersTest.scala index 3a2c085896..3e98425ef1 100644 --- a/webapi/src/test/scala/org/knora/webapi/core/LayersTest.scala +++ b/webapi/src/test/scala/org/knora/webapi/core/LayersTest.scala @@ -19,14 +19,17 @@ import org.knora.webapi.testservices.TestClientService object LayersTest { + /** + * The `Environment`s that we require for the tests to run - with or without Sipi + */ type DefaultTestEnvironmentWithoutSipi = LayersLive.DspEnvironmentLive with FusekiTestContainer with TestClientService type DefaultTestEnvironmentWithSipi = DefaultTestEnvironmentWithoutSipi with SipiTestContainer - // All live layers and both Fuseki and Sipi testcontainers + /** + * All live layers with both Fuseki and Sipi testcontainers + */ val defaultLayersTestWithSipi = - ZLayer.make[ - DefaultTestEnvironmentWithSipi - ]( + ZLayer.make[DefaultTestEnvironmentWithSipi]( ActorSystem.layer, ApiRoutes.layer, AppConfigForTestContainers.testcontainers, @@ -48,11 +51,11 @@ object LayersTest { TestClientService.layer ) - // All live layers but without sipi testcontainer + /** + * All live layers - with ActorSystem - but without Sipi testcontainer + */ val defaultLayersTestWithoutSipi = - ZLayer.make[ - DefaultTestEnvironmentWithoutSipi - ]( + ZLayer.make[DefaultTestEnvironmentWithoutSipi]( ActorSystem.layer, ApiRoutes.layer, AppConfigForTestContainers.fusekiOnlyTestcontainer, @@ -72,11 +75,12 @@ object LayersTest { // Test services TestClientService.layer ) - // All live layers but without sipi testcontainer + + /** + * All live layers - with ActorSystemTest - but without Sipi testcontainer + */ def defaultLayersTestWithoutSipi(system: akka.actor.ActorSystem) = - ZLayer.make[ - DefaultTestEnvironmentWithoutSipi - ]( + ZLayer.make[DefaultTestEnvironmentWithoutSipi]( ActorSystemTest.layer(system), ApiRoutes.layer, AppConfigForTestContainers.fusekiOnlyTestcontainer, @@ -97,11 +101,11 @@ object LayersTest { TestClientService.layer ) - // All live layers but with the mocked IIIF layer + /** + * All live layers - with ActorSystemTest - but with the mocked IIIF layer + */ val defaultLayersTestWithMockedSipi = - ZLayer.make[ - DefaultTestEnvironmentWithoutSipi - ]( + ZLayer.make[DefaultTestEnvironmentWithoutSipi]( ActorSystem.layer, ApiRoutes.layer, AppConfigForTestContainers.fusekiOnlyTestcontainer, @@ -110,7 +114,7 @@ object LayersTest { CacheServiceInMemImpl.layer, HttpServer.layer, IIIFServiceManager.layer, - IIIFServiceMockImpl.layer, // alternative: IIIFServiceMockImpl.layer + IIIFServiceMockImpl.layer, JWTService.layer, RepositoryUpdater.layer, State.layer, @@ -122,11 +126,11 @@ object LayersTest { TestClientService.layer ) - // All live layers but with the mocked IIIF layer + /** + * All live layers - with ActorSystemTest - but with the mocked IIIF layer + */ def defaultLayersTestWithMockedSipi(system: akka.actor.ActorSystem) = - ZLayer.make[ - DefaultTestEnvironmentWithoutSipi - ]( + ZLayer.make[DefaultTestEnvironmentWithoutSipi]( ActorSystemTest.layer(system), ApiRoutes.layer, AppConfigForTestContainers.fusekiOnlyTestcontainer, @@ -135,7 +139,7 @@ object LayersTest { CacheServiceInMemImpl.layer, HttpServer.layer, IIIFServiceManager.layer, - IIIFServiceMockImpl.layer, // alternative: IIIFServiceMockImpl.layer + IIIFServiceMockImpl.layer, JWTService.layer, RepositoryUpdater.layer, State.layer, diff --git a/webapi/src/test/scala/org/knora/webapi/core/TestClientService.scala b/webapi/src/test/scala/org/knora/webapi/core/TestClientService.scala index ea52d80b95..b623973718 100644 --- a/webapi/src/test/scala/org/knora/webapi/core/TestClientService.scala +++ b/webapi/src/test/scala/org/knora/webapi/core/TestClientService.scala @@ -1,7 +1,6 @@ package org.knora.webapi.testservices import akka.http.scaladsl.client.RequestBuilding -import akka.stream.Materializer import org.apache.http import org.apache.http.HttpHost import org.apache.http.client.config.RequestConfig @@ -37,8 +36,6 @@ import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtoc import org.knora.webapi.messages.util.rdf.JsonLDDocument import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.iiif.errors.SipiException import org.knora.webapi.util.SipiUtil @@ -64,8 +61,6 @@ final case class TestClientService(config: AppConfig, httpClient: CloseableHttpC with RequestBuilding { implicit val system: akka.actor.ActorSystem = sys - implicit val settings: KnoraSettingsImpl = KnoraSettings(system) - implicit val materializer: Materializer = Materializer.matFromSystem(system) implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraBlockingDispatcher) case class TestClientTimeoutException(msg: String) extends Exception diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala index d291a7112c..bb5ab02783 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala @@ -21,7 +21,7 @@ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject */ class CORSSupportE2ESpec extends E2ESpec { - implicit def default(implicit system: ActorSystem) = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem) = RouteTestTimeout(appConfig.defaultTimeoutAsDuration) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/ClientTestDataCollector.scala b/webapi/src/test/scala/org/knora/webapi/e2e/ClientTestDataCollector.scala index 464e35b4cc..7c78a71c4a 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/ClientTestDataCollector.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/ClientTestDataCollector.scala @@ -11,20 +11,20 @@ import java.nio.charset.StandardCharsets import java.nio.file.Files import java.nio.file.Path -import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.config.AppConfig /** * Collects E2E test requests and responses for use as client test data. * * @param settings the application settings. */ -class ClientTestDataCollector(settings: KnoraSettingsImpl) extends LazyLogging { +class ClientTestDataCollector(appConfig: AppConfig) extends LazyLogging { // write the client test data into this folder private val tempClientTestDataFolder: Path = Path.of("/tmp/client_test_data", "test-data") // Are we configured to collect client test data? - private val collectClientTestData = settings.collectClientTestData + private val collectClientTestData = appConfig.clientTestDataService.collectClientTestData logger.debug(s"collectClientTestData: $collectClientTestData") /** diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/ExceptionHandlerR2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/ExceptionHandlerR2RSpec.scala index f5c3fc74a2..cd91cf12a9 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/ExceptionHandlerR2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/ExceptionHandlerR2RSpec.scala @@ -74,7 +74,7 @@ class ExceptionHandlerR2RSpec extends R2RSpec { } } - private val route: Route = Route.seal(handleExceptions(handler.KnoraExceptionHandler(settings)) { + private val route: Route = Route.seal(handleExceptions(handler.KnoraExceptionHandler(appConfig)) { nfe ~ fe ~ bce ~ dve ~ oce ~ ece ~ sse ~ unpe ~ ae }) diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/HealthRouteE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/HealthRouteE2ESpec.scala index ae2d7b818c..38aeeab97a 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/HealthRouteE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/HealthRouteE2ESpec.scala @@ -20,13 +20,15 @@ import org.knora.webapi.core.domain.AppState */ class HealthRouteE2ESpec extends E2ESpec { - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) // Directory path for generated client test data private val clientTestDataPath: Seq[String] = Seq("system", "health") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) "The Health Route" should { diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/InstanceCheckerSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/InstanceCheckerSpec.scala index 8797cdc4fd..0acc69dec7 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/InstanceCheckerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/InstanceCheckerSpec.scala @@ -22,7 +22,9 @@ import org.knora.webapi.util.FileUtil class InstanceCheckerSpec extends E2ESpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) private val jsonLDInstanceChecker: InstanceChecker = InstanceChecker.getJsonLDChecker diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/FilesADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/FilesADME2ESpec.scala index c6e2ed6ce9..e008583253 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/FilesADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/FilesADME2ESpec.scala @@ -35,7 +35,7 @@ class FilesADME2ESpec extends E2ESpec with SessionJsonProtocol with TriplestoreJ private val normalUserEmailEnc = java.net.URLEncoder.encode(normalUserEmail, "utf-8") private val testPass = java.net.URLEncoder.encode("test", "utf-8") - val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(settings) + val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(appConfig) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESpec.scala index a23f34d283..e4c31e75d4 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESpec.scala @@ -36,7 +36,7 @@ class GroupsADME2ESpec extends E2ESpec with GroupsADMJsonProtocol with SessionJs private val clientTestDataPath: Seq[String] = Seq("admin", "groups") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) private val imagesUser01Email = SharedTestDataADM.imagesUser01.email private val testPass = SharedTestDataADM.testPass diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/PermissionsADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/PermissionsADME2ESpec.scala index 23d430c121..f0bd57894c 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/PermissionsADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/PermissionsADME2ESpec.scala @@ -31,7 +31,7 @@ class PermissionsADME2ESpec extends E2ESpec with TriplestoreJsonProtocol { private val clientTestDataPath: Seq[String] = Seq("admin", "permissions") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) private val customDOAPIri = "http://rdfh.ch/permissions/00FF/zTOK3HlWTLGgTO8ZWVnotg" "The Permissions Route ('admin/permissions')" when { "getting permissions" should { diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala index 2bb04b8577..3722cd4677 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala @@ -55,7 +55,7 @@ class ProjectsADME2ESpec private val clientTestDataPath: Seq[String] = Seq("admin", "projects") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects: List[RdfDataObject] = List( RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESpec.scala index debe6fb589..f26d6a2daa 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESpec.scala @@ -85,7 +85,7 @@ class UsersADME2ESpec private val clientTestDataPath: Seq[String] = Seq("admin", "users") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) /** * Convenience method returning the users project memberships. diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala index ba70ea1ee0..824767ca72 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala @@ -43,7 +43,7 @@ class CreateListItemsRouteADME2ESpec private val clientTestDataPath: Seq[String] = Seq("admin", "lists") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/demo_data/images-demo-data.ttl", name = "http://www.knora.org/data/00FF/images"), diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala index 87c28c8b59..1bbb6c97cc 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala @@ -41,7 +41,7 @@ class DeleteListItemsRouteADME2ESpec private val clientTestDataPath: Seq[String] = Seq("admin", "lists") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) // Collects client test data private def collectClientTestData(fileName: String, fileContent: String): Unit = diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala index 884c4764b0..8dd8843e4f 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala @@ -40,7 +40,7 @@ class GetListItemsRouteADME2ESpec private val clientTestDataPath: Seq[String] = Seq("admin", "lists") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/demo_data/images-demo-data.ttl", name = "http://www.knora.org/data/00FF/images"), diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala index 66fdb9baf1..dc4d8f7f22 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala @@ -43,7 +43,7 @@ class UpdateListItemsRouteADME2ESpec private val clientTestDataPath: Seq[String] = Seq("admin", "lists") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/demo_data/images-demo-data.ttl", name = "http://www.knora.org/data/00FF/images"), diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/http/ServerVersionE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/http/ServerVersionE2ESpec.scala index 0b328b51b1..e54014b379 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/http/ServerVersionE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/http/ServerVersionE2ESpec.scala @@ -16,7 +16,9 @@ import org.knora.webapi.http.version.ServerVersion * End-to-End (E2E) test specification for testing the server response. */ class ServerVersionE2ESpec extends E2ESpec { - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) "The Server" should { "return the custom 'Server' header with every response" in { diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/AuthenticationV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/AuthenticationV1E2ESpec.scala index 3b51daac5c..b773d41be7 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/AuthenticationV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/AuthenticationV1E2ESpec.scala @@ -38,7 +38,7 @@ class AuthenticationV1E2ESpec extends E2ESpec with SessionJsonProtocol with Trip private val testPass = java.net.URLEncoder.encode("test", "utf-8") private val wrongPass = java.net.URLEncoder.encode("wrong", "utf-8") - val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(settings) + val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(appConfig) "The Authentication Route ('v1/authenticate') with credentials supplied via URL parameters" should { @@ -100,7 +100,7 @@ class AuthenticationV1E2ESpec extends E2ESpec with SessionJsonProtocol with Trip HttpCookie( KnoraAuthenticationCookieName, value = sid, - domain = Some(settings.cookieDomain), + domain = Some(appConfig.cookieDomain), path = Some("/"), httpOnly = true ) @@ -142,7 +142,7 @@ class AuthenticationV1E2ESpec extends E2ESpec with SessionJsonProtocol with Trip HttpCookie( KnoraAuthenticationCookieName, "", - domain = Some(settings.cookieDomain), + domain = Some(appConfig.cookieDomain), path = Some("/"), httpOnly = true, expires = Some(DateTime(1970, 1, 1, 0, 0, 0)), @@ -197,7 +197,7 @@ class AuthenticationV1E2ESpec extends E2ESpec with SessionJsonProtocol with Trip HttpCookie( KnoraAuthenticationCookieName, value = sid, - domain = Some(settings.cookieDomain), + domain = Some(appConfig.cookieDomain), path = Some("/"), httpOnly = true ) diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ErrorV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ErrorV1E2ESpec.scala index 23b4ad7a05..c25632b22c 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ErrorV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ErrorV1E2ESpec.scala @@ -14,14 +14,12 @@ class ErrorV1E2ESpec extends E2ESpec with TriplestoreJsonProtocol { "Make a request that causes an internal server error (unit type message)" in { val request = Get(baseApiUrl + "/v1/error/unitMsg") val response = singleAwaitingRequest(request, 1.second) - println(response.toString()) assert(response.status == StatusCodes.InternalServerError) } "Make a request that causes an internal server error (ise type message)" in { val request = Get(baseApiUrl + "/v1/error/iseMsg") val response = singleAwaitingRequest(request, 1.second) - println(response.toString()) assert(response.status == StatusCodes.Conflict) } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ResourcesV1R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ResourcesV1R2RSpec.scala index 48f43f501b..2f5d0b8408 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ResourcesV1R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ResourcesV1R2RSpec.scala @@ -55,9 +55,12 @@ import org.knora.webapi.util.MutableTestIri */ class ResourcesV1R2RSpec extends R2RSpec { - private val resourcesPathV1 = DSPApiDirectives.handleErrors(system)(new ResourcesRouteV1(routeData).makeRoute) - private val resourcesPathV2 = DSPApiDirectives.handleErrors(system)(new ResourcesRouteV2(routeData).makeRoute) - private val valuesPathV1 = DSPApiDirectives.handleErrors(system)(new ValuesRouteV1(routeData).makeRoute) + private val resourcesPathV1 = + DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV1(routeData).makeRoute) + private val resourcesPathV2 = + DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData).makeRoute) + private val valuesPathV1 = + DSPApiDirectives.handleErrors(system, appConfig)(new ValuesRouteV1(routeData).makeRoute) private val superUser = SharedTestDataADM.superUser private val superUserEmail = superUser.email @@ -82,7 +85,9 @@ class ResourcesV1R2RSpec extends R2RSpec { private val password = SharedTestDataADM.testPass - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout * 2) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration * 2 + ) implicit val ec: ExecutionContextExecutor = system.dispatcher diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala index 9c1d9c95ba..719d050ec9 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala @@ -26,7 +26,9 @@ class SearchV1R2RSpec extends R2RSpec { private val searchPath = new SearchRouteV1(routeData).makeRoute - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher 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 b005fa5bb8..115802131c 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 @@ -34,7 +34,9 @@ class SipiV1R2RSpec extends R2RSpec { private val resourcesPath = new ResourcesRouteV1(routeData).makeRoute private val valuesPath = new ValuesRouteV1(routeData).makeRoute - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) private val incunabulaProjectAdminEmail = SharedTestDataV1.incunabulaProjectAdminUser.userData.email.get private val testPass = "test" @@ -90,14 +92,16 @@ class SipiV1R2RSpec extends R2RSpec { def createTmpFileDir(): Unit = { // check if tmp datadir exists and create it if not - val tmpFileDir = Paths.get(settings.tmpDataDir) + val tmpFileDir = Paths.get(appConfig.tmpDatadir) if (!Files.exists(tmpFileDir)) { try { Files.createDirectories(tmpFileDir) } catch { case e: Throwable => - throw FileWriteException(s"Tmp data directory ${settings.tmpDataDir} could not be created: ${e.getMessage}") + throw FileWriteException( + s"Tmp data directory ${appConfig.tmpDatadir} could not be created: ${e.getMessage}" + ) } } } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/StandoffV1R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/StandoffV1R2RSpec.scala index f577a7a6ce..baa1834fcb 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/StandoffV1R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/StandoffV1R2RSpec.scala @@ -42,15 +42,19 @@ import org.knora.webapi.util.MutableTestIri */ class StandoffV1R2RSpec extends R2RSpec { - private val standoffPath = DSPApiDirectives.handleErrors(system)(new StandoffRouteV1(routeData).makeRoute) - private val valuesPath = DSPApiDirectives.handleErrors(system)(new ValuesRouteV1(routeData).makeRoute) + private val standoffPath = + DSPApiDirectives.handleErrors(system, appConfig)(new StandoffRouteV1(routeData).makeRoute) + private val valuesPath = + DSPApiDirectives.handleErrors(system, appConfig)(new ValuesRouteV1(routeData).makeRoute) private val anythingUser = SharedTestDataV1.anythingUser1 private val anythingUserEmail = anythingUser.userData.email.get private val password = SharedTestDataADM.testPass - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ValuesV1R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ValuesV1R2RSpec.scala index 26f5c58532..47b34d81f9 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ValuesV1R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ValuesV1R2RSpec.scala @@ -29,9 +29,12 @@ import org.knora.webapi.util.MutableTestIri */ class ValuesV1R2RSpec extends R2RSpec { - private val valuesPath = DSPApiDirectives.handleErrors(system)(new ValuesRouteV1(routeData).makeRoute) + private val valuesPath = + DSPApiDirectives.handleErrors(system, appConfig)(new ValuesRouteV1(routeData).makeRoute) - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) private val integerValueIri = new MutableTestIri private val timeValueIri = new MutableTestIri diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/AuthenticationV2E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/AuthenticationV2E2ESpec.scala index 93375b418d..2a7d6d5892 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/AuthenticationV2E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/AuthenticationV2E2ESpec.scala @@ -196,7 +196,7 @@ class AuthenticationV2E2ESpec extends E2ESpec with AuthenticationV2JsonProtocol } "authenticate with token in cookie" in { - val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(settings) + val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(appConfig) val cookieHeader = headers.Cookie(KnoraAuthenticationCookieName, token.get) val request = Get(baseApiUrl + "/v2/authentication") ~> addHeader(cookieHeader) @@ -205,7 +205,7 @@ class AuthenticationV2E2ESpec extends E2ESpec with AuthenticationV2JsonProtocol } "fail authentication with invalid token in cookie" in { - val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(settings) + val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(appConfig) val cookieHeader = headers.Cookie(KnoraAuthenticationCookieName, "not_a_valid_token") val request = Get(baseApiUrl + "/v2/authentication") ~> addHeader(cookieHeader) diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/JSONLDHandlingV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/JSONLDHandlingV2R2RSpec.scala index f156048417..57f71bade1 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/JSONLDHandlingV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/JSONLDHandlingV2R2RSpec.scala @@ -27,7 +27,9 @@ class JSONLDHandlingV2R2RSpec extends R2RSpec { private val resourcesPath = new ResourcesRouteV2(routeData).makeRoute - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ListsRouteV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ListsRouteV2R2RSpec.scala index fd7d56ed4d..09bc9ca9d4 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ListsRouteV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ListsRouteV2R2RSpec.scala @@ -33,7 +33,9 @@ class ListsRouteV2R2RSpec extends R2RSpec { private val listsPath = new ListsRouteV2(routeData).makeRoute - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher @@ -41,7 +43,7 @@ class ListsRouteV2R2RSpec extends R2RSpec { private val clientTestDataPath: Seq[String] = Seq("v2", "lists") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects: List[RdfDataObject] = List( RdfDataObject(path = "test_data/all_data/incunabula-data.ttl", name = "http://www.knora.org/data/0803/incunabula"), diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala index 2c6cdbc016..0c4797d211 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala @@ -1,3 +1,8 @@ +/* + * 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.v2 import akka.actor.ActorSystem @@ -58,10 +63,14 @@ class OntologyV2R2RSpec extends R2RSpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - private val ontologiesPath = DSPApiDirectives.handleErrors(system)(new OntologiesRouteV2(routeData).makeRoute) - private val resourcesPath = DSPApiDirectives.handleErrors(system)(new ResourcesRouteV2(routeData).makeRoute) + private val ontologiesPath = + DSPApiDirectives.handleErrors(system, appConfig)(new OntologiesRouteV2(routeData).makeRoute) + private val resourcesPath = + DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData).makeRoute) - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher @@ -93,7 +102,7 @@ class OntologyV2R2RSpec extends R2RSpec { private val clientTestDataPath: Seq[String] = Seq("v2", "ontologies") // an instance of ClientTestDataCollector - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) // Collects client test data // TODO: redefine below method somewhere else if can be reused over other test files diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResourcesRouteV2E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResourcesRouteV2E2ESpec.scala index 5667dc4328..da54a93b80 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResourcesRouteV2E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResourcesRouteV2E2ESpec.scala @@ -55,7 +55,9 @@ import org.knora.webapi.util._ class ResourcesRouteV2E2ESpec extends E2ESpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) private val anythingUserEmail = SharedTestDataADM.anythingUser1.email private val password = SharedTestDataADM.testPass @@ -94,7 +96,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec { private val clientTestDataPath: Seq[String] = Seq("v2", "resources") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) private def collectClientTestData(fileName: String, fileContent: String, fileExtension: String = "json"): Unit = clientTestDataCollector.addFile( @@ -821,7 +823,8 @@ class ResourcesRouteV2E2ESpec extends E2ESpec { "not accept a graph request with an invalid depth (> max)" in { val request = Get( - s"$baseApiUrl/v2/graph/${URLEncoder.encode("http://rdfh.ch/0001/start", "UTF-8")}?depth=${settings.maxGraphBreadth + 1}" + s"$baseApiUrl/v2/graph/${URLEncoder + .encode("http://rdfh.ch/0001/start", "UTF-8")}?depth=${appConfig.v2.graphRoute.maxGraphBreadth + 1}" ) val response: HttpResponse = singleAwaitingRequest(request) val responseAsString = responseToString(response) @@ -2106,7 +2109,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec { "correctly update the ontology cache when adding a resource, so that the resource can afterwards be found by gravsearch" in { val freetestLastModDate: Instant = Instant.parse("2012-12-12T12:12:12.12Z") - DSPApiDirectives.handleErrors(system)(new OntologiesRouteV2(routeData).makeRoute) + DSPApiDirectives.handleErrors(system, appConfig)(new OntologiesRouteV2(routeData).makeRoute) val auth = BasicHttpCredentials(SharedTestDataADM.anythingAdminUser.email, SharedTestDataADM.testPass) // create a new resource class and add a property with cardinality to it diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala index 90a736915d..525df34688 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala @@ -51,12 +51,18 @@ import org.knora.webapi.util.MutableTestIri class SearchRouteV2R2RSpec extends R2RSpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - private val searchPath = DSPApiDirectives.handleErrors(system)(new SearchRouteV2(routeData).makeRoute) - private val resourcePath = DSPApiDirectives.handleErrors(system)(new ResourcesRouteV2(routeData).makeRoute) - private val standoffPath = DSPApiDirectives.handleErrors(system)(new StandoffRouteV2(routeData).makeRoute) - private val valuesPath = DSPApiDirectives.handleErrors(system)(new ValuesRouteV1(routeData).makeRoute) - - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + private val searchPath = + DSPApiDirectives.handleErrors(system, appConfig)(new SearchRouteV2(routeData).makeRoute) + private val resourcePath = + DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData).makeRoute) + private val standoffPath = + DSPApiDirectives.handleErrors(system, appConfig)(new StandoffRouteV2(routeData).makeRoute) + private val valuesPath = + DSPApiDirectives.handleErrors(system, appConfig)(new ValuesRouteV1(routeData).makeRoute) + + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher @@ -79,7 +85,7 @@ class SearchRouteV2R2RSpec extends R2RSpec { private val clientTestDataPath: Seq[String] = Seq("v2", "search") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects: List[RdfDataObject] = List( RdfDataObject(path = "test_data/demo_data/images-demo-data.ttl", name = "http://www.knora.org/data/00FF/images"), diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesRouteV2E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesRouteV2E2ESpec.scala index 831256965f..f42ccd18f4 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesRouteV2E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ValuesRouteV2E2ESpec.scala @@ -74,7 +74,7 @@ class ValuesRouteV2E2ESpec extends E2ESpec { private val clientTestDataPath: Seq[String] = Seq("v2", "values") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) object AThing { val iri: IRI = "http://rdfh.ch/0001/a-thing" 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 a715194f0b..a145daa5bb 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 @@ -40,7 +40,9 @@ class ValuesV2R2RSpec extends R2RSpec { private val valuesPath = new ValuesRouteV2(routeData).makeRoute private val searchPath = new SearchRouteV2(routeData).makeRoute - implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(settings.defaultTimeout) + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout( + appConfig.defaultTimeoutAsDuration + ) implicit val ec: ExecutionContextExecutor = system.dispatcher @@ -59,7 +61,7 @@ class ValuesV2R2RSpec extends R2RSpec { private val clientTestDataPath: Seq[String] = Seq("v2", "values") // Collects client test data - private val clientTestDataCollector = new ClientTestDataCollector(settings) + private val clientTestDataCollector = new ClientTestDataCollector(appConfig) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") diff --git a/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiIntegrationV1ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiIntegrationV1ITSpec.scala index fb5e17e39b..df3959bad5 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiIntegrationV1ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiIntegrationV1ITSpec.scala @@ -332,7 +332,7 @@ class KnoraSipiIntegrationV1ITSpec "create an 'p0803-incunabula:book' and an 'p0803-incunabula:page' with file parameters via XML import" in { // To be able to run packaged tests inside Docker, we need to copy // the file first to a place which is shared with sipi - val dest: Path = FileUtil.createTempFile(settings, Some("jpg")) + val dest: Path = FileUtil.createTempFile(Some("jpg"), appConfig) Files.copy(pathToChlaus, dest, StandardCopyOption.REPLACE_EXISTING) // Upload the image to Sipi. diff --git a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiAuthenticationITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiAuthenticationITSpec.scala index 59eca12fbb..30c1916887 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiAuthenticationITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiAuthenticationITSpec.scala @@ -66,7 +66,7 @@ class KnoraSipiAuthenticationITSpec "successfuly get an image with provided credentials inside cookie" in { // using cookie to authenticate when accessing sipi (test for cookie parsing in sipi) - val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(settings) + val KnoraAuthenticationCookieName = Authenticator.calculateCookieName(appConfig) val cookieHeader = headers.Cookie(KnoraAuthenticationCookieName, loginToken) // Request the permanently stored image from Sipi. 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 88589d6a59..a04b28b137 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 @@ -67,7 +67,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = incunabulaUser ) @@ -108,7 +108,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = anythingAdminUser ) @@ -150,7 +150,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = incunabulaUser ) @@ -192,7 +192,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = anythingAdminUser ) @@ -234,7 +234,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = anonymousUser ) @@ -276,7 +276,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = anythingAdminUser ) @@ -348,7 +348,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = incunabulaUser ) @@ -421,7 +421,7 @@ class ConstructResponseUtilV2Spec extends CoreSpec() with ImplicitSender { calculateMayHaveMoreResults = false, appActor = appActor, targetSchema = ApiV2Complex, - settings = settings, + appConfig = appConfig, requestingUser = incunabulaUser ) 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 daad5bdc51..cf2f968315 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 @@ -8,10 +8,10 @@ package org.knora.webapi.util.rdf import java.nio.file.Paths import org.knora.webapi._ +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.v2.responder.KnoraJsonLDResponseV2 import org.knora.webapi.messages.v2.responder.KnoraTurtleResponseV2 -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.FileUtil /** @@ -117,9 +117,10 @@ class KnoraResponseV2Spec() extends CoreSpec { * A test implementation of [[KnoraJsonLDResponseV2]]. */ case class JsonLDTestResponse(jsonLDDocument: JsonLDDocument) extends KnoraJsonLDResponseV2 { + override protected def toJsonLDDocument( targetSchema: ApiV2Schema, - settings: KnoraSettingsImpl, + appConfig: AppConfig, schemaOptions: Set[SchemaOption] ): JsonLDDocument = jsonLDDocument } @@ -138,7 +139,7 @@ class KnoraResponseV2Spec() extends CoreSpec { rdfFormat = JsonLD, targetSchema = InternalSchema, schemaOptions = Set.empty, - settings = settings + appConfig = appConfig ) // Parse the JSON-LD to a JsonLDDocument. @@ -166,7 +167,7 @@ class KnoraResponseV2Spec() extends CoreSpec { rdfFormat = Turtle, targetSchema = ApiV2Complex, schemaOptions = Set.empty, - settings = settings + appConfig = appConfig ) // Parse the Turtle to an RDF4J Model. @@ -188,7 +189,7 @@ class KnoraResponseV2Spec() extends CoreSpec { rdfFormat = JsonLD, targetSchema = ApiV2Complex, schemaOptions = Set(FlatJsonLD), - settings = settings + appConfig = appConfig ) val jsonLDResponseDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonLDResponseStr) @@ -202,7 +203,7 @@ class KnoraResponseV2Spec() extends CoreSpec { rdfFormat = JsonLD, targetSchema = InternalSchema, schemaOptions = Set(HierarchicalJsonLD), - settings = settings + appConfig = appConfig ) val jsonLDResponseDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonLDResponseStr) @@ -216,7 +217,7 @@ class KnoraResponseV2Spec() extends CoreSpec { rdfFormat = JsonLD, targetSchema = InternalSchema, schemaOptions = Set(FlatJsonLD), - settings = settings + appConfig = appConfig ) val jsonLDResponseDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonLDResponseStr) 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 efb79e2886..ed27c8c906 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 @@ -9,6 +9,7 @@ import scala.concurrent.duration._ import dsp.errors.AssertionException import org.knora.webapi.CoreSpec +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -30,13 +31,18 @@ private object CountQueryHandler { def transformQuery( query: String, appActor: ActorRef, - responderData: ResponderData + responderData: ResponderData, + appConfig: AppConfig )(implicit executionContext: ExecutionContext): SelectQuery = { val constructQuery = GravsearchParser.parseQuery(query) val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val typeInspectionResultFuture = typeInspectionRunner.inspectTypes(constructQuery.whereClause, anythingUser) @@ -340,7 +346,8 @@ class NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec extends Cor CountQueryHandler.transformQuery( inputQueryWithDecimalOptionalSortCriterionAndFilter, appActor, - responderData + responderData, + appConfig ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterionAndFilter) @@ -353,7 +360,8 @@ class NonTriplestoreSpecificGravsearchToCountPrequeryTransformerSpec extends Cor CountQueryHandler.transformQuery( inputQueryWithDecimalOptionalSortCriterionAndFilterComplex, appActor, - responderData + responderData, + appConfig ) 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 ec383c8c81..78900e93f4 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 @@ -9,6 +9,7 @@ import scala.concurrent.duration._ import dsp.errors.AssertionException import org.knora.webapi.CoreSpec +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM @@ -19,7 +20,6 @@ import org.knora.webapi.messages.util.search.gravsearch.GravsearchQueryChecker import org.knora.webapi.messages.util.search.gravsearch.prequery.NonTriplestoreSpecificGravsearchToPrequeryTransformer import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionRunner import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.ApacheLuceneSupport.LuceneQueryString @@ -33,13 +33,17 @@ private object QueryHandler { query: String, appActor: ActorRef, responderData: ResponderData, - settings: KnoraSettingsImpl + appConfig: AppConfig )(implicit executionContext: ExecutionContext): SelectQuery = { val constructQuery = GravsearchParser.parseQuery(query) val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val typeInspectionResultFuture = typeInspectionRunner.inspectTypes(constructQuery.whereClause, anythingUser) @@ -61,7 +65,7 @@ private object QueryHandler { constructClause = constructQuery.constructClause, typeInspectionResult = typeInspectionResult, querySchema = constructQuery.querySchema.getOrElse(throw AssertionException(s"WhereClause has no querySchema")), - settings = settings + appConfig = appConfig ) val nonTriplestoreSpecificPrequery: SelectQuery = QueryTraverser.transformConstructToSelect( @@ -3206,7 +3210,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithOptional, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithOptional) } @@ -3218,7 +3222,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterion, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterion) @@ -3232,7 +3236,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterionComplex, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterion) @@ -3246,7 +3250,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterionAndFilter, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterionAndFilter) @@ -3260,7 +3264,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateNonOptionalSortCriterionAndFilterComplex, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateNonOptionalSortCriterionAndFilter) @@ -3274,7 +3278,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterion, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterion) @@ -3288,7 +3292,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterionComplex, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterion) @@ -3302,7 +3306,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterionAndFilter, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterionAndFilter) @@ -3316,7 +3320,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDateOptionalSortCriterionAndFilterComplex, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDateOptionalSortCriterionAndFilter) @@ -3330,7 +3334,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterion, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterion) @@ -3343,7 +3347,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterionComplex, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterion) @@ -3356,7 +3360,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterionAndFilter, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithDecimalOptionalSortCriterionAndFilter) @@ -3369,7 +3373,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec inputQueryWithDecimalOptionalSortCriterionAndFilterComplex, appActor, responderData, - settings + appConfig ) // TODO: user provided statements and statement generated for sorting should be unified (https://github.com/dhlab-basel/Knora/issues/1195) @@ -3382,7 +3386,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndLiteralInSimpleSchema, appActor, responderData, - settings + appConfig ) assert(transformedQuery == TransformedQueryWithRdfsLabelAndLiteral) @@ -3394,7 +3398,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndLiteralInComplexSchema, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndLiteral) @@ -3406,7 +3410,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndVariableInSimpleSchema, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndVariable) @@ -3418,7 +3422,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndVariableInComplexSchema, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndVariable) @@ -3430,7 +3434,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndRegexInSimpleSchema, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndRegex) @@ -3442,7 +3446,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithRdfsLabelAndRegexInComplexSchema, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithRdfsLabelAndRegex) @@ -3454,7 +3458,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec InputQueryWithUnionScopes, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithUnionScopes) @@ -3466,7 +3470,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithStandoffTagHasStartAncestor, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryWithStandoffTagHasStartAncestor) @@ -3478,7 +3482,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorder, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryToReorder) @@ -3490,7 +3494,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorderWithUnion, appActor, responderData, - settings + appConfig ) assert(transformedQuery === transformedQueryToReorderWithUnion) @@ -3502,7 +3506,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithOptional, appActor, responderData, - settings + appConfig ) assert(transformedQuery === TransformedQueryWithOptional) @@ -3514,7 +3518,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorderWithMinus, appActor, responderData, - settings + appConfig ) assert(transformedQuery == transformedQueryToReorderWithMinus) @@ -3526,7 +3530,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryToReorderWithCycle, appActor, responderData, - settings + appConfig ) assert(transformedQuery == transformedQueryToReorderWithCycle) @@ -3538,7 +3542,7 @@ class NonTriplestoreSpecificGravsearchToPrequeryTransformerSpec extends CoreSpec queryWithKnoraApiResource, appActor, responderData, - settings + appConfig ) assert( diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectorSpec.scala index d72739238d..7d077fae52 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectorSpec.scala @@ -1343,7 +1343,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "The annotation-reading type inspector" should { "get type information from a simple query" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = false) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = false + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithExplicitTypeAnnotations) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1421,7 +1425,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "refine the inspected types for each typeableEntity" in { val typeInspectionRunner = - new InferringGravsearchTypeInspector(nextInspector = None, appActor, responderData = responderData) + new InferringGravsearchTypeInspector( + nextInspector = None, + appActor, + responderData = responderData + ) val parsedQuery = GravsearchParser.parseQuery(QueryRdfTypeRule) val (_, entityInfo) = Await.result( typeInspectionRunner.getUsageIndexAndEntityInfos(parsedQuery.whereClause, requestingUser = anythingAdminUser), @@ -1473,7 +1481,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "sanitize inconsistent resource types that only have knora-base:Resource as base class in common" in { val typeInspectionRunner = - new InferringGravsearchTypeInspector(nextInspector = None, appActor, responderData = responderData) + new InferringGravsearchTypeInspector( + nextInspector = None, + appActor, + responderData = responderData + ) val parsedQuery = GravsearchParser.parseQuery(QueryRdfTypeRule) val (usageIndex, entityInfo) = Await.result( typeInspectionRunner.getUsageIndexAndEntityInfos(parsedQuery.whereClause, requestingUser = anythingAdminUser), @@ -1551,7 +1563,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "sanitize inconsistent resource types that have common base classes other than knora-base:Resource" in { val typeInspectionRunner = - new InferringGravsearchTypeInspector(nextInspector = None, appActor, responderData = responderData) + new InferringGravsearchTypeInspector( + nextInspector = None, + appActor, + responderData = responderData + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithInconsistentTypes3) val (usageIndex, entityInfo) = Await.result( typeInspectionRunner.getUsageIndexAndEntityInfos(parsedQuery.whereClause, requestingUser = anythingAdminUser), @@ -1613,7 +1629,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "sanitize inconsistent types resulted from a union" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithInconsistentTypes3) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1673,7 +1693,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { """.stripMargin val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(queryWithOptional) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1735,7 +1759,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the most specific type from redundant ones given in a query" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithRedundantTypes) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1746,7 +1774,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer that an entity is a knora-api:Resource if there is an rdf:type statement about it and the specified type is a Knora resource class" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryRdfTypeRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1761,7 +1793,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer a property's knora-api:objectType if the property's IRI is used as a predicate" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryKnoraObjectTypeFromPropertyIriRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1771,7 +1807,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer an entity's type if the entity is used as the object of a statement and the predicate's knora-api:objectType is known" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryTypeOfObjectFromPropertyRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1781,7 +1821,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the knora-api:objectType of a property variable if it's used with an object whose type is known" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryKnoraObjectTypeFromObjectRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1791,7 +1835,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer an entity's type if the entity is used as the subject of a statement, the predicate is an IRI, and the predicate's knora-api:subjectType is known" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryTypeOfSubjectFromPropertyRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1801,7 +1849,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the knora-api:objectType of a property variable if it's compared to a known property IRI in a FILTER" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryPropertyVarTypeFromFilterRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1811,7 +1863,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a non-property variable if it's compared to an XSD literal in a FILTER" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryNonPropertyVarTypeFromFilterRule) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1821,7 +1877,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a non-property variable used as the argument of a function in a FILTER" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryVarTypeFromFunction) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1831,7 +1891,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a non-property IRI used as the argument of a function in a FILTER" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryIriTypeFromFunction) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1841,7 +1905,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the types in a query that requires 6 iterations" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(PathologicalQuery) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1851,7 +1919,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "know the object type of rdfs:label" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithRdfsLabelAndLiteral) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1861,7 +1933,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a variable used as the object of rdfs:label" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithRdfsLabelAndVariable) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1871,7 +1947,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a variable when it is compared with another variable in a FILTER (in the simple schema)" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryComparingResourcesInSimpleSchema) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1881,7 +1961,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a variable when it is compared with another variable in a FILTER (in the complex schema)" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryComparingResourcesInComplexSchema) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1891,7 +1975,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a resource IRI when it is compared with a variable in a FILTER (in the simple schema)" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryComparingResourceIriInSimpleSchema) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1901,7 +1989,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer the type of a resource IRI when it is compared with a variable in a FILTER (in the complex schema)" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryComparingResourceIriInComplexSchema) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1911,7 +2003,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "infer knora-api:Resource as the subject type of a subproperty of knora-api:hasLinkTo" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithFilterComparison) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1921,7 +2017,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "reject a query with a non-Knora property whose type cannot be inferred" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryNonKnoraTypeWithoutAnnotation) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1932,7 +2032,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "accept a query with a non-Knora property whose type can be inferred" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryNonKnoraTypeWithAnnotation) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1942,7 +2046,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "ignore Gravsearch options" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithGravsearchOptions) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1952,7 +2060,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "reject a query with inconsistent types inferred from statements" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithInconsistentTypes1) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) @@ -1963,7 +2075,11 @@ class GravsearchTypeInspectorSpec extends CoreSpec() with ImplicitSender { "reject a query with inconsistent types inferred from a FILTER" in { val typeInspectionRunner = - new GravsearchTypeInspectionRunner(appActor, responderData = responderData, inferTypes = true) + new GravsearchTypeInspectionRunner( + appActor, + responderData = responderData, + inferTypes = true + ) val parsedQuery = GravsearchParser.parseQuery(QueryWithInconsistentTypes2) val resultFuture: Future[GravsearchTypeInspectionResult] = typeInspectionRunner.inspectTypes(parsedQuery.whereClause, requestingUser = anythingAdminUser) 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 606dc60ef6..2b48b555d3 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 @@ -360,7 +360,8 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender with Authentica // need to be able to authenticate credentials with new password val resF = Authenticator.authenticateCredentialsV2( credentials = - Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test123456")) + Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test123456")), + appConfig )(system, appActor, executionContext) resF map { res => @@ -387,7 +388,8 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender with Authentica // need to be able to authenticate credentials with new password val resF = Authenticator.authenticateCredentialsV2( credentials = - Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test654321")) + Some(KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some(normalUser.email)), "test654321")), + appConfig )(system, appActor, executionContext) resF map { res => 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 fd106aa8ac..f170d0be52 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 @@ -6,8 +6,6 @@ package org.knora.webapi.responders.v1 import akka.testkit.ImplicitSender -import com.typesafe.config.Config -import com.typesafe.config.ConfigFactory import spray.json.JsValue import java.util.UUID @@ -40,10 +38,6 @@ import org.knora.webapi.util._ * Static data for testing [[ResourcesResponderV1]]. */ object ResourcesResponderV1Spec { - private val config: Config = ConfigFactory.parseString(""" - akka.loglevel = "DEBUG" - akka.stdout-loglevel = "DEBUG" - """.stripMargin) private val ReiseInsHeiligelandThreeValues: ResourceSearchResponseV1 = ResourceSearchResponseV1( resources = Vector( @@ -647,7 +641,13 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { implicit private val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - private val valueUtilV1 = new ValueUtilV1(settings) + private val resourcesResponderV1SpecContextData: ResourcesResponderV1SpecContextData = + new ResourcesResponderV1SpecContextData(appConfig) + + private val resourcesResponderV1SpecFullData: ResourcesResponderV1SpecFullData = + new ResourcesResponderV1SpecFullData(appConfig) + + private val valueUtilV1 = new ValueUtilV1(appConfig) override lazy val rdfDataObjects = List( RdfDataObject(path = "test_data/all_data/incunabula-data.ttl", name = "http://www.knora.org/data/0803/incunabula"), @@ -910,7 +910,7 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { expectMsgPF(timeout) { case response: ResourceFullResponseV1 => compareResourceFullResponses( received = response, - expected = ResourcesResponderV1SpecFullData.expectedBookResourceFullResponse + expected = resourcesResponderV1SpecFullData.expectedBookResourceFullResponse ) } } @@ -925,7 +925,7 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { expectMsgPF(timeout) { case response: ResourceFullResponseV1 => compareResourceFullResponses( received = response, - expected = ResourcesResponderV1SpecFullData.expectedPageResourceFullResponse + expected = resourcesResponderV1SpecFullData.expectedPageResourceFullResponse ) } } @@ -940,7 +940,7 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { val response: JsValue = expectMsgType[ResourceContextResponseV1](timeout).toJsValue - response should be(ResourcesResponderV1SpecContextData.expectedBookResourceContextResponse) + response should be(resourcesResponderV1SpecContextData.expectedBookResourceContextResponse) } "return the context of a page of the book 'Zeitglöcklein des Lebens und Leidens Christi' in the Incunabula test data" in { @@ -954,7 +954,7 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { expectMsgPF(timeout) { case response: ResourceContextResponseV1 => compareResourcePartOfContextResponses( received = response, - expected = ResourcesResponderV1SpecContextData.expectedPageResourceContextResponse + expected = resourcesResponderV1SpecContextData.expectedPageResourceContextResponse ) } } @@ -1163,7 +1163,7 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { ) ), resource_reference = Set(nonexistentIri), - mapping = ResourcesResponderV1SpecFullData.dummyMapping, + mapping = resourcesResponderV1SpecFullData.dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping" ) @@ -1226,7 +1226,7 @@ class ResourcesResponderV1Spec extends CoreSpec with ImplicitSender { startIndex = 1 ) ), - mapping = ResourcesResponderV1SpecFullData.dummyMapping, + mapping = resourcesResponderV1SpecFullData.dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping", resource_reference = Set("http://rdfh.ch/0803/c5058f3a") ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecContextData.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecContextData.scala index 97a442f886..6b43b87bf0 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecContextData.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecContextData.scala @@ -5,22 +5,16 @@ package org.knora.webapi.responders.v1 -import akka.actor.ActorSystem import spray.json.JsValue import spray.json.JsonParser import java.nio.file.Paths +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.v1.responder.resourcemessages._ -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.FileUtil -object ResourcesResponderV1SpecContextData { - - implicit lazy val system: ActorSystem = ActorSystem("webapi") - - val settings: KnoraSettingsImpl = KnoraSettings(system) +final case class ResourcesResponderV1SpecContextData(appConfig: AppConfig) { /* @@ -33,7 +27,7 @@ object ResourcesResponderV1SpecContextData { .readTextFile( Paths.get("..", "test_data/v1/expectedBookContextResponse.json") ) - .replaceAll("IIIF_BASE_URL", settings.externalSipiIIIFGetUrl) + .replaceAll("IIIF_BASE_URL", appConfig.sipi.externalBaseUrl) val expectedBookResourceContextResponse: JsValue = JsonParser(expectedBookResourceContextResponseStr) @@ -51,7 +45,7 @@ object ResourcesResponderV1SpecContextData { locations = None, preview = None, restype_iconsrc = - Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), restype_description = Some("Diese Resource-Klasse beschreibt ein Buch"), restype_label = Some("Buch"), restype_name = Some("http://www.knora.org/ontology/0803/incunabula#book"), @@ -74,7 +68,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", ny = Some(3505), nx = Some(2613), origname = Some("ad+s167_druck1=0001.tif"), @@ -87,7 +81,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", ny = Some(128), nx = Some(95), origname = Some("ad+s167_druck1=0001.tif"), @@ -97,7 +91,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/82,110/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/82,110/0/default.jpg", ny = Some(110), nx = Some(82), origname = Some("ad+s167_druck1=0001.tif"), @@ -107,7 +101,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/163,219/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/163,219/0/default.jpg", ny = Some(219), nx = Some(163), origname = Some("ad+s167_druck1=0001.tif"), @@ -117,7 +111,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/327,438/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/327,438/0/default.jpg", ny = Some(438), nx = Some(327), origname = Some("ad+s167_druck1=0001.tif"), @@ -127,7 +121,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/653,876/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/653,876/0/default.jpg", ny = Some(876), nx = Some(653), origname = Some("ad+s167_druck1=0001.tif"), @@ -137,8 +131,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = - s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/1307,1753/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/1307,1753/0/default.jpg", ny = Some(1753), nx = Some(1307), origname = Some("ad+s167_druck1=0001.tif"), @@ -148,8 +141,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = - s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", ny = Some(3505), nx = Some(2613), origname = Some("ad+s167_druck1=0001.tif"), @@ -162,7 +154,7 @@ object ResourcesResponderV1SpecContextData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", ny = Some(128), nx = Some(95), origname = Some("ad+s167_druck1=0001.tif"), @@ -170,7 +162,7 @@ object ResourcesResponderV1SpecContextData { ) ), restype_iconsrc = - Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/page.gif"), + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/page.gif"), restype_description = Some("Eine Seite ist ein Teil eines Buchs"), restype_label = Some("Seite"), restype_name = Some("http://www.knora.org/ontology/0803/incunabula#page"), diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecFullData.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecFullData.scala index 16ac6ab2b1..0990bfeba8 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecFullData.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ResourcesResponderV1SpecFullData.scala @@ -5,21 +5,14 @@ package org.knora.webapi.responders.v1 -import akka.actor.ActorSystem - +import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.v1.responder.resourcemessages._ import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages.MappingXMLtoStandoff import org.knora.webapi.messages.v2.responder.standoffmessages.XMLTag -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl // FIXME: Rename to something more generic and without spec in the name since it is not a spec and is used in more then one spec -object ResourcesResponderV1SpecFullData { - - implicit lazy val system: ActorSystem = ActorSystem("webapi") - - val settings: KnoraSettingsImpl = KnoraSettings(system) +final case class ResourcesResponderV1SpecFullData(appConfig: AppConfig) { // The expected response to a "full" resource request for a book. val expectedBookResourceFullResponse: ResourceFullResponseV1 = ResourceFullResponseV1( @@ -38,7 +31,7 @@ object ResourcesResponderV1SpecFullData { locations = None, preview = None, restype_iconsrc = - Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "knora-base/link.gif"), + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "knora-base/link.gif"), restype_description = Some("Verkn\u00FCpfung mehrerer Resourcen"), restype_label = Some("Verkn\u00FCpfungsobjekt"), restype_name = Some("http://www.knora.org/ontology/knora-base#LinkObj"), @@ -64,7 +57,7 @@ object ResourcesResponderV1SpecFullData { locations = None, preview = None, restype_iconsrc = - Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "knora-base/link.gif"), + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "knora-base/link.gif"), restype_description = Some("Verkn\u00FCpfung mehrerer Resourcen"), restype_label = Some("Verkn\u00FCpfungsobjekt"), restype_name = Some("http://www.knora.org/ontology/knora-base#LinkObj"), @@ -404,7 +397,7 @@ object ResourcesResponderV1SpecFullData { resdata = Some( ResourceDataV1( rights = Some(6), - iconsrc = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), + iconsrc = Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), restype_label = Some("Buch"), restype_name = "http://www.knora.org/ontology/0803/incunabula#book", res_id = "http://rdfh.ch/0803/c5058f3a" @@ -421,7 +414,8 @@ object ResourcesResponderV1SpecFullData { locdata = None, locations = None, preview = None, - restype_iconsrc = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), + restype_iconsrc = + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), restype_description = Some("Diese Resource-Klasse beschreibt ein Buch"), restype_label = Some("Buch"), restype_name = Some("http://www.knora.org/ontology/0803/incunabula#book"), @@ -445,7 +439,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", ny = Some(128), nx = Some(95), origname = Some("ad+s167_druck1=0001.tif"), @@ -455,7 +449,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/82,110/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/82,110/0/default.jpg", ny = Some(110), nx = Some(82), origname = Some("ad+s167_druck1=0001.tif"), @@ -465,7 +459,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/163,219/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/163,219/0/default.jpg", ny = Some(219), nx = Some(163), origname = Some("ad+s167_druck1=0001.tif"), @@ -475,7 +469,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/327,438/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/327,438/0/default.jpg", ny = Some(438), nx = Some(327), origname = Some("ad+s167_druck1=0001.tif"), @@ -485,7 +479,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/653,876/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/653,876/0/default.jpg", ny = Some(876), nx = Some(653), origname = Some("ad+s167_druck1=0001.tif"), @@ -495,8 +489,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = - s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/1307,1753/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/1307,1753/0/default.jpg", ny = Some(1753), nx = Some(1307), origname = Some("ad+s167_druck1=0001.tif"), @@ -506,8 +499,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = - s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", ny = Some(3505), nx = Some(2613), origname = Some("ad+s167_druck1=0001.tif"), @@ -648,14 +640,14 @@ object ResourcesResponderV1SpecFullData { value_rights = Vector(Some(2)), value_firstprops = Vector(Some("Zeitgl\u00F6cklein des Lebens und Leidens Christi")), value_iconsrcs = - Vector(Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif")), + Vector(Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif")), value_restype = Vector(Some("Buch")), comments = Vector(None), value_ids = Vector("http://rdfh.ch/0803/8a0b1e75/values/ac9ddbf4-62a7-4cdc-b530-16cbbaa265bf"), values = Vector( LinkV1( valueResourceClassIcon = - Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), valueResourceClassLabel = Some("Buch"), valueResourceClass = Some("http://www.knora.org/ontology/0803/incunabula#book"), valueLabel = Some("Zeitgl\u00F6cklein des Lebens und Leidens Christi"), @@ -773,7 +765,7 @@ object ResourcesResponderV1SpecFullData { resdata = Some( ResourceDataV1( rights = Some(6), - iconsrc = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/page.gif"), + iconsrc = Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/page.gif"), restype_label = Some("Seite"), restype_name = "http://www.knora.org/ontology/0803/incunabula#page", res_id = "http://rdfh.ch/0803/8a0b1e75" @@ -792,7 +784,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", ny = Some(3505), nx = Some(2613), origname = Some("ad+s167_druck1=0001.tif"), @@ -805,7 +797,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", ny = Some(128), nx = Some(95), origname = Some("ad+s167_druck1=0001.tif"), @@ -815,7 +807,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/82,110/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/82,110/0/default.jpg", ny = Some(110), nx = Some(82), origname = Some("ad+s167_druck1=0001.tif"), @@ -825,7 +817,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/163,219/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/163,219/0/default.jpg", ny = Some(219), nx = Some(163), origname = Some("ad+s167_druck1=0001.tif"), @@ -835,7 +827,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/327,438/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/327,438/0/default.jpg", ny = Some(438), nx = Some(327), origname = Some("ad+s167_druck1=0001.tif"), @@ -845,7 +837,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/653,876/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/653,876/0/default.jpg", ny = Some(876), nx = Some(653), origname = Some("ad+s167_druck1=0001.tif"), @@ -855,7 +847,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/1307,1753/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/1307,1753/0/default.jpg", ny = Some(1753), nx = Some(1307), origname = Some("ad+s167_druck1=0001.tif"), @@ -865,7 +857,7 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/2613,3505/0/default.jpg", ny = Some(3505), nx = Some(2613), origname = Some("ad+s167_druck1=0001.tif"), @@ -878,14 +870,15 @@ object ResourcesResponderV1SpecFullData { protocol = "file", duration = 0, fps = 0, - path = s"${settings.externalSipiIIIFGetUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", + path = s"${appConfig.sipi.externalBaseUrl}/0803/incunabula_0000000002.jp2/full/95,128/0/default.jpg", ny = Some(128), nx = Some(95), origname = Some("ad+s167_druck1=0001.tif"), format_name = "JPEG2000" ) ), - restype_iconsrc = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/page.gif"), + restype_iconsrc = + Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/page.gif"), restype_description = Some("Eine Seite ist ein Teil eines Buchs"), restype_label = Some("Seite"), restype_name = Some("http://www.knora.org/ontology/0803/incunabula#page"), diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/SearchResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/SearchResponderV1Spec.scala index 273f956d03..ec8541216a 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/SearchResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/SearchResponderV1Spec.scala @@ -221,8 +221,8 @@ class SearchResponderV1Spec extends CoreSpec() with ImplicitSender { ), iconlabel = Some("Buch"), icontitle = Some("Buch"), - iconsrc = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), - preview_path = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), + iconsrc = Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), + preview_path = Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), obj_id = "http://rdfh.ch/0803/c5058f3a" ), SearchResultRowV1( @@ -243,8 +243,8 @@ class SearchResponderV1Spec extends CoreSpec() with ImplicitSender { ), iconlabel = Some("Buch"), icontitle = Some("Buch"), - iconsrc = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), - preview_path = Some(settings.salsah1BaseUrl + settings.salsah1ProjectIconsBasePath + "incunabula/book.gif"), + iconsrc = Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), + preview_path = Some(appConfig.salsah1.baseUrl + appConfig.salsah1.projectIconsBasepath + "incunabula/book.gif"), obj_id = "http://rdfh.ch/0803/ff17e5ef9601" ) ) 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 1fec7a5056..fbe3b56199 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 @@ -40,6 +40,7 @@ object ValuesResponderV1Spec { private val imagesUser = SharedTestDataADM.imagesUser01 private val anythingUser = SharedTestDataADM.anythingUser1 + } /** @@ -47,6 +48,7 @@ object ValuesResponderV1Spec { */ class ValuesResponderV1Spec extends CoreSpec with ImplicitSender { implicit private val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance + private val resourcesResponderV1SpecFullData = ResourcesResponderV1SpecFullData(appConfig) import ValuesResponderV1Spec._ @@ -2067,7 +2069,7 @@ class ValuesResponderV1Spec extends CoreSpec with ImplicitSender { ) ), resource_reference = Set(nonexistentIri), - mapping = ResourcesResponderV1SpecFullData.dummyMapping, + mapping = resourcesResponderV1SpecFullData.dummyMapping, mappingIri = "http://rdfh.ch/standoff/mappings/StandardMapping" ) diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourceUtilV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourceUtilV2Spec.scala index 50e01dab56..7d773706f0 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourceUtilV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourceUtilV2Spec.scala @@ -15,7 +15,7 @@ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject object ResourceUtilV2Spec {} class ResourceUtilV2Spec extends CoreSpec() { - implicit val timeout: Timeout = settings.defaultTimeout + implicit val timeout: Timeout = appConfig.defaultTimeoutAsDuration implicit val ec: ExecutionContextExecutor = system.dispatcher override lazy val rdfDataObjects = List( 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 41f0da895f..3c5293806c 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 @@ -1902,7 +1902,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { resource.deletionInfo should not be (None) resource.lastModificationDate should not be (None) resource.creationDate should equal(aThingCreationDate) - println(resource) } } @@ -2210,7 +2209,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! eraseRequest expectMsgPF(timeout) { case msg: akka.actor.Status.Failure => - // println(msg.cause) msg.cause.isInstanceOf[ForbiddenException] should ===(true) } } @@ -2266,7 +2264,6 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { appActor ! eraseRequest expectMsgPF(timeout) { case msg: akka.actor.Status.Failure => - // println(msg.cause) msg.cause.isInstanceOf[BadRequestException] should ===(true) } 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 8c1eb44507..206c6be90b 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 @@ -33,7 +33,7 @@ import org.knora.webapi.messages.v2.responder.ontologymessages.ReadPropertyInfoV class CacheSpec extends CoreSpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - private implicit val timeout: Timeout = settings.defaultTimeout + private implicit val timeout: Timeout = appConfig.defaultTimeoutAsDuration override lazy val rdfDataObjects = List( RdfDataObject( diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CardinalitiesSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CardinalitiesSpec.scala index a02ab6903e..60fd5b5069 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CardinalitiesSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CardinalitiesSpec.scala @@ -19,7 +19,7 @@ import org.knora.webapi.messages.StringFormatter class CardinalitiesSpec extends CoreSpec { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - private implicit val timeout: Timeout = settings.defaultTimeout + private implicit val timeout: Timeout = appConfig.defaultTimeoutAsDuration val freetestOntologyIri: SmartIri = "http://0.0.0.0:3333/ontology/0001/freetest/v2".toSmartIri @@ -29,7 +29,7 @@ class CardinalitiesSpec extends CoreSpec { val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTest").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = CardinalityHandler.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) + val resF = CardinalityHandler.isPropertyUsedInResources(appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(res, "property is used in resource (instance of that resource class)") } } @@ -38,7 +38,7 @@ class CardinalitiesSpec extends CoreSpec { val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTestResourceClass").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = CardinalityHandler.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) + val resF = CardinalityHandler.isPropertyUsedInResources(appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(!res, "property is not used in resource (instance of that resource class)") } @@ -49,7 +49,7 @@ class CardinalitiesSpec extends CoreSpec { val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTest").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = CardinalityHandler.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) + val resF = CardinalityHandler.isPropertyUsedInResources(appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(!res, "property is not used in resource (instance of that resource class)") } @@ -61,7 +61,7 @@ class CardinalitiesSpec extends CoreSpec { val internalClassIri = anythingOntologyIri.makeEntityIri("Thing").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = CardinalityHandler.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) + val resF = CardinalityHandler.isPropertyUsedInResources(appActor, internalClassIri, internalPropertyIri) resF map { res => println(res); assert(res, "property is used in resource (instance of resource class)") } } @@ -70,7 +70,7 @@ class CardinalitiesSpec extends CoreSpec { val internalClassIri = freetestOntologyIri.makeEntityIri("FreeTest").toOntologySchema(InternalSchema) println(s"internalPropertyIri: $internalPropertyIri") - val resF = CardinalityHandler.isPropertyUsedInResources(settings, appActor, internalClassIri, internalPropertyIri) + val resF = CardinalityHandler.isPropertyUsedInResources(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 5a9e24452b..e1cc7a63e1 100644 --- a/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala @@ -31,12 +31,11 @@ object AuthenticatorSpec { class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodTester { - implicit val timeout: Timeout = settings.defaultTimeout + implicit val timeout: Timeout = appConfig.defaultTimeoutAsDuration implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - private val getUserByIdentifier = PrivateMethod[Future[UserADM]](Symbol("getUserByIdentifier")) - private val authenticateCredentialsV2 = PrivateMethod[Future[Boolean]](Symbol("authenticateCredentialsV2")) + private val getUserByIdentifier = PrivateMethod[Future[UserADM]](Symbol("getUserByIdentifier")) "During Authentication" when { "called, the 'getUserADMByEmail' method " should { @@ -86,11 +85,9 @@ class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodT UserIdentifierADM(maybeEmail = Some(AuthenticatorSpec.rootUserEmail)), AuthenticatorSpec.rootUserPassword ) - val resF = Authenticator invokePrivate authenticateCredentialsV2( + val resF = Authenticator.authenticateCredentialsV2( Some(correctPasswordCreds), - system, - appActor, - executionContext + appConfig ) resF map { res => assert(res) @@ -99,11 +96,9 @@ class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodT "fail with unknown email" in { val wrongPasswordCreds = KnoraPasswordCredentialsV2(UserIdentifierADM(maybeEmail = Some("wrongemail@example.com")), "wrongpassword") - val resF = Authenticator invokePrivate authenticateCredentialsV2( + val resF = Authenticator.authenticateCredentialsV2( Some(wrongPasswordCreds), - system, - appActor, - executionContext + appConfig ) resF map { _ => assertThrows(BadCredentialsException) @@ -115,11 +110,9 @@ class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodT UserIdentifierADM(maybeEmail = Some(AuthenticatorSpec.rootUserEmail)), "wrongpassword" ) - val resF = Authenticator invokePrivate authenticateCredentialsV2( + val resF = Authenticator.authenticateCredentialsV2( Some(wrongPasswordCreds), - system, - appActor, - executionContext + appConfig ) resF map { _ => assertThrows(BadCredentialsException) @@ -127,17 +120,15 @@ class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodT } "succeed with correct token" in { val token = JWTHelper.createToken( - "myuseriri", - settings.jwtSecretKey, - settings.jwtLongevity, - settings.externalKnoraApiHostPort + "http://rdfh.ch/users/X-T8IkfQTKa86UWuISpbOA", + appConfig.jwtSecretKey, + appConfig.jwtLongevityAsDuration, + appConfig.knoraApi.externalKnoraApiHostPort ) val tokenCreds = KnoraJWTTokenCredentialsV2(token) - val resF = Authenticator invokePrivate authenticateCredentialsV2( + val resF = Authenticator.authenticateCredentialsV2( Some(tokenCreds), - system, - appActor, - executionContext + appConfig ) resF map { res => assert(res) @@ -145,33 +136,30 @@ class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodT } "fail with invalidated token" in { val token = JWTHelper.createToken( - "myuseriri", - settings.jwtSecretKey, - settings.jwtLongevity, - settings.externalKnoraApiHostPort + "http://rdfh.ch/users/X-T8IkfQTKa86UWuISpbOA", + appConfig.jwtSecretKey, + appConfig.jwtLongevityAsDuration, + appConfig.knoraApi.externalKnoraApiHostPort ) val tokenCreds = KnoraJWTTokenCredentialsV2(token) CacheUtil.put(AUTHENTICATION_INVALIDATION_CACHE_NAME, tokenCreds.jwtToken, tokenCreds.jwtToken) - val resF = Authenticator invokePrivate authenticateCredentialsV2( - Some(tokenCreds), - system, - appActor, - executionContext - ) - resF map { _ => - assertThrows(BadCredentialsException) + + assertThrows[BadCredentialsException] { + Authenticator.authenticateCredentialsV2( + Some(tokenCreds), + appConfig + ) } + } "fail with wrong token" in { val tokenCreds = KnoraJWTTokenCredentialsV2("123456") - val resF = Authenticator invokePrivate authenticateCredentialsV2( - Some(tokenCreds), - system, - appActor, - executionContext - ) - resF map { _ => - assertThrows(BadCredentialsException) + + assertThrows[BadCredentialsException] { + Authenticator.authenticateCredentialsV2( + Some(tokenCreds), + appConfig + ) } } @@ -179,7 +167,7 @@ class AuthenticatorSpec extends CoreSpec with ImplicitSender with PrivateMethodT "called, the 'calculateCookieName' method" should { "succeed with generating the name" in { - Authenticator.calculateCookieName(settings) should equal("KnoraAuthenticationGAXDALRQFYYDUMZTGMZQ9999") + Authenticator.calculateCookieName(appConfig) should equal("KnoraAuthenticationGAXDALRQFYYDUMZTGMZQ9999") } } } diff --git a/webapi/src/test/scala/org/knora/webapi/routing/JWTHelperSpec.scala b/webapi/src/test/scala/org/knora/webapi/routing/JWTHelperSpec.scala index 9d8930c856..16068ed065 100644 --- a/webapi/src/test/scala/org/knora/webapi/routing/JWTHelperSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/routing/JWTHelperSpec.scala @@ -21,48 +21,48 @@ class JWTHelperSpec extends CoreSpec with ImplicitSender { "create a token" in { val token: String = JWTHelper.createToken( userIri = SharedTestDataADM.anythingUser1.id, - secret = settings.jwtSecretKey, - longevity = settings.jwtLongevity, - issuer = settings.externalKnoraApiHostPort, + secret = appConfig.jwtSecretKey, + longevity = appConfig.jwtLongevityAsDuration, + issuer = appConfig.knoraApi.externalKnoraApiHostPort, content = Map("foo" -> JsString("bar")) ) JWTHelper.extractUserIriFromToken( token = token, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(Some(SharedTestDataADM.anythingUser1.id)) JWTHelper.extractContentFromToken( token = token, - secret = settings.jwtSecretKey, + secret = appConfig.jwtSecretKey, contentName = "foo", - issuer = settings.externalKnoraApiHostPort + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(Some("bar")) } "validate a token" in { JWTHelper.validateToken( token = validToken, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(true) } "extract the user's IRI" in { JWTHelper.extractUserIriFromToken( token = validToken, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(Some(SharedTestDataADM.anythingUser1.id)) } "extract application-specific content" in { JWTHelper.extractContentFromToken( token = validToken, - secret = settings.jwtSecretKey, + secret = appConfig.jwtSecretKey, contentName = "foo", - issuer = settings.externalKnoraApiHostPort + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(Some("bar")) } @@ -72,8 +72,8 @@ class JWTHelperSpec extends CoreSpec with ImplicitSender { JWTHelper.extractUserIriFromToken( token = invalidToken, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(None) } @@ -83,8 +83,8 @@ class JWTHelperSpec extends CoreSpec with ImplicitSender { JWTHelper.extractUserIriFromToken( token = tokenWithInvalidSubject, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(None) } @@ -94,8 +94,8 @@ class JWTHelperSpec extends CoreSpec with ImplicitSender { JWTHelper.extractUserIriFromToken( token = tokenWithMissingExp, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(None) } @@ -105,8 +105,8 @@ class JWTHelperSpec extends CoreSpec with ImplicitSender { JWTHelper.extractUserIriFromToken( token = expiredToken, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(None) } @@ -116,8 +116,8 @@ class JWTHelperSpec extends CoreSpec with ImplicitSender { JWTHelper.validateToken( token = tokenWithDifferentIssuer, - secret = settings.jwtSecretKey, - issuer = settings.externalKnoraApiHostPort + secret = appConfig.jwtSecretKey, + issuer = appConfig.knoraApi.externalKnoraApiHostPort ) should be(false) } } diff --git a/webapi/src/test/scala/org/knora/webapi/util/AkkaHttpUtils.scala b/webapi/src/test/scala/org/knora/webapi/util/AkkaHttpUtils.scala index 0907f08d8c..be3720a490 100644 --- a/webapi/src/test/scala/org/knora/webapi/util/AkkaHttpUtils.scala +++ b/webapi/src/test/scala/org/knora/webapi/util/AkkaHttpUtils.scala @@ -9,7 +9,6 @@ import akka.actor.ActorSystem import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.unmarshalling.Unmarshal -import akka.stream.Materializer import akka.util.Timeout import com.typesafe.scalalogging.LazyLogging import spray.json._ @@ -35,13 +34,9 @@ object AkkaHttpUtils extends LazyLogging { import DefaultJsonProtocol._ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ - implicit val materializer: Materializer = Materializer.matFromSystem(system) - val jsonFuture: Future[JsObject] = response match { - case HttpResponse(StatusCodes.OK, _, entity, _) => - Unmarshal(entity).to[JsObject] - case other => - throw new Exception(other.toString()) + case HttpResponse(StatusCodes.OK, _, entity, _) => Unmarshal(entity).to[JsObject] + case other => throw new Exception(other.toString()) } // FIXME: There is probably a better non blocking way of doing it. 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 fbb0ea86c8..c86d9067da 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 @@ -5,55 +5,33 @@ package org.knora.webapi.util.cache -import akka.actor.ActorSystem -import akka.testkit.TestKit -import com.typesafe.scalalogging.LazyLogging -import org.scalatest.BeforeAndAfterAll -import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.AnyWordSpecLike - -import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.CoreSpec import org.knora.webapi.routing.Authenticator -import org.knora.webapi.settings.KnoraSettings -import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.sharedtestdata.SharedTestDataV1 -class CacheUtilSpec - extends TestKit(ActorSystem("CacheUtilSpec")) - with AnyWordSpecLike - with Matchers - with BeforeAndAfterAll - with LazyLogging - with Authenticator { - - StringFormatter.initForTest() - val settings: KnoraSettingsImpl = KnoraSettings(system) +class CacheUtilSpec extends CoreSpec { private val cacheName = Authenticator.AUTHENTICATION_INVALIDATION_CACHE_NAME - private val sessionId = System.currentTimeMillis().toString - - final override def beforeAll(): Unit = { - CacheUtil.removeAllCaches() - CacheUtil.createCaches(settings.caches) - } - - final override def afterAll(): Unit = { - CacheUtil.removeAllCaches() - TestKit.shutdownActorSystem(system) - } + private val sessionId = java.lang.System.currentTimeMillis().toString "Caching" should { "allow to set and get the value " in { + CacheUtil.removeAllCaches() + CacheUtil.createCaches(appConfig.cacheConfigs) CacheUtil.put(cacheName, sessionId, SharedTestDataV1.rootUser) CacheUtil.get(cacheName, sessionId) should be(Some(SharedTestDataV1.rootUser)) } "return none if key is not found " in { + CacheUtil.removeAllCaches() + CacheUtil.createCaches(appConfig.cacheConfigs) CacheUtil.get(cacheName, 213.toString) should be(None) } "allow to delete a set value " in { + CacheUtil.removeAllCaches() + CacheUtil.createCaches(appConfig.cacheConfigs) CacheUtil.remove(cacheName, sessionId) CacheUtil.get(cacheName, sessionId) should be(None) }