diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5e34e1c44a..8be2ee047f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,22 +17,17 @@ jobs: uses: actions/checkout@v1 with: fetch-depth: 15 - - name: Setup JDK - uses: actions/setup-java@v2 - with: - distribution: temurin - java-version: 11 - name: get current time uses: josStorer/get-current-time@v2 id: current-time with: format: YYYY-MM-DD utcOffset: "+02:00" - - name: setup java version - uses: joschi/setup-jdk@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - java-version: '11' # The OpenJDK version to make available on the path - architecture: 'x64' # defaults to 'x64' + distribution: 'temurin' + java-version: '17' - name: add docker compose v2 run: | mkdir -p ~/.docker/cli-plugins/ @@ -69,11 +64,11 @@ jobs: with: format: YYYY-MM-DD utcOffset: "+02:00" - - name: setup java version - uses: joschi/setup-jdk@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - java-version: '11' # The OpenJDK version to make available on the path - architecture: 'x64' # defaults to 'x64' + distribution: 'temurin' + java-version: '17' - name: add docker compose v2 run: | mkdir -p ~/.docker/cli-plugins/ @@ -116,11 +111,11 @@ jobs: with: format: YYYY-MM-DD utcOffset: "+02:00" - - name: setup java version - uses: joschi/setup-jdk@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - java-version: '11' # The OpenJDK version to make available on the path - architecture: 'x64' # defaults to 'x64' + distribution: 'temurin' + java-version: '17' - name: add docker compose v2 run: | mkdir -p ~/.docker/cli-plugins/ @@ -211,11 +206,11 @@ jobs: with: format: YYYY-MM-DD utcOffset: "+02:00" - - name: setup java version - uses: joschi/setup-jdk@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - java-version: '11' # The OpenJDK version to make available on the path - architecture: 'x64' # defaults to 'x64' + distribution: 'temurin' + java-version: '17' - name: add docker compose v2 run: | mkdir -p ~/.docker/cli-plugins/ @@ -287,3 +282,42 @@ jobs: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} CUSTOM_DOMAIN: docs-api.dasch.swiss REQUIREMENTS: docs/requirements.txt + + fmtcheck: + name: Check Formating + runs-on: ubuntu-latest + steps: + - name: checkout source + uses: actions/checkout@v1 + with: + fetch-depth: 15 + - name: get current time + uses: josStorer/get-current-time@v2 + id: current-time + with: + format: YYYY-MM-DD + utcOffset: "+02:00" + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + - name: add docker compose v2 + run: | + mkdir -p ~/.docker/cli-plugins/ + curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose + chmod +x ~/.docker/cli-plugins/docker-compose + - name: install requirements + run: sudo apt-get install ca-certificates-java expect + - name: Coursier cache + uses: coursier/cache-action@v6 + - name: Run fmtcheck + run: make check + - name: Cleanup before cache + shell: bash + run: | + rm -rf "$HOME/.ivy2/local" || true + find $HOME/Library/Caches/Coursier/v1 -name "ivydata-*.properties" -delete || true + find $HOME/.ivy2/cache -name "ivydata-*.properties" -delete || true + find $HOME/.cache/coursier/v1 -name "ivydata-*.properties" -delete || true + find $HOME/.sbt -name "*.lock" -delete || true diff --git a/.gitignore b/.gitignore index b2282fd28f..435b4f5efa 100644 --- a/.gitignore +++ b/.gitignore @@ -46,7 +46,7 @@ sipi/images/originals/1111/* .idea/ .metals/ -metals.sbt +**/metals.sbt .tmp/ diff --git a/Makefile b/Makefile index 3c651e143c..5206455c5b 100644 --- a/Makefile +++ b/Makefile @@ -300,6 +300,10 @@ info: ## print out all variables @echo "BUILD_TAG: \t\t $(BUILD_TAG)" @echo "GIT_EMAIL: \t\t $(GIT_EMAIL)" +.PHONY: check +check: # Run code formating check + @sbt "check" + .PHONY: help help: ## this help @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort diff --git a/build.sbt b/build.sbt index 1fd333488f..b7cde42056 100644 --- a/build.sbt +++ b/build.sbt @@ -49,6 +49,9 @@ lazy val root: Project = Project(id = "root", file(".")) publish / skip := true ) +addCommandAlias("fmt", "all root/scalafmtSbt root/scalafmtAll") +addCommandAlias("check", "all root/scalafmtSbtCheck root/scalafmtCheckAll") + ////////////////////////////////////// // DSP's custom SIPI ////////////////////////////////////// @@ -98,7 +101,7 @@ lazy val webApiCommonSettings = Seq( lazy val webapi: Project = Project(id = "webapi", base = file("webapi")) .settings(buildSettings) - .enablePlugins(SbtTwirl, JavaAppPackaging, DockerPlugin, GatlingPlugin, JavaAgent, RevolverPlugin, BuildInfoPlugin) + .enablePlugins(SbtTwirl, JavaAppPackaging, DockerPlugin, GatlingPlugin, JavaAgent, BuildInfoPlugin) .settings( name := "webapi", resolvers ++= Seq( @@ -133,10 +136,6 @@ lazy val webapi: Project = Project(id = "webapi", base = file("webapi")) scalacOptions ++= Seq("-feature", "-unchecked", "-deprecation", "-Yresolve-term-conflict:package"), logLevel := Level.Info, run / javaOptions := webapiJavaRunOptions, - reStart / javaOptions ++= resolvedJavaAgents.value map { resolved => - "-javaagent:" + resolved.artifact.absolutePath + resolved.agent.arguments - }, // allows sbt-javaagent to work with sbt-revolver - reStart / javaOptions ++= webapiJavaRunOptions, javaAgents += Dependencies.aspectjweaver, fork := true, // run tests in a forked JVM Test / testForkedParallel := false, // run forked tests in parallel diff --git a/docs/architecture/decisions/0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer.md b/docs/architecture/decisions/0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer.md new file mode 100644 index 0000000000..8c5d72a9c7 --- /dev/null +++ b/docs/architecture/decisions/0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer.md @@ -0,0 +1,20 @@ +# 3. Change IIIF Service Manager and Sipi implementation to zlayer + +Date: 2022-04-29 + +## Status + +Accepted + +## Context + +Both `org.knora.webapi.store.iiif.IIIFServiceManager` and `org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl` +where implemented as Akka-Actors + +## Decision + +As part of the move from `Akka` to `ZIO`, it was decided that the `IIIFServiceManager` and the `IIIFServiceSipiImpl` is refactored using ZIO. + +## Consequences + +The usage from other actors stays the same. The actor messages and responses don't change. diff --git a/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala b/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala index fb8f48ad54..78ed04e8b1 100644 --- a/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala +++ b/dsp-api-main/src/main/scala/dsp/api/main/MainApp.scala @@ -1,6 +1,7 @@ package dsp.api.main -import dsp.schema.repo.{SchemaRepo, SchemaRepoLive} +import dsp.schema.repo.SchemaRepo +import dsp.schema.repo.SchemaRepoLive import zio.Console.printLine import zio._ diff --git a/project/Dependencies.scala b/project/Dependencies.scala index d738e71a4c..c0483b8791 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -33,7 +33,7 @@ object Dependencies { val zioHttp = "io.d11" %% "zhttp" % ZioHttpVersion val zioJson = "dev.zio" %% "zio-json" % ZioJsonVersion val zioPrelude = "dev.zio" %% "zio-prelude" % ZioPreludeVersion - val zioLoggingSlf4j = "dev.zio" %% "zio-logging-slf4j" % ZioLoggingVersion + val zioLogging = "dev.zio" %% "zio-logging" % ZioLoggingVersion val zioConfig = "dev.zio" %% "zio-config" % ZioConfigVersion val zioConfigMagnolia = "dev.zio" %% "zio-config-magnolia" % ZioConfigVersion val zioConfigTypesafe = "dev.zio" %% "zio-config-typesafe" % ZioConfigVersion @@ -143,7 +143,7 @@ object Dependencies { zioConfigTypesafe, zioHttp, zioJson, - zioLoggingSlf4j, + zioLogging, zioPrelude, zioTest % Test, zioTestSbt % Test diff --git a/project/plugins.sbt b/project/plugins.sbt index a899a76a0a..c0480eab55 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -5,13 +5,9 @@ resolvers ++= Seq( // please don't remove or merge uncommented to main addDependencyTreePlugin -// Knora -addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.2") -addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.9") -addSbtPlugin("io.kamon" % "sbt-aspectj-runner" % "1.1.1") - -// webapi -addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1") +addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.2") +addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.9") +addSbtPlugin("io.kamon" % "sbt-aspectj-runner" % "1.1.1") addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.5.1") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10") addSbtPlugin("com.lightbend.sbt" % "sbt-javaagent" % "0.1.5") @@ -19,6 +15,7 @@ addSbtPlugin("io.gatling" % "gatling-sbt" % "2.2.2") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1") addSbtPlugin("com.codacy" % "sbt-codacy-coverage" % "1.3.15") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") // ad-hoc plugins - uncomment on demenad and keep it commented out in main branch @@ -27,6 +24,3 @@ addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") // https://github.com/cb372/sbt-explicit-dependencies // addSbtPlugin("com.github.cb372" % "sbt-explicit-dependencies" % "0.2.16") - -// https://scalameta.org/scalafmt/docs/installation.html#sbt -// addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") diff --git a/sipi/scripts/jwt.lua b/sipi/scripts/jwt.lua index 9f887b5043..655e659b95 100644 --- a/sipi/scripts/jwt.lua +++ b/sipi/scripts/jwt.lua @@ -26,9 +26,9 @@ function get_knora_token() end token_issuer = webapi_hostname .. ':' .. webapi_port - server.log("token_issuer:" .. token_issuer, server.loglevel.LOG_DEBUG) + server.log("token_issuer: " .. token_issuer, server.loglevel.LOG_DEBUG) if token["iss"] ~= token_issuer then - server.log(token_issuer, server.loglevel.LOG_DEBUG) + server.log("Invalid token issuer: " .. token_issuer .. " . Expected: " .. token["iss"], server.loglevel.LOG_DEBUG) send_error(401, "Invalid token. The token was not issued by the same server that sent the request.") return nil end diff --git a/webapi/src/main/resources/application.conf b/webapi/src/main/resources/application.conf index b57f58faee..5bd2576be6 100644 --- a/webapi/src/main/resources/application.conf +++ b/webapi/src/main/resources/application.conf @@ -296,7 +296,7 @@ app { shacl { # The directory that SHACL shapes are loaded from. - shapes-dir = "shacl" + shapes-dir = "../test_data/shacl" shapes-dir = ${?KNORA_WEBAPI_SHACLE_SHAPES_DIR} } diff --git a/webapi/src/main/scala/org/knora/webapi/RdfMediaTypes.scala b/webapi/src/main/scala/org/knora/webapi/RdfMediaTypes.scala index 143285b584..f0ec471219 100644 --- a/webapi/src/main/scala/org/knora/webapi/RdfMediaTypes.scala +++ b/webapi/src/main/scala/org/knora/webapi/RdfMediaTypes.scala @@ -5,7 +5,10 @@ package org.knora.webapi -import akka.http.scaladsl.model.{ContentType, HttpCharsets, MediaType, MediaTypes} +import akka.http.scaladsl.model.ContentType +import akka.http.scaladsl.model.HttpCharsets +import akka.http.scaladsl.model.MediaType +import akka.http.scaladsl.model.MediaTypes /** * Represents media types supported by the Knora API server for representing RDF data, and provides diff --git a/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala b/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala index cd57e769eb..49e5d9124e 100644 --- a/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala +++ b/webapi/src/main/scala/org/knora/webapi/app/ApplicationActor.scala @@ -20,9 +20,7 @@ import akka.stream.Materializer import akka.util.Timeout import ch.megard.akka.http.cors.scaladsl.CorsDirectives import ch.megard.akka.http.cors.scaladsl.settings.CorsSettings -import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging -import kamon.Kamon import org.knora.webapi.config.AppConfig import org.knora.webapi.core.LiveActorMaker import org.knora.webapi.exceptions.InconsistentRepositoryDataException @@ -35,8 +33,6 @@ import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig import org.knora.webapi.http.directives.DSPApiDirectives import org.knora.webapi.http.version.ServerVersion import org.knora.webapi.messages.admin.responder.KnoraRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM -import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.app.appmessages._ import org.knora.webapi.messages.store.StoreRequest import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceGetStatus @@ -63,73 +59,16 @@ import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.settings._ import org.knora.webapi.store.StoreManager import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.util.cache.CacheUtil import redis.clients.jedis.exceptions.JedisConnectionException -import zio.Runtime -import zio.ZIO -import zio.config.typesafe.TypesafeConfig -import zio.stm.TRef import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.concurrent.duration._ import scala.util.Failure import scala.util.Success -import org.knora.webapi.store.cacheservice.config.RedisConfig -import zio.ZEnvironment -import zio.RuntimeConfig -import org.knora.webapi.core.Logging - -trait Managers { - implicit val system: ActorSystem - val responderManager: ActorRef - val storeManager: ActorRef -} - -trait LiveManagers extends Managers { - this: Actor => - - /** - * Initializing the cache service manager, which is a ZLayer, - * by unsafe running it. - */ - lazy val cacheServiceManager: CacheServiceManager = - Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.live) - .unsafeRun( - (for (manager <- ZIO.service[CacheServiceManager]) - yield manager).provide(CacheServiceInMemImpl.layer, CacheServiceManager.layer) - ) - - /** - * The actor that forwards messages to actors that deal with persistent storage. - */ - lazy val storeManager: ActorRef = context.actorOf( - Props(new StoreManager(appActor = self, csm = cacheServiceManager) 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( - appActor = self, - responderData = ResponderData( - system = context.system, - appActor = self, - knoraSettings = KnoraSettings(system), - cacheServiceSettings = new CacheServiceSettings(system.settings.config) - ) - ) with LiveActorMaker - ) - .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = RESPONDER_MANAGER_ACTOR_NAME - ) -} /** * This is the first actor in the application. All other actors are children @@ -139,8 +78,15 @@ trait LiveManagers extends Managers { * the startup and shutdown sequence. Further, it forwards any messages meant * for responders or the store to the respective actor. */ -class ApplicationActor extends Actor with Stash with LazyLogging with AroundDirectives with Timers { - this: Managers => +class ApplicationActor( + cacheServiceManager: CacheServiceManager, + iiifServiceManager: IIIFServiceManager, + appConfig: AppConfig +) extends Actor + with Stash + with LazyLogging + with AroundDirectives + with Timers { logger.debug("entered the ApplicationManager constructor") @@ -184,6 +130,34 @@ class ApplicationActor extends Actor with Stash with LazyLogging with AroundDire appActor = self ) + /** + * The actor that forwards messages to responder actors to handle API requests. + */ + lazy val responderManager: ActorRef = context.actorOf( + Props( + new ResponderManager( + appActor = self, + responderData = ResponderData( + system = context.system, + appActor = self, + knoraSettings = KnoraSettings(system), + cacheServiceSettings = new CacheServiceSettings(system.settings.config) + ) + ) with LiveActorMaker + ) + .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), + name = RESPONDER_MANAGER_ACTOR_NAME + ) + + /** + * The actor that forwards messages to actors that deal with persistent storage. + */ + lazy val storeManager: ActorRef = context.actorOf( + Props(new StoreManager(self, cacheServiceManager, iiifServiceManager, appConfig) with LiveActorMaker) + .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), + name = StoreManagerActorName + ) + /** * This actor acts as the supervisor for its child actors. * Here we can override the default supervisor strategy. @@ -443,7 +417,7 @@ class ApplicationActor extends Actor with Stash with LazyLogging with AroundDire case akka.actor.Status.Failure(ex: Exception) => ex match { - case MissingLastModificationDateOntologyException(message, _) => + case MissingLastModificationDateOntologyException(_, _) => logger.info("Application stopped because of loading ontology into the cache failed.") appStop() case _ => throw ex diff --git a/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala b/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala index 272f1cd3b9..92d79102f9 100644 --- a/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala +++ b/webapi/src/main/scala/org/knora/webapi/app/LiveCore.scala @@ -10,11 +10,12 @@ import akka.stream.Materializer import org.knora.webapi.core.Core import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.rdf.RdfFeatureFactory -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.settings._ import scala.concurrent.ExecutionContext -import scala.language.postfixOps -import scala.languageFeature.postfixOps /** * The applications actor system. @@ -53,7 +54,7 @@ trait LiveCore extends Core { * sequences. */ lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with LiveManagers) + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)) .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), name = APPLICATION_MANAGER_ACTOR_NAME ) diff --git a/webapi/src/main/scala/org/knora/webapi/app/Main.scala b/webapi/src/main/scala/org/knora/webapi/app/Main.scala index fb1dea15f9..afd81daf5a 100644 --- a/webapi/src/main/scala/org/knora/webapi/app/Main.scala +++ b/webapi/src/main/scala/org/knora/webapi/app/Main.scala @@ -6,14 +6,16 @@ package org.knora.webapi.app import akka.actor.Terminated -import org.knora.webapi.messages.app.appmessages.AppStart - -import zio.config.typesafe.TypesafeConfig -import com.typesafe.config.ConfigFactory +import org.knora.webapi.auth.JWTService import org.knora.webapi.config.AppConfig - -import zio._ import org.knora.webapi.core.Logging +import org.knora.webapi.messages.app.appmessages.AppStart +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import zio._ + import java.util.concurrent.TimeUnit /** @@ -23,11 +25,32 @@ import java.util.concurrent.TimeUnit */ object Main extends scala.App with LiveCore { + // The ZIO runtime used to run functional effects + val runtime = Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + + // The effect for building a cache service manager, a IIIF service manager, and AppConfig. + val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, appConfig) + /** - * Loads the applicaton configuration using ZIO-Config. ZIO-Config is capable to load - * the Typesafe-Config format. + * Create both managers by unsafe running them. */ - val config = TypesafeConfig.fromTypesafeConfig(ConfigFactory.load().getConfig("app"), AppConfig.config) + val (cacheServiceManager, iiifServiceManager, appConfig) = + runtime + .unsafeRun( + managers + .provide( + CacheServiceInMemImpl.layer, + CacheServiceManager.layer, + AppConfig.live, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, + JWTService.layer + ) + ) /** * Start server initialisation diff --git a/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala b/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala new file mode 100644 index 0000000000..a10ce5d138 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/auth/JWTService.scala @@ -0,0 +1,38 @@ +package org.knora.webapi.auth + +import org.knora.webapi._ +import org.knora.webapi.config._ +import org.knora.webapi.routing.JWTHelper +import spray.json.JsValue +import zio._ + +final case class JWTService(config: AppConfig) { + + /** + * Creates a new JWT token for a specific user and holds some additional + * content. + * + * @param id the user's IRI. + * @param content containing additional information. + */ + def newToken(id: IRI, content: Map[String, JsValue]): UIO[String] = + ZIO.succeed { + JWTHelper.createToken( + userIri = id, + secret = config.jwtSecretKey, + longevity = config.jwtLongevityAsDuration, + issuer = config.knoraApi.externalKnoraApiHostPort, + content = content + ) + } +} + +object JWTService { + val layer: ZLayer[AppConfig, Nothing, JWTService] = { + ZLayer { + for { + config <- ZIO.service[AppConfig] + } yield JWTService(config) + } + } +} 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 97c6aa841c..f3facfbebc 100644 --- a/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala +++ b/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala @@ -1,14 +1,123 @@ package org.knora.webapi.config -import org.knora.webapi.store.cacheservice.config.CacheServiceConfig -import zio.config.ConfigDescriptor +import com.typesafe.config.ConfigFactory +import zio._ import zio.config._ +import scala.concurrent.duration + import typesafe._ import magnolia._ -final case class AppConfig(cacheService: CacheServiceConfig) +/** + * Represents (eventually) the complete configuration as defined in application.conf. + */ +final case class AppConfig( + testing: Boolean = false, + printExtendedConfig: Boolean, + defaultTimeout: String, + dumpMessages: Boolean, + showInternalErrors: Boolean, + skipAuthentication: Boolean, + bcryptPasswordStrength: Int, + jwtSecretKey: String, + jwtLongevity: String, + cookieDomain: String, + allowReloadOverHttp: Boolean, + knoraApi: KnoraAPI, + sipi: Sipi, + triplestore: Triplestore +) { + val jwtLongevityAsDuration = scala.concurrent.duration.Duration(jwtLongevity) +} + +final case class KnoraAPI( + internalHost: String, + internalPort: Int, + externalProtocol: String, + externalHost: String, + externalPort: Int +) { + def internalKnoraApiHostPort: String = internalHost + (if (internalPort != 80) + ":" + internalPort + else "") + def internalKnoraApiBaseUrl: String = "http://" + internalHost + (if (internalPort != 80) + ":" + internalPort + else "") + def externalKnoraApiHostPort: String = externalHost + (if (externalPort != 80) + ":" + externalPort + else "") + def externalKnoraApiBaseUrl: String = externalProtocol + "://" + externalHost + (if (externalPort != 80) + ":" + externalPort + else "") +} + +final case class Sipi( + internalProtocol: String, + internalHost: String, + internalPort: Int, + timeout: String, + externalProtocol: String, + externalHost: String, + externalPort: Int, + fileServerPath: String, + v2: V2, + imageMimeTypes: List[String], + documentMimeTypes: List[String], + textMimeTypes: List[String], + videoMimeTypes: List[String], + audioMimeTypes: List[String], + archiveMimeTypes: List[String] +) { + def internalBaseUrl: String = "http://" + internalHost + (if (internalPort != 80) + ":" + internalPort + else "") + def 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 Triplestore( + dbtype: String, + useHttps: Boolean, + host: String, + queryTimeout: String, + updateTimeout: String, + autoInit: Boolean +) { + val updateTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(updateTimeout)) +} +/** + * Loads the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading + * the Typesafe-Config format. + */ object AppConfig { - val config: ConfigDescriptor[AppConfig] = descriptor[AppConfig].mapKey(toKebabCase) + + /** + * Reads in the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading + * the Typesafe-Config format. Reads the 'app' configuration from 'application.conf'. + */ + private val source: ConfigSource = + TypesafeConfigSource.fromTypesafeConfig(ZIO.attempt(ConfigFactory.load().getConfig("app").resolve)) + + /** + * 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) + + /** + * Live configuration reading from application.conf. + */ + val live: ZLayer[Any, Nothing, AppConfig] = + ZLayer { + config.orDie + }.tap(_ => ZIO.debug(">>> AppConfig Initialized <<<")) } diff --git a/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala b/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala index 4e422b9800..a447812306 100644 --- a/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala +++ b/webapi/src/main/scala/org/knora/webapi/contributors/GenerateContributorsFile.scala @@ -5,15 +5,23 @@ package org.knora.webapi.contributors -import java.net.{URL, URLConnection} -import java.nio.file.{Path, Paths} - import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.twirl.Contributor import org.knora.webapi.util.FileUtil -import org.rogach.scallop.{ScallopConf, ScallopOption} -import spray.json.{JsArray, JsNull, JsNumber, JsObject, JsString, JsValue, JsonParser} - +import org.rogach.scallop.ScallopConf +import org.rogach.scallop.ScallopOption +import spray.json.JsArray +import spray.json.JsNull +import spray.json.JsNumber +import spray.json.JsObject +import spray.json.JsString +import spray.json.JsValue +import spray.json.JsonParser + +import java.net.URL +import java.net.URLConnection +import java.nio.file.Path +import java.nio.file.Paths import scala.io.Source /** diff --git a/webapi/src/main/scala/org/knora/webapi/core/ActorMaker.scala b/webapi/src/main/scala/org/knora/webapi/core/ActorMaker.scala index 41f5369bb2..afda402784 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/ActorMaker.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/ActorMaker.scala @@ -5,7 +5,9 @@ package org.knora.webapi.core -import akka.actor.{Actor, ActorRef, Props} +import akka.actor.Actor +import akka.actor.ActorRef +import akka.actor.Props /** * This trait is part of the cake pattern used in the creation of actors. Here we only define the method, and with diff --git a/webapi/src/main/scala/org/knora/webapi/core/Core.scala b/webapi/src/main/scala/org/knora/webapi/core/Core.scala index e90a143a42..16988d02f8 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/Core.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/Core.scala @@ -5,9 +5,13 @@ package org.knora.webapi.core -import akka.actor.{ActorRef, ActorSystem} +import akka.actor.ActorRef +import akka.actor.ActorSystem import akka.stream.Materializer +import org.knora.webapi.config.AppConfig import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.iiif.IIIFServiceManager import scala.concurrent.ExecutionContext @@ -23,5 +27,11 @@ trait Core { implicit val executionContext: ExecutionContext + val iiifServiceManager: IIIFServiceManager + + val cacheServiceManager: CacheServiceManager + + val appConfig: AppConfig + val appActor: ActorRef } diff --git a/webapi/src/main/scala/org/knora/webapi/core/LiveActorMaker.scala b/webapi/src/main/scala/org/knora/webapi/core/LiveActorMaker.scala index bbef2769cd..6311802979 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/LiveActorMaker.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/LiveActorMaker.scala @@ -5,7 +5,8 @@ package org.knora.webapi.core -import akka.actor.{Actor, Props} +import akka.actor.Actor +import akka.actor.Props /** * This trait is part of the cake pattern used in the creation of actors. This trait provides an implementation of the diff --git a/webapi/src/main/scala/org/knora/webapi/core/Logging.scala b/webapi/src/main/scala/org/knora/webapi/core/Logging.scala index 6ed8e71c2e..9425907801 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/Logging.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/Logging.scala @@ -1,27 +1,28 @@ package org.knora.webapi.core -import zio.logging._ -import zio.logging.backend.SLF4J._ -import zio.logging.backend.SLF4J import zio.LogLevel import zio.RuntimeConfigAspect +import zio.logging.LogFormat._ +import zio.logging._ object Logging { val logFormat = "[correlation-id = %s] %s" def generateCorrelationId = Some(java.util.UUID.randomUUID()) - val live: RuntimeConfigAspect = { - SLF4J.slf4j( + val textFormat: LogFormat = + timestamp.fixed(32).color(LogColor.BLUE) |-| level.highlight.fixed(14) |-| line.highlight + + val fromDebug: RuntimeConfigAspect = { + console( logLevel = LogLevel.Debug, - format = LogFormat.default, - _ => "dsp" + format = textFormat ) } - val console: RuntimeConfigAspect = { - zio.logging.console( + val fromInfo: RuntimeConfigAspect = { + console( logLevel = LogLevel.Info, - format = LogFormat.default + format = textFormat ) } diff --git a/webapi/src/main/scala/org/knora/webapi/exceptions/Exceptions.scala b/webapi/src/main/scala/org/knora/webapi/exceptions/Exceptions.scala index 88f859ba97..7eb129937f 100644 --- a/webapi/src/main/scala/org/knora/webapi/exceptions/Exceptions.scala +++ b/webapi/src/main/scala/org/knora/webapi/exceptions/Exceptions.scala @@ -6,7 +6,8 @@ package org.knora.webapi.exceptions import akka.event.LoggingAdapter -import org.apache.commons.lang3.{SerializationException, SerializationUtils} +import org.apache.commons.lang3.SerializationException +import org.apache.commons.lang3.SerializationUtils /* @@ -448,6 +449,9 @@ case class SipiException(message: String, cause: Option[Throwable] = None) object SipiException { def apply(message: String, e: Throwable, log: LoggingAdapter): SipiException = SipiException(message, Some(ExceptionUtil.logAndWrapIfNotSerializable(e, log))) + + def apply(message: String, e: Throwable): SipiException = + SipiException(message, Some(e)) } /** diff --git a/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala b/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala index dbd4d607f2..25bd81710d 100644 --- a/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala +++ b/webapi/src/main/scala/org/knora/webapi/feature/FeatureFactory.scala @@ -5,16 +5,20 @@ package org.knora.webapi.feature +import akka.http.scaladsl.model.HttpHeader +import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.headers.RawHeader -import akka.http.scaladsl.model.{HttpHeader, HttpResponse} import akka.http.scaladsl.server.RequestContext -import org.knora.webapi.exceptions.{BadRequestException, FeatureToggleException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.FeatureToggleException import org.knora.webapi.settings.KnoraSettings.FeatureToggleBaseConfig import org.knora.webapi.settings.KnoraSettingsImpl import scala.annotation.tailrec +import scala.util.Failure +import scala.util.Success +import scala.util.Try import scala.util.control.Exception._ -import scala.util.{Failure, Success, Try} /** * A tagging trait for module-specific factories that produce implementations of features. 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 451fb58ec1..f996d08618 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 @@ -7,8 +7,10 @@ package org.knora.webapi.http.directives import akka.actor.ActorSystem import akka.http.scaladsl.server -import akka.http.scaladsl.server.Directives.{handleExceptions, handleRejections} -import akka.http.scaladsl.server.{ExceptionHandler, RejectionHandler} +import akka.http.scaladsl.server.Directives.handleExceptions +import akka.http.scaladsl.server.Directives.handleRejections +import akka.http.scaladsl.server.ExceptionHandler +import akka.http.scaladsl.server.RejectionHandler import ch.megard.akka.http.cors.scaladsl.CorsDirectives import org.knora.webapi.http.handler.KnoraExceptionHandler import org.knora.webapi.settings.KnoraSettings 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 53fa94eff0..7cba7abfc0 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 @@ -6,15 +6,23 @@ package org.knora.webapi.http.handler import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.Directives.{complete, extractRequest} +import akka.http.scaladsl.server.Directives.complete +import akka.http.scaladsl.server.Directives.extractRequest import akka.http.scaladsl.server.ExceptionHandler import com.typesafe.scalalogging.LazyLogging -import org.knora.webapi.exceptions.{InternalServerException, RequestRejectedException} -import org.knora.webapi.http.status.{ApiStatusCodesV1, ApiStatusCodesV2} +import org.knora.webapi.exceptions.InternalServerException +import org.knora.webapi.exceptions.RequestRejectedException +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, JsonLDObject, JsonLDString} +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 -import spray.json.{JsNumber, JsObject, JsString, JsValue} +import spray.json.JsNumber +import spray.json.JsObject +import spray.json.JsString +import spray.json.JsValue /** * The Knora exception handler is used by akka-http to convert any exceptions thrown during route processing diff --git a/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesADM.scala b/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesADM.scala index d72027406b..ac340a1175 100644 --- a/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesADM.scala @@ -5,7 +5,8 @@ package org.knora.webapi.http.status -import akka.http.scaladsl.model.{StatusCode, StatusCodes} +import akka.http.scaladsl.model.StatusCode +import akka.http.scaladsl.model.StatusCodes import org.knora.webapi.exceptions._ /** diff --git a/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV1.scala b/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV1.scala index fdf2e6ded8..46d23c3873 100644 --- a/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV1.scala @@ -5,7 +5,8 @@ package org.knora.webapi.http.status -import akka.http.scaladsl.model.{StatusCode, StatusCodes} +import akka.http.scaladsl.model.StatusCode +import akka.http.scaladsl.model.StatusCodes import org.knora.webapi.exceptions._ /** diff --git a/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV2.scala b/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV2.scala index b9be8200ec..6320cd9f14 100644 --- a/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/http/status/ApiStatusCodesV2.scala @@ -5,7 +5,8 @@ package org.knora.webapi.http.status -import akka.http.scaladsl.model.{StatusCode, StatusCodes} +import akka.http.scaladsl.model.StatusCode +import akka.http.scaladsl.model.StatusCodes import org.knora.webapi.exceptions._ /** diff --git a/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala b/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala index 14840bb963..d0215dc7b6 100644 --- a/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala +++ b/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala @@ -9,7 +9,8 @@ import com.typesafe.scalalogging.Logger import kamon.instrumentation.futures.scala.ScalaFutureInstrumentation.trace import org.slf4j.LoggerFactory -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future import scala.util.Success /** 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 cc2451725a..64f9c5b88a 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala @@ -18,30 +18,34 @@ import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants.SalsahGui import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM -import org.knora.webapi.messages.store.triplestoremessages.{ - SparqlAskRequest, - SparqlAskResponse, - StringLiteralSequenceV2, - StringLiteralV2 -} +import org.knora.webapi.messages.store.triplestoremessages.SparqlAskRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlAskResponse +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +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, JavaUtil} +import org.knora.webapi.util.Base64UrlCheckDigit +import org.knora.webapi.util.JavaUtil import spray.json._ import java.nio.ByteBuffer import java.text.ParseException import java.time._ import java.time.format.DateTimeFormatter -import java.time.temporal.{ChronoField, TemporalAccessor} +import java.time.temporal.ChronoField +import java.time.temporal.TemporalAccessor +import java.util.Base64 +import java.util.UUID import java.util.concurrent.ConcurrentHashMap -import java.util.{Base64, UUID} -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.util.Failure +import scala.util.Success +import scala.util.Try import scala.util.control.Exception._ import scala.util.matching.Regex -import scala.util.{Failure, Success, Try} /** * Provides instances of [[StringFormatter]], as well as string formatting constants. @@ -2801,14 +2805,14 @@ class StringFormatter private ( } /** - * Constructs a URL for accessing a file that has been uploaded to Sipi's temporary storage. + * 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 makeSipiTempFileUrl(settings: KnoraSettingsImpl, filename: String): String = - s"${settings.internalSipiBaseUrl}/tmp/$filename" + def makeSipiTempFilePath(settings: KnoraSettingsImpl, 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/admin/responder/groupsmessages/GroupsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala index 707dd65923..d496eb504f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/groupsmessages/GroupsMessagesADM.scala @@ -9,11 +9,16 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.projectsmessages.{ProjectADM, ProjectsADMJsonProtocol} +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 -import spray.json.{DefaultJsonProtocol, JsValue, JsonFormat, RootJsonFormat} +import spray.json.DefaultJsonProtocol +import spray.json.JsValue +import spray.json.JsonFormat +import spray.json.RootJsonFormat import java.util.UUID diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala index ec8e467206..153aadfd02 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADM.scala @@ -10,18 +10,15 @@ import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.{ - ListChildNodeCreatePayloadADM, - ListRootNodeCreatePayloadADM -} +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages.ListsErrorMessagesADM._ import org.knora.webapi.messages.admin.responder.usersmessages._ -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} -import org.knora.webapi.messages.store.triplestoremessages.{ - StringLiteralSequenceV2, - StringLiteralV2, - TriplestoreJsonProtocol -} +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import spray.json._ import java.util.UUID diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala index feeeba99c7..fe90e5ae36 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADM.scala @@ -7,15 +7,17 @@ package org.knora.webapi.messages.admin.responder.permissionsmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, ForbiddenException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.ForbiddenException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.StringFormatter.UUID_INVALID_ERROR +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.traits.Jsonable -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import spray.json._ import java.util.UUID diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesUtilADM.scala index 45fccb23f2..fbf9d052e3 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesUtilADM.scala @@ -6,16 +6,15 @@ package org.knora.webapi.messages.admin.responder.permissionsmessages import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{ApplicationCacheException, BadRequestException} +import org.knora.webapi.exceptions.ApplicationCacheException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.OntologyConstants.KnoraAdmin.AdministrativePermissionAbbreviations -import org.knora.webapi.messages.OntologyConstants.KnoraBase.{ - ChangeRightsPermission, - DeletePermission, - EntityPermissionAbbreviations, - ModifyPermission, - RestrictedViewPermission, - ViewPermission -} +import org.knora.webapi.messages.OntologyConstants.KnoraBase.ChangeRightsPermission +import org.knora.webapi.messages.OntologyConstants.KnoraBase.DeletePermission +import org.knora.webapi.messages.OntologyConstants.KnoraBase.EntityPermissionAbbreviations +import org.knora.webapi.messages.OntologyConstants.KnoraBase.ModifyPermission +import org.knora.webapi.messages.OntologyConstants.KnoraBase.RestrictedViewPermission +import org.knora.webapi.messages.OntologyConstants.KnoraBase.ViewPermission import org.knora.webapi.util.cache.CacheUtil /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala index 11b9f42a24..27cbc0276f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala @@ -8,15 +8,23 @@ package org.knora.webapi.messages.admin.responder.projectsmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.apache.commons.lang3.builder.HashCodeBuilder import org.knora.webapi.IRI -import org.knora.webapi.annotation.{ApiMayChange, ServerUnique} -import org.knora.webapi.exceptions.{BadRequestException, DataConversionException, OntologyConstraintException} +import org.knora.webapi.annotation.ApiMayChange +import org.knora.webapi.annotation.ServerUnique +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DataConversionException +import org.knora.webapi.exceptions.OntologyConstraintException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} -import org.knora.webapi.messages.store.triplestoremessages.{StringLiteralV2, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1 -import spray.json.{DefaultJsonProtocol, JsValue, JsonFormat, RootJsonFormat} +import spray.json.DefaultJsonProtocol +import spray.json.JsValue +import spray.json.JsonFormat +import spray.json.RootJsonFormat import java.nio.file.Path import java.util.UUID diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala index 136bcabbe4..78aef8b082 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala @@ -7,13 +7,15 @@ package org.knora.webapi.messages.admin.responder.sipimessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.projectsmessages.{ - ProjectRestrictedViewSettingsADM, - ProjectsADMJsonProtocol -} +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} -import spray.json.{DefaultJsonProtocol, JsValue, NullOptions, RootJsonFormat} +import spray.json.DefaultJsonProtocol +import spray.json.JsValue +import spray.json.NullOptions +import spray.json.RootJsonFormat /** * An abstract trait representing a Knora v1 API request message that can be sent to `SipiResponderV2`. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala index 0a83f69784..67a2e27e53 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/storesmessages/StoresMessagesADM.scala @@ -7,8 +7,10 @@ package org.knora.webapi.messages.admin.responder.storesmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import spray.json._ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala index b56fa44222..56fa89afe8 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADM.scala @@ -7,16 +7,22 @@ package org.knora.webapi.messages.admin.responder.usersmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, DataConversionException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DataConversionException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.groupsmessages.{GroupADM, GroupsADMJsonProtocol} -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionsADMJsonProtocol, PermissionsDataADM} -import org.knora.webapi.messages.admin.responder.projectsmessages.{ProjectADM, ProjectsADMJsonProtocol} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupADM +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupsADMJsonProtocol +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsADMJsonProtocol +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol import org.knora.webapi.messages.admin.responder.valueObjects._ -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1 import org.knora.webapi.messages.v1.responder.usermessages._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import spray.json._ import java.util.UUID diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ListsValueObjectsADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ListsValueObjectsADM.scala index 8a7181a345..5707bf55cf 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ListsValueObjectsADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ListsValueObjectsADM.scala @@ -9,7 +9,6 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.StringFormatter.UUID_INVALID_ERROR import org.knora.webapi.messages.admin.responder.listsmessages.ListsErrorMessagesADM._ -import org.knora.webapi.messages.admin.responder.valueObjects.GroupIRI.sf import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import zio.prelude.Validation diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ProjectsValueObjectsADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ProjectsValueObjectsADM.scala index 1fd75e5525..b08c22e1e9 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ProjectsValueObjectsADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/ProjectsValueObjectsADM.scala @@ -9,7 +9,6 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.StringFormatter.UUID_INVALID_ERROR import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsErrorMessagesADM._ -import org.knora.webapi.messages.admin.responder.valueObjects.GroupIRI.sf import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import zio.prelude.Validation diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/UsersValueObjectsADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/UsersValueObjectsADM.scala index 89084d8e49..340f198ad1 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/UsersValueObjectsADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/valueObjects/UsersValueObjectsADM.scala @@ -10,7 +10,6 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.StringFormatter.UUID_INVALID_ERROR import org.knora.webapi.messages.admin.responder.usersmessages.UsersErrorMessagesADM._ -import org.knora.webapi.messages.admin.responder.valueObjects.GroupIRI.sf import zio.prelude.Validation import scala.util.matching.Regex diff --git a/webapi/src/main/scala/org/knora/webapi/messages/store/cacheservicemessages/CacheServiceMessages.scala b/webapi/src/main/scala/org/knora/webapi/messages/store/cacheservicemessages/CacheServiceMessages.scala index cfdd896e4d..40dd5a96a3 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/store/cacheservicemessages/CacheServiceMessages.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/store/cacheservicemessages/CacheServiceMessages.scala @@ -5,8 +5,10 @@ package org.knora.webapi.messages.store.cacheservicemessages -import org.knora.webapi.messages.admin.responder.projectsmessages.{ProjectADM, ProjectIdentifierADM} -import org.knora.webapi.messages.admin.responder.usersmessages.{UserADM, UserIdentifierADM} +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.messages.store.StoreRequest sealed trait CacheServiceRequest extends StoreRequest diff --git a/webapi/src/main/scala/org/knora/webapi/messages/store/sipimessages/SipiMessages.scala b/webapi/src/main/scala/org/knora/webapi/messages/store/sipimessages/SipiMessages.scala index 3e944d76a2..4c3bcdbad0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/store/sipimessages/SipiMessages.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/store/sipimessages/SipiMessages.scala @@ -5,10 +5,10 @@ package org.knora.webapi.messages.store.sipimessages +import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.StoreRequest import org.knora.webapi.messages.traits.RequestWithSender -import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import spray.json._ /** @@ -26,10 +26,10 @@ sealed trait SipiRequest extends IIIFRequest { /** * Requests file metadata from Sipi. A successful response is a [[GetFileMetadataResponse]]. * - * @param fileUrl the URL at which Sipi can serve the file. + * @param filePath the path at which Sipi can serve the file. * @param requestingUser the user making the request. */ -case class GetFileMetadataRequest(fileUrl: String, requestingUser: UserADM) extends SipiRequest +case class GetFileMetadataRequest(filePath: String, requestingUser: UserADM) extends SipiRequest /** * Represents file metadata returned by Sipi. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/FusekiAPI.scala b/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/FusekiAPI.scala index 34b1d80b76..a72ca294d4 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/FusekiAPI.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/FusekiAPI.scala @@ -6,7 +6,9 @@ package org.knora.webapi.messages.store.triplestoremessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport -import spray.json.{DefaultJsonProtocol, JsonFormat, RootJsonFormat} +import spray.json.DefaultJsonProtocol +import spray.json.JsonFormat +import spray.json.RootJsonFormat /** * Represents a response from Fuseki about the state of the Fuseki server. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala b/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala index 14005162a0..540b900dd6 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/store/triplestoremessages/TriplestoreMessages.scala @@ -5,9 +5,6 @@ package org.knora.webapi.messages.store.triplestoremessages -import java.nio.file.Path -import java.time.Instant - import akka.event.LoggingAdapter import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.apache.commons.lang3.StringUtils @@ -15,15 +12,21 @@ import org.knora.webapi._ import org.knora.webapi.exceptions._ import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.StoreRequest import org.knora.webapi.messages.store.triplestoremessages.TriplestoreStatus.TriplestoreStatus import org.knora.webapi.messages.util.ErrorHandlingMap import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import spray.json._ +import java.nio.file.Path +import java.time.Instant import scala.collection.mutable -import scala.util.{Failure, Success, Try} +import scala.util.Failure +import scala.util.Success +import scala.util.Try ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Messages diff --git a/webapi/src/main/scala/org/knora/webapi/messages/twirl/ResourceHtmlView.scala b/webapi/src/main/scala/org/knora/webapi/messages/twirl/ResourceHtmlView.scala index 3227f5f265..b135b020a2 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/twirl/ResourceHtmlView.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/twirl/ResourceHtmlView.scala @@ -11,13 +11,18 @@ import akka.util.Timeout import com.typesafe.scalalogging.Logger import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.KnoraSystemInstances -import org.knora.webapi.messages.v1.responder.listmessages.{NodePathGetRequestV1, NodePathGetResponseV1} +import org.knora.webapi.messages.v1.responder.listmessages.NodePathGetRequestV1 +import org.knora.webapi.messages.v1.responder.listmessages.NodePathGetResponseV1 import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceFullResponseV1 -import org.knora.webapi.messages.v1.responder.valuemessages.{DateValueV1, HierarchicalListValueV1, LinkV1, TextValueV1} +import org.knora.webapi.messages.v1.responder.valuemessages.DateValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.HierarchicalListValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.LinkV1 +import org.knora.webapi.messages.v1.responder.valuemessages.TextValueV1 import org.slf4j.LoggerFactory import scala.concurrent.Await -import scala.concurrent.duration.{Duration, SECONDS} +import scala.concurrent.duration.Duration +import scala.concurrent.duration.SECONDS /** * Provides an HTML view of a resource. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/twirl/SparqlTemplateResourceToCreate.scala b/webapi/src/main/scala/org/knora/webapi/messages/twirl/SparqlTemplateResourceToCreate.scala index 15131c349c..bb413ee07e 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/twirl/SparqlTemplateResourceToCreate.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/twirl/SparqlTemplateResourceToCreate.scala @@ -5,10 +5,10 @@ package org.knora.webapi.messages.twirl -import java.time.Instant - import org.knora.webapi._ +import java.time.Instant + /** * Represents a resource to be created with its index, label, IRI, permissions, and SPARQL for creating its values * diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/CalendarDateUtilV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/CalendarDateUtilV2.scala index bada28d739..8cf5727222 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/CalendarDateUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/CalendarDateUtilV2.scala @@ -5,12 +5,13 @@ package org.knora.webapi.messages.util -import java.util.Date - import com.ibm.icu.util._ -import org.knora.webapi.exceptions.{AssertionException, BadRequestException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter +import java.util.Date + /** * Indicates the era (CE or BCE) in Gregorian and Julian calendar dates. */ 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 b8f48fba76..bba5f265f6 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 @@ -5,42 +5,44 @@ package org.knora.webapi.messages.util -import java.time.Instant -import java.util.UUID - import akka.actor.ActorRef import akka.http.scaladsl.util.FastFuture import akka.pattern.ask import akka.util.Timeout import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, InconsistentRepositoryDataException, NotImplementedException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException +import org.knora.webapi.exceptions.NotImplementedException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.admin.responder.projectsmessages.{ - ProjectGetRequestADM, - ProjectGetResponseADM, - ProjectIdentifierADM -} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +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.messages.store.triplestoremessages.SparqlExtendedConstructResponse.ConstructPredicateObjects import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.PermissionUtilADM.EntityPermission import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 -import org.knora.webapi.messages.v2.responder.listsmessages.{NodeGetRequestV2, NodeGetResponseV2} +import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetRequestV2 +import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetResponseV2 import org.knora.webapi.messages.v2.responder.ontologymessages.StandoffEntityInfoGetResponseV2 -import org.knora.webapi.messages.v2.responder.resourcemessages.{ReadResourceV2, ReadResourcesSequenceV2} -import org.knora.webapi.messages.v2.responder.standoffmessages.{ - GetRemainingStandoffFromTextValueRequestV2, - GetStandoffResponseV2, - MappingXMLtoStandoff, - StandoffTagV2 -} +import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourceV2 +import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourcesSequenceV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.GetRemainingStandoffFromTextValueRequestV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.GetStandoffResponseV2 +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.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.ActorUtil -import scala.concurrent.{ExecutionContext, Future} +import java.time.Instant +import java.util.UUID +import scala.concurrent.ExecutionContext +import scala.concurrent.Future object ConstructResponseUtilV2 { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/DateUtilV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/DateUtilV1.scala index a431387f77..1e971453b7 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/DateUtilV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/DateUtilV1.scala @@ -5,17 +5,18 @@ package org.knora.webapi.messages.util -import java.util.{Calendar, Date, GregorianCalendar} - import jodd.datetime.JDateTime -import org.knora.webapi.exceptions.{AssertionException, BadRequestException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.v1.responder.valuemessages.{ - DateValueV1, - JulianDayNumberValueV1, - KnoraCalendarV1, - KnoraPrecisionV1 -} +import org.knora.webapi.messages.v1.responder.valuemessages.DateValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.JulianDayNumberValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.KnoraCalendarV1 +import org.knora.webapi.messages.v1.responder.valuemessages.KnoraPrecisionV1 + +import java.util.Calendar +import java.util.Date +import java.util.GregorianCalendar /** * Utility functions for converting dates. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/FakeTriplestore.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/FakeTriplestore.scala index ba5fababd4..cabd9a66dc 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/FakeTriplestore.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/FakeTriplestore.scala @@ -5,12 +5,12 @@ package org.knora.webapi.messages.util -import java.nio.file.{Files, Path} - import akka.event.LoggingAdapter import org.apache.commons.io.FileUtils import org.knora.webapi.util.FileUtil +import java.nio.file.Files +import java.nio.file.Path import scala.jdk.CollectionConverters._ /** 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 c1e6b8e255..7e86a5058c 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 @@ -5,13 +5,12 @@ package org.knora.webapi.messages.util -import java.time.Instant - import org.apache.commons.text.StringEscapeUtils import org.knora.webapi.OntologySchema import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality +import java.time.Instant import scala.reflect.runtime.{universe => ru} /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala index cba68ed089..724f5ae61f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/PermissionUtilADM.scala @@ -10,18 +10,25 @@ import akka.pattern.ask import akka.util.Timeout import com.typesafe.scalalogging.LazyLogging import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{BadRequestException, InconsistentRepositoryDataException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.groupsmessages.{GroupGetResponseADM, MultipleGroupsGetRequestADM} -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionADM, PermissionType} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupGetResponseADM +import org.knora.webapi.messages.admin.responder.groupsmessages.MultipleGroupsGetRequestADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionType import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.store.triplestoremessages.LiteralV2 import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstructResponse.ConstructPredicateObjects -import org.knora.webapi.messages.store.triplestoremessages.{LiteralV2, SparqlExtendedConstructResponse} -import org.knora.webapi.messages.util.GroupedProps.{ValueLiterals, ValueProps} +import org.knora.webapi.messages.util.GroupedProps.ValueLiterals +import org.knora.webapi.messages.util.GroupedProps.ValueProps import org.knora.webapi.messages.v1.responder.usermessages.UserProfileV1 -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * A utility that responder actors use to determine a user's permissions on an RDF entity in the triplestore. 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 d831fa7569..27ba9f8d28 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 @@ -5,7 +5,8 @@ package org.knora.webapi.messages.util -import akka.actor.{ActorRef, ActorSystem} +import akka.actor.ActorRef +import akka.actor.ActorSystem import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala index 4ea3469b36..57cbdee1f3 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/UserUtilADM.scala @@ -15,7 +15,8 @@ import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages._ -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * Utility functions for working with users. 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 a673d8a20e..f78d626939 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 @@ -9,29 +9,27 @@ import akka.actor.ActorRef import akka.pattern._ import akka.util.Timeout import org.knora.webapi._ -import org.knora.webapi.exceptions.{ - InconsistentRepositoryDataException, - NotImplementedException, - OntologyConstraintException -} +import org.knora.webapi.exceptions.InconsistentRepositoryDataException +import org.knora.webapi.exceptions.NotImplementedException +import org.knora.webapi.exceptions.OntologyConstraintException import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.GroupedProps._ import org.knora.webapi.messages.util.rdf.VariableResultsRow import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 import org.knora.webapi.messages.v1.responder.ontologymessages._ -import org.knora.webapi.messages.v1.responder.resourcemessages.{ - LiteralValueType, - LocationV1, - ResourceCreateValueObjectResponseV1, - ResourceCreateValueResponseV1 -} +import org.knora.webapi.messages.v1.responder.resourcemessages.LiteralValueType +import org.knora.webapi.messages.v1.responder.resourcemessages.LocationV1 +import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceCreateValueObjectResponseV1 +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.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * Converts data from SPARQL query results into [[ApiValueV1]] objects. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/AbstractShaclValidator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/AbstractShaclValidator.scala index 13e187eef0..9c16f95ee4 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/AbstractShaclValidator.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/AbstractShaclValidator.scala @@ -5,11 +5,11 @@ package org.knora.webapi.messages.util.rdf +import org.knora.webapi.exceptions.AssertionException + import java.nio.file._ import java.nio.file.attribute.BasicFileAttributes -import org.knora.webapi.exceptions.AssertionException - /** * An abstract base class for classes that validate RDF models using SHACL shapes. * diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/JsonLDUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/JsonLDUtil.scala index 9ced9b6276..bad2a6cef2 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/JsonLDUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/JsonLDUtil.scala @@ -13,10 +13,13 @@ import org.apache.commons.lang3.builder.HashCodeBuilder import org.knora.webapi._ import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} -import java.io.{StringReader, StringWriter} +import java.io.StringReader +import java.io.StringWriter import java.util import java.util.UUID import scala.jdk.CollectionConverters._ 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 59f2f5a8ed..548a44106c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala @@ -6,7 +6,8 @@ package org.knora.webapi.messages.util.rdf import org.knora.webapi.exceptions.AssertionException -import org.knora.webapi.feature.{FeatureFactory, FeatureFactoryConfig} +import org.knora.webapi.feature.FeatureFactory +import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.util.rdf.jenaimpl._ import org.knora.webapi.messages.util.rdf.rdf4jimpl._ import org.knora.webapi.settings.KnoraSettingsImpl diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala index e60995f262..a35818386a 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtil.scala @@ -5,14 +5,23 @@ package org.knora.webapi.messages.util.rdf -import java.io.{BufferedInputStream, BufferedOutputStream, InputStream, OutputStream} -import java.nio.file.{Files, Path} - import akka.http.scaladsl.model.MediaType -import org.knora.webapi.exceptions.{BadRequestException, InvalidRdfException} -import org.knora.webapi.{IRI, RdfMediaTypes, SchemaOption, SchemaOptions} - -import scala.util.{Failure, Success, Try} +import org.knora.webapi.IRI +import org.knora.webapi.RdfMediaTypes +import org.knora.webapi.SchemaOption +import org.knora.webapi.SchemaOptions +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.InvalidRdfException + +import java.io.BufferedInputStream +import java.io.BufferedOutputStream +import java.io.InputStream +import java.io.OutputStream +import java.nio.file.Files +import java.nio.file.Path +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * A trait for supported RDF formats. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala index db5a415019..b3b520e4b2 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtil.scala @@ -5,14 +5,18 @@ package org.knora.webapi.messages.util.rdf.jenaimpl -import java.io.{InputStream, OutputStream, StringReader, StringWriter} - import org.apache.jena import org.knora.webapi.IRI import org.knora.webapi.feature.Feature import org.knora.webapi.messages.util.rdf._ -import scala.util.{Failure, Success, Try} +import java.io.InputStream +import java.io.OutputStream +import java.io.StringReader +import java.io.StringWriter +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * Wraps an [[RdfStreamProcessor]] in a [[jena.riot.system.StreamRDF]]. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala index c4a7a95695..d72b3e9d80 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala @@ -13,8 +13,8 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.ErrorHandlingMap import org.knora.webapi.messages.util.rdf._ -import scala.jdk.CollectionConverters._ import scala.collection.mutable.ArrayBuffer +import scala.jdk.CollectionConverters._ sealed trait JenaNode extends RdfNode { def node: jena.graph.Node diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidator.scala index 67a8ed8c08..49d0c78363 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidator.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidator.scala @@ -5,12 +5,12 @@ package org.knora.webapi.messages.util.rdf.jenaimpl -import java.nio.file.Path - import org.apache.jena import org.apache.jena.query.DatasetFactory import org.knora.webapi.messages.util.rdf._ +import java.nio.file.Path + /** * Performs SHACL validation using Jena. * diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala index 95fa46f321..935e7296a0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtil.scala @@ -5,14 +5,18 @@ package org.knora.webapi.messages.util.rdf.rdf4jimpl -import java.io.{InputStream, OutputStream, StringReader, StringWriter} - import org.eclipse.rdf4j import org.knora.webapi.IRI import org.knora.webapi.feature.Feature import org.knora.webapi.messages.util.rdf._ -import scala.util.{Failure, Success, Try} +import java.io.InputStream +import java.io.OutputStream +import java.io.StringReader +import java.io.StringWriter +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * Wraps an [[RdfStreamProcessor]] in an [[rdf4j.rio.RDFHandler]]. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala index 146a05a527..9de7b6ad58 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JModel.scala @@ -13,8 +13,8 @@ import org.knora.webapi.messages.util.ErrorHandlingMap import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.util.JavaUtil._ -import scala.jdk.CollectionConverters._ import scala.collection.mutable.ArrayBuffer +import scala.jdk.CollectionConverters._ sealed trait RDF4JNode extends RdfNode { def rdf4jValue: rdf4j.model.Value diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala index 0972a63cf9..d56a5298ef 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidator.scala @@ -5,12 +5,13 @@ package org.knora.webapi.messages.util.rdf.rdf4jimpl -import java.nio.file.Path - import org.eclipse.rdf4j import org.knora.webapi.messages.util.rdf._ -import scala.util.{Failure, Success, Try} +import java.nio.file.Path +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * Performs SHACL validation using RDF4J. 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 d194097782..76bef5b3a3 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 @@ -7,7 +7,8 @@ package org.knora.webapi.messages.util.search import org.knora.webapi._ import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.settings.KnoraSettingsImpl object FullTextMainQueryGenerator { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/MainQueryResultProcessor.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/MainQueryResultProcessor.scala index 3ba44593bf..4c2db7ee5f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/MainQueryResultProcessor.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/MainQueryResultProcessor.scala @@ -8,17 +8,16 @@ package org.knora.webapi.messages.util.search import org.knora.webapi._ import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.ConstructResponseUtilV2 -import org.knora.webapi.messages.util.ConstructResponseUtilV2.{ - RdfPropertyValues, - RdfResources, - ResourceWithValueRdfData, - ValueRdfData -} +import org.knora.webapi.messages.util.ConstructResponseUtilV2.RdfPropertyValues +import org.knora.webapi.messages.util.ConstructResponseUtilV2.RdfResources +import org.knora.webapi.messages.util.ConstructResponseUtilV2.ResourceWithValueRdfData +import org.knora.webapi.messages.util.ConstructResponseUtilV2.ValueRdfData import org.knora.webapi.messages.util.search.gravsearch.mainquery.GravsearchMainQueryGenerator.ValueObjectVariablesAndValueObjectIris import org.knora.webapi.messages.util.search.gravsearch.prequery.NonTriplestoreSpecificGravsearchToPrequeryTransformer import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionResult -import org.knora.webapi.messages.{SmartIri, StringFormatter} object MainQueryResultProcessor { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlQuery.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlQuery.scala index 23790d69b5..d337168153 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlQuery.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlQuery.scala @@ -5,11 +5,15 @@ package org.knora.webapi.messages.util.search -import akka.http.scaladsl.model.{HttpCharsets, MediaType} +import akka.http.scaladsl.model.HttpCharsets +import akka.http.scaladsl.model.MediaType import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.util.ApacheLuceneSupport.LuceneQueryString /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlTransformer.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlTransformer.scala index cc15b5dd54..1ce3ccdd29 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlTransformer.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/SparqlTransformer.scala @@ -6,9 +6,12 @@ package org.knora.webapi.messages.util.search import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter /** * Methods and classes for transforming generated SPARQL. 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 12e718feba..60d2bc98e9 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 @@ -6,14 +6,17 @@ package org.knora.webapi.messages.util.search.gravsearch import org.eclipse.rdf4j +import org.eclipse.rdf4j.query.MalformedQueryException +import org.eclipse.rdf4j.query.algebra +import org.eclipse.rdf4j.query.parser.QueryParser import org.eclipse.rdf4j.query.parser.sparql._ -import org.eclipse.rdf4j.query.parser.{ParsedQuery, QueryParser} -import org.eclipse.rdf4j.query.{MalformedQueryException, algebra} import org.knora.webapi._ import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import scala.jdk.CollectionConverters._ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchQueryChecker.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchQueryChecker.scala index 5477bd4e7d..40e9f146e0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchQueryChecker.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchQueryChecker.scala @@ -6,15 +6,14 @@ package org.knora.webapi.messages.util.search.gravsearch import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.OntologyConstants -import org.knora.webapi.messages.util.search.gravsearch.types.{ - GravsearchEntityTypeInfo, - GravsearchTypeInspectionResult, - NonPropertyTypeInfo, - PropertyTypeInfo -} import org.knora.webapi.messages.util.search._ +import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchEntityTypeInfo +import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionResult +import org.knora.webapi.messages.util.search.gravsearch.types.NonPropertyTypeInfo +import org.knora.webapi.messages.util.search.gravsearch.types.PropertyTypeInfo object GravsearchQueryChecker { 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 5c13a695c8..5b55e87eb0 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 @@ -8,14 +8,14 @@ package org.knora.webapi.messages.util.search.gravsearch.mainquery import org.knora.webapi._ import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.ErrorHandlingMap -import org.knora.webapi.messages.util.rdf.{SparqlSelectResult, VariableResultsRow} -import org.knora.webapi.messages.util.search.gravsearch.prequery.{ - AbstractPrequeryGenerator, - NonTriplestoreSpecificGravsearchToPrequeryTransformer -} +import org.knora.webapi.messages.util.rdf.SparqlSelectResult +import org.knora.webapi.messages.util.rdf.VariableResultsRow import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} +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 { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/AbstractPrequeryGenerator.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/AbstractPrequeryGenerator.scala index 1573043dbd..9a030241d6 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/AbstractPrequeryGenerator.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/AbstractPrequeryGenerator.scala @@ -8,11 +8,13 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import org.knora.webapi._ import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.util.search.gravsearch.GravsearchQueryChecker import org.knora.webapi.messages.util.search.gravsearch.types._ import org.knora.webapi.messages.v2.responder.valuemessages.DateValueContentV2 -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.util.ApacheLuceneSupport.LuceneQueryString import scala.collection.mutable diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala index 110393fafd..1b96e43a22 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/GravsearchQueryOptimisationFactory.scala @@ -6,14 +6,15 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import org.knora.webapi.ApiV2Schema -import org.knora.webapi.feature.{Feature, FeatureFactory, FeatureFactoryConfig} +import org.knora.webapi.feature.Feature +import org.knora.webapi.feature.FeatureFactory +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.util.search.gravsearch.types.{ - GravsearchTypeInspectionResult, - GravsearchTypeInspectionUtil, - TypeableEntity -} -import org.knora.webapi.messages.{OntologyConstants, SmartIri} +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.TypeableEntity import scalax.collection.Graph import scalax.collection.GraphEdge.DiHyperEdge 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 247aaea721..e423b7e397 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 @@ -6,15 +6,14 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.util.search.gravsearch.types.{ - GravsearchTypeInspectionResult, - GravsearchTypeInspectionUtil, - NonPropertyTypeInfo, - PropertyTypeInfo -} +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 /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/TopologicalSortUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/TopologicalSortUtil.scala index ef8fb34587..fcf2594118 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/TopologicalSortUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/prequery/TopologicalSortUtil.scala @@ -8,8 +8,6 @@ package org.knora.webapi.messages.util.search.gravsearch.prequery import scalax.collection.Graph import scalax.collection.GraphEdge.DiHyperEdge -import scala.collection.mutable - /** * A utility for finding all topological orders of a graph. * Based on [[https://github.com/scala-graph/scala-graph/issues/129#issuecomment-485398400]]. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/AnnotationReadingGravsearchTypeInspector.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/AnnotationReadingGravsearchTypeInspector.scala index c6d63c506b..f3c3394a07 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/AnnotationReadingGravsearchTypeInspector.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/AnnotationReadingGravsearchTypeInspector.scala @@ -6,15 +6,15 @@ package org.knora.webapi.messages.util.search.gravsearch.types import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} -import org.knora.webapi.messages.{OntologyConstants, SmartIri} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil.{ - TypeAnnotationProperties, - TypeAnnotationProperty -} +import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil.TypeAnnotationProperties +import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil.TypeAnnotationProperty import scala.concurrent.Future diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionResult.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionResult.scala index ef35fcab94..39091726b5 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionResult.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionResult.scala @@ -6,7 +6,9 @@ package org.knora.webapi.messages.util.search.gravsearch.types import org.knora.webapi.messages.SmartIri -import org.knora.webapi.messages.util.search.{Entity, IriRef, QueryVariable} +import org.knora.webapi.messages.util.search.Entity +import org.knora.webapi.messages.util.search.IriRef +import org.knora.webapi.messages.util.search.QueryVariable /** * Represents the type information that was found concerning a Gravsearch entity. 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 b93b6ebf9e..5e995e6880 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 @@ -6,13 +6,15 @@ package org.knora.webapi.messages.util.search.gravsearch.types import org.knora.webapi.exceptions.GravsearchException +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.settings.KnoraDispatchers -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * Runs Gravsearch type inspection using one or more type inspector implementations. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionUtil.scala index 4e0d198eb6..3e99e75594 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/GravsearchTypeInspectionUtil.scala @@ -6,9 +6,11 @@ package org.knora.webapi.messages.util.search.gravsearch.types import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri} /** * Utilities for Gravsearch type inspection. 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 c9887754bf..d073d2ab56 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 @@ -10,9 +10,12 @@ import akka.util.Timeout 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, KnoraSettings, KnoraSettingsImpl} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * An trait whose implementations can get type information from a parsed Gravsearch query in different ways. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/InferringGravsearchTypeInspector.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/InferringGravsearchTypeInspector.scala index 34c54a9c3b..7ea04e50dd 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/InferringGravsearchTypeInspector.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/InferringGravsearchTypeInspector.scala @@ -5,22 +5,24 @@ package org.knora.webapi.messages.util.search.gravsearch.types -import akka.event.{LogSource, LoggingAdapter} +import akka.event.LogSource +import akka.event.LoggingAdapter import akka.pattern._ import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, GravsearchException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.v2.responder.KnoraReadV2 -import org.knora.webapi.messages.v2.responder.ontologymessages.{ - EntityInfoGetRequestV2, - EntityInfoGetResponseV2, - ReadClassInfoV2, - ReadPropertyInfoV2 -} -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import org.knora.webapi.messages.v2.responder.ontologymessages.EntityInfoGetRequestV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.EntityInfoGetResponseV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.ReadClassInfoV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.ReadPropertyInfoV2 import scala.annotation.tailrec import scala.concurrent.Future diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/IntermediateTypeInspectionResult.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/IntermediateTypeInspectionResult.scala index 86867f21e3..6f73ad6cc7 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/IntermediateTypeInspectionResult.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/search/gravsearch/types/IntermediateTypeInspectionResult.scala @@ -8,7 +8,8 @@ package org.knora.webapi.messages.util.search.gravsearch.types import org.knora.webapi.IRI import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter /** * Represents an intermediate result during type inspection. This is different from [[GravsearchTypeInspectionResult]] 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 1cd670a466..55e635c527 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 @@ -12,24 +12,26 @@ import akka.util.Timeout import org.knora.webapi.IRI import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.store.triplestoremessages.{LiteralV2, SmartIriLiteralV2} +import org.knora.webapi.messages.store.triplestoremessages.LiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.SmartIriLiteralV2 import org.knora.webapi.messages.util.DateUtilV1 -import org.knora.webapi.messages.v1.responder.valuemessages.{ - JulianDayNumberValueV1, - KnoraCalendarV1, - KnoraPrecisionV1, - UpdateValueV1 -} +import org.knora.webapi.messages.v1.responder.valuemessages.JulianDayNumberValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.KnoraCalendarV1 +import org.knora.webapi.messages.v1.responder.valuemessages.KnoraPrecisionV1 +import org.knora.webapi.messages.v1.responder.valuemessages.UpdateValueV1 import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo import org.knora.webapi.messages.v2.responder.ontologymessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl import java.time.Instant import java.util.UUID -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future object StandoffTagUtilV2 { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtil.scala index 7369ed5071..8b75ba65ec 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtil.scala @@ -5,20 +5,20 @@ package org.knora.webapi.messages.util.standoff -import java.io.{StringReader, StringWriter} -import java.util.UUID - import akka.event.LoggingAdapter import com.sksamuel.diffpatch.DiffMatchPatch import com.sksamuel.diffpatch.DiffMatchPatch._ -import javax.xml.parsers.SAXParserFactory -import javax.xml.transform.stream.StreamSource import org.apache.commons.text.StringEscapeUtils import org.knora.webapi._ import org.knora.webapi.exceptions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.ErrorHandlingMap +import java.io.StringReader +import java.io.StringWriter +import java.util.UUID +import javax.xml.parsers.SAXParserFactory +import javax.xml.transform.stream.StreamSource import scala.xml._ /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLUtil.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLUtil.scala index 5e74b2c81f..c36c2f3b24 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/standoff/XMLUtil.scala @@ -5,12 +5,13 @@ package org.knora.webapi.messages.util.standoff -import java.io.{StringReader, StringWriter} - -import javax.xml.transform.stream.StreamSource import net.sf.saxon.s9api.XsltExecutable import org.knora.webapi.exceptions.StandoffConversionException +import java.io.StringReader +import java.io.StringWriter +import javax.xml.transform.stream.StreamSource + object XMLUtil { /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala index 728cf5f67b..9ca1051b17 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ckanmessages/CkanMessagesV1.scala @@ -8,7 +8,8 @@ package org.knora.webapi.messages.v1.responder.ckanmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import spray.json._ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/listmessages/ListMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/listmessages/ListMessagesV1.scala index 096a77f6b2..4d25823e19 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/listmessages/ListMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/listmessages/ListMessagesV1.scala @@ -7,8 +7,9 @@ package org.knora.webapi.messages.v1.responder.listmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v1.responder.usermessages.UserProfileV1 -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} import spray.json._ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala index 1755dd7372..d8b193e927 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/ontologymessages/OntologyMessagesV1.scala @@ -9,13 +9,17 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo -import org.knora.webapi.messages.v2.responder.ontologymessages.{EntityInfoContentV2, ReadClassInfoV2, _} +import org.knora.webapi.messages.v2.responder.ontologymessages.EntityInfoContentV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.ReadClassInfoV2 +import org.knora.webapi.messages.v2.responder.ontologymessages._ import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffDataTypeClasses -import org.knora.webapi.messages.{SmartIri, StringFormatter} import spray.json._ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala index 1de3bf65af..f358927128 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/projectmessages/ProjectMessagesV1.scala @@ -8,9 +8,14 @@ package org.knora.webapi.messages.v1.responder.projectmessages import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v1.responder.usermessages.UserProfileV1 -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} -import spray.json.{DefaultJsonProtocol, JsValue, JsonFormat, NullOptions, RootJsonFormat} +import spray.json.DefaultJsonProtocol +import spray.json.JsValue +import spray.json.JsonFormat +import spray.json.NullOptions +import spray.json.RootJsonFormat ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // API requests diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala index 8342b9d784..298bc238a2 100755 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/resourcemessages/ResourceMessagesV1.scala @@ -5,26 +5,25 @@ package org.knora.webapi.messages.v1.responder.resourcemessages -import java.time.Instant -import java.util.UUID - import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ -import org.knora.webapi.exceptions.{ - BadRequestException, - DataConversionException, - InconsistentRepositoryDataException, - InvalidApiJsonException -} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DataConversionException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException +import org.knora.webapi.exceptions.InvalidApiJsonException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v1.responder.valuemessages._ -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} import org.knora.webapi.messages.v2.responder.UpdateResultInProject import spray.json._ +import java.time.Instant +import java.util.UUID + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // API requests diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/searchmessages/SearchMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/searchmessages/SearchMessagesV1.scala index b79fe3d37f..65bc6b1aa8 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/searchmessages/SearchMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/searchmessages/SearchMessagesV1.scala @@ -9,7 +9,8 @@ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import spray.json._ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala index db4ba11d77..fc65645a27 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/standoffmessages/StandoffMessagesV1.scala @@ -5,17 +5,18 @@ package org.knora.webapi.messages.v1.responder.standoffmessages -import java.util.UUID - import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi.IRI import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v1.responder.ontologymessages.StandoffEntityInfoGetResponseV1 -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} import org.knora.webapi.messages.v2.responder.standoffmessages.MappingXMLtoStandoff import spray.json._ +import java.util.UUID + /** * An abstract trait representing a Knora v1 API request message that can be sent to `StandoffResponderV1`. */ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala index fed979f56f..15b1d1191d 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/usermessages/UserMessagesV1.scala @@ -5,18 +5,22 @@ package org.knora.webapi.messages.v1.responder.usermessages -import java.util.UUID - import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, InconsistentRepositoryDataException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionsADMJsonProtocol, PermissionsDataADM} -import org.knora.webapi.messages.v1.responder.projectmessages.{ProjectInfoV1, ProjectV1JsonProtocol} +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsADMJsonProtocol +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 +import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1 +import org.knora.webapi.messages.v1.responder.projectmessages.ProjectV1JsonProtocol import org.knora.webapi.messages.v1.responder.usermessages.UserProfileTypeV1.UserProfileType -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} import spray.json._ +import java.util.UUID + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // API requests diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala index 3151bf8fc7..4b6cacbfe8 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v1/responder/valuemessages/ValueMessagesV1.scala @@ -5,26 +5,29 @@ package org.knora.webapi.messages.v1.responder.valuemessages -import java.time.Instant -import java.util.UUID - import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, InconsistentRepositoryDataException, NotImplementedException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.traits.Jsonable import org.knora.webapi.messages.util.DateUtilV1 import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 import org.knora.webapi.messages.v1.responder.resourcemessages.LocationV1 -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} import org.knora.webapi.messages.v2.responder.UpdateResultInProject import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import spray.json._ +import java.time.Instant +import java.util.UUID + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // API requests 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 5c2a101773..2fb98b31ef 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 @@ -5,17 +5,20 @@ package org.knora.webapi.messages.v2.responder -import java.util.UUID - import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.util.Timeout import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, RdfFeatureFactory, RdfModel, Turtle} +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 -import scala.concurrent.{ExecutionContext, Future} +import java.util.UUID +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * A tagging trait for messages that can be sent to Knora API v2 responders. 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 0bb2761830..d185b4eab4 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 @@ -5,16 +5,15 @@ package org.knora.webapi.messages.v2.responder -import org.knora.webapi.{ - ApiV2Complex, - ApiV2Schema, - ApiV2Simple, - InternalSchema, - OntologySchema, - SchemaOption, - SchemaOptions -} -import org.knora.webapi.exceptions.{AssertionException, BadRequestException} +import org.knora.webapi.ApiV2Complex +import org.knora.webapi.ApiV2Schema +import org.knora.webapi.ApiV2Simple +import org.knora.webapi.InternalSchema +import org.knora.webapi.OntologySchema +import org.knora.webapi.SchemaOption +import org.knora.webapi.SchemaOptions +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM 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 674e56ca52..df8b962fcf 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 @@ -8,13 +8,16 @@ package org.knora.webapi.messages.v2.responder.listsmessages import org.knora.webapi._ import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.store.triplestoremessages.{StringLiteralSequenceV2, StringLiteralV2} +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +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, KnoraRequestV2} -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} +import org.knora.webapi.messages.v2.responder.KnoraJsonLDResponseV2 +import org.knora.webapi.messages.v2.responder.KnoraRequestV2 import org.knora.webapi.settings.KnoraSettingsImpl /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2ComplexTransformationRules.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2ComplexTransformationRules.scala index 404136f2c5..7944f6871f 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2ComplexTransformationRules.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2ComplexTransformationRules.scala @@ -7,9 +7,13 @@ package org.knora.webapi.messages.v2.responder.ontologymessages import org.knora.webapi._ import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.store.triplestoremessages.{OntologyLiteralV2, SmartIriLiteralV2, StringLiteralV2} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.store.triplestoremessages.OntologyLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.SmartIriLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} /** * Rules for converting `knora-base` (or an ontology based on it) into `knora-api` in the [[ApiV2Complex]] schema. diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2SimpleTransformationRules.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2SimpleTransformationRules.scala index 14d49cce70..30858041e0 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2SimpleTransformationRules.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/KnoraBaseToApiV2SimpleTransformationRules.scala @@ -7,9 +7,13 @@ package org.knora.webapi.messages.v2.responder.ontologymessages import org.knora.webapi._ import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.store.triplestoremessages.{OntologyLiteralV2, SmartIriLiteralV2, StringLiteralV2} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.store.triplestoremessages.OntologyLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.SmartIriLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} /** * Rules for converting `knora-base` (or an ontology based on it) into `knora-api` in the [[ApiV2Simple]] schema. 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 fbb13cbb10..5098489636 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 @@ -6,6 +6,16 @@ package org.knora.webapi package messages.v2.responder.ontologymessages +import akka.actor.ActorRef +import akka.event.LoggingAdapter +import akka.util.Timeout +import org.apache.commons.lang3.builder.HashCodeBuilder + +import java.time.Instant +import java.util.UUID +import scala.concurrent.ExecutionContext +import scala.concurrent.Future + import exceptions.{ AssertionException, BadRequestException, @@ -23,15 +33,6 @@ import messages.v2.responder.standoffmessages.StandoffDataTypeClasses import messages.{OntologyConstants, SmartIri, StringFormatter} import settings.KnoraSettingsImpl -import akka.actor.ActorRef -import akka.event.LoggingAdapter -import akka.util.Timeout -import org.apache.commons.lang3.builder.HashCodeBuilder - -import java.time.Instant -import java.util.UUID -import scala.concurrent.{ExecutionContext, Future} - /** * An abstract trait for messages that can be sent to `ResourcesResponderV2`. */ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyTransformationRules.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyTransformationRules.scala index 2de392227f..1e9a4b1257 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyTransformationRules.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyTransformationRules.scala @@ -5,9 +5,11 @@ package org.knora.webapi.messages.v2.responder.ontologymessages +import org.knora.webapi.ApiV2Complex +import org.knora.webapi.ApiV2Schema +import org.knora.webapi.ApiV2Simple +import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo -import org.knora.webapi.messages.{OntologyConstants, SmartIri} -import org.knora.webapi.{ApiV2Complex, ApiV2Schema, ApiV2Simple} /** * A trait for objects that provide rules for converting an ontology from the internal schema to an external schema. 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 a86acd610b..8b8a106fcb 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 @@ -5,8 +5,6 @@ package org.knora.webapi.messages.v2.responder.resourcemessages -import java.time.Instant -import java.util.UUID import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.pattern._ @@ -15,26 +13,29 @@ import org.knora.webapi._ import org.knora.webapi.exceptions._ import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.StringFormatter.UUID_INVALID_ERROR -import org.knora.webapi.messages.admin.responder.projectsmessages.{ - ProjectADM, - ProjectGetRequestADM, - ProjectGetResponseADM, - ProjectIdentifierADM -} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +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.messages.util.PermissionUtilADM.EntityPermission import org.knora.webapi.messages.util._ import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.util.standoff.{StandoffTagUtilV2, XMLUtil} +import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 +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.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util._ -import scala.concurrent.{ExecutionContext, Future} +import java.time.Instant +import java.util.UUID +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * An abstract trait for messages that can be sent to `ResourcesResponderV2`. 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 07dfbf02d4..13eb2731f1 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 @@ -5,14 +5,20 @@ package org.knora.webapi.messages.v2.responder.searchmessages +import org.knora.webapi.ApiV2Schema +import org.knora.webapi.IRI +import org.knora.webapi.SchemaOption import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDInt, JsonLDObject, JsonLDString} +import org.knora.webapi.messages.util.rdf.JsonLDDocument +import org.knora.webapi.messages.util.rdf.JsonLDInt +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.messages.{OntologyConstants, SmartIri} import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.{ApiV2Schema, IRI, SchemaOption} /** * An abstract trait for messages that can be sent to `SearchResponderV2`. 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 65f2e9d9c0..bad8d91501 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 @@ -5,9 +5,6 @@ package org.knora.webapi.messages.v2.responder.standoffmessages -import java.time.Instant -import java.util.UUID - import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.util.Timeout @@ -15,20 +12,23 @@ import org.knora.webapi._ import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.rdf._ +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.KnoraRequestV2 import org.knora.webapi.messages.v2.responder.ontologymessages.StandoffEntityInfoGetResponseV2 -import org.knora.webapi.messages.v2.responder.{ - KnoraContentV2, - KnoraJsonLDRequestReaderV2, - KnoraJsonLDResponseV2, - KnoraRequestV2 -} -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl +import java.time.Instant +import java.util.UUID import scala.collection.immutable.SortedSet -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * An abstract trait representing a Knora v2 API request message that can be sent to `StandoffResponderV2`. 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 79dc42772e..d82bfb67f9 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 @@ -5,34 +5,42 @@ package org.knora.webapi.messages.v2.responder.valuemessages -import java.time.Instant -import java.util.UUID import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.http.scaladsl.util.FastFuture import akka.pattern._ import akka.util.Timeout import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, BadRequestException, NotImplementedException, SipiException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.NotImplementedException +import org.knora.webapi.exceptions.SipiException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.StringFormatter.UUID_INVALID_ERROR import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.store.sipimessages.{GetFileMetadataRequest, GetFileMetadataResponse} +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataResponse import org.knora.webapi.messages.util.PermissionUtilADM.EntityPermission import org.knora.webapi.messages.util._ import org.knora.webapi.messages.util.rdf._ +import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2.TextWithStandoffTagsV2 -import org.knora.webapi.messages.util.standoff.{StandoffTagUtilV2, XMLUtil} +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.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util._ -import scala.concurrent.{ExecutionContext, Future} +import java.time.Instant +import java.util.UUID +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * A tagging trait for requests handled by [[org.knora.webapi.responders.v2.ValuesResponderV2]]. @@ -3205,9 +3213,9 @@ object FileValueWithSipiMetadata { ) // Ask Sipi about the rest of the file's metadata. - tempFileUrl = stringFormatter.makeSipiTempFileUrl(settings, internalFilename) + tempFilePath = stringFormatter.makeSipiTempFilePath(settings, internalFilename) fileMetadataResponse: GetFileMetadataResponse <- (storeManager ? GetFileMetadataRequest( - fileUrl = tempFileUrl, + filePath = tempFilePath, requestingUser = requestingUser )).mapTo[GetFileMetadataResponse] diff --git a/webapi/src/main/scala/org/knora/webapi/responders/IriLocker.scala b/webapi/src/main/scala/org/knora/webapi/responders/IriLocker.scala index c9324f8a87..42b1144b4c 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/IriLocker.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/IriLocker.scala @@ -5,15 +5,15 @@ package org.knora.webapi.responders -import java.util.UUID -import java.util.concurrent.ConcurrentHashMap - import org.knora.webapi.IRI import org.knora.webapi.exceptions.ApplicationLockException import org.knora.webapi.util.JavaUtil +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap import scala.annotation.tailrec -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * Implements JVM-wide, reentrant, application-level update locks on data represented by IRIs, such as Knora 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 7b584dde9f..fb057277ba 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/Responder.scala @@ -18,14 +18,13 @@ import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings import scala.concurrent.ExecutionContext import scala.concurrent.Future -import scala.language.postfixOps import exceptions.{BadRequestException, DuplicateValueException, UnexpectedMessageException} import messages.store.triplestoremessages.SparqlSelectRequest import messages.util.ResponderData import messages.util.rdf.SparqlSelectResult import messages.{SmartIri, StringFormatter} -import settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl} +import settings.{KnoraDispatchers, KnoraSettingsImpl} /** * Responder helper methods. diff --git a/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala b/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala index f1c64af70f..53180448b8 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/ResponderManager.scala @@ -5,7 +5,10 @@ package org.knora.webapi.responders -import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem} +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.ActorRef +import akka.actor.ActorSystem import akka.event.LoggingReceive import org.knora.webapi.core.ActorMaker import org.knora.webapi.messages.admin.responder.groupsmessages.GroupsResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala index 5c6955d040..69acedc2f5 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala @@ -23,7 +23,6 @@ import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.rdf.SparqlSelectResult -import org.knora.webapi.messages.v1.responder.projectmessages._ import org.knora.webapi.responders.IriLocker import org.knora.webapi.responders.Responder import org.knora.webapi.responders.Responder.handleUnexpectedMessage diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala index c0991c1198..a70b0e2548 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala @@ -28,7 +28,6 @@ import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.v1.responder.projectmessages._ import org.knora.webapi.messages.v2.responder.ontologymessages.OntologyMetadataGetByProjectRequestV2 import org.knora.webapi.messages.v2.responder.ontologymessages.ReadOntologyMetadataV2 import org.knora.webapi.responders.IriLocker diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala index 1d0a037689..2f67eca720 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala @@ -5,7 +5,6 @@ package org.knora.webapi.responders.admin -import akka.actor.Status import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi.exceptions.InconsistentRepositoryDataException 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 28ad2dd78d..9535d9c0e7 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 @@ -8,19 +8,16 @@ package org.knora.webapi.responders.admin import akka.pattern._ import org.knora.webapi.exceptions.ForbiddenException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.storesmessages.{ - ResetTriplestoreContentRequestADM, - ResetTriplestoreContentResponseADM, - StoreResponderRequestADM -} +import org.knora.webapi.messages.admin.responder.storesmessages.ResetTriplestoreContentRequestADM +import org.knora.webapi.messages.admin.responder.storesmessages.ResetTriplestoreContentResponseADM +import org.knora.webapi.messages.admin.responder.storesmessages.StoreResponderRequestADM import org.knora.webapi.messages.app.appmessages.GetAllowReloadOverHTTPState import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceFlushDB -import org.knora.webapi.messages.store.triplestoremessages.{ - RdfDataObject, - ResetRepositoryContent, - ResetRepositoryContentACK -} -import org.knora.webapi.messages.util.{KnoraSystemInstances, ResponderData} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContent +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContentACK +import org.knora.webapi.messages.util.KnoraSystemInstances +import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.v2.responder.SuccessResponseV2 import org.knora.webapi.messages.v2.responder.ontologymessages.LoadOntologiesRequestV2 import org.knora.webapi.responders.Responder 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 0ed7b10e16..ee316d7abd 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 @@ -7,17 +7,17 @@ package org.knora.webapi.responders.v1 import akka.pattern._ import org.knora.webapi._ -import org.knora.webapi.exceptions.{InconsistentRepositoryDataException, NotFoundException} +import org.knora.webapi.exceptions.InconsistentRepositoryDataException +import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants -import org.knora.webapi.messages.admin.responder.projectsmessages.{ - ProjectADM, - ProjectsGetRequestADM, - ProjectsGetResponseADM -} +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsGetRequestADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsGetResponseADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.util.{ResponderData, ValueUtilV1} +import org.knora.webapi.messages.util.ResponderData +import org.knora.webapi.messages.util.ValueUtilV1 import org.knora.webapi.messages.v1.responder.ontologymessages._ import org.knora.webapi.messages.v1.responder.resourcemessages.SalsahGuiConversions import org.knora.webapi.messages.v2.responder.SuccessResponseV2 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 e83473e8f3..e87074d9ac 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 @@ -49,7 +49,6 @@ import org.knora.webapi.util.ApacheLuceneSupport.MatchStringWhileTyping import java.time.Instant import java.util.UUID -import scala.collection.immutable import scala.concurrent.Future import scala.util.Failure import scala.util.Success diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala index 400ff106ce..7ca62e883a 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/StandoffResponderV1.scala @@ -5,26 +5,23 @@ package org.knora.webapi.responders.v1 -import java.util.UUID - import akka.pattern._ import org.knora.webapi._ -import org.knora.webapi.exceptions.{NotFoundException, SipiException} +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.exceptions.SipiException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData -import org.knora.webapi.messages.v1.responder.ontologymessages.{ - ConvertOntologyClassV2ToV1, - StandoffEntityInfoGetResponseV1 -} +import org.knora.webapi.messages.v1.responder.ontologymessages.ConvertOntologyClassV2ToV1 +import org.knora.webapi.messages.v1.responder.ontologymessages.StandoffEntityInfoGetResponseV1 import org.knora.webapi.messages.v1.responder.standoffmessages._ -import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.responders.Responder import org.knora.webapi.responders.Responder.handleUnexpectedMessage +import java.util.UUID import scala.concurrent.Future /** 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 0bf70a1409..467ebcdbbf 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 @@ -8,12 +8,10 @@ package org.knora.webapi.responders.v2 import akka.pattern._ import org.knora.webapi.IRI import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.listsmessages.{ - ChildNodeInfoGetResponseADM, - ListGetRequestADM, - ListGetResponseADM, - ListNodeInfoGetRequestADM -} +import org.knora.webapi.messages.admin.responder.listsmessages.ChildNodeInfoGetResponseADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListGetRequestADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListGetResponseADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeInfoGetRequestADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.v2.responder.listsmessages._ 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 07c7b0ba43..b3380210c7 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 @@ -36,7 +36,6 @@ import org.knora.webapi.responders.v2.ontology.OntologyHelpers import org.knora.webapi.util._ import java.time.Instant -import scala.concurrent.ExecutionContext import scala.concurrent.Future /** diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourceUtilV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourceUtilV2.scala index d61ce06eeb..64f51d9528 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourceUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourceUtilV2.scala @@ -10,26 +10,30 @@ import akka.pattern._ import akka.util.Timeout import com.typesafe.scalalogging.Logger import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{ForbiddenException, NotFoundException} +import org.knora.webapi.exceptions.ForbiddenException +import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.messages.SmartIri -import org.knora.webapi.messages.admin.responder.permissionsmessages.{ - DefaultObjectAccessPermissionsStringForPropertyGetADM, - DefaultObjectAccessPermissionsStringResponseADM -} +import org.knora.webapi.messages.admin.responder.permissionsmessages.DefaultObjectAccessPermissionsStringForPropertyGetADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.DefaultObjectAccessPermissionsStringResponseADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.store.sipimessages.{ - DeleteTemporaryFileRequest, - MoveTemporaryFileToPermanentStorageRequest -} -import org.knora.webapi.messages.store.triplestoremessages.{SparqlAskRequest, SparqlAskResponse} +import org.knora.webapi.messages.store.sipimessages.DeleteTemporaryFileRequest +import org.knora.webapi.messages.store.sipimessages.MoveTemporaryFileToPermanentStorageRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlAskRequest +import org.knora.webapi.messages.store.triplestoremessages.SparqlAskResponse +import org.knora.webapi.messages.util.KnoraSystemInstances +import org.knora.webapi.messages.util.PermissionUtilADM import org.knora.webapi.messages.util.PermissionUtilADM.EntityPermission -import org.knora.webapi.messages.util.{KnoraSystemInstances, PermissionUtilADM} +import org.knora.webapi.messages.v2.responder.SuccessResponseV2 +import org.knora.webapi.messages.v2.responder.UpdateResultInProject import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourceV2 -import org.knora.webapi.messages.v2.responder.valuemessages.{FileValueContentV2, ReadValueV2, ValueContentV2} -import org.knora.webapi.messages.v2.responder.{SuccessResponseV2, UpdateResultInProject} - -import scala.concurrent.{ExecutionContext, Future} -import scala.util.{Failure, Success} +import org.knora.webapi.messages.v2.responder.valuemessages.FileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.ReadValueV2 +import org.knora.webapi.messages.v2.responder.valuemessages.ValueContentV2 + +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.util.Failure +import scala.util.Success /** * Utility functions for working with Knora resources and their values. diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala index 5d950b56c8..678efa1b5e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResponderWithStandoffV2.scala @@ -8,17 +8,18 @@ package org.knora.webapi.responders.v2 import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{NotFoundException, SipiException} +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.exceptions.SipiException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.util.ConstructResponseUtilV2.{MappingAndXSLTransformation, ResourceWithValueRdfData} -import org.knora.webapi.messages.util.{ConstructResponseUtilV2, ResponderData} -import org.knora.webapi.messages.v2.responder.standoffmessages.{ - GetMappingRequestV2, - GetMappingResponseV2, - GetXSLTransformationRequestV2, - GetXSLTransformationResponseV2 -} +import org.knora.webapi.messages.util.ConstructResponseUtilV2 +import org.knora.webapi.messages.util.ConstructResponseUtilV2.MappingAndXSLTransformation +import org.knora.webapi.messages.util.ConstructResponseUtilV2.ResourceWithValueRdfData +import org.knora.webapi.messages.util.ResponderData +import org.knora.webapi.messages.v2.responder.standoffmessages.GetMappingRequestV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.GetMappingResponseV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.GetXSLTransformationRequestV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.GetXSLTransformationResponseV2 import org.knora.webapi.responders.Responder import scala.concurrent.Future 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 4d71da77ce..48fcb95b0e 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 @@ -429,10 +429,9 @@ class SearchResponderV2(responderData: ResponderData) extends ResponderWithStand nonTriplestoreSpecificPrequery: SelectQuery = QueryTraverser.transformConstructToSelect( inputQuery = inputQuery.copy( whereClause = whereClauseWithoutAnnotations, - orderBy = - Seq.empty[ - OrderCriterion - ] // count queries do not need any sorting criteria + orderBy = Seq.empty[ + OrderCriterion + ] // count queries do not need any sorting criteria ), transformer = nonTriplestoreSpecificConstructToSelectTransformer ) 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 5e61197b1f..afd8273dba 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 @@ -15,7 +15,6 @@ import org.knora.webapi.ApiV2Complex import org.knora.webapi.InternalSchema import org.knora.webapi.KnoraBaseVersion import org.knora.webapi.OntologySchema -import org.knora.webapi.app.ApplicationActor import org.knora.webapi.exceptions.ApplicationCacheException import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.exceptions.ForbiddenException 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 5e4a1ff8cd..25df4277af 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/Authenticator.scala @@ -5,39 +5,49 @@ package org.knora.webapi.routing -import java.util.{Base64, UUID} -import akka.actor.{ActorRef, ActorSystem} -import akka.http.scaladsl.model.headers.{HttpCookie, HttpCookiePair} -import akka.http.scaladsl.model.{headers, _} +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.http.scaladsl.model._ +import akka.http.scaladsl.model.headers +import akka.http.scaladsl.model.headers.HttpCookie +import akka.http.scaladsl.model.headers.HttpCookiePair import akka.http.scaladsl.server.RequestContext import akka.http.scaladsl.util.FastFuture import akka.pattern._ -import akka.util.{ByteString, Timeout} +import akka.util.ByteString +import akka.util.Timeout import com.typesafe.scalalogging.Logger import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{AuthenticationException, BadCredentialsException, BadRequestException} +import org.knora.webapi.exceptions.AuthenticationException +import org.knora.webapi.exceptions.BadCredentialsException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.instrumentation.InstrumentationSupport import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages._ import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.v1.responder.usermessages._ -import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.{ - KnoraJWTTokenCredentialsV2, - KnoraPasswordCredentialsV2, - KnoraSessionCredentialsV2 -} +import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraJWTTokenCredentialsV2 +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.util.cache.CacheUtil import org.slf4j.LoggerFactory -import pdi.jwt.{JwtAlgorithm, JwtClaim, JwtHeader, JwtSprayJson} +import pdi.jwt.JwtAlgorithm +import pdi.jwt.JwtClaim +import pdi.jwt.JwtHeader +import pdi.jwt.JwtSprayJson import spray.json._ +import java.util.Base64 +import java.util.UUID +import scala.concurrent.ExecutionContext +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{ExecutionContext, Future} -import scala.util.{Failure, Success, Try} -import org.knora.webapi.settings.KnoraSettingsImpl +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * This trait is used in routes that need authentication support. It provides methods that use the [[RequestContext]] @@ -874,7 +884,7 @@ object JWTHelper { def createToken( userIri: IRI, secret: String, - longevity: FiniteDuration, + longevity: Duration, issuer: String, content: Map[String, JsValue] = Map.empty ): String = { 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 86671f9b35..66c829227b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala @@ -6,13 +6,17 @@ package org.knora.webapi.routing import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.Directives.{get, path} +import akka.http.scaladsl.server.Directives.get +import akka.http.scaladsl.server.Directives.path import akka.http.scaladsl.server.Route import akka.pattern.ask import akka.util.Timeout import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.app.appmessages.{AppState, AppStates, GetAppState} -import spray.json.{JsObject, JsString} +import org.knora.webapi.messages.app.appmessages.AppState +import org.knora.webapi.messages.app.appmessages.AppStates +import org.knora.webapi.messages.app.appmessages.GetAppState +import spray.json.JsObject +import spray.json.JsString import scala.concurrent.Future import scala.concurrent.duration._ 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 acd1ac89b3..dd5711c2e7 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala @@ -5,31 +5,33 @@ package org.knora.webapi.routing -import akka.actor.{ActorRef, ActorSystem} +import akka.actor.ActorRef +import akka.actor.ActorSystem import akka.event.LoggingAdapter -import akka.http.scaladsl.server.{RequestContext, Route, RouteResult} +import akka.http.scaladsl.server.RequestContext +import akka.http.scaladsl.server.Route +import akka.http.scaladsl.server.RouteResult import akka.pattern._ import akka.stream.Materializer import akka.util.Timeout import org.knora.webapi.IRI import org.knora.webapi.exceptions.BadRequestException -import org.knora.webapi.feature.{ - FeatureFactoryConfig, - KnoraSettingsFeatureFactoryConfig, - RequestContextFeatureFactoryConfig -} +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.feature.RequestContextFeatureFactoryConfig import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.projectsmessages.{ - ProjectADM, - ProjectGetRequestADM, - ProjectGetResponseADM, - ProjectIdentifierADM -} +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.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl import zio.prelude.Validation -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * Data needed to be passed to each route. 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 555baa167c..11e4621082 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RejectingRoute.scala @@ -11,11 +11,14 @@ import akka.http.scaladsl.server.Route import akka.pattern.ask import akka.util.Timeout import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.app.appmessages.{AppState, AppStates, GetAppState} +import org.knora.webapi.messages.app.appmessages.AppState +import org.knora.webapi.messages.app.appmessages.AppStates +import org.knora.webapi.messages.app.appmessages.GetAppState import scala.concurrent.Future import scala.concurrent.duration._ -import scala.util.{Failure, Success} +import scala.util.Failure +import scala.util.Success /** * Provides AppState actor access logic 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 374eb2d57e..4749f88503 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -8,15 +8,18 @@ package org.knora.webapi.routing import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.{RequestContext, RouteResult} +import akka.http.scaladsl.server.RequestContext +import akka.http.scaladsl.server.RouteResult import akka.pattern._ import akka.util.Timeout import org.knora.webapi.exceptions.UnexpectedMessageException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.{KnoraRequestADM, KnoraResponseADM} +import org.knora.webapi.messages.admin.responder.KnoraRequestADM +import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.settings.KnoraSettingsImpl -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future /** * Convenience methods for Knora Admin routes. 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 5f87c02998..571b17443d 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV1.scala @@ -8,32 +8,37 @@ package org.knora.webapi.routing import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.{RequestContext, RouteResult} +import akka.http.scaladsl.server.RequestContext +import akka.http.scaladsl.server.RouteResult import akka.pattern._ import akka.util.Timeout import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{BadRequestException, SipiException, UnexpectedMessageException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.SipiException +import org.knora.webapi.exceptions.UnexpectedMessageException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.http.status.ApiStatusCodesV1 import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.sipimessages.GetFileMetadataResponse import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2.TextWithStandoffTagsV2 -import org.knora.webapi.messages.v1.responder.valuemessages.{ - ArchiveFileValueV1, - AudioFileValueV1, - DocumentFileValueV1, - FileValueV1, - MovingImageFileValueV1, - StillImageFileValueV1, - TextFileValueV1 -} -import org.knora.webapi.messages.v1.responder.{KnoraRequestV1, KnoraResponseV1} -import org.knora.webapi.messages.v2.responder.standoffmessages.{GetMappingRequestV2, GetMappingResponseV2} +import org.knora.webapi.messages.v1.responder.KnoraRequestV1 +import org.knora.webapi.messages.v1.responder.KnoraResponseV1 +import org.knora.webapi.messages.v1.responder.valuemessages.ArchiveFileValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.AudioFileValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.DocumentFileValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.FileValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.MovingImageFileValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.StillImageFileValueV1 +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 spray.json.{JsNumber, JsObject} +import spray.json.JsNumber +import spray.json.JsObject -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future import scala.reflect.ClassTag /** 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 ccf3b03125..dc8a79b237 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilV2.scala @@ -8,20 +8,28 @@ package org.knora.webapi.routing import akka.actor.ActorRef import akka.event.LoggingAdapter import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.{RequestContext, RouteResult} +import akka.http.scaladsl.server.RequestContext +import akka.http.scaladsl.server.RouteResult import akka.pattern._ import akka.util.Timeout import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, UnexpectedMessageException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.UnexpectedMessageException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, RdfFeatureFactory, RdfFormat, RdfModel} +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.util.rdf.JsonLDDocument +import org.knora.webapi.messages.util.rdf.RdfFeatureFactory +import org.knora.webapi.messages.util.rdf.RdfFormat +import org.knora.webapi.messages.util.rdf.RdfModel +import org.knora.webapi.messages.v2.responder.KnoraRequestV2 +import org.knora.webapi.messages.v2.responder.KnoraResponseV2 import org.knora.webapi.messages.v2.responder.resourcemessages.ResourceTEIGetResponseV2 -import org.knora.webapi.messages.v2.responder.{KnoraRequestV2, KnoraResponseV2} -import org.knora.webapi.messages.{SmartIri, StringFormatter} import org.knora.webapi.settings.KnoraSettingsImpl -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.ExecutionContext +import scala.concurrent.Future import scala.util.control.Exception.catching /** diff --git a/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala index 5a6b53487b..d94acb8dbc 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala @@ -8,8 +8,9 @@ package org.knora.webapi.routing import akka.http.scaladsl.server.Route import com.github.swagger.akka.SwaggerHttpService import com.github.swagger.akka.model.Info +import io.swagger.models.ExternalDocs +import io.swagger.models.Scheme import io.swagger.models.auth.BasicAuthDefinition -import io.swagger.models.{ExternalDocs, Scheme} import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.routing.admin._ import org.knora.webapi.routing.admin.lists._ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala index 87f7158477..07cd50197b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/VersionRoute.scala @@ -6,12 +6,14 @@ package org.knora.webapi.routing import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.Directives.{get, path} +import akka.http.scaladsl.server.Directives.get +import akka.http.scaladsl.server.Directives.path import akka.http.scaladsl.server.Route import akka.util.Timeout import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.http.version.BuildInfo -import spray.json.{JsObject, JsString} +import spray.json.JsObject +import spray.json.JsString import scala.concurrent.duration._ 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 fc6d07daf2..8bfd28332d 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 @@ -6,13 +6,17 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.groupsmessages._ import org.knora.webapi.messages.admin.responder.valueObjects._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM import zio.prelude.Validation import java.util.UUID diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala index 643cc07254..f07cb0fb0f 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala @@ -8,8 +8,9 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.admin.lists._ -import org.knora.webapi.routing.{KnoraRoute, KnoraRouteData} /** * Provides an akka-http-routing function for API routes that deal with lists. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala index c9c3843821..29d6bd12fb 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/PermissionsRouteADM.scala @@ -8,8 +8,9 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.admin.permissions._ -import org.knora.webapi.routing.{KnoraRoute, KnoraRouteData} /** * Provides an akka-http-routing function for API routes that deal with permissions. 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 90ac5f984c..28076e92b1 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 @@ -6,13 +6,17 @@ package org.knora.webapi.routing.admin import akka.Done -import akka.http.scaladsl.model.headers.{ContentDispositionTypes, `Content-Disposition`} -import akka.http.scaladsl.model.{ContentTypes, HttpEntity} +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.headers.ContentDispositionTypes +import akka.http.scaladsl.model.headers.`Content-Disposition` import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import akka.pattern._ import akka.stream.IOResult -import akka.stream.scaladsl.{FileIO, Source} +import akka.stream.scaladsl.FileIO +import akka.stream.scaladsl.Source import akka.util.ByteString import io.swagger.annotations._ import org.knora.webapi.IRI @@ -21,7 +25,10 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.projectsmessages._ import org.knora.webapi.messages.admin.responder.valueObjects._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM import zio.prelude.Validation import java.nio.file.Files diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala index 76882ae113..8fb24ae115 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/SipiRouteADM.scala @@ -10,7 +10,10 @@ import akka.http.scaladsl.server.Route import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.sipimessages.SipiFileInfoGetRequestADM -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM /** * Provides a routing function for the API that Sipi connects to. @@ -39,7 +42,7 @@ class SipiRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with projectIDAndFile(1), throw BadRequestException(s"Invalid filename: '${projectIDAndFile(1)}'") ) - _ = log.info(s"/admin/files route called for filename $filename") + _ = log.info(s"/admin/files route called for filename $filename by user: $requestingUser") } yield SipiFileInfoGetRequestADM( projectID = projectID, filename = filename, 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 bb24268231..cf8b6de799 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/StoreRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/StoreRouteADM.scala @@ -8,15 +8,16 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import io.swagger.annotations.Api -import javax.ws.rs.Path import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.admin.responder.storesmessages.{ - ResetTriplestoreContentRequestADM, - StoresADMJsonProtocol -} +import org.knora.webapi.messages.admin.responder.storesmessages.ResetTriplestoreContentRequestADM +import org.knora.webapi.messages.admin.responder.storesmessages.StoresADMJsonProtocol import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM +import javax.ws.rs.Path import scala.concurrent.Future import scala.concurrent.duration._ 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 af499422d5..f8416ee181 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 @@ -6,7 +6,8 @@ package org.knora.webapi.routing.admin import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ import org.knora.webapi.annotation.ApiMayChange import org.knora.webapi.exceptions.BadRequestException @@ -15,7 +16,10 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UsersADMJsonProto import org.knora.webapi.messages.admin.responder.usersmessages._ import org.knora.webapi.messages.admin.responder.valueObjects._ import org.knora.webapi.messages.util.KnoraSystemInstances -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM import zio.prelude.Validation import java.util.UUID 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 ce2b4e90d9..62759ed44d 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 @@ -5,14 +5,19 @@ package org.knora.webapi.routing.admin.lists -import java.util.UUID import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import org.knora.webapi.exceptions.BadRequestException -import org.knora.webapi.feature.{Feature, FeatureFactoryConfig} +import org.knora.webapi.feature.Feature +import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.listsmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM +import java.util.UUID import scala.concurrent.Future object DeleteListItemsRouteADM { diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala index 0b84d565a2..e654c36368 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala @@ -6,22 +6,24 @@ package org.knora.webapi.routing.admin.lists import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ import org.knora.webapi.IRI -import org.knora.webapi.exceptions.{BadRequestException, ForbiddenException} -import org.knora.webapi.feature.{Feature, FeatureFactoryConfig} -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.{ - ListChildNodeCreatePayloadADM, - ListRootNodeCreatePayloadADM -} -import org.knora.webapi.messages.admin.responder.listsmessages.ListsErrorMessagesADM.{ - LIST_CREATE_PERMISSION_ERROR, - LIST_NODE_CREATE_PERMISSION_ERROR -} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.ForbiddenException +import org.knora.webapi.feature.Feature +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListsErrorMessagesADM.LIST_CREATE_PERMISSION_ERROR +import org.knora.webapi.messages.admin.responder.listsmessages.ListsErrorMessagesADM.LIST_NODE_CREATE_PERMISSION_ERROR import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.messages.admin.responder.valueObjects._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM import zio.prelude.Validation import java.util.UUID 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 822388af3c..bd9def74d1 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 @@ -6,13 +6,20 @@ package org.knora.webapi.routing.admin.lists import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ import org.knora.webapi.exceptions.BadRequestException -import org.knora.webapi.feature.{Feature, FeatureFactoryConfig} +import org.knora.webapi.feature.Feature +import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.listsmessages._ -import org.knora.webapi.messages.admin.responder.valueObjects.{Comments, Labels, ListName} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.messages.admin.responder.valueObjects.Comments +import org.knora.webapi.messages.admin.responder.valueObjects.Labels +import org.knora.webapi.messages.admin.responder.valueObjects.ListName +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM import java.util.UUID import javax.ws.rs.Path 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 64dd15a388..b7e6d649b7 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 @@ -5,16 +5,19 @@ package org.knora.webapi.routing.admin.permissions -import java.util.UUID - import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import javax.ws.rs.Path import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM +import java.util.UUID +import javax.ws.rs.Path import scala.concurrent.Future object CreatePermissionRouteADM { 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 284436d274..c8371d3e54 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 @@ -5,16 +5,19 @@ package org.knora.webapi.routing.admin.permissions -import java.util.UUID - import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} - +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import javax.ws.rs.Path import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM + +import java.util.UUID +import javax.ws.rs.Path object DeletePermissionRouteADM { val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") 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 5d83d030fe..ec1b80b841 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 @@ -5,15 +5,19 @@ package org.knora.webapi.routing.admin.permissions -import java.util.UUID - import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import javax.ws.rs.Path import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM + +import java.util.UUID +import javax.ws.rs.Path object GetPermissionsRouteADM { val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") 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 4719c6041a..8ca1149827 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 @@ -5,16 +5,20 @@ package org.knora.webapi.routing.admin.permissions -import java.util.UUID - import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import javax.ws.rs.Path import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.permissionsmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilADM} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilADM + +import java.util.UUID +import javax.ws.rs.Path object UpdatePermissionRouteADM { val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala b/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala index a203900449..af1695beb8 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v1/AssetsRouteV1.scala @@ -5,17 +5,23 @@ package org.knora.webapi.routing.v1 +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.MediaTypes +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.server.Route +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData + +import java.awt.Color +import java.awt.Font +import java.awt.Graphics import java.awt.image.BufferedImage -import java.awt.{Color, Font, Graphics} import java.io.ByteArrayOutputStream import java.nio.file.Paths - -import akka.http.scaladsl.model.{HttpEntity, HttpResponse, MediaTypes} -import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.Route import javax.imageio.ImageIO -import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData} /** * A route used for faking the image server. 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 10662b366c..e63c2a901a 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 @@ -8,7 +8,9 @@ package org.knora.webapi.routing.v1 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData /** * A route providing authentication support. It allows the creation of "sessions", which is used in the SALSAH app. 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 61dd452388..c28a9a8b39 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 @@ -9,7 +9,10 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.ckanmessages.CkanRequestV1 -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 /** * A route used to serve data to CKAN. It is used be the Ckan instance running under http://data.humanities.ch. 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 9c4ca28113..2ca8723520 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 @@ -11,7 +11,10 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.v1.responder.listmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 /** * Provides API routes that deal with lists. 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 c6b2c82960..3ad0837a15 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 @@ -10,7 +10,10 @@ import akka.http.scaladsl.server.Route import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.projectmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 class ProjectsRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) 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 8da8fbf2ee..f65957911f 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 @@ -10,7 +10,10 @@ import akka.http.scaladsl.server.Route import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.ontologymessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 /** * Provides a spray-routing function for API routes that deal with resource types. 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 8573394dc0..4213feb352 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 @@ -5,37 +5,28 @@ package org.knora.webapi.routing.v1 -import java.io._ -import java.nio.charset.StandardCharsets -import java.time.Instant -import java.util.UUID - import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.http.scaladsl.util.FastFuture import akka.pattern._ -import javax.xml.XMLConstants -import javax.xml.transform.stream.StreamSource -import javax.xml.validation.{Schema, SchemaFactory, Validator} import org.knora.webapi._ -import org.knora.webapi.exceptions.{ - AssertionException, - BadRequestException, - ForbiddenException, - InconsistentRepositoryDataException -} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.ForbiddenException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter.XmlImportNamespaceInfoV1 -import org.knora.webapi.messages.admin.responder.projectsmessages.{ - ProjectGetRequestADM, - ProjectGetResponseADM, - ProjectIdentifierADM -} +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.messages.store.sipimessages.{GetFileMetadataRequest, GetFileMetadataResponse} +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataResponse import org.knora.webapi.messages.twirl.ResourceHtmlView import org.knora.webapi.messages.util.DateUtilV1 import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2.TextWithStandoffTagsV2 @@ -43,15 +34,30 @@ import org.knora.webapi.messages.v1.responder.ontologymessages._ import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceV1JsonProtocol._ import org.knora.webapi.messages.v1.responder.resourcemessages._ import org.knora.webapi.messages.v1.responder.valuemessages._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} -import org.knora.webapi.util.{ActorUtil, FileUtil} -import org.w3c.dom.ls.{LSInput, LSResourceResolver} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 +import org.knora.webapi.util.ActorUtil +import org.knora.webapi.util.FileUtil +import org.w3c.dom.ls.LSInput +import org.w3c.dom.ls.LSResourceResolver import org.xml.sax.SAXException +import java.io._ +import java.nio.charset.StandardCharsets +import java.time.Instant +import java.util.UUID +import javax.xml.XMLConstants +import javax.xml.transform.stream.StreamSource +import javax.xml.validation.Schema +import javax.xml.validation.SchemaFactory +import javax.xml.validation.Validator import scala.collection.immutable import scala.concurrent.Future -import scala.util.{Failure, Success, Try} +import scala.util.Failure +import scala.util.Success +import scala.util.Try import scala.xml._ /** @@ -324,12 +330,12 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) file: Option[FileValueV1] <- apiRequest.file match { case Some(filename) => // Ask Sipi about the file's metadata. - val tempFileUrl = stringFormatter.makeSipiTempFileUrl(settings, filename) + val tempFilePath = stringFormatter.makeSipiTempFilePath(settings, filename) for { fileMetadataResponse: GetFileMetadataResponse <- (storeManager ? GetFileMetadataRequest( - fileUrl = tempFileUrl, + filePath = tempFilePath, requestingUser = userADM )).mapTo[GetFileMetadataResponse] } yield Some( @@ -385,11 +391,11 @@ class ResourcesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) convertedFile <- resourceRequest.file match { case Some(filename) => // Ask Sipi about the file's metadata. - val tempFileUrl = stringFormatter.makeSipiTempFileUrl(settings, filename) + val tempFilePath = stringFormatter.makeSipiTempFilePath(settings, filename) for { fileMetadataResponse: GetFileMetadataResponse <- (storeManager ? GetFileMetadataRequest( - fileUrl = tempFileUrl, + filePath = tempFilePath, requestingUser = userProfile )).mapTo[GetFileMetadataResponse] } yield Some( 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 be8fefc098..bd7c3ffcc3 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 @@ -12,12 +12,13 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.v1.responder.searchmessages.{ - ExtendedSearchGetRequestV1, - FulltextSearchGetRequestV1, - SearchComparisonOperatorV1 -} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.messages.v1.responder.searchmessages.ExtendedSearchGetRequestV1 +import org.knora.webapi.messages.v1.responder.searchmessages.FulltextSearchGetRequestV1 +import org.knora.webapi.messages.v1.responder.searchmessages.SearchComparisonOperatorV1 +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 import scala.language.postfixOps 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 dfee297635..c3d80b7aea 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 @@ -5,8 +5,6 @@ package org.knora.webapi.routing.v1 -import java.util.UUID - import akka.http.scaladsl.model.Multipart import akka.http.scaladsl.model.Multipart.BodyPart import akka.http.scaladsl.server.Directives._ @@ -15,9 +13,13 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.standoffmessages.RepresentationV1JsonProtocol.createMappingApiRequestV1Format import org.knora.webapi.messages.v1.responder.standoffmessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 import spray.json._ +import java.util.UUID import scala.concurrent.Future import scala.concurrent.duration._ 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 be7ad369e9..38ec4472f3 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 @@ -5,15 +5,18 @@ package org.knora.webapi.routing.v1 -import java.util.UUID - import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.apache.commons.validator.routines.UrlValidator import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.v1.responder.usermessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 + +import java.util.UUID /** * Provides a spray-routing function for API routes that deal with lists. 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 dc4d8ce397..ead016e378 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 @@ -5,26 +5,32 @@ package org.knora.webapi.routing.v1 -import java.time.Instant -import java.util.UUID - import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.http.scaladsl.util.FastFuture import akka.pattern._ import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, InconsistentRepositoryDataException, NotFoundException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.InconsistentRepositoryDataException +import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.store.sipimessages.{GetFileMetadataRequest, GetFileMetadataResponse} +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataResponse import org.knora.webapi.messages.util.DateUtilV1 import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2.TextWithStandoffTagsV2 -import org.knora.webapi.messages.v1.responder.resourcemessages.{ResourceInfoGetRequestV1, ResourceInfoResponseV1} +import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceInfoGetRequestV1 +import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceInfoResponseV1 import org.knora.webapi.messages.v1.responder.valuemessages.ApiValueV1JsonProtocol._ import org.knora.webapi.messages.v1.responder.valuemessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV1} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV1 +import java.time.Instant +import java.util.UUID import scala.concurrent.Future /** @@ -594,11 +600,11 @@ class ValuesRouteV1(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ): Future[ChangeFileValueRequestV1] = { val resourceIri = stringFormatter.validateAndEscapeIri(resIriStr, throw BadRequestException(s"Invalid resource IRI: $resIriStr")) - val tempFileUrl = stringFormatter.makeSipiTempFileUrl(settings, apiRequest.file) + val tempFilePath = stringFormatter.makeSipiTempFilePath(settings, apiRequest.file) for { fileMetadataResponse: GetFileMetadataResponse <- (storeManager ? GetFileMetadataRequest( - fileUrl = tempFileUrl, + filePath = tempFilePath, requestingUser = userADM )).mapTo[GetFileMetadataResponse] } yield ChangeFileValueRequestV1( 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 614be8cdea..d97b8fa270 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 @@ -9,12 +9,12 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM +import org.knora.webapi.messages.v2.routing.authenticationmessages.AuthenticationV2JsonProtocol import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraPasswordCredentialsV2 -import org.knora.webapi.messages.v2.routing.authenticationmessages.{ - AuthenticationV2JsonProtocol, - LoginApiRequestPayloadV2 -} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData} +import org.knora.webapi.messages.v2.routing.authenticationmessages.LoginApiRequestPayloadV2 +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData /** * A route providing API v2 authentication support. It allows the creation of "sessions", which are used in the SALSAH app. 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 61671c2170..fa83ff440f 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 @@ -10,8 +10,12 @@ import akka.http.scaladsl.server.Route import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.v2.responder.listsmessages.{ListGetRequestV2, NodeGetRequestV2} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} +import org.knora.webapi.messages.v2.responder.listsmessages.ListGetRequestV2 +import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetRequestV2 +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV2 import scala.concurrent.Future 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 b84497ce9c..de4bd24f48 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 @@ -6,6 +6,13 @@ package org.knora.webapi package routing.v2 +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route + +import java.util.UUID +import scala.concurrent.Future + import exceptions.BadRequestException import feature.FeatureFactoryConfig import messages.IriConversions._ @@ -14,12 +21,6 @@ import messages.v2.responder.ontologymessages._ import messages.{OntologyConstants, SmartIri} import routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} -import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} - -import java.util.UUID -import scala.concurrent.Future - object OntologiesRouteV2 { val OntologiesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "ontologies") } 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 800219fd79..37bf742744 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 @@ -5,21 +5,26 @@ package org.knora.webapi.routing.v2 -import java.time.Instant -import java.util.UUID - import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDUtil} +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +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.{SmartIri, StringFormatter} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV2 +import java.time.Instant +import java.util.UUID import scala.concurrent.Future object ResourcesRouteV2 { 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 2a3a34788f..ef251204d1 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 @@ -11,10 +11,15 @@ import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.search.gravsearch.GravsearchParser import org.knora.webapi.messages.v2.responder.searchmessages._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV2 import scala.concurrent.Future 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 cbeca529c7..c776cb6843 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 @@ -5,8 +5,6 @@ package org.knora.webapi.routing.v2 -import java.util.UUID - import akka.http.scaladsl.model.Multipart import akka.http.scaladsl.model.Multipart.BodyPart import akka.http.scaladsl.server.Directives._ @@ -17,14 +15,16 @@ import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.util.rdf.JsonLDUtil -import org.knora.webapi.messages.v2.responder.standoffmessages.{ - CreateMappingRequestMetadataV2, - CreateMappingRequestV2, - CreateMappingRequestXMLV2, - GetStandoffPageRequestV2 -} -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} +import org.knora.webapi.messages.v2.responder.standoffmessages.CreateMappingRequestMetadataV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.CreateMappingRequestV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.CreateMappingRequestXMLV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.GetStandoffPageRequestV2 +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV2 +import java.util.UUID import scala.concurrent.Future import scala.concurrent.duration._ 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 19db291415..7142d2b30b 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 @@ -5,21 +5,25 @@ package org.knora.webapi.routing.v2 -import java.time.Instant -import java.util.UUID - import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.{PathMatcher, Route} +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.SmartIri -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDUtil} +import org.knora.webapi.messages.util.rdf.JsonLDDocument +import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.messages.v2.responder.resourcemessages.ResourcesGetRequestV2 import org.knora.webapi.messages.v2.responder.valuemessages._ -import org.knora.webapi.routing.{Authenticator, KnoraRoute, KnoraRouteData, RouteUtilV2} +import org.knora.webapi.routing.Authenticator +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.RouteUtilV2 +import java.time.Instant +import java.util.UUID import scala.concurrent.Future object ValuesRouteV2 { diff --git a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala index 58e40c40c3..7cb3042ef8 100644 --- a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala @@ -42,9 +42,9 @@ class KnoraSettingsImpl(config: Config, log: LoggingAdapter) extends Extension { // 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 "") + val internalKnoraApiBaseUrl: String = 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") diff --git a/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala b/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala index 0e2aadb212..10ff909dd3 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/StoreManager.scala @@ -7,21 +7,25 @@ package org.knora.webapi.store import akka.actor._ import akka.event.LoggingReceive -import org.knora.webapi.core.{LiveActorMaker, _} +import org.knora.webapi.config.AppConfig +import org.knora.webapi.core.LiveActorMaker +import org.knora.webapi.core._ import org.knora.webapi.exceptions.UnexpectedMessageException -import org.knora.webapi.feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig} +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceRequest import org.knora.webapi.messages.store.sipimessages.IIIFRequest import org.knora.webapi.messages.store.triplestoremessages.TriplestoreRequest -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.settings._ import org.knora.webapi.store.cacheservice.CacheServiceManager -import org.knora.webapi.store.cacheservice.api.CacheService -import org.knora.webapi.store.iiif.IIIFManager +import org.knora.webapi.store.iiif.IIIFServiceManager import org.knora.webapi.store.triplestore.TriplestoreManager +import org.knora.webapi.util.ActorUtil import scala.concurrent.ExecutionContext -import zio._ -import org.knora.webapi.util.ActorUtil /** * This actor receives messages for different stores, and forwards them to the corresponding store manager. @@ -31,7 +35,13 @@ import org.knora.webapi.util.ActorUtil * * @param appActor a reference to the main application actor. */ -class StoreManager(appActor: ActorRef, csm: CacheServiceManager) extends Actor with ActorLogging { +class StoreManager( + appActor: ActorRef, + cacheServiceManager: CacheServiceManager, + iiifsm: IIIFServiceManager, + appConfig: AppConfig +) extends Actor + with ActorLogging { this: ActorMaker => /** @@ -69,19 +79,10 @@ class StoreManager(appActor: ActorRef, csm: CacheServiceManager) extends Actor w TriplestoreManagerActorName ) - /** - * Starts the IIIF Manager Actor - */ - protected lazy val iiifManager: ActorRef = makeActor( - Props(new IIIFManager with LiveActorMaker).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - IIIFManagerActorName - ) - def receive: Receive = LoggingReceive { - case tripleStoreMessage: TriplestoreRequest => triplestoreManager forward tripleStoreMessage - case iiifMessages: IIIFRequest => iiifManager forward iiifMessages - case cacheServiceMessages: CacheServiceRequest => - ActorUtil.zio2Message(sender(), csm receive cacheServiceMessages, log) + case req: CacheServiceRequest => ActorUtil.zio2Message(sender(), cacheServiceManager.receive(req), log, appConfig) + case req: IIIFRequest => ActorUtil.zio2Message(sender(), iiifsm.receive(req), log, appConfig) + case req: TriplestoreRequest => triplestoreManager forward req case other => sender() ! Status.Failure(UnexpectedMessageException(s"StoreManager received an unexpected message: $other")) } diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala index 5129b9fd26..a4871ade96 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/CacheServiceManager.scala @@ -5,24 +5,16 @@ package org.knora.webapi.store.cacheservice -import akka.actor.{Actor, ActorLogging, ActorSystem, Status} -import com.typesafe.scalalogging.LazyLogging -import org.knora.webapi.exceptions.UnexpectedMessageException -import org.knora.webapi.instrumentation.InstrumentationSupport -import org.knora.webapi.messages.admin.responder.projectsmessages.{ProjectADM, ProjectIdentifierADM} -import org.knora.webapi.messages.admin.responder.usersmessages.{UserADM, UserIdentifierADM} +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.messages.store.cacheservicemessages._ -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.util.ActorUtil.zio2Message import org.knora.webapi.store.cacheservice.api.CacheService - -import scala.concurrent.{ExecutionContext, Future} import zio._ -import zio.metrics._ import zio.metrics.Metric -import zio.metrics.MetricLabel + import java.time.temporal.ChronoUnit -import zio.metrics.MetricClient case class CacheServiceManager(cs: CacheService) { diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala index 95520279ad..77bbdee7d5 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/api/CacheService.scala @@ -5,10 +5,12 @@ package org.knora.webapi.store.cacheservice.api +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM +import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceStatusResponse import zio._ -import org.knora.webapi.messages.admin.responder.projectsmessages.{ProjectADM, ProjectIdentifierADM} -import org.knora.webapi.messages.admin.responder.usersmessages.{UserADM, UserIdentifierADM} -import org.knora.webapi.messages.store.cacheservicemessages.{CacheServiceStatusResponse} /** * Cache Service Interface diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala index 36e35e6885..bc7304c31d 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/config/CacheServiceConfig.scala @@ -1,7 +1,5 @@ package org.knora.webapi.store.cacheservice.config -import zio._ - final case class CacheServiceConfig(enabled: Boolean, redis: RedisConfig) final case class RedisConfig(server: String, port: Int) diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala index a558678988..3bd7c92a28 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceInMemImpl.scala @@ -5,8 +5,6 @@ package org.knora.webapi.store.cacheservice.impl -import akka.http.scaladsl.util.FastFuture -import org.knora.webapi.IRI import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierType @@ -21,9 +19,6 @@ import org.knora.webapi.store.cacheservice.api.EmptyValue import zio._ import zio.stm._ -import scala.concurrent.ExecutionContext -import scala.concurrent.Future - /** * In-Memory Cache implementation * diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala index e51e70d06a..d26bb2fa44 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/impl/CacheServiceRedisImpl.scala @@ -5,8 +5,6 @@ package org.knora.webapi.store.cacheservice.impl -import com.typesafe.scalalogging.LazyLogging -import com.typesafe.scalalogging.Logger import org.knora.webapi.exceptions.ForbiddenException import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM @@ -22,7 +20,6 @@ import org.knora.webapi.store.cacheservice.api.EmptyKey import org.knora.webapi.store.cacheservice.api.EmptyValue import org.knora.webapi.store.cacheservice.config.RedisConfig import org.knora.webapi.store.cacheservice.serialization.CacheSerialization -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings import redis.clients.jedis.Jedis import redis.clients.jedis.JedisPool import redis.clients.jedis.JedisPoolConfig diff --git a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala index 48b9339242..fa09a2e801 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerialization.scala @@ -6,15 +6,12 @@ package org.knora.webapi.store.cacheservice.serialization import org.knora.webapi.exceptions.CacheServiceException -import org.knora.webapi.instrumentation.InstrumentationSupport - -import java.io.{ByteArrayInputStream, ByteArrayOutputStream, ObjectInputStream, ObjectOutputStream} -import scala.concurrent.{ExecutionContext, Future} - import zio._ -import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.admin.responder.groupsmessages.GroupADM -import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 + +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.ObjectInputStream +import java.io.ObjectOutputStream case class EmptyByteArray(message: String) extends CacheServiceException(message) diff --git a/webapi/src/main/scala/org/knora/webapi/store/iiif/IIIFManager.scala b/webapi/src/main/scala/org/knora/webapi/store/iiif/IIIFManager.scala deleted file mode 100644 index 541cc0d2f6..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/store/iiif/IIIFManager.scala +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.iiif - -import akka.actor.{Actor, ActorLogging, ActorRef, Props, Status} -import akka.event.LoggingReceive -import akka.routing.FromConfig -import org.knora.webapi.core.ActorMaker -import org.knora.webapi.exceptions.UnexpectedMessageException -import org.knora.webapi.messages.store.sipimessages.IIIFRequest -import org.knora.webapi.settings.{KnoraDispatchers, _} - -/** - * Makes requests to IIIF servers. - */ -class IIIFManager extends Actor with ActorLogging { - this: ActorMaker => - - /** - * Constructs the [[SipiConnector]] actor (pool). - */ - protected final def makeDefaultSipiConnector: ActorRef = - makeActor( - FromConfig.props(Props[SipiConnector]()).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - SipiConnectorActorName - ) - - /** - * Subclasses can override this member to substitute a custom actor instead of the default SipiConnector. - */ - protected lazy val sipiConnector: ActorRef = makeDefaultSipiConnector - - def receive = LoggingReceive { - case sipiMessages: IIIFRequest => sipiConnector forward sipiMessages - case other => - sender() ! Status.Failure(UnexpectedMessageException(s"SipiManager received an unexpected message: $other")) - } - -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/iiif/IIIFServiceManager.scala b/webapi/src/main/scala/org/knora/webapi/store/iiif/IIIFServiceManager.scala new file mode 100644 index 0000000000..ed07678cb2 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/iiif/IIIFServiceManager.scala @@ -0,0 +1,46 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.iiif + +import org.knora.webapi.messages.store.sipimessages.DeleteTemporaryFileRequest +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest +import org.knora.webapi.messages.store.sipimessages.IIIFRequest +import org.knora.webapi.messages.store.sipimessages.IIIFServiceGetStatus +import org.knora.webapi.messages.store.sipimessages.MoveTemporaryFileToPermanentStorageRequest +import org.knora.webapi.messages.store.sipimessages.SipiGetTextFileRequest +import org.knora.webapi.store.iiif.api.IIIFService +import zio._ + +/** + * Makes requests to IIIF servers. + */ +final case class IIIFServiceManager(iiifs: IIIFService) { + + /** + * Main entry point for the Actor based architecture. Here we only translate the + * incoming Akka messages to calls to ZIO based implementations. Each ZIO response + * is then translated back to Akka through [[ActorUtil.zio2Message]]. + */ + def receive(message: IIIFRequest) = message match { + case req: GetFileMetadataRequest => iiifs.getFileMetadata(req) + case req: MoveTemporaryFileToPermanentStorageRequest => iiifs.moveTemporaryFileToPermanentStorage(req) + case req: DeleteTemporaryFileRequest => iiifs.deleteTemporaryFile(req) + case req: SipiGetTextFileRequest => iiifs.getTextFileRequest(req) + case IIIFServiceGetStatus => iiifs.getStatus() + case other => ZIO.logError(s"IIIFServiceManager received an unexpected message: $other") + } + +} + +object IIIFServiceManager { + val layer: ZLayer[IIIFService, Nothing, IIIFServiceManager] = { + ZLayer { + for { + iiif <- ZIO.service[IIIFService] + } yield IIIFServiceManager(iiif) + } + } +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/iiif/SipiConnector.scala b/webapi/src/main/scala/org/knora/webapi/store/iiif/SipiConnector.scala deleted file mode 100644 index 3f1e492f34..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/store/iiif/SipiConnector.scala +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.iiif - -import akka.actor.{Actor, ActorLogging, ActorSystem} -import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport -import org.apache.http.client.config.RequestConfig -import org.apache.http.client.entity.UrlEncodedFormEntity -import org.apache.http.client.methods.{CloseableHttpResponse, HttpDelete, HttpGet, HttpPost} -import org.apache.http.client.protocol.HttpClientContext -import org.apache.http.config.SocketConfig -import org.apache.http.impl.client.{CloseableHttpClient, HttpClients} -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager -import org.apache.http.message.BasicNameValuePair -import org.apache.http.protocol.HttpContext -import org.apache.http.util.EntityUtils -import org.apache.http.{Consts, HttpHost, HttpRequest, NameValuePair, NoHttpResponseException} -import org.knora.webapi.exceptions.{BadRequestException, NotFoundException, SipiException} -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.routing.JWTHelper -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings} -import org.knora.webapi.util.ActorUtil.{handleUnexpectedMessage, try2Message} -import org.knora.webapi.util.SipiUtil -import spray.json._ - -import java.io.IOException -import java.util -import scala.concurrent.ExecutionContext -import scala.util.Try - -/** - * Makes requests to Sipi. - */ -class SipiConnector extends Actor with ActorLogging { - - implicit val system: ActorSystem = context.system - implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - private val settings = KnoraSettings(system) - - implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - - private val targetHost: HttpHost = new HttpHost(settings.internalSipiHost, settings.internalSipiPort, "http") - - private val sipiTimeoutMillis = settings.sipiTimeout.toMillis.toInt - - // Create a connection manager with custom configuration. - private val connManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager() - - // Create socket configuration - private val socketConfig: SocketConfig = SocketConfig - .custom() - .setTcpNoDelay(true) - .build(); - - // Configure the connection manager to use socket configuration by default. - connManager.setDefaultSocketConfig(socketConfig) - - // Validate connections after 1 sec of inactivity - connManager.setValidateAfterInactivity(1000); - - // Configure total max or per route limits for persistent connections - // that can be kept in the pool or leased by the connection manager. - connManager.setMaxTotal(100) - connManager.setDefaultMaxPerRoute(10) - - // Sipi custom default request config - private val defaultRequestConfig = RequestConfig - .custom() - .setConnectTimeout(sipiTimeoutMillis) - .setConnectionRequestTimeout(sipiTimeoutMillis) - .setSocketTimeout(sipiTimeoutMillis) - .build() - - // Create an HttpClient with the given custom dependencies and configuration. - private val httpClient: CloseableHttpClient = HttpClients - .custom() - .setConnectionManager(connManager) - .setDefaultRequestConfig(defaultRequestConfig) - .build() - - override def receive: Receive = { - case getFileMetadataRequest: GetFileMetadataRequest => - try2Message(sender(), getFileMetadata(getFileMetadataRequest), log) - case moveTemporaryFileToPermanentStorageRequest: MoveTemporaryFileToPermanentStorageRequest => - try2Message(sender(), moveTemporaryFileToPermanentStorage(moveTemporaryFileToPermanentStorageRequest), log) - case deleteTemporaryFileRequest: DeleteTemporaryFileRequest => - try2Message(sender(), deleteTemporaryFile(deleteTemporaryFileRequest), log) - case getTextFileRequest: SipiGetTextFileRequest => - try2Message(sender(), sipiGetTextFileRequest(getTextFileRequest), log) - case IIIFServiceGetStatus => try2Message(sender(), iiifGetStatus(), log) - case other => handleUnexpectedMessage(sender(), other, log, this.getClass.getName) - } - - /** - * Represents a response from Sipi's `knora.json` route. - * - * @param originalFilename the file's original filename, if known. - * @param originalMimeType the file's original MIME type. - * @param internalMimeType the file's internal MIME type. - * @param width the file's width in pixels, if applicable. - * @param height the file's height in pixels, if applicable. - * @param numpages the number of pages in the file, if applicable. - * @param duration the duration of the file in seconds, if applicable. - * @param fps the frame rate of the file, if applicable. - */ - case class SipiKnoraJsonResponse( - originalFilename: Option[String], - originalMimeType: Option[String], - internalMimeType: String, - width: Option[Int], - height: Option[Int], - numpages: Option[Int], - duration: Option[BigDecimal], - fps: Option[BigDecimal] - ) { - if (originalFilename.contains("")) { - throw SipiException(s"Sipi returned an empty originalFilename") - } - - if (originalMimeType.contains("")) { - throw SipiException(s"Sipi returned an empty originalMimeType") - } - } - - object SipiKnoraJsonResponseProtocol extends SprayJsonSupport with DefaultJsonProtocol { - implicit val sipiKnoraJsonResponseFormat: RootJsonFormat[SipiKnoraJsonResponse] = jsonFormat8(SipiKnoraJsonResponse) - } - - /** - * Asks Sipi for metadata about a file. - * - * @param getFileMetadataRequest the request. - * @return a [[GetFileMetadataResponse]] containing the requested metadata. - */ - private def getFileMetadata(getFileMetadataRequest: GetFileMetadataRequest): Try[GetFileMetadataResponse] = { - import SipiKnoraJsonResponseProtocol._ - - val knoraInfoUrl = getFileMetadataRequest.fileUrl + "/knora.json" - val sipiRequest = new HttpGet(knoraInfoUrl) - - for { - sipiResponseStr <- doSipiRequest(sipiRequest) - sipiResponse: SipiKnoraJsonResponse = sipiResponseStr.parseJson.convertTo[SipiKnoraJsonResponse] - } yield GetFileMetadataResponse( - originalFilename = sipiResponse.originalFilename, - originalMimeType = sipiResponse.originalMimeType, - internalMimeType = sipiResponse.internalMimeType, - width = sipiResponse.width, - height = sipiResponse.height, - pageCount = sipiResponse.numpages, - duration = sipiResponse.duration, - fps = sipiResponse.fps - ) - } - - /** - * Asks Sipi to move a file from temporary storage to permanent storage. - * - * @param moveTemporaryFileToPermanentStorageRequestV2 the request. - * @return a [[SuccessResponseV2]]. - */ - private def moveTemporaryFileToPermanentStorage( - moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest - ): Try[SuccessResponseV2] = { - val token: String = JWTHelper.createToken( - userIri = moveTemporaryFileToPermanentStorageRequestV2.requestingUser.id, - secret = settings.jwtSecretKey, - longevity = settings.jwtLongevity, - issuer = settings.externalKnoraApiHostPort, - content = Map( - "knora-data" -> JsObject( - Map( - "permission" -> JsString("StoreFile"), - "filename" -> JsString(moveTemporaryFileToPermanentStorageRequestV2.internalFilename), - "prefix" -> JsString(moveTemporaryFileToPermanentStorageRequestV2.prefix) - ) - ) - ) - ) - - val moveFileUrl = s"${settings.internalSipiBaseUrl}/${settings.sipiMoveFileRouteV2}?token=$token" - - val formParams = new util.ArrayList[NameValuePair]() - formParams.add(new BasicNameValuePair("filename", moveTemporaryFileToPermanentStorageRequestV2.internalFilename)) - formParams.add(new BasicNameValuePair("prefix", moveTemporaryFileToPermanentStorageRequestV2.prefix)) - val requestEntity = new UrlEncodedFormEntity(formParams, Consts.UTF_8) - val queryHttpPost = new HttpPost(moveFileUrl) - queryHttpPost.setEntity(requestEntity) - - for { - _ <- doSipiRequest(queryHttpPost) - } yield SuccessResponseV2("Moved file to permanent storage.") - } - - /** - * Asks Sipi to delete a temporary file. - * - * @param deleteTemporaryFileRequestV2 the request. - * @return a [[SuccessResponseV2]]. - */ - private def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Try[SuccessResponseV2] = { - val token: String = JWTHelper.createToken( - userIri = deleteTemporaryFileRequestV2.requestingUser.id, - secret = settings.jwtSecretKey, - longevity = settings.jwtLongevity, - settings.externalKnoraApiHostPort, - content = Map( - "knora-data" -> JsObject( - Map( - "permission" -> JsString("DeleteTempFile"), - "filename" -> JsString(deleteTemporaryFileRequestV2.internalFilename) - ) - ) - ) - ) - - val deleteFileUrl = - s"${settings.internalSipiBaseUrl}/${settings.sipiDeleteTempFileRouteV2}/${deleteTemporaryFileRequestV2.internalFilename}?token=$token" - val request = new HttpDelete(deleteFileUrl) - - for { - _ <- doSipiRequest(request) - } yield SuccessResponseV2("Deleted temporary file.") - } - - /** - * Asks Sipi for a text file used internally by Knora. - * - * @param textFileRequest the request message. - */ - private def sipiGetTextFileRequest(textFileRequest: SipiGetTextFileRequest): Try[SipiGetTextFileResponse] = { - val httpRequest = new HttpGet(textFileRequest.fileUrl) - - val sipiResponseTry: Try[SipiGetTextFileResponse] = for { - responseStr <- doSipiRequest(httpRequest) - } yield SipiGetTextFileResponse(responseStr) - - sipiResponseTry.recover { - case notFoundException: NotFoundException => - throw NotFoundException( - s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${notFoundException.message}" - ) - - case badRequestException: BadRequestException => - throw SipiException( - s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${badRequestException.message}" - ) - - case sipiException: SipiException => - throw SipiException( - s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${sipiException.message}", - sipiException.cause - ) - - case other => - throw SipiException( - s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${other.getMessage}" - ) - } - } - - /** - * Tries to access the IIIF Service. - */ - private def iiifGetStatus(): Try[IIIFServiceStatusResponse] = { - val request = new HttpGet(settings.internalSipiBaseUrl + "/server/test.html") - - val result: Try[String] = doSipiRequest(request) - if (result.isSuccess) { - Try(IIIFServiceStatusOK) - } else { - Try(IIIFServiceStatusNOK) - } - } - - /** - * Makes an HTTP request to Sipi and returns the response. - * - * @param request the HTTP request. - * @return Sipi's response. - */ - private def doSipiRequest(request: HttpRequest): Try[String] = { - val httpContext: HttpClientContext = HttpClientContext.create() - var maybeResponse: Option[CloseableHttpResponse] = None - - val sipiResponseTry = Try { - maybeResponse = Some(httpClient.execute(targetHost, request, httpContext)) - - val responseEntityStr: String = Option(maybeResponse.get.getEntity) match { - case Some(responseEntity) => EntityUtils.toString(responseEntity) - case None => "" - } - - val statusCode: Int = maybeResponse.get.getStatusLine.getStatusCode - val statusCategory: Int = statusCode / 100 - - // Was the request successful? - if (statusCategory == 2) { - // Yes. - responseEntityStr - } else { - // No. Throw an appropriate exception. - val sipiErrorMsg = SipiUtil.getSipiErrorMessage(responseEntityStr) - - if (statusCode == 404) { - throw NotFoundException(sipiErrorMsg) - } else if (statusCategory == 4) { - throw BadRequestException(s"Sipi responded with HTTP status code $statusCode: $sipiErrorMsg") - } else { - throw SipiException(s"Sipi responded with HTTP status code $statusCode: $sipiErrorMsg") - } - } - } - - maybeResponse match { - case Some(response) => response.close() - case None => () - } - - sipiResponseTry.recover { - case badRequestException: BadRequestException => throw badRequestException - case notFoundException: NotFoundException => throw notFoundException - case sipiException: SipiException => throw sipiException - case e: Exception => throw SipiException("Failed to connect to Sipi", e, log) - } - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/store/iiif/api/IIIFService.scala b/webapi/src/main/scala/org/knora/webapi/store/iiif/api/IIIFService.scala new file mode 100644 index 0000000000..a42f1fbd88 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/iiif/api/IIIFService.scala @@ -0,0 +1,54 @@ +package org.knora.webapi.store.iiif.api + +import org.knora.webapi.messages.store.sipimessages.DeleteTemporaryFileRequest +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest +import org.knora.webapi.messages.store.sipimessages.GetFileMetadataResponse +import org.knora.webapi.messages.store.sipimessages.IIIFServiceStatusResponse +import org.knora.webapi.messages.store.sipimessages.MoveTemporaryFileToPermanentStorageRequest +import org.knora.webapi.messages.store.sipimessages.SipiGetTextFileRequest +import org.knora.webapi.messages.store.sipimessages.SipiGetTextFileResponse +import org.knora.webapi.messages.v2.responder.SuccessResponseV2 +import zio._ + +trait IIIFService { + + /** + * Asks Sipi for metadata about a file, served from the 'knora.json' route. + * + * @param getFileMetadataRequest the request. + * @return a [[GetFileMetadataResponse]] containing the requested metadata. + */ + def getFileMetadata(getFileMetadataRequest: GetFileMetadataRequest): Task[GetFileMetadataResponse] + + /** + * Asks Sipi to move a file from temporary storage to permanent storage. + * + * @param moveTemporaryFileToPermanentStorageRequestV2 the request. + * @return a [[SuccessResponseV2]]. + */ + def moveTemporaryFileToPermanentStorage( + moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest + ): Task[SuccessResponseV2] + + /** + * Asks Sipi to delete a temporary file. + * + * @param deleteTemporaryFileRequestV2 the request. + * @return a [[SuccessResponseV2]]. + */ + def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Task[SuccessResponseV2] + + /** + * Asks Sipi for a text file used internally by Knora. + * + * @param textFileRequest the request message. + */ + def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): Task[SipiGetTextFileResponse] + + /** + * Tries to access the IIIF Service. + */ + def getStatus(): Task[IIIFServiceStatusResponse] +} + +object IIIFService extends Accessible[IIIFService] diff --git a/webapi/src/main/scala/org/knora/webapi/store/iiif/domain/SipiKnoraJsonResponse.scala b/webapi/src/main/scala/org/knora/webapi/store/iiif/domain/SipiKnoraJsonResponse.scala new file mode 100644 index 0000000000..615e399862 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/iiif/domain/SipiKnoraJsonResponse.scala @@ -0,0 +1,41 @@ +package org.knora.webapi.store.iiif.domain + +import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport +import org.knora.webapi.exceptions.SipiException +import spray.json.DefaultJsonProtocol +import spray.json.RootJsonFormat + +/** + * Represents a response from Sipi's `knora.json` route. + * + * @param originalFilename the file's original filename, if known. + * @param originalMimeType the file's original MIME type. + * @param internalMimeType the file's internal MIME type. + * @param width the file's width in pixels, if applicable. + * @param height the file's height in pixels, if applicable. + * @param numpages the number of pages in the file, if applicable. + * @param duration the duration of the file in seconds, if applicable. + * @param fps the frame rate of the file, if applicable. + */ +final case class SipiKnoraJsonResponse( + originalFilename: Option[String], + originalMimeType: Option[String], + internalMimeType: String, + width: Option[Int], + height: Option[Int], + numpages: Option[Int], + duration: Option[BigDecimal], + fps: Option[BigDecimal] +) { + if (originalFilename.contains("")) { + throw SipiException(s"Sipi returned an empty originalFilename") + } + + if (originalMimeType.contains("")) { + throw SipiException(s"Sipi returned an empty originalMimeType") + } +} + +object SipiKnoraJsonResponseProtocol extends SprayJsonSupport with DefaultJsonProtocol { + implicit val sipiKnoraJsonResponseFormat: RootJsonFormat[SipiKnoraJsonResponse] = jsonFormat8(SipiKnoraJsonResponse) +} 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 new file mode 100644 index 0000000000..fd960e9bbb --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/store/iiif/impl/IIIFServiceSipiImpl.scala @@ -0,0 +1,347 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.iiif.impl + +import org.apache.http.Consts +import org.apache.http.HttpHost +import org.apache.http.HttpRequest +import org.apache.http.NameValuePair +import org.apache.http.client.config.RequestConfig +import org.apache.http.client.entity.UrlEncodedFormEntity +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpDelete +import org.apache.http.client.methods.HttpGet +import org.apache.http.client.methods.HttpPost +import org.apache.http.client.protocol.HttpClientContext +import org.apache.http.config.SocketConfig +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager +import org.apache.http.message.BasicNameValuePair +import org.apache.http.util.EntityUtils +import org.knora.webapi.auth.JWTService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.exceptions.SipiException +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 +import org.knora.webapi.store.iiif.domain._ +import org.knora.webapi.util.SipiUtil +import spray.json._ +import zio._ + +import java.util +import org.knora.webapi.exceptions.KnoraException + +/** + * Makes requests to Sipi. + */ +case class IIIFServiceSipiImpl( + config: 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. + * + * @param getFileMetadataRequest the request. + * @return a [[GetFileMetadataResponse]] containing the requested metadata. + */ + def getFileMetadata(getFileMetadataRequest: GetFileMetadataRequest): Task[GetFileMetadataResponse] = { + import SipiKnoraJsonResponseProtocol._ + + for { + url <- ZIO.succeed(config.sipi.internalBaseUrl + getFileMetadataRequest.filePath + "/knora.json") + request <- ZIO.succeed(new HttpGet(url)) + _ <- ZIO.debug(request) + sipiResponseStr <- doSipiRequest(request) + sipiResponse <- ZIO.attempt(sipiResponseStr.parseJson.convertTo[SipiKnoraJsonResponse]) + } yield GetFileMetadataResponse( + originalFilename = sipiResponse.originalFilename, + originalMimeType = sipiResponse.originalMimeType, + internalMimeType = sipiResponse.internalMimeType, + width = sipiResponse.width, + height = sipiResponse.height, + pageCount = sipiResponse.numpages, + duration = sipiResponse.duration, + fps = sipiResponse.fps + ) + } + + /** + * Asks Sipi to move a file from temporary storage to permanent storage. + * + * @param moveTemporaryFileToPermanentStorageRequestV2 the request. + * @return a [[SuccessResponseV2]]. + */ + def moveTemporaryFileToPermanentStorage( + moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest + ): Task[SuccessResponseV2] = { + + // create the JWT token with the necessary permission + val jwtToken: UIO[String] = jwt.newToken( + moveTemporaryFileToPermanentStorageRequestV2.requestingUser.id, + Map( + "knora-data" -> JsObject( + Map( + "permission" -> JsString("StoreFile"), + "filename" -> JsString(moveTemporaryFileToPermanentStorageRequestV2.internalFilename), + "prefix" -> JsString(moveTemporaryFileToPermanentStorageRequestV2.prefix) + ) + ) + ) + ) + + // builds the url for the operation + def moveFileUrl(token: String) = + ZIO.succeed(s"${config.sipi.internalBaseUrl}/${config.sipi.v2.moveFileRoute}?token=$token") + + // build the form to send together with the request + val formParams = new util.ArrayList[NameValuePair]() + formParams.add(new BasicNameValuePair("filename", moveTemporaryFileToPermanentStorageRequestV2.internalFilename)) + formParams.add(new BasicNameValuePair("prefix", moveTemporaryFileToPermanentStorageRequestV2.prefix)) + val requestEntity = new UrlEncodedFormEntity(formParams, Consts.UTF_8) + + // build the request + def request(url: String, requestEntity: UrlEncodedFormEntity) = { + val req = new HttpPost(url) + req.setEntity(requestEntity) + req + } + + for { + token <- jwtToken + url <- moveFileUrl(token) + entity <- ZIO.succeed(requestEntity) + request <- ZIO.succeed(request(url, entity)) + _ <- doSipiRequest(request) + } yield SuccessResponseV2("Moved file to permanent storage.") + } + + /** + * Asks Sipi to delete a temporary file. + * + * @param deleteTemporaryFileRequestV2 the request. + * @return a [[SuccessResponseV2]]. + */ + def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Task[SuccessResponseV2] = { + + val jwtToken: UIO[String] = jwt.newToken( + deleteTemporaryFileRequestV2.requestingUser.id, + Map( + "knora-data" -> JsObject( + Map( + "permission" -> JsString("DeleteTempFile"), + "filename" -> JsString(deleteTemporaryFileRequestV2.internalFilename) + ) + ) + ) + ) + + def deleteUrl(token: String): ZIO[Any, Nothing, String] = + ZIO.succeed( + s"${config.sipi.internalBaseUrl}/${config.sipi.v2.deleteTempFileRoute}/${deleteTemporaryFileRequestV2.internalFilename}?token=$token" + ) + + for { + token <- jwtToken + url <- deleteUrl(token) + request <- ZIO.succeed(new HttpDelete(url)) + _ <- doSipiRequest(request) + } yield SuccessResponseV2("Deleted temporary file.") + } + + /** + * Asks Sipi for a text file used internally by Knora. + * + * @param textFileRequest the request message. + */ + def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): Task[SipiGetTextFileResponse] = { + + // helper method to handle errors + def handleErrors(ex: Throwable): ZIO[Any, Exception with KnoraException with Product, Nothing] = ex match { + case notFoundException: NotFoundException => + ZIO.fail( + NotFoundException( + s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${notFoundException.message}" + ) + ) + + case badRequestException: BadRequestException => + ZIO.fail( + SipiException( + s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${badRequestException.message}" + ) + ) + + case sipiException: SipiException => + ZIO.fail( + SipiException( + s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${sipiException.message}", + sipiException.cause + ) + ) + + case other => + ZIO.logError( + s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${other.getMessage}" + ) *> + ZIO.fail( + SipiException( + s"Unable to get file ${textFileRequest.fileUrl} from Sipi as requested by ${textFileRequest.senderName}: ${other.getMessage}" + ) + ) + } + + for { + request <- ZIO.succeed(new HttpGet(textFileRequest.fileUrl)) + responseStr <- doSipiRequest(request).catchAll(ex => handleErrors(ex)) + } yield SipiGetTextFileResponse(responseStr) + } + + /** + * Tries to access the IIIF Service to check if Sipi is running. + */ + def getStatus(): UIO[IIIFServiceStatusResponse] = + for { + request <- ZIO.succeed(new HttpGet(config.sipi.internalBaseUrl + "/server/test.html")) + response <- doSipiRequest(request).fold(_ => IIIFServiceStatusNOK, _ => IIIFServiceStatusOK) + } yield response + + /** + * Makes an HTTP request to Sipi and returns the response. + * + * @param request the HTTP request. + * @return Sipi's response. + */ + private def doSipiRequest(request: HttpRequest): Task[String] = { + val targetHost: HttpHost = + new HttpHost(config.sipi.internalHost, config.sipi.internalPort, config.sipi.internalProtocol) + val httpContext: HttpClientContext = HttpClientContext.create() + var maybeResponse: Option[CloseableHttpResponse] = None + + val sipiRequest: Task[String] = ZIO.attemptBlocking { + maybeResponse = Some(httpClient.execute(targetHost, request, httpContext)) + + val responseEntityStr: String = Option(maybeResponse.get.getEntity) match { + case Some(responseEntity) => EntityUtils.toString(responseEntity) + case None => "" + } + + val statusCode: Int = maybeResponse.get.getStatusLine.getStatusCode + val statusCategory: Int = statusCode / 100 + + // Was the request successful? + if (statusCategory == 2) { + // Yes. + responseEntityStr + } else { + // No. Throw an appropriate exception. + val sipiErrorMsg = SipiUtil.getSipiErrorMessage(responseEntityStr) + + if (statusCode == 404) { + throw NotFoundException(sipiErrorMsg) + } else if (statusCategory == 4) { + throw BadRequestException(s"Sipi responded with HTTP status code $statusCode: $sipiErrorMsg") + } else { + throw SipiException(s"Sipi responded with HTTP status code $statusCode: $sipiErrorMsg") + } + } + } + + maybeResponse match { + case Some(response) => response.close() + case None => () + } + + sipiRequest.catchAll(error => + error match { + case badRequestException: BadRequestException => ZIO.fail(badRequestException) + case notFoundException: NotFoundException => ZIO.fail(notFoundException) + case sipiException: SipiException => ZIO.fail(sipiException) + case e: Exception => ZIO.logError(e.getMessage) *> ZIO.fail(SipiException("Failed to connect to Sipi", e)) + } + ) + } +} + +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 { + + // timeout from config + val sipiTimeoutMillis: Int = config.sipi.timeoutInSeconds.toMillis.toInt + + // Create a connection manager with custom configuration. + val connManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager() + + // Create socket configuration + val socketConfig: SocketConfig = SocketConfig + .custom() + .setTcpNoDelay(true) + .build(); + + // Configure the connection manager to use socket configuration by default. + connManager.setDefaultSocketConfig(socketConfig) + + // Validate connections after 1 sec of inactivity + connManager.setValidateAfterInactivity(1000); + + // Configure total max or per route limits for persistent connections + // that can be kept in the pool or leased by the connection manager. + connManager.setMaxTotal(100) + connManager.setDefaultMaxPerRoute(10) + + // Sipi custom default request config + val defaultRequestConfig = RequestConfig + .custom() + .setConnectTimeout(sipiTimeoutMillis) + .setConnectionRequestTimeout(sipiTimeoutMillis) + .setSocketTimeout(sipiTimeoutMillis) + .build() + + // Create an HttpClient with the given custom dependencies and configuration. + val httpClient: CloseableHttpClient = HttpClients + .custom() + .setConnectionManager(connManager) + .setDefaultRequestConfig(defaultRequestConfig) + .build() + + httpClient + }.tap(_ => ZIO.debug(">>> Acquire Sipi IIIF Service <<<")).orDie + + /** + * Releases the httpClient, freeing all resources. + */ + private def release(httpClient: CloseableHttpClient): URIO[Any, Unit] = + ZIO.attemptBlocking { + httpClient.close() + }.tap(_ => ZIO.debug(">>> Release Sipi IIIF Service <<<")).orDie + + val layer: ZLayer[AppConfig & JWTService, Nothing, IIIFService] = { + ZLayer { + for { + config <- ZIO.service[AppConfig] + // _ <- ZIO.debug(config) + 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 <- acquire(config) + } yield IIIFServiceSipiImpl(config, jwtService, httpClient) + }.tap(_ => ZIO.debug(">>> Sipi IIIF Service Initialized <<<")) + } +} diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala index 1a778a2ec3..c46418f897 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/TriplestoreManager.scala @@ -12,7 +12,6 @@ import akka.actor.Props import akka.event.LoggingReceive import akka.routing.FromConfig import org.knora.webapi.core.ActorMaker -import org.knora.webapi.exceptions.UnsupportedTriplestoreException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.store.triplestoremessages.UpdateRepositoryRequest import org.knora.webapi.messages.util.FakeTriplestore 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 8505a88d46..769a266dd6 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 @@ -1,25 +1,29 @@ package org.knora.webapi.store.triplestore.upgrade -import java.nio.file.{Files, Path, Paths} -import java.io.File -import scala.reflect.io.Directory - -import akka.actor.{ActorRef, ActorSystem} +import akka.actor.ActorRef +import akka.actor.ActorSystem import akka.http.scaladsl.util.FastFuture import akka.pattern._ import akka.util.Timeout -import com.typesafe.scalalogging.{LazyLogging, Logger} +import com.typesafe.scalalogging.LazyLogging +import com.typesafe.scalalogging.Logger import org.knora.webapi.IRI import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettingsImpl} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdatePlan.PluginForKnoraBaseVersion import org.knora.webapi.util.FileUtil -import scala.concurrent.{ExecutionContext, Future} +import java.io.File +import java.nio.file.Files +import java.nio.file.Path +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.reflect.io.Directory /** * Updates a Knora repository to work with the current version of Knora. diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala index eb554d7ab3..e6ff4b18f6 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1322.scala @@ -7,8 +7,9 @@ package org.knora.webapi.store.triplestore.upgrade.plugins import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin /** diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala index 3536d7287e..c3b77432d6 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR2018.scala @@ -5,17 +5,18 @@ package org.knora.webapi.store.triplestore.upgrade.plugins +import com.typesafe.scalalogging.Logger import org.knora.webapi.exceptions.InconsistentRepositoryDataException import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.OntologyConstants.KnoraAdmin.SystemProject -import org.knora.webapi.messages.OntologyConstants.KnoraBase.{AttachedToProject, LastModificationDate} +import org.knora.webapi.messages.OntologyConstants.KnoraBase.AttachedToProject +import org.knora.webapi.messages.OntologyConstants.KnoraBase.LastModificationDate import org.knora.webapi.messages.OntologyConstants.Owl.Ontology import org.knora.webapi.messages.OntologyConstants.Xsd.DateTime import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.store.triplestore.upgrade.UpgradePlugin import java.time.Instant -import com.typesafe.scalalogging.Logger /** * Transforms a repository for DSP-API PR 2018. diff --git a/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala b/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala index 7163107498..5ffd380673 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/ActorUtil.scala @@ -6,15 +6,14 @@ package org.knora.webapi.util import akka.actor.ActorRef -import akka.actor.Status import akka.event.LoggingAdapter import akka.http.scaladsl.util.FastFuture import akka.util.Timeout +import org.knora.webapi.config.AppConfig import org.knora.webapi.core.Logging import org.knora.webapi.exceptions.ExceptionUtil import org.knora.webapi.exceptions.RequestRejectedException import org.knora.webapi.exceptions.UnexpectedMessageException -import org.knora.webapi.exceptions.WrapperException import zio._ import scala.concurrent.ExecutionContext @@ -31,39 +30,52 @@ object ActorUtil { * phase, to be able to return ZIO inside an Actor. * * It performs the same functionality as [[future2Message]] does, rewritten completely uzing ZIOs. + * + * BEST PRACTICE: + * Do not log in the middle, only log at the edge. Trust the ZIO error model to propagate errors losslessly. + * + * Since this is the "edge" of the ZIO world for now, we need to log all errors that ZIO has potentially accumulated */ - def zio2Message[A](sender: ActorRef, zioTask: zio.Task[A], log: LoggingAdapter): Unit = - Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.live) - .unsafeRun( - zioTask.fold(ex => handleExeption(ex, sender), success => sender ! success) + def zio2Message[A](sender: ActorRef, zioTask: zio.Task[A], log: LoggingAdapter, appConfig: AppConfig): Unit = + Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + .unsafeRunTask( + zioTask.foldCauseZIO(cause => handleCause(cause, sender), success => ZIO.succeed(sender ! success)) ) /** - * The "throwable" handling part of `zio2Message`. It analyses the kind of throwable - * and sends the actor, that made the request in the `ask` pattern, the failure response. + * The "cause" handling part of `zio2Message`. It analyses the kind of failures and defects + * that where accumulated and sends the actor, that made the request in the `ask` pattern, + * the failure response. * - * @param ex the throwable that needs to be handled. + * @param cause the failures and defects that need to be handled. * @param sender the actor that made the request in the `ask` pattern. */ - def handleExeption(ex: Throwable, sender: ActorRef): ZIO[Any, Nothing, Unit] = - ex match { - case rejectedEx: RequestRejectedException => + def handleCause(cause: Cause[Throwable], sender: ActorRef): ZIO[Any, Nothing, Unit] = + cause.failureOrCause match { + case Left(rejectedEx: RequestRejectedException) => { // The error was the client's fault. Log the exception, and also // let the client know. - ZIO.logDebug(s"This error is presumably the clients fault: $rejectedEx") *> ZIO.succeed( - sender ! akka.actor.Status.Failure(rejectedEx) - ) + ZIO.logDebug(s"This error is presumably the clients fault: $rejectedEx") *> + ZIO.succeed(sender ! akka.actor.Status.Failure(rejectedEx)) + } - case otherEx: Exception => + case Left(otherEx: Exception) => { // The error wasn't the client's fault. Log the exception, and also // let the client know. - ZIO.logDebug(s"This error is presumably NOT the clients fault: $otherEx") *> ZIO.succeed( - sender ! akka.actor.Status.Failure(otherEx) - ) *> ZIO.fail(throw otherEx) + ZIO.logError(s"This error is presumably NOT the clients fault: $otherEx") *> + ZIO.succeed(sender ! akka.actor.Status.Failure(otherEx)) + } - case otherThrowable: Throwable => + case Left(otherThrowable: Throwable) => // Don't try to recover from a Throwable that isn't an Exception. - ZIO.logDebug(s"Presumably something realy bad has happened: $otherThrowable") *> ZIO.fail(throw otherThrowable) + ZIO.logError(s"Presumably something realy bad has happened: $otherThrowable") *> + ZIO.succeed(sender ! akka.actor.Status.Failure(otherThrowable)) + + case Right(otherCauses: Cause[Nothing]) => + // Now we are getting all non-recoverable defects, which we need to squash before + // sending it back to the requesting actor. + ZIO.logErrorCause(otherCauses) *> + ZIO.succeed(sender ! akka.actor.Status.Failure(otherCauses.squashTrace)) } /** diff --git a/webapi/src/main/scala/org/knora/webapi/util/Base64UrlCheckDigit.scala b/webapi/src/main/scala/org/knora/webapi/util/Base64UrlCheckDigit.scala index 28fb0c27a8..6e10741092 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/Base64UrlCheckDigit.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/Base64UrlCheckDigit.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util -import org.apache.commons.validator.routines.checkdigit.{CheckDigitException, ModulusCheckDigit} +import org.apache.commons.validator.routines.checkdigit.CheckDigitException +import org.apache.commons.validator.routines.checkdigit.ModulusCheckDigit /** * Calculates and validates check digits for base64url-encoded strings. 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 ce12a2deaf..50feee9b4a 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/FileUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/FileUtil.scala @@ -5,17 +5,24 @@ package org.knora.webapi.util -import java.io.ByteArrayOutputStream -import java.nio.charset.StandardCharsets -import java.nio.file.{Files, Path, Paths} -import java.util.zip.{ZipEntry, ZipOutputStream} - import com.typesafe.scalalogging.Logger -import org.knora.webapi.exceptions.{FileWriteException, NotFoundException} +import org.knora.webapi.exceptions.FileWriteException +import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.settings.KnoraSettingsImpl -import scala.io.{BufferedSource, Codec, Source} -import scala.util.{Failure, Success, Try} +import java.io.ByteArrayOutputStream +import java.nio.charset.StandardCharsets +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream +import scala.io.BufferedSource +import scala.io.Codec +import scala.io.Source +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * Functions for reading and writing files. diff --git a/webapi/src/main/scala/org/knora/webapi/util/JavaUtil.scala b/webapi/src/main/scala/org/knora/webapi/util/JavaUtil.scala index 23f9f5d998..33ccd94c83 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/JavaUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/JavaUtil.scala @@ -5,9 +5,8 @@ package org.knora.webapi.util -import java.util.function.{BiFunction, Function} - -import scala.language.implicitConversions +import java.util.function.BiFunction +import java.util.function.Function /** * Utility functions for working with Java libraries. diff --git a/webapi/src/main/scala/org/knora/webapi/util/SipiUtil.scala b/webapi/src/main/scala/org/knora/webapi/util/SipiUtil.scala index 3b6c950167..df701048f6 100644 --- a/webapi/src/main/scala/org/knora/webapi/util/SipiUtil.scala +++ b/webapi/src/main/scala/org/knora/webapi/util/SipiUtil.scala @@ -7,7 +7,9 @@ package org.knora.webapi.util import spray.json._ -import scala.util.{Failure, Success, Try} +import scala.util.Failure +import scala.util.Success +import scala.util.Try /** * Utility functions for communicating with Sipi. 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 fac44da38a..8cddf04e54 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 @@ -6,8 +6,11 @@ package org.knora.webapi.util.cache import com.typesafe.scalalogging.Logger +import net.sf.ehcache.Cache +import net.sf.ehcache.CacheManager +import net.sf.ehcache.Ehcache +import net.sf.ehcache.Element import net.sf.ehcache.event.CacheEventListener -import net.sf.ehcache.{Cache, CacheManager, Ehcache, Element} import org.knora.webapi.exceptions.ApplicationCacheException import org.slf4j.LoggerFactory diff --git a/webapi/src/test/resources/test.conf b/webapi/src/test/resources/test.conf index eb1bd0d49d..d6aab7b6b0 100644 --- a/webapi/src/test/resources/test.conf +++ b/webapi/src/test/resources/test.conf @@ -25,6 +25,7 @@ akka { } app { + testing = true print-short-config = false triplestore.auto-init = true diff --git a/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala index 83be280cc4..277b2402a3 100644 --- a/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/AsyncCoreSpec.scala @@ -5,34 +5,65 @@ package org.knora.webapi -import akka.actor.{ActorRef, ActorSystem, Props} +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Props import akka.event.LoggingAdapter import akka.pattern.ask import akka.stream.Materializer -import akka.testkit.{ImplicitSender, TestKit} +import akka.testkit.ImplicitSender +import akka.testkit.TestKit import akka.util.Timeout -import com.typesafe.config.{Config, ConfigFactory} -import org.knora.webapi.app.{ApplicationActor, LiveManagers} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.auth.JWTService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.config.AppConfigForTestContainers import org.knora.webapi.core.Core -import org.knora.webapi.feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig, TestFeatureFactoryConfig} +import org.knora.webapi.core.Logging +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.feature.TestFeatureFactoryConfig import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.app.appmessages.{AppStart, AppStop, SetAllowReloadOverHTTPState} +import org.knora.webapi.messages.app.appmessages.AppStart +import org.knora.webapi.messages.app.appmessages.AppStop +import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceFlushDB -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, ResetRepositoryContent} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.ResetRepositoryContent +import org.knora.webapi.messages.util.KnoraSystemInstances +import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.rdf.RdfFeatureFactory -import org.knora.webapi.messages.util.{KnoraSystemInstances, ResponderData} import org.knora.webapi.messages.v2.responder.ontologymessages.LoadOntologiesRequestV2 -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.settings._ +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.testcontainers.SipiTestContainer import org.knora.webapi.util.StartupUtils import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.{AnyWordSpecLike, AsyncWordSpecLike} - +import org.scalatest.wordspec.AsyncWordSpecLike +import zio.& +import zio.Runtime +import zio.RuntimeConfig +import zio.ZEnvironment +import zio.ZIO +import zio.ZLayer + +import scala.concurrent.Await +import scala.concurrent.ExecutionContext import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext} import scala.language.postfixOps -import scala.util.{Failure, Success, Try} +import scala.util.Failure +import scala.util.Success +import scala.util.Try abstract class AsyncCoreSpec(_system: ActorSystem) extends TestKit(_system) @@ -48,7 +79,7 @@ abstract class AsyncCoreSpec(_system: ActorSystem) this( ActorSystem( name, - TestContainersAll.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) + TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) ) ) @@ -56,17 +87,17 @@ abstract class AsyncCoreSpec(_system: ActorSystem) this( ActorSystem( CoreSpec.getCallerName(classOf[AsyncCoreSpec]), - TestContainersAll.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) + TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) ) ) - def this(name: String) = this(ActorSystem(name, TestContainersAll.PortConfig.withFallback(ConfigFactory.load()))) + def this(name: String) = this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()))) def this() = this( ActorSystem( CoreSpec.getCallerName(classOf[AsyncCoreSpec]), - TestContainersAll.PortConfig.withFallback(ConfigFactory.load()) + TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()) ) ) @@ -85,8 +116,50 @@ abstract class AsyncCoreSpec(_system: ActorSystem) val log: LoggingAdapter = akka.event.Logging(system, this.getClass) + // The ZIO runtime used to run functional effects + val runtime = Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + + // The effect for building a cache service manager and a IIIF service manager. + val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, appConfig) + + /** + * The effect layers which will be used to run the managers effect. + * Can be overriden in specs that need other implementations. + */ + val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer + AppConfigForTestContainers.testcontainers, + JWTService.layer, + // FusekiTestContainer.layer, + SipiTestContainer.layer + ) + + /** + * Create both managers by unsafe running them. + */ + val (cacheServiceManager, iiifServiceManager, appConfig) = + runtime + .unsafeRun( + managers + .provide( + effectLayers + ) + ) + + // start the Application Actor lazy val appActor: ActorRef = - system.actorOf(Props(new ApplicationActor with LiveManagers), name = APPLICATION_MANAGER_ACTOR_NAME) + system.actorOf( + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + name = APPLICATION_MANAGER_ACTOR_NAME + ) // The main application actor forwards messages to the responder manager and the store manager. val responderManager: ActorRef = appActor diff --git a/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala b/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala index 3d4db50425..5d35e1b1c1 100644 --- a/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/CoreSpec.scala @@ -5,11 +5,49 @@ package org.knora.webapi -import app.{ApplicationActor, LiveManagers} +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Props +import akka.event.LoggingAdapter +import akka.pattern.ask +import akka.stream.Materializer +import akka.testkit.ImplicitSender +import akka.testkit.TestKit +import akka.util.Timeout +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.auth.JWTService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.core.Logging +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.testcontainers.SipiTestContainer +import org.scalatest.BeforeAndAfterAll +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpecLike +import zio.& +import zio.Runtime +import zio.RuntimeConfig +import zio.ZEnvironment +import zio.ZIO +import zio.ZLayer + +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.duration._ +import scala.language.postfixOps +import scala.util.Failure +import scala.util.Success +import scala.util.Try + +import app.ApplicationActor import core.Core import feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig, TestFeatureFactoryConfig} import messages.StringFormatter -import messages.app.appmessages.{AppStart, AppStop, SetAllowReloadOverHTTPState} +import messages.app.appmessages.{AppStart, SetAllowReloadOverHTTPState} import messages.store.cacheservicemessages.CacheServiceFlushDB import messages.store.triplestoremessages.{RdfDataObject, ResetRepositoryContent} import messages.util.rdf.RdfFeatureFactory @@ -19,22 +57,6 @@ import settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} import store.cacheservice.settings.CacheServiceSettings import util.StartupUtils -import akka.actor.{ActorRef, ActorSystem, Props} -import akka.event.LoggingAdapter -import akka.pattern.ask -import akka.stream.Materializer -import akka.testkit.{ImplicitSender, TestKit} -import akka.util.Timeout -import com.typesafe.config.{Config, ConfigFactory} -import org.scalatest.BeforeAndAfterAll -import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.AnyWordSpecLike - -import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext} -import scala.language.postfixOps -import scala.util.{Failure, Success, Try} - object CoreSpec { /* @@ -71,7 +93,7 @@ abstract class CoreSpec(_system: ActorSystem) this( ActorSystem( name, - TestContainersAll.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) + TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) ) ) @@ -79,17 +101,17 @@ abstract class CoreSpec(_system: ActorSystem) this( ActorSystem( CoreSpec.getCallerName(classOf[CoreSpec]), - TestContainersAll.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) + TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load(config.withFallback(CoreSpec.defaultConfig))) ) ) - def this(name: String) = this(ActorSystem(name, TestContainersAll.PortConfig.withFallback(ConfigFactory.load()))) + def this(name: String) = this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()))) def this() = this( ActorSystem( CoreSpec.getCallerName(classOf[CoreSpec]), - TestContainersAll.PortConfig.withFallback(ConfigFactory.load()) + TestContainerFuseki.PortConfig.withFallback(ConfigFactory.load()) ) ) @@ -107,8 +129,50 @@ abstract class CoreSpec(_system: ActorSystem) val log: LoggingAdapter = akka.event.Logging(system, this.getClass) + // The ZIO runtime used to run functional effects + val runtime = Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + + // The effect for building a cache service manager and a IIIF service manager. + val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, appConfig) + + /** + * The effect layers which will be used to run the managers effect. + * Can be overriden in specs that need other implementations. + */ + lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer + AppConfigForTestContainers.testcontainers, + JWTService.layer, + // FusekiTestContainer.layer, + SipiTestContainer.layer + ) + + /** + * Create both managers by unsafe running them. + */ + val (cacheServiceManager, iiifServiceManager, appConfig) = + runtime + .unsafeRun( + managers + .provide( + effectLayers + ) + ) + + // start the Application Actor lazy val appActor: ActorRef = - system.actorOf(Props(new ApplicationActor with LiveManagers), name = APPLICATION_MANAGER_ACTOR_NAME) + system.actorOf( + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + name = APPLICATION_MANAGER_ACTOR_NAME + ) // The main application actor forwards messages to the responder manager and the store manager. val responderManager: ActorRef = appActor diff --git a/webapi/src/test/scala/org/knora/webapi/E2ESimSpec.scala b/webapi/src/test/scala/org/knora/webapi/E2ESimSpec.scala deleted file mode 100644 index 03c94a8cd3..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/E2ESimSpec.scala +++ /dev/null @@ -1,98 +0,0 @@ -/* -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.{ActorRef, ActorSystem, Props} -import akka.http.scaladsl.Http -import akka.http.scaladsl.client.RequestBuilding -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpRequest, HttpResponse} -import akka.stream.Materializer -import com.typesafe.config.{Config, ConfigFactory} -import com.typesafe.scalalogging.LazyLogging -import io.gatling.core.Predef._ -import org.knora.webapi.app.{APPLICATION_MANAGER_ACTOR_NAME, ApplicationActor, LiveManagers} -import org.knora.webapi.messages.app.appmessages.{AppStart, AppStop, SetAllowReloadOverHTTPState} -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} -import org.knora.webapi.messages.StringFormatter -import spray.json._ - -import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext} -import scala.language.postfixOps - -object E2ESimSpec { - - val config: Config = ConfigFactory.load() - - val defaultConfig: Config = ConfigFactory.parseString( - """ - akka.loglevel = "INFO" - akka.stdout-loglevel = "INFO" - """.stripMargin - ).withFallback(config) -} - -/** - * This class can be used in End-to-End testing. It starts the Knora server and - * provides access to settings and logging. - */ -abstract class E2ESimSpec(_system: ActorSystem) extends Simulation with Core with TriplestoreJsonProtocol with RequestBuilding with LazyLogging { - - /* constructors */ - def this(name: String, config: Config) = this(ActorSystem(name, TestContainers.PortConfig.withFallback(config.withFallback(E2ESimSpec.defaultConfig)))) - def this(config: Config) = this(ActorSystem("PerfSpec", TestContainers.PortConfig.withFallback(config.withFallback(E2ESimSpec.defaultConfig)))) - def this(name: String) = this(ActorSystem(name, TestContainers.PortConfig.withFallback(E2ESimSpec.defaultConfig))) - def this() = this(ActorSystem("PerfSpec", TestContainers.PortConfig.withFallback(E2ESimSpec.defaultConfig))) - - /* needed by the core trait */ - implicit lazy val system: ActorSystem = _system - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) - implicit val materializer: Materializer = Materializer.matFromSystem(system) - implicit val executionContext: ExecutionContext = system.dispatchers.defaultGlobalDispatcher - - // can be overridden in individual spec - lazy val rdfDataObjects = Seq.empty[RdfDataObject] - - /* Needs to be initialized before any responders */ - StringFormatter.initForTest() - - val log = akka.event.Logging(system, this.getClass) - - lazy val appActor: ActorRef = system.actorOf(Props(new ApplicationActor with LiveManagers), name = APPLICATION_MANAGER_ACTOR_NAME) - - protected val baseApiUrl: String = settings.internalKnoraApiBaseUrl - - before { - /* Set the startup flags and start the Knora Server */ - logger.info(s"executing before setup started") - - appActor ! SetAllowReloadOverHTTPState(true) - - appActor ! AppStart(ignoreRepository = true, requiresIIIFService = false) - - loadTestData(rdfDataObjects) - - logger.info(s"executing before setup finished") - } - - after { - /* Stop the server when everything else has finished */ - logger.info(s"executing after setup") - appActor ! AppStop() - } - - protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = { - val request = Post(baseApiUrl + "/admin/store/ResetTriplestoreContent", HttpEntity(ContentTypes.`application/json`, rdfDataObjects.toJson.compactPrint)) - singleAwaitingRequest(request, 5 minutes) - } - - protected def singleAwaitingRequest(request: HttpRequest, duration: Duration = 3.seconds): HttpResponse = { - val responseFuture = Http().singleRequest(request) - Await.result(responseFuture, duration) - } -} - */ diff --git a/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala index ee265f262a..50cabdd1ab 100644 --- a/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/E2ESpec.scala @@ -5,37 +5,67 @@ package org.knora.webapi -import app.{ApplicationActor, LiveManagers} -import core.Core -import feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig, TestFeatureFactoryConfig} -import messages.StringFormatter -import messages.app.appmessages.{AppStart, AppStop, SetAllowReloadOverHTTPState} -import messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} -import messages.util.rdf._ -import settings._ -import util.{FileUtil, StartupUtils} -import akka.actor.{ActorRef, ActorSystem, Props} +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Props import akka.event.LoggingAdapter -import akka.http.scaladsl.Http import akka.http.scaladsl.client.RequestBuilding -import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import akka.http.scaladsl.model._ import akka.stream.Materializer -import akka.testkit.{ImplicitSender, TestKit} -import com.typesafe.config.{Config, ConfigFactory} +import akka.testkit.TestKit +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging +import org.knora.webapi.auth.JWTService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.config.AppConfigForTestContainers +import org.knora.webapi.core.Core +import org.knora.webapi.core.Logging +import org.knora.webapi.exceptions.FileWriteException +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.feature.TestFeatureFactoryConfig +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.app.appmessages.AppStart +import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState +import org.knora.webapi.messages.store.sipimessages.SipiUploadResponse +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.settings._ +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.testcontainers.SipiTestContainer +import org.knora.webapi.testservices.FileToUpload +import org.knora.webapi.testservices.TestClientService +import org.knora.webapi.util.FileUtil +import org.knora.webapi.util.StartupUtils +import org.scalatest.BeforeAndAfterAll +import org.scalatest.Suite import org.scalatest.concurrent.ScalaFutures import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike -import org.scalatest.{BeforeAndAfterAll, Suite} import spray.json._ - -import java.nio.file.{Files, Path, Paths} -import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext, Future} -import scala.languageFeature.postfixOps -import scala.util.{Failure, Success, Try} -import org.knora.webapi.exceptions.FileWriteException +import zio.& +import zio.Runtime +import zio.RuntimeConfig +import zio.ZEnvironment +import zio.ZIO +import zio.ZLayer +import zio._ + +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.util.concurrent.TimeUnit +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.concurrent.duration.FiniteDuration + +import app.ApplicationActor object E2ESpec { val defaultConfig: Config = ConfigFactory.load() @@ -60,14 +90,16 @@ class E2ESpec(_system: ActorSystem) /* constructors */ def this(name: String, config: Config) = - this(ActorSystem(name, TestContainersAll.PortConfig.withFallback(config.withFallback(E2ESpec.defaultConfig)))) + this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(config.withFallback(E2ESpec.defaultConfig)))) def this(config: Config) = - this(ActorSystem("E2ETest", TestContainersAll.PortConfig.withFallback(config.withFallback(E2ESpec.defaultConfig)))) + this( + ActorSystem("E2ETest", TestContainerFuseki.PortConfig.withFallback(config.withFallback(E2ESpec.defaultConfig))) + ) - def this(name: String) = this(ActorSystem(name, TestContainersAll.PortConfig.withFallback(E2ESpec.defaultConfig))) + def this(name: String) = this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(E2ESpec.defaultConfig))) - def this() = this(ActorSystem("E2ETest", TestContainersAll.PortConfig.withFallback(E2ESpec.defaultConfig))) + def this() = this(ActorSystem("E2ETest", TestContainerFuseki.PortConfig.withFallback(E2ESpec.defaultConfig))) /* needed by the core trait */ implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) @@ -83,10 +115,52 @@ class E2ESpec(_system: ActorSystem) val log: LoggingAdapter = akka.event.Logging(system, this.getClass) + // The ZIO runtime used to run functional effects + val runtime = Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + + // The effect for building a cache service manager and a IIIF service manager. + lazy val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, appConfig) + + /** + * The effect layers which will be used to run the managers effect. + * Can be overriden in specs that need other implementations. + */ + lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer + AppConfigForTestContainers.testcontainers, + JWTService.layer, + // FusekiTestContainer.layer, + SipiTestContainer.layer + ) + + /** + * Create both managers by unsafe running them. + */ + lazy val (cacheServiceManager, iiifServiceManager, appConfig) = + runtime + .unsafeRun( + managers + .provide( + effectLayers + ) + ) + + // start the Application Actor lazy val appActor: ActorRef = - system.actorOf(Props(new ApplicationActor with LiveManagers), name = APPLICATION_MANAGER_ACTOR_NAME) + system.actorOf( + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + name = APPLICATION_MANAGER_ACTOR_NAME + ) - protected val baseApiUrl: String = settings.internalKnoraApiBaseUrl + protected val baseApiUrl: String = appConfig.knoraApi.internalKnoraApiBaseUrl protected val defaultFeatureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( testToggles = Set.empty, @@ -109,42 +183,79 @@ class E2ESpec(_system: ActorSystem) // loadTestData loadTestData(rdfDataObjects) - } override def afterAll(): Unit = /* Stop the server when everything else has finished */ TestKit.shutdownActorSystem(system) - protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = { - logger.info("Loading test data started ...") - val request = Post( - baseApiUrl + "/admin/store/ResetTriplestoreContent", - HttpEntity(ContentTypes.`application/json`, rdfDataObjects.toJson.compactPrint) + protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.loadTestData(rdfDataObjects) + } yield result).provide(TestClientService.layer(appConfig, system)) ) - val response = Http().singleRequest(request) - Try(Await.result(response, 479999.milliseconds)) match { - case Success(res) => logger.info("... loading test data done.") - case Failure(e) => logger.error(s"Loading test data failed: ${e.getMessage}") - } - } + protected def singleAwaitingRequest(request: HttpRequest, duration: zio.Duration = 15.seconds): HttpResponse = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.singleAwaitingRequest(request, duration) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) - // duration is intentionally like this, so that it could be found with search if seen in a stack trace - protected def singleAwaitingRequest(request: HttpRequest, duration: Duration = 15999.milliseconds): HttpResponse = { - val responseFuture = Http().singleRequest(request) - Await.result(responseFuture, duration) - } + protected def getResponseAsString(request: HttpRequest): String = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseString(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) + + protected def checkResponseOK(request: HttpRequest): Unit = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.checkResponseOK(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) + + protected def getResponseAsJson(request: HttpRequest): JsObject = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJson(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) + + protected def getResponseAsJsonLD(request: HttpRequest): JsonLDDocument = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJsonLD(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) + + protected def uploadToSipi(loginToken: String, filesToUpload: Seq[FileToUpload]): SipiUploadResponse = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.uploadToSipi(loginToken, filesToUpload) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) protected def responseToJsonLDDocument(httpResponse: HttpResponse): JsonLDDocument = { - val responseBodyFuture: Future[String] = httpResponse.entity.toStrict(10.seconds).map(_.data.decodeString("UTF-8")) - val responseBodyStr = Await.result(responseBodyFuture, 10.seconds) + val responseBodyFuture: Future[String] = + httpResponse.entity.toStrict(FiniteDuration(10L, TimeUnit.SECONDS)).map(_.data.decodeString("UTF-8")) + val responseBodyStr = Await.result(responseBodyFuture, FiniteDuration(10L, TimeUnit.SECONDS)) JsonLDUtil.parseJsonLD(responseBodyStr) } protected def responseToString(httpResponse: HttpResponse): String = { - val responseBodyFuture: Future[String] = httpResponse.entity.toStrict(10.seconds).map(_.data.decodeString("UTF-8")) - Await.result(responseBodyFuture, 10.seconds) + val responseBodyFuture: Future[String] = + httpResponse.entity.toStrict(FiniteDuration(10L, TimeUnit.SECONDS)).map(_.data.decodeString("UTF-8")) + Await.result(responseBodyFuture, FiniteDuration(10L, TimeUnit.SECONDS)) } protected def doGetRequest(urlPath: String): String = { @@ -168,11 +279,6 @@ class E2ESpec(_system: ActorSystem) rdfFormatUtil.parseToRdfModel(rdfStr = rdfXmlStr, rdfFormat = RdfXml) } - protected def getResponseEntityBytes(httpResponse: HttpResponse): Array[Byte] = { - val responseBodyFuture: Future[Array[Byte]] = httpResponse.entity.toStrict(10.seconds).map(_.data.toArray) - Await.result(responseBodyFuture, 10.seconds) - } - /** * Reads or writes a test data file. * diff --git a/webapi/src/test/scala/org/knora/webapi/ITKnoraFakeSpec.scala b/webapi/src/test/scala/org/knora/webapi/ITKnoraFakeSpec.scala deleted file mode 100644 index 90c63f1e76..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/ITKnoraFakeSpec.scala +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.ActorSystem -import akka.event.LoggingAdapter -import akka.http.scaladsl.Http -import akka.http.scaladsl.client.RequestBuilding -import akka.http.scaladsl.model.{HttpRequest, HttpResponse, StatusCodes} -import akka.http.scaladsl.unmarshalling.Unmarshal -import akka.stream.Materializer -import com.typesafe.config.{Config, ConfigFactory} -import org.knora.webapi.core.Core -import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.util.rdf.RdfFeatureFactory -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl} -import org.scalatest.matchers.should.Matchers -import org.scalatest.wordspec.AnyWordSpecLike -import org.scalatest.{BeforeAndAfterAll, Suite} -import spray.json.{JsObject, _} - -import scala.concurrent.duration.{Duration, _} -import scala.concurrent.{Await, ExecutionContext} -import scala.languageFeature.postfixOps - -object ITKnoraFakeSpec { - val defaultConfig: Config = ConfigFactory.load() -} - -/** - * This class can be used in End-to-End testing. It starts a Fake Knora server and - * provides access to settings and logging. - */ -class ITKnoraFakeSpec(_system: ActorSystem) - extends Core - with KnoraFakeCore - with Suite - with AnyWordSpecLike - with Matchers - with BeforeAndAfterAll - with RequestBuilding { - - /* constructors */ - def this(name: String, config: Config) = - this( - ActorSystem(name, TestContainersAll.PortConfig.withFallback(config.withFallback(ITKnoraFakeSpec.defaultConfig))) - ) - def this(config: Config) = - this( - ActorSystem( - "IntegrationTests", - TestContainersAll.PortConfig.withFallback(config.withFallback(ITKnoraFakeSpec.defaultConfig)) - ) - ) - def this(name: String) = - this(ActorSystem(name, TestContainersAll.PortConfig.withFallback(ITKnoraFakeSpec.defaultConfig))) - def this() = - this(ActorSystem("IntegrationTests", TestContainersAll.PortConfig.withFallback(ITKnoraFakeSpec.defaultConfig))) - - /* needed by the core trait */ - implicit lazy val system: ActorSystem = _system - implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) - implicit val materializer: Materializer = Materializer.matFromSystem(system) - implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - /* Needs to be initialized before any responders */ - StringFormatter.initForTest() - RdfFeatureFactory.init(settings) - - val log: LoggingAdapter = akka.event.Logging(system, this.getClass) - - protected val baseApiUrl: String = settings.internalKnoraApiBaseUrl - protected val baseInternalSipiUrl: String = settings.internalSipiBaseUrl - protected val baseExternalSipiUrl: String = settings.externalSipiBaseUrl - - override def beforeAll(): Unit = { - /* Set the startup flags and start the Knora Server */ - log.debug(s"Starting Knora Service") - startService() - } - - override def afterAll(): Unit = { - /* Stop the server when everything else has finished */ - log.debug(s"Stopping Knora Service") - stopService() - } - - protected def singleAwaitingRequest(request: HttpRequest, duration: Duration = 15.seconds): HttpResponse = { - val responseFuture = Http().singleRequest(request) - Await.result(responseFuture, duration) - } - - protected def getResponseString(request: HttpRequest): String = { - val response = singleAwaitingRequest(request) - val responseBodyStr = Await.result(Unmarshal(response.entity).to[String], 6.seconds) - assert(response.status === StatusCodes.OK, s",\n REQUEST: $request,\n RESPONSE: $responseBodyStr") - responseBodyStr - } - - protected def checkResponseOK(request: HttpRequest): Unit = - getResponseString(request) - - protected def getResponseJson(request: HttpRequest): JsObject = - getResponseString(request).parseJson.asJsObject -} diff --git a/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala b/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala index a816b17267..a6a88f3495 100644 --- a/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/ITKnoraLiveSpec.scala @@ -5,37 +5,54 @@ package org.knora.webapi -import java.nio.file.{Files, Path, Paths} - -import akka.actor.{ActorRef, ActorSystem, Props} +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Props import akka.event.LoggingAdapter -import akka.http.scaladsl.Http import akka.http.scaladsl.client.RequestBuilding -import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import akka.http.scaladsl.model._ import akka.stream.Materializer -import akka.testkit.{ImplicitSender, TestKit} -import com.typesafe.config.{Config, ConfigFactory} +import akka.testkit.TestKit +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging -import org.knora.webapi.app.{ApplicationActor, LiveManagers} +import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.auth.JWTService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.config.AppConfigForTestContainers import org.knora.webapi.core.Core -import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.core.Logging import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.app.appmessages.{AppStart, AppStop, SetAllowReloadOverHTTPState} -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.app.appmessages.AppStart +import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState import org.knora.webapi.messages.store.sipimessages._ -import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDUtil, RdfFeatureFactory} +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.RdfFeatureFactory import org.knora.webapi.settings._ +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.testcontainers.SipiTestContainer +import org.knora.webapi.testservices.FileToUpload +import org.knora.webapi.testservices.TestClientService import org.knora.webapi.util.StartupUtils +import org.scalatest.BeforeAndAfterAll +import org.scalatest.Suite import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike -import org.scalatest.{BeforeAndAfterAll, Suite} import spray.json._ +import zio.& +import zio.Runtime +import zio.RuntimeConfig +import zio.ZEnvironment +import zio.ZIO +import zio.ZLayer +import zio._ -import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext, Future} -import scala.languageFeature.postfixOps +import scala.concurrent.ExecutionContext object ITKnoraLiveSpec { val defaultConfig: Config = ConfigFactory.load() @@ -60,19 +77,19 @@ class ITKnoraLiveSpec(_system: ActorSystem) /* constructors */ def this(name: String, config: Config) = this( - ActorSystem(name, TestContainersAll.PortConfig.withFallback(config.withFallback(ITKnoraLiveSpec.defaultConfig))) + ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(config.withFallback(ITKnoraLiveSpec.defaultConfig))) ) def this(config: Config) = this( ActorSystem( "IntegrationTests", - TestContainersAll.PortConfig.withFallback(config.withFallback(ITKnoraLiveSpec.defaultConfig)) + TestContainerFuseki.PortConfig.withFallback(config.withFallback(ITKnoraLiveSpec.defaultConfig)) ) ) def this(name: String) = - this(ActorSystem(name, TestContainersAll.PortConfig.withFallback(ITKnoraLiveSpec.defaultConfig))) + this(ActorSystem(name, TestContainerFuseki.PortConfig.withFallback(ITKnoraLiveSpec.defaultConfig))) def this() = - this(ActorSystem("IntegrationTests", TestContainersAll.PortConfig.withFallback(ITKnoraLiveSpec.defaultConfig))) + this(ActorSystem("IntegrationTests", TestContainerFuseki.PortConfig.withFallback(ITKnoraLiveSpec.defaultConfig))) /* needed by the core trait (represents the KnoraTestCore trait)*/ implicit lazy val settings: KnoraSettingsImpl = KnoraSettings(system) @@ -88,12 +105,57 @@ class ITKnoraLiveSpec(_system: ActorSystem) val log: LoggingAdapter = akka.event.Logging(system, this.getClass) + // The ZIO runtime used to run functional effects + val runtime = Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + + /** + * The effect for building a cache service manager, a IIIF service manager, + * and the sipi test client. + */ + val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, appConfig) + + /** + * The effect layers which will be used to run the managers effect. + * Can be overriden in specs that need other implementations. + */ + val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer + AppConfigForTestContainers.testcontainers, + JWTService.layer, + // FusekiTestContainer.layer, + SipiTestContainer.layer + ) + + /** + * Create both managers and the sipi client by unsafe running them. + */ + val (cacheServiceManager, iiifServiceManager, appConfig) = + runtime + .unsafeRun( + managers + .provide( + effectLayers + ) + ) + + // start the Application Actor lazy val appActor: ActorRef = - system.actorOf(Props(new ApplicationActor with LiveManagers), name = APPLICATION_MANAGER_ACTOR_NAME) + system.actorOf( + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + name = APPLICATION_MANAGER_ACTOR_NAME + ) - protected val baseApiUrl: String = settings.internalKnoraApiBaseUrl - protected val baseInternalSipiUrl: String = settings.internalSipiBaseUrl - protected val baseExternalSipiUrl: String = settings.externalSipiBaseUrl + protected val baseApiUrl: String = appConfig.knoraApi.internalKnoraApiBaseUrl + protected val baseInternalSipiUrl: String = appConfig.sipi.internalBaseUrl + protected val baseExternalSipiUrl: String = appConfig.sipi.externalBaseUrl override def beforeAll(): Unit = { @@ -106,9 +168,6 @@ class ITKnoraLiveSpec(_system: ActorSystem) // waits until knora is up and running applicationStateRunning() - // check sipi - checkIfSipiIsRunning() - // loadTestData loadTestData(rdfDataObjects) } @@ -120,112 +179,60 @@ class ITKnoraLiveSpec(_system: ActorSystem) TestKit.shutdownActorSystem(system) } - protected def checkIfSipiIsRunning(): Unit = { - // This requires that (1) fileserver.docroot is set in Sipi's config file and (2) it contains a file test.html. - val request = Get(baseInternalSipiUrl + "/server/test.html") - val response = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, s"Sipi is probably not running: ${response.status}") - if (response.status.isSuccess()) logger.info("Sipi is running.") - response.entity.discardBytes() - } - - protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = { - logger.info("Loading test data started ...") - val request = Post( - baseApiUrl + "/admin/store/ResetTriplestoreContent", - HttpEntity(ContentTypes.`application/json`, rdfDataObjects.toJson.compactPrint) + protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.loadTestData(rdfDataObjects) + } yield result).provide(TestClientService.layer(appConfig, system)) ) - singleAwaitingRequest(request, 479999.milliseconds) - logger.info("... loading test data done.") - } - protected def getResponseStringOrThrow(request: HttpRequest): String = { - val response: HttpResponse = singleAwaitingRequest(request) - val responseBodyStr: String = - Await.result(response.entity.toStrict(10999.seconds).map(_.data.decodeString("UTF-8")), 10.seconds) - - if (response.status.isSuccess) { - responseBodyStr - } else { - throw AssertionException( - s"Got HTTP ${response.status.intValue}\n REQUEST: $request,\n RESPONSE: $responseBodyStr" - ) - } - } + protected def getResponseStringOrThrow(request: HttpRequest): String = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseString(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) protected def checkResponseOK(request: HttpRequest): Unit = - getResponseStringOrThrow(request) + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.checkResponseOK(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) protected def getResponseJson(request: HttpRequest): JsObject = - getResponseStringOrThrow(request).parseJson.asJsObject - - protected def singleAwaitingRequest(request: HttpRequest, duration: Duration = 15999.milliseconds): HttpResponse = { - val responseFuture: Future[HttpResponse] = Http().singleRequest(request) - Await.result(responseFuture, duration) - } - - protected def getResponseJsonLD(request: HttpRequest): JsonLDDocument = { - val responseBodyStr = getResponseStringOrThrow(request) - JsonLDUtil.parseJsonLD(responseBodyStr) - } - - /** - * Represents a file to be uploaded to Sipi. - * - * @param path the path of the file. - * @param mimeType the MIME type of the file. - */ - protected case class FileToUpload(path: Path, mimeType: ContentType) - - /** - * Represents an image file to be uploaded to Sipi. - * - * @param fileToUpload the file to be uploaded. - * @param width the image's width in pixels. - * @param height the image's height in pixels. - */ - protected case class InputFile(fileToUpload: FileToUpload, width: Int, height: Int) - - /** - * Uploads a file to Sipi and returns the information in Sipi's response. - * - * @param loginToken the login token to be included in the request to Sipi. - * @param filesToUpload the files to be uploaded. - * @return a [[SipiUploadResponse]] representing Sipi's response. - */ - protected def uploadToSipi(loginToken: String, filesToUpload: Seq[FileToUpload]): SipiUploadResponse = { - // Make a multipart/form-data request containing the files. - - val formDataParts: Seq[Multipart.FormData.BodyPart] = filesToUpload.map { fileToUpload => - assert(Files.exists(fileToUpload.path), s"File ${fileToUpload} does not exist") - - Multipart.FormData.BodyPart( - "file", - HttpEntity.fromPath(fileToUpload.mimeType, fileToUpload.path), - Map("filename" -> fileToUpload.path.getFileName.toString) - ) - } - - val sipiFormData = Multipart.FormData(formDataParts: _*) - - // Send Sipi the file in a POST request. - val sipiRequest = Post(s"$baseInternalSipiUrl/upload?token=$loginToken", sipiFormData) - - val sipiUploadResponseJson: JsObject = getResponseJson(sipiRequest) + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJson(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) - val sipiUploadResponse: SipiUploadResponse = sipiUploadResponseJson.convertTo[SipiUploadResponse] + protected def singleAwaitingRequest(request: HttpRequest, duration: zio.Duration = 15.seconds): HttpResponse = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.singleAwaitingRequest(request, duration) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) - // Request the temporary file from Sipi. - for (responseEntry <- sipiUploadResponse.uploadedFiles) { - val sipiGetTmpFileRequest: HttpRequest = if (responseEntry.fileType == "image") { - Get(responseEntry.temporaryUrl.replace("http://0.0.0.0:1024", baseInternalSipiUrl) + "/full/max/0/default.jpg") - } else { - Get(responseEntry.temporaryUrl.replace("http://0.0.0.0:1024", baseInternalSipiUrl) + "/file") - } + protected def getResponseJsonLD(request: HttpRequest): JsonLDDocument = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.getResponseJsonLD(request) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) - checkResponseOK(sipiGetTmpFileRequest) - } + protected def uploadToSipi(loginToken: String, filesToUpload: Seq[FileToUpload]): SipiUploadResponse = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.uploadToSipi(loginToken, filesToUpload) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) - sipiUploadResponse - } } diff --git a/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala b/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala index 181241b264..7a14e8d8d9 100644 --- a/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/IntegrationSpec.scala @@ -5,25 +5,33 @@ package org.knora.webapi -import akka.actor.{ActorRef, ActorSystem} +import akka.actor.ActorRef +import akka.actor.ActorSystem import akka.dispatch.MessageDispatcher import akka.pattern.ask import akka.util.Timeout -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AsyncWordSpecLike import zio.Console.printLine -import zio.Schedule.{Decision, WithState} -import zio.{Schedule, _} - -import scala.concurrent.{Await, ExecutionContext, Future} -import scala.language.postfixOps -import scala.util.{Failure, Success, Try} +import zio.Schedule +import zio.Schedule.Decision +import zio.Schedule.WithState +import zio._ + +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.util.Failure +import scala.util.Success +import scala.util.Try object IntegrationSpec { diff --git a/webapi/src/test/scala/org/knora/webapi/KnoraFakeCore.scala b/webapi/src/test/scala/org/knora/webapi/KnoraFakeCore.scala deleted file mode 100644 index 422893ef3a..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/KnoraFakeCore.scala +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.{ActorRef, Props} -import akka.http.scaladsl.Http -import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.Route -import org.knora.webapi.app.{ApplicationActor, LiveManagers} -import org.knora.webapi.core.Core -import org.knora.webapi.settings.APPLICATION_MANAGER_ACTOR_NAME - -import scala.concurrent.duration.FiniteDuration - -/** - * A fake Knora service that Sipi can use to get file permissions. - */ -trait KnoraFakeCore { - this: Core => - - // need to create an actor to conform to Core but never send AppStart() - override val appActor: ActorRef = - system.actorOf(Props(new ApplicationActor with LiveManagers), name = APPLICATION_MANAGER_ACTOR_NAME) - - /** - * Timeout definition (need to be high enough to allow reloading of data so that checkActorSystem doesn't timeout) - */ - implicit private val timeout: FiniteDuration = settings.defaultTimeout - - /** - * Faked `webapi` routes - */ - private val apiRoutes = { - path("admin" / "files" / Segments(2)) { projectIDAndFile => - get { - complete( - """ - { - "permissionCode": 2, - "status": 0 - } - """ - ) - } - } - } - - /** - * Starts the Faked Knora API server. - */ - def startService(): Unit = { - Http().newServerAt(settings.internalKnoraApiHost, settings.internalKnoraApiPort).bindFlow(Route.toFlow(apiRoutes)) - println( - s"Faked Knora API Server started at http://${settings.internalKnoraApiHost}:${settings.internalKnoraApiPort}." - ) - } - - /** - * Stops Knora. - */ - def stopService(): Unit = - system.terminate() - -} diff --git a/webapi/src/test/scala/org/knora/webapi/ManagersWithMockedSipi.scala b/webapi/src/test/scala/org/knora/webapi/ManagersWithMockedSipi.scala deleted file mode 100644 index 45fd21e710..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/ManagersWithMockedSipi.scala +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi - -import akka.actor.{Actor, ActorRef, Props} -import org.knora.webapi.app.Managers -import org.knora.webapi.core.LiveActorMaker -import org.knora.webapi.messages.util.ResponderData -import org.knora.webapi.responders.MockableResponderManager -import org.knora.webapi.settings._ -import org.knora.webapi.store.MockableStoreManager -import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings -import org.knora.webapi.store.iiif.MockSipiConnector -import org.knora.webapi.store.cacheservice.CacheServiceManager -import zio.Runtime -import zio.ZIO - -/** - * Mixin trait for running the application with mocked Sipi - */ -trait ManagersWithMockedSipi extends Managers { - this: Actor => - - lazy val mockStoreConnectors: Map[String, ActorRef] = Map( - SipiConnectorActorName -> context.actorOf(Props(new MockSipiConnector)) - ) - lazy val mockResponders: Map[String, ActorRef] = Map.empty[String, ActorRef] - - lazy val cacheServiceManager: CacheServiceManager = Runtime.default - .unsafeRun( - (for (manager <- ZIO.service[CacheServiceManager]) - yield manager).provide(CacheServiceInMemImpl.layer, CacheServiceManager.layer) - ) - - lazy val storeManager: ActorRef = context.actorOf( - Props( - new MockableStoreManager(mockStoreConnectors = mockStoreConnectors, appActor = self, csm = cacheServiceManager) - with LiveActorMaker - ), - name = StoreManagerActorName - ) - - lazy val responderManager: ActorRef = context.actorOf( - Props( - new MockableResponderManager( - mockRespondersOrStoreConnectors = mockResponders, - appActor = self, - responderData = ResponderData( - system, - self, - knoraSettings = KnoraSettings(system), - cacheServiceSettings = new CacheServiceSettings(system.settings.config) - ) - ) - ), - name = RESPONDER_MANAGER_ACTOR_NAME - ) -} diff --git a/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala index 09ab09c5b8..d114b5d4ea 100644 --- a/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/R2RSpec.scala @@ -5,37 +5,63 @@ package org.knora.webapi -import java.nio.file.{Files, Path, Paths} - -import akka.actor.{ActorRef, ActorSystem, Props} +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Props import akka.event.LoggingAdapter import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.server.ExceptionHandler import akka.http.scaladsl.testkit.ScalatestRouteTest -import akka.pattern.ask import akka.util.Timeout import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging -import org.knora.webapi.app.{ApplicationActor, LiveManagers} +import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.auth.JWTService +import org.knora.webapi.config.AppConfig +import org.knora.webapi.config.AppConfigForTestContainers import org.knora.webapi.core.Core -import org.knora.webapi.feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig, TestFeatureFactoryConfig} +import org.knora.webapi.core.Logging +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.feature.TestFeatureFactoryConfig import org.knora.webapi.http.handler import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.app.appmessages.{AppStart, AppStop, SetAllowReloadOverHTTPState} -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, ResetRepositoryContent} -import org.knora.webapi.messages.util.KnoraSystemInstances +import org.knora.webapi.messages.app.appmessages.AppStart +import org.knora.webapi.messages.app.appmessages.AppStop +import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.v2.responder.ontologymessages.LoadOntologiesRequestV2 import org.knora.webapi.routing.KnoraRouteData -import org.knora.webapi.settings.{KnoraDispatchers, KnoraSettings, KnoraSettingsImpl, _} -import org.knora.webapi.util.{FileUtil, StartupUtils} +import org.knora.webapi.settings.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.settings._ +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +import org.knora.webapi.testcontainers.SipiTestContainer +import org.knora.webapi.testservices.TestClientService +import org.knora.webapi.util.FileUtil +import org.knora.webapi.util.StartupUtils +import org.scalatest.BeforeAndAfterAll +import org.scalatest.Suite import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike -import org.scalatest.{BeforeAndAfterAll, Suite} - +import zio.& +import zio.Runtime +import zio.RuntimeConfig +import zio.ZEnvironment +import zio.ZIO +import zio.ZLayer + +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext, Future} -import scala.language.postfixOps /** * R(oute)2R(esponder) Spec base class. Please, for any new E2E tests, use E2ESpec. @@ -53,7 +79,7 @@ class R2RSpec /* needed by the core trait */ implicit lazy val _system: ActorSystem = ActorSystem( actorSystemNameFrom(getClass), - TestContainersAll.PortConfig.withFallback( + TestContainerFuseki.PortConfig.withFallback( ConfigFactory.parseString(testConfigSource).withFallback(ConfigFactory.load()) ) ) @@ -79,10 +105,50 @@ class R2RSpec implicit val timeout: Timeout = Timeout(settings.defaultTimeout) - lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with LiveManagers).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + // The ZIO runtime used to run functional effects + val runtime = Runtime(ZEnvironment.empty, RuntimeConfig.default @@ Logging.fromInfo) + + // The effect for building a cache service manager and a IIIF service manager. + lazy val managers = for { + csm <- ZIO.service[CacheServiceManager] + iiifsm <- ZIO.service[IIIFServiceManager] + appConfig <- ZIO.service[AppConfig] + } yield (csm, iiifsm, appConfig) + + /** + * The effect layers which will be used to run the managers effect. + * Can be overriden in specs that need other implementations. + */ + lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer + AppConfigForTestContainers.testcontainers, + JWTService.layer, + // FusekiTestContainer.layer, + SipiTestContainer.layer + ) + + /** + * Create both managers by unsafe running them. + */ + lazy val (cacheServiceManager, iiifServiceManager, appConfig) = + runtime + .unsafeRun( + managers + .provide( + effectLayers + ) + ) + + // start the Application Actor + lazy val appActor: ActorRef = + system.actorOf( + Props(new ApplicationActor(cacheServiceManager, iiifServiceManager, appConfig)), + name = APPLICATION_MANAGER_ACTOR_NAME + ) // The main application actor forwards messages to the responder manager and the store manager. val responderManager: ActorRef = appActor @@ -114,6 +180,14 @@ class R2RSpec /* Stop the server when everything else has finished */ appActor ! AppStop() + protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = + runtime.unsafeRunTask( + (for { + testClient <- ZIO.service[TestClientService] + result <- testClient.loadTestData(rdfDataObjects) + } yield result).provide(TestClientService.layer(appConfig, system)) + ) + protected def responseToJsonLDDocument(httpResponse: HttpResponse): JsonLDDocument = { val responseBodyFuture: Future[String] = httpResponse.entity.toStrict(5.seconds).map(_.data.decodeString("UTF-8")) val responseBodyStr = Await.result(responseBodyFuture, 5.seconds) @@ -130,19 +204,6 @@ class R2RSpec rdfFormatUtil.parseToRdfModel(rdfStr = rdfXmlStr, rdfFormat = RdfXml) } - protected def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Unit = { - implicit val timeout: Timeout = Timeout(settings.defaultTimeout) - Await.result(appActor ? ResetRepositoryContent(rdfDataObjects), 5 minutes) - - Await.result( - appActor ? LoadOntologiesRequestV2( - featureFactoryConfig = defaultFeatureFactoryConfig, - requestingUser = KnoraSystemInstances.Users.SystemUser - ), - 30 seconds - ) - } - /** * Reads or writes a test data file. * diff --git a/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala b/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala index 37dfe9ff1c..2985a8dfa7 100644 --- a/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala +++ b/webapi/src/test/scala/org/knora/webapi/TestContainerFuseki.scala @@ -5,12 +5,13 @@ package org.knora.webapi -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.http.version.BuildInfo import org.testcontainers.containers.GenericContainer import org.testcontainers.utility.DockerImageName import scala.jdk.CollectionConverters._ -import org.knora.webapi.http.version.BuildInfo /** * Provides the Fuseki container necessary for running tests. diff --git a/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala b/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala index 69bfb20a41..0c8b0181e0 100644 --- a/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala +++ b/webapi/src/test/scala/org/knora/webapi/TestContainerRedis.scala @@ -5,7 +5,8 @@ package org.knora.webapi -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.testcontainers.containers.GenericContainer import org.testcontainers.utility.DockerImageName diff --git a/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala b/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala index 3bb68b5ddb..34b423f1c8 100644 --- a/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala +++ b/webapi/src/test/scala/org/knora/webapi/TestContainersAll.scala @@ -5,14 +5,16 @@ package org.knora.webapi -import java.net.{NetworkInterface, UnknownHostException} - -import com.typesafe.config.{Config, ConfigFactory} -import org.testcontainers.containers.{BindMode, GenericContainer} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.http.version.BuildInfo +import org.testcontainers.containers.BindMode +import org.testcontainers.containers.GenericContainer import org.testcontainers.utility.DockerImageName +import java.net.NetworkInterface +import java.net.UnknownHostException import scala.jdk.CollectionConverters._ -import org.knora.webapi.http.version.BuildInfo /** * Provides all containers necessary for running tests. diff --git a/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala b/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala index 2dd40ca114..9cf76d1b37 100644 --- a/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala +++ b/webapi/src/test/scala/org/knora/webapi/TestProbeMaker.scala @@ -5,7 +5,9 @@ package org.knora.webapi -import akka.actor.{Actor, ActorLogging, Props} +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.Props import akka.testkit.TestProbe import org.knora.webapi.core.ActorMaker diff --git a/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala b/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala index 47f4e4c988..d1b14aa413 100644 --- a/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/UnitSpec.scala @@ -5,15 +5,14 @@ package org.knora.webapi -import messages.StringFormatter - -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike -import scala.language.postfixOps +import messages.StringFormatter object UnitSpec { diff --git a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala new file mode 100644 index 0000000000..297bb4b572 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainers.scala @@ -0,0 +1,40 @@ +package org.knora.webapi.config + +import com.typesafe.config.ConfigFactory +import org.knora.webapi.testcontainers.SipiTestContainer +import zio._ +import zio.config._ +import zio.config.typesafe.TypesafeConfigSource + +import magnolia._ + +/** + * Alters the AppConfig with the TestContainer ports for Fuseki and Sipi. + */ +object AppConfigForTestContainers { + + /** + * Reads in the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading + * the Typesafe-Config format. Reads the 'app' configuration from 'application.conf'. + */ + private val source: ConfigSource = + TypesafeConfigSource.fromTypesafeConfig(ZIO.attempt(ConfigFactory.load().getConfig("app").resolve)) + + /** + * Intantiates our config class hierarchy using the data from the 'app' configuration from 'application.conf'. + */ + private val config: UIO[AppConfig] = (read(descriptor[AppConfig].mapKey(toKebabCase) from source)).orDie + + /** + * Altered AppConfig with ports from TestContainers for Fuseki and Sipi. + */ + val testcontainers: ZLayer[SipiTestContainer, Nothing, AppConfig] = + ZLayer { + for { + appConfig <- config // .tapBoth(ZIO.debug(_), ZIO.debug(_)) + // fusekiContainer <- ZIO.service[FusekiTestContainer] + sipiContainer <- ZIO.service[SipiTestContainer] + alteredSipiConfig <- ZIO.succeed(appConfig.sipi.copy(internalPort = sipiContainer.container.getFirstMappedPort)) + } yield appConfig.copy(sipi = alteredSipiConfig) + }.tap(_ => ZIO.debug(">>> AppConfigForTestContainers Initialized <<<")) +} diff --git a/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersSpec.scala b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersSpec.scala new file mode 100644 index 0000000000..6cd2113b47 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigForTestContainersSpec.scala @@ -0,0 +1,25 @@ +package org.knora.webapi.config + +import org.knora.webapi.testcontainers.SipiTestContainer +import zio._ +import zio.test._ + +object AppConfigForTestContainersSpec extends ZIOSpecDefault { + + def spec = suite("AppConfigForTestContainersSpec")( + test("successfully provide the adapted application configuration for using with test containers") { + for { + appConfig <- ZIO.service[AppConfig] + sipiContainer <- ZIO.service[SipiTestContainer] + sipiPort <- ZIO.succeed(sipiContainer.container.getFirstMappedPort) + _ <- ZIO.debug(appConfig) + _ <- ZIO.debug(sipiContainer.container.getFirstMappedPort) + } yield { + assertTrue(appConfig.sipi.internalPort == sipiPort) + } + } + ).provide( + AppConfigForTestContainers.testcontainers, + SipiTestContainer.layer + ) +} diff --git a/webapi/src/test/scala/org/knora/webapi/config/AppConfigSpec.scala b/webapi/src/test/scala/org/knora/webapi/config/AppConfigSpec.scala new file mode 100644 index 0000000000..32d22b9d3f --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/config/AppConfigSpec.scala @@ -0,0 +1,25 @@ +package org.knora.webapi.config + +import zio._ +import zio.test._ + +import java.util.concurrent.TimeUnit +import scala.concurrent.duration.FiniteDuration + +object AppConfigSpec extends ZIOSpec[AppConfig] { + + val layer = ZLayer.make[AppConfig](AppConfig.live) + + def spec = suite("ApplicationConfigSpec")( + test("successfully provide the application configuration") { + for { + appConfig <- ZIO.service[AppConfig] + // _ <- ZIO.debug(appConfig) + } yield { + assertTrue(appConfig.printExtendedConfig == false) + assertTrue(appConfig.jwtLongevityAsDuration == FiniteDuration(30L, TimeUnit.DAYS)) + assertTrue(appConfig.sipi.timeoutInSeconds == FiniteDuration(120L, TimeUnit.SECONDS)) + } + } + ) +} diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala index e2fe807bb4..2c552d4835 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/CORSSupportE2ESpec.scala @@ -7,8 +7,10 @@ package org.knora.webapi.e2e import akka.actor.ActorSystem import akka.http.scaladsl.model.HttpMethods._ -import akka.http.scaladsl.model.headers.{`Access-Control-Allow-Methods`, _} -import akka.http.scaladsl.model.{HttpResponse, StatusCodes} +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes +import akka.http.scaladsl.model.headers._ +import akka.http.scaladsl.model.headers.`Access-Control-Allow-Methods` import akka.http.scaladsl.testkit.RouteTestTimeout import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec 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 ee0e30e7ee..ac342a527b 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/ClientTestDataCollector.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/ClientTestDataCollector.scala @@ -5,16 +5,12 @@ package org.knora.webapi.e2e -import org.knora.webapi.exceptions.TestConfigurationException -import org.knora.webapi.settings.KnoraSettingsImpl -import java.io.File -import java.io.BufferedWriter -import java.io.FileWriter -import java.nio.file.Paths -import java.nio.file.Path import com.typesafe.scalalogging.LazyLogging +import org.knora.webapi.settings.KnoraSettingsImpl + import java.nio.charset.StandardCharsets import java.nio.file.Files +import java.nio.file.Path /** * Collects E2E test requests and responses for use as client test data. 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 5750eca991..93145b54b1 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/ExceptionHandlerR2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/ExceptionHandlerR2RSpec.scala @@ -6,7 +6,9 @@ package org.knora.webapi.e2e import akka.http.scaladsl.model._ -import akka.http.scaladsl.server.Directives.{get, path, _} +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.server.Directives.get +import akka.http.scaladsl.server.Directives.path import akka.http.scaladsl.server.Route import org.knora.webapi._ import org.knora.webapi.exceptions._ diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala index 954c92c0d3..a34881ffca 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/FeatureToggleR2RSpec.scala @@ -6,16 +6,22 @@ package org.knora.webapi.e2e import akka.actor.ActorSystem +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.RawHeader -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes} -import akka.http.scaladsl.server.Directives.{get, path} +import akka.http.scaladsl.server.Directives.get +import akka.http.scaladsl.server.Directives.path import akka.http.scaladsl.server.Route import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.util.FastFuture import org.knora.webapi.R2RSpec import org.knora.webapi.feature._ import org.knora.webapi.http.directives.DSPApiDirectives -import org.knora.webapi.routing.{KnoraRoute, KnoraRouteData, KnoraRouteFactory} +import org.knora.webapi.routing.KnoraRoute +import org.knora.webapi.routing.KnoraRouteData +import org.knora.webapi.routing.KnoraRouteFactory import scala.concurrent.ExecutionContextExecutor 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 f41ca13a71..62e26d5227 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/HealthRouteE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/HealthRouteE2ESpec.scala @@ -8,9 +8,11 @@ package org.knora.webapi.e2e import akka.actor.ActorSystem import akka.http.scaladsl.model._ import akka.http.scaladsl.testkit.RouteTestTimeout -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.messages.app.appmessages.{AppStates, SetAppState} +import org.knora.webapi.messages.app.appmessages.AppStates +import org.knora.webapi.messages.app.appmessages.SetAppState object HealthRouteE2ESpec { val config: Config = ConfigFactory.parseString(""" diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/InstanceChecker.scala b/webapi/src/test/scala/org/knora/webapi/e2e/InstanceChecker.scala index e1325626ff..a383f87973 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/InstanceChecker.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/InstanceChecker.scala @@ -5,18 +5,19 @@ package org.knora.webapi.e2e -import java.net.URLEncoder - import com.typesafe.scalalogging.LazyLogging import org.knora.webapi._ import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util._ import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality._ import org.knora.webapi.messages.v2.responder.ontologymessages._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import java.net.URLEncoder import scala.collection.mutable /** 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 745499d0f6..76bbf65781 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/InstanceCheckerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/InstanceCheckerSpec.scala @@ -5,17 +5,17 @@ package org.knora.webapi.e2e -import java.nio.file.Paths - import akka.actor.ActorSystem import akka.http.scaladsl.testkit.RouteTestTimeout -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.util.FileUtil +import java.nio.file.Paths import scala.concurrent.ExecutionContextExecutor /** diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/RejectingRouteE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/RejectingRouteE2ESpec.scala index 9089fc8cc5..a97ccbbb56 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/RejectingRouteE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/RejectingRouteE2ESpec.scala @@ -5,9 +5,7 @@ package org.knora.webapi.e2e -import akka.actor.ActorSystem import akka.http.scaladsl.model._ -import akka.http.scaladsl.testkit.RouteTestTimeout import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/AdminMixE2ESimSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/AdminMixE2ESimSpec.scala deleted file mode 100644 index 2b23393974..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/AdminMixE2ESimSpec.scala +++ /dev/null @@ -1,63 +0,0 @@ -/* -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.e2e.admin - -import io.gatling.core.Predef.{forAll, global, rampUsers, scenario, _} -import io.gatling.http.Predef.{http, status} -import org.knora.webapi.E2ESimSpec -import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject - -import scala.concurrent.duration._ - -/** - * Simulation Scenario for testing the admin endpoints. - * - * This simulation scenario accesses the users, groups, and projects endpoint. - */ -class AdminMixE2ESimSpec extends E2ESimSpec { - - override lazy val rdfDataObjects: Seq[RdfDataObject] = Seq.empty[RdfDataObject] - - val protobolBuilder = http - .baseURL("http://localhost:3333") - - val users = scenario("Users") - .exec( - http("Get all users") - .get("/admin/users") - .check(status.is(200)) - ) - - val groups = scenario("Groups") - .exec( - http("Get all groups") - .get("/admin/groups") - .check(status.is(200)) - ) - - val projects = scenario("Projects") - .exec( - http("Get all projects") - .get("/admin/projects") - .check(status.is(200)) - ) - - val injections = Seq(rampUsers(500) over 5.seconds) - - val assertions = Seq( - global.responseTime.mean.lt(1500) - , forAll.failedRequests.count.lt(1) - ) - - setUp( - users.inject(injections).protocols(protobolBuilder), - groups.inject(injections).protocols(protobolBuilder), - projects.inject(injections).protocols(protobolBuilder) - ).assertions(assertions) - -} - */ diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESimSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESimSpec.scala deleted file mode 100644 index 098892d09c..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/GroupsADME2ESimSpec.scala +++ /dev/null @@ -1,50 +0,0 @@ -/* -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.e2e.admin - -import io.gatling.core.Predef._ -import io.gatling.http.Predef._ -import org.knora.webapi.E2ESimSpec -import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject - -import scala.concurrent.duration._ - -/** - * Simulation Scenario for testing the groups endpoints. - * - * This simulation scenario accesses the groups endpoint with - * 1000 users concurrently. - */ -class GroupsADME2ESimSpec extends E2ESimSpec { - - override lazy val rdfDataObjects: Seq[RdfDataObject] = Seq.empty[RdfDataObject] - - val protobolBuilder = http - .baseURL("http://localhost:3333") - - val groups = scenario("Users") - .exec( - http("Get all groups") - .get("/admin/groups") - .check(status.is(200)) - ) - - val injections = Seq(rampUsers(1000) over 5.seconds) - - val assertions = Seq( - global.responseTime.mean.lt(500) - , forAll.failedRequests.count.lt(1) - ) - - setUp( - groups.inject(injections).protocols(protobolBuilder) - ).assertions(assertions) - -} - - - */ 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 af73bc2496..ea961c9e6b 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 @@ -10,14 +10,19 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} -import org.knora.webapi.messages.admin.responder.groupsmessages.{GroupADM, GroupsADMJsonProtocol} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupADM +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupsADMJsonProtocol import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.util.{AkkaHttpUtils, MutableTestIri} +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri import scala.concurrent.Await import scala.concurrent.duration._ 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 41c9d4e1ee..f5f20d8abc 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 @@ -7,16 +7,20 @@ package org.knora.webapi.e2e.admin import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol -import org.knora.webapi.sharedtestdata.{SharedOntologyTestDataADM, SharedTestDataADM, SharedTestDataV1} +import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 import org.knora.webapi.util.AkkaHttpUtils import spray.json._ - -import scala.concurrent.duration._ +import zio._ object PermissionsADME2ESpec { diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESimSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESimSpec.scala deleted file mode 100644 index 87357d80c2..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESimSpec.scala +++ /dev/null @@ -1,50 +0,0 @@ -/* -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.e2e.admin - -import io.gatling.core.Predef._ -import io.gatling.http.Predef._ -import org.knora.webapi.E2ESimSpec -import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject - -import scala.concurrent.duration._ - -/** - * Simulation Scenario for testing the projects endpoints. - * - * This simulation scenario accesses the projects endpoint with - * 1000 users concurrently. - */ -class ProjectsADME2ESimSpec extends E2ESimSpec { - - override lazy val rdfDataObjects: Seq[RdfDataObject] = Seq.empty[RdfDataObject] - - val protobolBuilder = http - .baseURL("http://localhost:3333") - - val projects = scenario("Users") - .exec( - http("Get all projects") - .get("/admin/projects") - .check(status.is(200)) - ) - - val injections = Seq(rampUsers(1000) over 5.seconds) - - val assertions = Seq( - global.responseTime.mean.lt(500) - , forAll.failedRequests.count.lt(1) - ) - - setUp( - projects.inject(injections).protocols(protobolBuilder) - ).assertions(assertions) - -} - - - */ 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 4071862afe..24498f9f47 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 @@ -5,28 +5,38 @@ package org.knora.webapi.e2e.admin -import java.net.URLEncoder - import akka.actor.ActorSystem +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes} import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal import akka.util.Timeout -import com.typesafe.config.{Config, ConfigFactory} -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.E2ESpec +import org.knora.webapi.IRI +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.admin.responder.projectsmessages._ import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UsersADMJsonProtocol._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, StringLiteralV2, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.util.rdf.RdfModel import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.util.{AkkaHttpUtils, MutableTestIri} -import org.knora.webapi.{E2ESpec, IRI} +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri +import java.net.URLEncoder +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} object ProjectsADME2ESpec { val config: Config = ConfigFactory.parseString(""" diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/SipiADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/SipiADME2ESpec.scala index d93c4c6d74..2415dd5dd1 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/SipiADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/SipiADME2ESpec.scala @@ -10,12 +10,15 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.Cookie import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.messages.admin.responder.sipimessages.SipiFileInfoGetResponseADM import org.knora.webapi.messages.admin.responder.sipimessages.SipiResponderResponseADMJsonProtocol._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} -import org.knora.webapi.messages.v1.responder.sessionmessages.{SessionJsonProtocol, SessionResponse} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol +import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol +import org.knora.webapi.messages.v1.responder.sessionmessages.SessionResponse import org.knora.webapi.routing.Authenticator.KNORA_AUTHENTICATION_COOKIE_NAME import org.knora.webapi.sharedtestdata.SharedTestDataV1 diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/StoreADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/StoreADME2ESpec.scala index cc4a96d43d..c301251226 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/StoreADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/StoreADME2ESpec.scala @@ -5,16 +5,15 @@ package org.knora.webapi.e2e.admin -import akka.actor.ActorSystem -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, StatusCodes} -import akka.http.scaladsl.testkit.RouteTestTimeout +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.StatusCodes import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.messages.app.appmessages.SetAllowReloadOverHTTPState import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import spray.json._ - -import scala.concurrent.duration._ +import zio._ object StoreADME2ESpec { val config = ConfigFactory.parseString(""" @@ -30,8 +29,6 @@ object StoreADME2ESpec { */ class StoreADME2ESpec extends E2ESpec(StoreADME2ESpec.config) with TriplestoreJsonProtocol { - implicit def default(implicit system: ActorSystem) = RouteTestTimeout(120.seconds) - /** * The marshaling to Json is done automatically by spray, hence the import of the 'TriplestoreJsonProtocol'. * The Json which spray generates looks like this: diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESimSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESimSpec.scala deleted file mode 100644 index 75271defe3..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/UsersADME2ESimSpec.scala +++ /dev/null @@ -1,69 +0,0 @@ -/* -package org.knora.webapi.e2e.admin - -import io.gatling.core.Predef._ -import io.gatling.http.Predef._ -import org.knora.webapi.E2ESimSpec -import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject - -import scala.concurrent.duration._ -import scala.util.Random - - -/** - * Simulation Scenario for testing the users endpoint. - * - * In this simulation scenario, concurrently, 1000 users retrieve a list of all users, - * while additional 20 users register themselves. The mean response time should be less - * then 300 ms (according to a quick google search, 200 ms are standard). - */ -class UsersADME2ESimSpec extends E2ESimSpec { - - // need to override this. before each test, the triplestore is automatically reloaded. - // if you want more then the base data, then add here - override lazy val rdfDataObjects: Seq[RdfDataObject] = Seq.empty[RdfDataObject] - - val protocolBuilder = http.baseURL("http://localhost:3333") - - val feeder = Iterator.continually( - Map( - "email" -> (Random.alphanumeric.take(20).mkString + "@foo.com"), - "givenName" -> Random.alphanumeric.take(10).mkString, - "familyName" -> Random.alphanumeric.take(10).mkString, - "password" -> Random.alphanumeric.take(35).mkString - ) - ) - - val getAllUsers = scenario("GetUsers") - .exec( - http("Get all users") - .get("/admin/users") - .check(status.is(200)) - ) - - val createUser = scenario("CreateUser") - .feed(feeder) - .exec( - http("Create a user") - .post("/admin/users") - .body(StringBody("""{ "email": "${email}", "givenName": "${givenName}", "familyName": "${familyName}", "password": "${password}", "status": true, "lang": "en", "systemAdmin": false }""")).asJSON - .check(status.is(200)) - ) - - val largeAndFast = Seq(rampUsers(1000) over 5.seconds) - val lowAndSlow = Seq(rampUsers(25) over 10.seconds) - - val assertions = Seq( - global.responseTime.mean.lt(300) - , forAll.failedRequests.count.lt(1) - ) - - setUp( - getAllUsers.inject(largeAndFast).protocols(protocolBuilder), - createUser.inject(lowAndSlow).protocols(protocolBuilder) - ).assertions(assertions) - -} - - - */ 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 ccdb580f1b..c0446c38c7 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 @@ -10,19 +10,26 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} -import org.knora.webapi.messages.admin.responder.groupsmessages.{GroupADM, GroupsADMJsonProtocol} -import org.knora.webapi.messages.admin.responder.projectsmessages.{ProjectADM, ProjectsADMJsonProtocol} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupADM +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupsADMJsonProtocol +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UsersADMJsonProtocol._ import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsV1 -import org.knora.webapi.sharedtestdata.{SharedTestDataADM, SharedTestDataV1} -import org.knora.webapi.util.{AkkaHttpUtils, MutableTestIri} +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri import scala.concurrent.Await import scala.concurrent.duration._ 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 3381dc48b8..d6a8743bea 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 @@ -6,17 +6,23 @@ package org.knora.webapi.e2e.admin.lists import akka.actor.ActorSystem +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{HttpResponse, StatusCodes} import akka.http.scaladsl.testkit.RouteTestTimeout -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.admin.responder.listsmessages._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsADM -import org.knora.webapi.sharedtestdata.{SharedListsTestDataADM, SharedTestDataADM} +import org.knora.webapi.sharedtestdata.SharedListsTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.AkkaHttpUtils import scala.concurrent.duration._ diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala index 393b728882..c02fd74aa9 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala @@ -10,15 +10,23 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.E2ESpec +import org.knora.webapi.IRI +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.admin.responder.listsmessages._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, StringLiteralV2, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsADM -import org.knora.webapi.sharedtestdata.{SharedListsTestDataADM, SharedTestDataADM} -import org.knora.webapi.util.{AkkaHttpUtils, MutableTestIri} -import org.knora.webapi.{E2ESpec, IRI} +import org.knora.webapi.sharedtestdata.SharedListsTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri import scala.concurrent.Await import scala.concurrent.duration._ 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 d681f665f1..1fa1303e56 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 @@ -6,16 +6,25 @@ package org.knora.webapi.e2e.admin.lists import akka.actor.ActorSystem -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes} +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.testkit.RouteTestTimeout -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.admin.responder.listsmessages._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, StringLiteralV2, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsADM -import org.knora.webapi.sharedtestdata.{SharedListsTestDataADM, SharedTestDataADM} +import org.knora.webapi.sharedtestdata.SharedListsTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.AkkaHttpUtils import scala.concurrent.duration._ 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 ffd10b8a9a..a3a6839928 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 @@ -8,7 +8,8 @@ package org.knora.webapi.e2e.http import akka.actor.ActorSystem import akka.http.scaladsl.model._ import akka.http.scaladsl.testkit.RouteTestTimeout -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.http.version.ServerVersion 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 16b5478619..faf75a06d1 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 @@ -7,13 +7,16 @@ package org.knora.webapi.e2e.v1 import akka.actor.ActorSystem import akka.http.scaladsl.model._ -import akka.http.scaladsl.model.headers.{`Set-Cookie`, _} +import akka.http.scaladsl.model.headers._ +import akka.http.scaladsl.model.headers.`Set-Cookie` import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol -import org.knora.webapi.messages.v1.responder.sessionmessages.{SessionJsonProtocol, SessionResponse} +import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol +import org.knora.webapi.messages.v1.responder.sessionmessages.SessionResponse import org.knora.webapi.routing.Authenticator.KNORA_AUTHENTICATION_COOKIE_NAME import org.knora.webapi.sharedtestdata.SharedTestDataV1 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 2115bc8c09..baac32e44c 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 @@ -3,8 +3,7 @@ package org.knora.webapi.e2e.v1 import akka.http.scaladsl.model.StatusCodes import org.knora.webapi.E2ESpec import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol - -import scala.concurrent.duration._ +import zio._ /** * Causes an internal server error to see if logging is working correctly. diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ListsV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ListsV1E2ESpec.scala index 1b2f297d74..b2d7fb9571 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ListsV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ListsV1E2ESpec.scala @@ -9,7 +9,8 @@ import akka.actor.ActorSystem import akka.http.scaladsl.testkit.RouteTestTimeout import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.listmessages._ import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsV1 diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/PermissionsHandlingV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/PermissionsHandlingV1E2ESpec.scala index 6eca277e7f..c3090997be 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/PermissionsHandlingV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/PermissionsHandlingV1E2ESpec.scala @@ -10,7 +10,8 @@ import akka.http.scaladsl.model.headers.BasicHttpCredentials import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.sharedtestdata.{SharedTestDataADM, SharedTestDataV1} +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 object PermissionsHandlingV1E2ESpec { val config = ConfigFactory.parseString(""" diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ProjectsV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ProjectsV1E2ESpec.scala index 144966eb2f..7eef4ad195 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/ProjectsV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/ProjectsV1E2ESpec.scala @@ -12,7 +12,8 @@ import akka.http.scaladsl.testkit.RouteTestTimeout import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol -import org.knora.webapi.messages.v1.responder.projectmessages.{ProjectInfoV1, ProjectV1JsonProtocol} +import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1 +import org.knora.webapi.messages.v1.responder.projectmessages.ProjectV1JsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.sharedtestdata.SharedTestDataV1 import org.knora.webapi.util.AkkaHttpUtils 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 860f3b6346..dd589962c9 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 @@ -5,43 +5,49 @@ package org.knora.webapi.e2e.v1 -import java.io.ByteArrayInputStream -import java.net.URLEncoder -import java.util.zip.{ZipEntry, ZipInputStream} - import akka.actor.ActorSystem import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.testkit.RouteTestTimeout import akka.pattern._ import org.knora.webapi._ -import org.knora.webapi.exceptions.{ - AssertionException, - InvalidApiJsonException, - NotFoundException, - TriplestoreResponseException -} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.InvalidApiJsonException +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.exceptions.TriplestoreResponseException import org.knora.webapi.http.directives.DSPApiDirectives import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.messages.util.rdf.{SparqlSelectResult, VariableResultsRow} +import org.knora.webapi.messages.util.rdf.SparqlSelectResult +import org.knora.webapi.messages.util.rdf.VariableResultsRow import org.knora.webapi.messages.v1.responder.resourcemessages.PropsGetForRegionV1 import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceV1JsonProtocol._ -import org.knora.webapi.routing.v1.{ResourcesRouteV1, ValuesRouteV1} +import org.knora.webapi.routing.v1.ResourcesRouteV1 +import org.knora.webapi.routing.v1.ValuesRouteV1 import org.knora.webapi.routing.v2.ResourcesRouteV2 import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataADM._ -import org.knora.webapi.util.{AkkaHttpUtils, MutableTestIri} +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri import org.scalatest.Assertion -import org.xmlunit.builder.{DiffBuilder, Input} +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff import spray.json._ +import java.io.ByteArrayInputStream +import java.net.URLEncoder +import java.util.zip.ZipEntry +import java.util.zip.ZipInputStream +import scala.concurrent.Await +import scala.concurrent.ExecutionContextExecutor +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContextExecutor, Future} -import scala.util.{Random, Try} -import scala.xml.{Node, NodeSeq, XML} +import scala.util.Random +import scala.xml.Node +import scala.xml.NodeSeq +import scala.xml.XML /** * End-to-end test specification for the resources endpoint. 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 e0052abbca..27a83ebbef 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 @@ -5,22 +5,31 @@ package org.knora.webapi.e2e.v1 -import java.net.URLEncoder -import java.nio.file.{Files, Paths} - import akka.actor._ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ -import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.config.AppConfig import org.knora.webapi.exceptions.FileWriteException import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.v1.responder.resourcemessages.{CreateResourceApiRequestV1, CreateResourceValueV1} -import org.knora.webapi.messages.v1.responder.valuemessages.{ChangeFileValueApiRequestV1, CreateRichtextV1} -import org.knora.webapi.routing.v1.{ResourcesRouteV1, ValuesRouteV1} -import org.knora.webapi.settings._ +import org.knora.webapi.messages.v1.responder.resourcemessages.CreateResourceApiRequestV1 +import org.knora.webapi.messages.v1.responder.resourcemessages.CreateResourceValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.ChangeFileValueApiRequestV1 +import org.knora.webapi.messages.v1.responder.valuemessages.CreateRichtextV1 +import org.knora.webapi.routing.v1.ResourcesRouteV1 +import org.knora.webapi.routing.v1.ValuesRouteV1 import org.knora.webapi.sharedtestdata.SharedTestDataV1 +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl +import zio.& +import zio.ZLayer + +import java.net.URLEncoder +import java.nio.file.Files +import java.nio.file.Paths /** * End-to-end test specification for the resources endpoint. This specification uses the Spray Testkit as documented @@ -47,11 +56,15 @@ class SipiV1R2RSpec extends R2RSpec { RdfDataObject(path = "test_data/demo_data/images-demo-data.ttl", name = "http://www.knora.org/data/00FF/images") ) - /* we need to run our app with the mocked sipi actor */ - override lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + /* we need to run our app with the mocked sipi implementation */ + override lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceMockImpl.layer, + AppConfig.live + ) object RequestParams { 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 aee6f5468c..ba4e61f6cf 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 @@ -5,28 +5,35 @@ package org.knora.webapi.e2e.v1 -import java.net.URLEncoder -import java.nio.file.Paths - import akka.actor.ActorSystem +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{HttpEntity, _} import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ import org.knora.webapi.exceptions.InvalidApiJsonException import org.knora.webapi.http.directives.DSPApiDirectives import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.routing.v1.{StandoffRouteV1, ValuesRouteV1} +import org.knora.webapi.routing.v1.StandoffRouteV1 +import org.knora.webapi.routing.v1.ValuesRouteV1 +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 import org.knora.webapi.sharedtestdata.SharedTestDataV1._ -import org.knora.webapi.sharedtestdata.{SharedTestDataADM, SharedTestDataV1} -import org.knora.webapi.util.{AkkaHttpUtils, FileUtil, MutableTestIri} -import org.xmlunit.builder.{DiffBuilder, Input} +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.FileUtil +import org.knora.webapi.util.MutableTestIri +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff import spray.json._ +import java.net.URLEncoder +import java.nio.file.Paths +import scala.concurrent.Await +import scala.concurrent.ExecutionContextExecutor +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContextExecutor, Future} /** * End-to-end test specification for the standoff endpoint. This specification uses the Spray Testkit as documented diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/UsersV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/UsersV1E2ESpec.scala index 0a2557ffaf..dfffc2c66c 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/UsersV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/UsersV1E2ESpec.scala @@ -10,12 +10,13 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import com.typesafe.config.ConfigFactory +import org.knora.webapi.E2ESpec +import org.knora.webapi.IRI import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsV1 import org.knora.webapi.sharedtestdata.SharedTestDataV1 import org.knora.webapi.util.AkkaHttpUtils -import org.knora.webapi.{E2ESpec, IRI} import scala.concurrent.duration._ 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 8b320ba147..dc8e206100 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 @@ -5,11 +5,11 @@ package org.knora.webapi.e2e.v1 -import java.net.URLEncoder - import akka.actor.ActorSystem +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, StatusCodes} import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ import org.knora.webapi.http.directives.DSPApiDirectives @@ -17,9 +17,12 @@ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.v1.responder.valuemessages.ApiValueV1JsonProtocol._ import org.knora.webapi.routing.v1.ValuesRouteV1 import org.knora.webapi.sharedtestdata.SharedTestDataV1 -import org.knora.webapi.util.{AkkaHttpUtils, MutableTestIri} +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri import spray.json._ +import java.net.URLEncoder + /** * Tests the values route. */ 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 f1ab16e168..c4b38089a7 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 @@ -10,10 +10,12 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol -import org.knora.webapi.messages.v2.routing.authenticationmessages.{AuthenticationV2JsonProtocol, LoginResponse} +import org.knora.webapi.messages.v2.routing.authenticationmessages.AuthenticationV2JsonProtocol +import org.knora.webapi.messages.v2.routing.authenticationmessages.LoginResponse import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.MutableTestString 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 9d29a190d0..6c443aeb83 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 @@ -5,9 +5,6 @@ package org.knora.webapi.e2e.v2 -import java.net.URLEncoder -import java.nio.file.Paths - import akka.actor.ActorSystem import akka.http.javadsl.model.StatusCodes import akka.http.scaladsl.testkit.RouteTestTimeout @@ -18,6 +15,8 @@ import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.routing.v2.ResourcesRouteV2 import spray.json._ +import java.net.URLEncoder +import java.nio.file.Paths import scala.concurrent.ExecutionContextExecutor /** 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 753d33d5ad..8e95e9a8b0 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 @@ -5,21 +5,23 @@ package org.knora.webapi.e2e.v2 -import java.net.URLEncoder -import java.nio.file.Paths - import akka.actor.ActorSystem import akka.http.javadsl.model.StatusCodes import akka.http.scaladsl.model.headers.Accept import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.rdf.RdfModel import org.knora.webapi.routing.v2.ListsRouteV2 import org.knora.webapi.util.FileUtil -import spray.json.{JsValue, JsonParser} +import spray.json.JsValue +import spray.json.JsonParser +import java.net.URLEncoder +import java.nio.file.Paths import scala.concurrent.ExecutionContextExecutor /** diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/MarkupHeader.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/MarkupHeader.scala index 38c7898f0e..cd9cebde46 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/MarkupHeader.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/MarkupHeader.scala @@ -5,7 +5,8 @@ package org.knora.webapi.e2e.v2 -import akka.http.scaladsl.model.headers.{ModeledCustomHeader, ModeledCustomHeaderCompanion} +import akka.http.scaladsl.model.headers.ModeledCustomHeader +import akka.http.scaladsl.model.headers.ModeledCustomHeaderCompanion import org.knora.webapi.routing.RouteUtilV2 import scala.util.Try 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 b499d5be82..96d3de9396 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 @@ -2,25 +2,35 @@ package org.knora.webapi.e2e.v2 import akka.actor.ActorSystem import akka.http.scaladsl.model._ -import akka.http.scaladsl.model.headers.{Accept, BasicHttpCredentials} +import akka.http.scaladsl.model.headers.Accept +import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.http.directives.DSPApiDirectives import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.v2.responder.ontologymessages.{InputOntologyV2, TestResponseParsingModeV2} -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import org.knora.webapi.messages.v2.responder.ontologymessages.InputOntologyV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.TestResponseParsingModeV2 import org.knora.webapi.models._ -import org.knora.webapi.routing.v2.{OntologiesRouteV2, ResourcesRouteV2} -import org.knora.webapi.sharedtestdata.{SharedOntologyTestDataADM, SharedTestDataADM} +import org.knora.webapi.routing.v2.OntologiesRouteV2 +import org.knora.webapi.routing.v2.ResourcesRouteV2 +import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util._ import spray.json._ import java.net.URLEncoder -import java.nio.file.{Files, Path, Paths} +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths import java.time.Instant import scala.concurrent.ExecutionContextExecutor diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ProjectHeader.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ProjectHeader.scala index 4648e4c6a0..ef6373ae9f 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ProjectHeader.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ProjectHeader.scala @@ -5,7 +5,8 @@ package org.knora.webapi.e2e.v2 -import akka.http.scaladsl.model.headers.{ModeledCustomHeader, ModeledCustomHeaderCompanion} +import akka.http.scaladsl.model.headers.ModeledCustomHeader +import akka.http.scaladsl.model.headers.ModeledCustomHeaderCompanion import org.knora.webapi.routing.RouteUtilV2 import scala.util.Try 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 ff358e1245..053d4de988 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 @@ -5,34 +5,46 @@ package org.knora.webapi.e2e.v2 -import java.net.URLEncoder -import java.nio.file.Paths -import java.time.Instant import akka.actor.ActorSystem -import akka.http.scaladsl.model.headers.{Accept, BasicHttpCredentials} -import akka.http.scaladsl.model.{HttpEntity, HttpResponse, MediaRange, StatusCodes} +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.MediaRange +import akka.http.scaladsl.model.StatusCodes +import akka.http.scaladsl.model.headers.Accept +import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.InstanceChecker +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.e2e.v2.ResponseCheckerV2._ -import org.knora.webapi.e2e.{ClientTestDataCollector, InstanceChecker, TestDataFileContent, TestDataFilePath} import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util._ import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.routing.RouteUtilV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util._ -import org.xmlunit.builder.{DiffBuilder, Input} +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff -import spray.json.{JsValue, JsonParser} +import spray.json.JsValue +import spray.json.JsonParser +import java.net.URLEncoder +import java.nio.file.Paths +import java.time.Instant import scala.collection.mutable.ArrayBuffer +import scala.concurrent.Await +import scala.concurrent.ExecutionContextExecutor import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContextExecutor} /** * Tests the API v2 resources route. @@ -1310,9 +1322,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val response: HttpResponse = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, response.toString) - val responseJsonDoc: JsonLDDocument = responseToJsonLDDocument(response) + val responseJsonDoc: JsonLDDocument = getResponseAsJsonLD(request) val resourceIri: IRI = responseJsonDoc.body.requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) @@ -1320,12 +1330,9 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { val resourceGetRequest = Get( s"$baseApiUrl/v2/resources/${URLEncoder.encode(resourceIri, "UTF-8")}" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val resourceGetResponse: HttpResponse = - singleAwaitingRequest(resourceGetRequest, duration = settings.triplestoreUpdateTimeout) - val resourceGetResponseAsString = responseToString(resourceGetResponse) // Get the value from the response. - val resourceGetResponseAsJsonLD = JsonLDUtil.parseJsonLD(resourceGetResponseAsString) + val resourceGetResponseAsJsonLD = getResponseAsJsonLD(resourceGetRequest) val valueIri: IRI = resourceGetResponseAsJsonLD.body .requireObject("http://0.0.0.0:3333/ontology/0001/anything/v2#hasBoolean") .requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) @@ -1371,9 +1378,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val response: HttpResponse = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, response.toString) - val responseJsonDoc: JsonLDDocument = responseToJsonLDDocument(response) + val responseJsonDoc: JsonLDDocument = getResponseAsJsonLD(request) val resourceIri: IRI = responseJsonDoc.body.requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) @@ -1381,12 +1386,9 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { val resourceGetRequest = Get( s"$baseApiUrl/v2/resources/${URLEncoder.encode(resourceIri, "UTF-8")}" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val resourceGetResponse: HttpResponse = - singleAwaitingRequest(resourceGetRequest, duration = settings.triplestoreUpdateTimeout) - val resourceGetResponseAsString = responseToString(resourceGetResponse) // Get the value from the response. - val resourceGetResponseAsJsonLD = JsonLDUtil.parseJsonLD(resourceGetResponseAsString) + val resourceGetResponseAsJsonLD = getResponseAsJsonLD(resourceGetRequest) val valueUUID = resourceGetResponseAsJsonLD.body .requireObject("http://0.0.0.0:3333/ontology/0001/anything/v2#hasBoolean") .requireString(OntologyConstants.KnoraApiV2Complex.ValueHasUUID) @@ -1436,9 +1438,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val response: HttpResponse = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, response.toString) - val responseJsonDoc: JsonLDDocument = responseToJsonLDDocument(response) + val responseJsonDoc: JsonLDDocument = getResponseAsJsonLD(request) val resourceIri: IRI = responseJsonDoc.body.requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) @@ -1446,9 +1446,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { val resourceGetRequest = Get( s"$baseApiUrl/v2/resources/${URLEncoder.encode(resourceIri, "UTF-8")}" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val resourceGetResponse: HttpResponse = - singleAwaitingRequest(resourceGetRequest, duration = settings.triplestoreUpdateTimeout) - val resourceGetResponseAsString = responseToString(resourceGetResponse) + val resourceGetResponseAsString = getResponseAsString(resourceGetRequest) // Get the value from the response. val resourceGetResponseAsJsonLD = JsonLDUtil.parseJsonLD(resourceGetResponseAsString) @@ -1511,10 +1509,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val response: HttpResponse = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, response.toString) - - val responseJsonDoc: JsonLDDocument = responseToJsonLDDocument(response) + val responseJsonDoc: JsonLDDocument = getResponseAsJsonLD(request) val resourceIri: IRI = responseJsonDoc.body.requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) assert(resourceIri == customResourceIRI) @@ -1523,9 +1518,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { val resourceGetRequest = Get( s"$baseApiUrl/v2/resources/${URLEncoder.encode(resourceIri, "UTF-8")}" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val resourceGetResponse: HttpResponse = - singleAwaitingRequest(resourceGetRequest, duration = settings.triplestoreUpdateTimeout) - val resourceGetResponseAsString = responseToString(resourceGetResponse) + val resourceGetResponseAsString = getResponseAsString(resourceGetRequest) // Get the value from the response. val resourceGetResponseAsJsonLD = JsonLDUtil.parseJsonLD(resourceGetResponseAsString) @@ -1598,9 +1591,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(SharedTestDataADM.anythingAdminUser.email, password)) - val response: HttpResponse = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, response.toString) - val responseJsonDoc: JsonLDDocument = responseToJsonLDDocument(response) + val responseJsonDoc: JsonLDDocument = getResponseAsJsonLD(request) val resourceIri: IRI = responseJsonDoc.body.requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) assert(resourceIri.toSmartIri.isKnoraDataIri) @@ -1640,9 +1631,8 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(SharedTestDataADM.anythingUser2.email, password)) - val response: HttpResponse = singleAwaitingRequest(request) - val responseAsString = responseToString(response) - assert(response.status == StatusCodes.Forbidden, responseAsString) + val response = singleAwaitingRequest(request) + assert(response.status == StatusCodes.Forbidden, "should be forbidden") } "create a resource containing escaped text" in { @@ -1652,9 +1642,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val response: HttpResponse = singleAwaitingRequest(request) - assert(response.status == StatusCodes.OK, response.toString) - val responseJsonDoc: JsonLDDocument = responseToJsonLDDocument(response) + val responseJsonDoc: JsonLDDocument = getResponseAsJsonLD(request) val resourceIri: IRI = responseJsonDoc.body.requireStringWithValidation(JsonLDKeywords.ID, stringFormatter.validateAndEscapeIri) assert(resourceIri.toSmartIri.isKnoraDataIri) @@ -1699,9 +1687,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val updateResponse: HttpResponse = singleAwaitingRequest(updateRequest) - val updateResponseAsString: String = responseToString(updateResponse) - assert(updateResponse.status == StatusCodes.OK, updateResponseAsString) + val updateResponseAsString: String = getResponseAsString(updateRequest) assert( JsonParser(updateResponseAsString) == JsonParser( updateResourceMetadataResponse( @@ -1727,11 +1713,8 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { val previewRequest = Get( s"$baseApiUrl/v2/resourcespreview/$aThingIriEncoded" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val previewResponse: HttpResponse = singleAwaitingRequest(previewRequest) - val previewResponseAsString = responseToString(previewResponse) - assert(previewResponse.status == StatusCodes.OK, previewResponseAsString) - val previewJsonLD = JsonLDUtil.parseJsonLD(previewResponseAsString) + val previewJsonLD = getResponseAsJsonLD(previewRequest) val updatedLabel: String = previewJsonLD.requireString(OntologyConstants.Rdfs.Label) assert(updatedLabel == newLabel) val updatedPermissions: String = previewJsonLD.requireString(OntologyConstants.KnoraApiV2Complex.HasPermissions) @@ -2009,11 +1992,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { s"$baseApiUrl/v2/resources", HttpEntity(RdfMediaTypes.`application/ld+json`, jsonLDEntity) ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val resourceCreateResponse: HttpResponse = - singleAwaitingRequest(request = resourceCreateRequest, duration = settings.triplestoreUpdateTimeout) - assert(resourceCreateResponse.status == StatusCodes.OK, resourceCreateResponse.toString) - - val resourceCreateResponseAsJsonLD: JsonLDDocument = responseToJsonLDDocument(resourceCreateResponse) + val resourceCreateResponseAsJsonLD: JsonLDDocument = getResponseAsJsonLD(resourceCreateRequest) val resourceIri: IRI = resourceCreateResponseAsJsonLD.body.requireStringWithValidation( JsonLDKeywords.ID, @@ -2030,9 +2009,7 @@ class ResourcesRouteV2E2ESpec extends E2ESpec(ResourcesRouteV2E2ESpec.config) { val resourceGetRequest = Get( s"$baseApiUrl/v2/resources/${URLEncoder.encode(hamletResourceIri.get, "UTF-8")}" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val resourceGetResponse: HttpResponse = - singleAwaitingRequest(resourceGetRequest, duration = settings.triplestoreUpdateTimeout) - val resourceGetResponseAsString = responseToString(resourceGetResponse) + val resourceGetResponseAsString = getResponseAsString(resourceGetRequest) // Check that the response matches the ontology. instanceChecker.check( diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResponseCheckerV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResponseCheckerV2Spec.scala index cd1d4ea05b..c3f8c8b74f 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResponseCheckerV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/ResponseCheckerV2Spec.scala @@ -5,11 +5,11 @@ package org.knora.webapi.e2e.v2 -import java.nio.file.Paths - import org.knora.webapi.CoreSpec import org.knora.webapi.util.FileUtil +import java.nio.file.Paths + /** * Tests [[ResponseCheckerV2]]. */ diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SchemaHeader.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SchemaHeader.scala index ea9160a4b5..4633bdb2d1 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SchemaHeader.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SchemaHeader.scala @@ -5,7 +5,8 @@ package org.knora.webapi.e2e.v2 -import akka.http.scaladsl.model.headers.{ModeledCustomHeader, ModeledCustomHeaderCompanion} +import akka.http.scaladsl.model.headers.ModeledCustomHeader +import akka.http.scaladsl.model.headers.ModeledCustomHeaderCompanion import org.knora.webapi.routing.RouteUtilV2 import scala.util.Try 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 b061de6d78..ab35da0905 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 @@ -5,32 +5,42 @@ package org.knora.webapi.e2e.v2 -import java.net.URLEncoder -import java.nio.file.Paths - import akka.actor.ActorSystem import akka.http.javadsl.model.StatusCodes +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.Multipart import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, Multipart} import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.e2e.v2.ResponseCheckerV2._ -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} import org.knora.webapi.http.directives.DSPApiDirectives import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDKeywords, JsonLDUtil} +import org.knora.webapi.messages.util.rdf.JsonLDDocument +import org.knora.webapi.messages.util.rdf.JsonLDKeywords +import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.messages.util.search.SparqlQueryConstants -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.routing.RouteUtilV2 import org.knora.webapi.routing.v1.ValuesRouteV1 -import org.knora.webapi.routing.v2.{ResourcesRouteV2, SearchRouteV2, StandoffRouteV2} +import org.knora.webapi.routing.v2.ResourcesRouteV2 +import org.knora.webapi.routing.v2.SearchRouteV2 +import org.knora.webapi.routing.v2.StandoffRouteV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.util.{FileUtil, MutableTestIri} -import org.xmlunit.builder.{DiffBuilder, Input} +import org.knora.webapi.util.FileUtil +import org.knora.webapi.util.MutableTestIri +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff import spray.json.JsString +import java.net.URLEncoder +import java.nio.file.Paths import scala.concurrent.ExecutionContextExecutor /** diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/StandoffRouteV2E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/StandoffRouteV2E2ESpec.scala index 2801565764..da2f706693 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/StandoffRouteV2E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/StandoffRouteV2E2ESpec.scala @@ -5,30 +5,36 @@ package org.knora.webapi.e2e.v2 -import java.nio.file.Paths import akka.http.javadsl.model.StatusCodes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{HttpEntity, _} import akka.http.scaladsl.unmarshalling.Unmarshal -import org.knora.webapi.messages.store.sipimessages._ -import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ import org.knora.webapi._ import org.knora.webapi.e2e.v2.ResponseCheckerV2.compareJSONLDForMappingCreationResponse import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ +import org.knora.webapi.messages.store.sipimessages._ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDKeywords} -import org.knora.webapi.messages.v2.routing.authenticationmessages.{AuthenticationV2JsonProtocol, LoginResponse} +import org.knora.webapi.messages.util.rdf.JsonLDDocument +import org.knora.webapi.messages.util.rdf.JsonLDKeywords +import org.knora.webapi.messages.v2.routing.authenticationmessages.AuthenticationV2JsonProtocol +import org.knora.webapi.messages.v2.routing.authenticationmessages.LoginResponse +import org.knora.webapi.models.filemodels.FileType +import org.knora.webapi.models.filemodels.UploadFileRequest +import org.knora.webapi.models.standoffmodels.DefineStandoffMapping import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataV1.ANYTHING_PROJECT_IRI -import org.knora.webapi.util.{FileUtil, MutableTestIri} -import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.models.filemodels.{FileType, UploadFileRequest} -import org.knora.webapi.models.standoffmodels.DefineStandoffMapping -import org.xmlunit.builder.{DiffBuilder, Input} +import org.knora.webapi.util.FileUtil +import org.knora.webapi.util.MutableTestIri +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff import spray.json._ import java.net.URLEncoder +import java.nio.file.Paths import scala.concurrent.Await import scala.concurrent.duration._ @@ -36,6 +42,7 @@ import scala.concurrent.duration._ * End-to-end test specification for the standoff endpoint. */ class StandoffRouteV2E2ESpec extends E2ESpec with AuthenticationV2JsonProtocol { + private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance private val anythingUser = SharedTestDataADM.anythingUser1 @@ -43,10 +50,8 @@ class StandoffRouteV2E2ESpec extends E2ESpec with AuthenticationV2JsonProtocol { private val password = SharedTestDataADM.testPass private val pathToXMLWithStandardMapping = "../test_data/test_route/texts/StandardHTML.xml" - - private val pathToLetterMapping = "../test_data/test_route/texts/mappingForLetter.xml" - - private val pathToFreetestCustomMapping = "../test_data/test_route/texts/freetestCustomMapping.xml" + private val pathToLetterMapping = "../test_data/test_route/texts/mappingForLetter.xml" + private val pathToFreetestCustomMapping = "../test_data/test_route/texts/freetestCustomMapping.xml" private val pathToFreetestCustomMappingWithTransformation = "../test_data/test_route/texts/freetestCustomMappingWithTransformation.xml" private val pathToFreetestXMLTextValue = "../test_data/test_route/texts/freetestXMLTextValue.xml" @@ -124,16 +129,10 @@ class StandoffRouteV2E2ESpec extends E2ESpec with AuthenticationV2JsonProtocol { val request = Get( s"$baseApiUrl/v2/resources/$iri" ) ~> addCredentials(BasicHttpCredentials(anythingUserEmail, password)) - val response: HttpResponse = singleAwaitingRequest(request) - responseToJsonLDDocument(response) + getResponseAsJsonLD(request) } "The Standoff v2 Endpoint" should { - "check if SIPI is available" in { - val request = Get(s"${settings.internalSipiBaseUrl}/server/test.html") - val res = singleAwaitingRequest(request) - assert(res.status == StatusCodes.OK) - } "create a text value with standard mapping" in { val xmlContent = FileUtil.readTextFile(Paths.get(pathToXMLWithStandardMapping)) @@ -284,7 +283,7 @@ class StandoffRouteV2E2ESpec extends E2ESpec with AuthenticationV2JsonProtocol { Map("filename" -> freetestXSLTFile) ) ) - val sipiRequest = Post(s"${settings.internalSipiBaseUrl}/upload?token=$loginToken", sipiFormData) + val sipiRequest = Post(s"${appConfig.sipi.internalBaseUrl}/upload?token=$loginToken", sipiFormData) val sipiResponse = singleAwaitingRequest(sipiRequest) val uploadedFile = responseToString(sipiResponse).parseJson.asJsObject .convertTo[SipiUploadResponse] 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 8d7b8623ae..feb3cfebcc 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 @@ -5,30 +5,34 @@ package org.knora.webapi.e2e.v2 -import java.net.URLEncoder -import java.nio.file.Paths -import java.time.Instant -import java.util.UUID - import akka.actor.ActorSystem import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal import org.knora.webapi._ +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.e2e.v2.ResponseCheckerV2.compareJSONLDForResourcesResponse -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.util.search.SparqlQueryConstants -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util._ -import org.xmlunit.builder.{DiffBuilder, Input} +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff +import java.net.URLEncoder +import java.nio.file.Paths +import java.time.Instant +import java.util.UUID import scala.concurrent.Await import scala.concurrent.duration._ 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 40af60d438..9c69076f1c 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 @@ -5,23 +5,34 @@ package org.knora.webapi.e2e.v2 -import akka.actor.{ActorRef, ActorSystem, Props} +import akka.actor.ActorSystem +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{HttpEntity, StatusCodes} import akka.http.scaladsl.testkit.RouteTestTimeout import org.knora.webapi._ -import org.knora.webapi.app.ApplicationActor -import org.knora.webapi.e2e.{ClientTestDataCollector, TestDataFileContent, TestDataFilePath} +import org.knora.webapi.config.AppConfig +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.util.search.SparqlQueryConstants -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} -import org.knora.webapi.routing.v2.{SearchRouteV2, ValuesRouteV2} -import org.knora.webapi.settings._ +import org.knora.webapi.routing.v2.SearchRouteV2 +import org.knora.webapi.routing.v2.ValuesRouteV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util.MutableTestIri +import zio.& +import zio.ZLayer import scala.concurrent.ExecutionContextExecutor @@ -44,11 +55,15 @@ class ValuesV2R2RSpec extends R2RSpec { implicit val ec: ExecutionContextExecutor = system.dispatcher - /* we need to run our app with the mocked sipi actor */ - override lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + /* we need to run our app with the mocked sipi implementation */ + override lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceMockImpl.layer, + AppConfig.live + ) private val aThingPictureIri = "http://rdfh.ch/0001/a-thing-picture" diff --git a/webapi/src/test/scala/org/knora/webapi/it/VersionRouteITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/VersionRouteITSpec.scala index 6e7f88e8eb..0c71a4037f 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/VersionRouteITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/VersionRouteITSpec.scala @@ -5,16 +5,15 @@ package org.knora.webapi.it -import java.util.NoSuchElementException - import akka.http.scaladsl.model._ -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.ITKnoraLiveSpec import spray.json._ +import java.util.NoSuchElementException import scala.concurrent.Await import scala.concurrent.duration._ -import scala.languageFeature.postfixOps object VersionRouteITSpec { val config: Config = ConfigFactory.parseString(""" diff --git a/webapi/src/test/scala/org/knora/webapi/it/v1/DrawingsGodsV1ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v1/DrawingsGodsV1ITSpec.scala index 194fcbca34..ceea11100f 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v1/DrawingsGodsV1ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v1/DrawingsGodsV1ITSpec.scala @@ -5,23 +5,25 @@ package org.knora.webapi.it.v1 -import java.net.URLEncoder - import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.ITKnoraLiveSpec import org.knora.webapi.exceptions.InvalidApiJsonException -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} -import org.knora.webapi.messages.v2.routing.authenticationmessages.{AuthenticationV2JsonProtocol, LoginResponse} import org.knora.webapi.messages.store.sipimessages._ -import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol +import org.knora.webapi.messages.v2.routing.authenticationmessages.AuthenticationV2JsonProtocol +import org.knora.webapi.messages.v2.routing.authenticationmessages.LoginResponse +import org.knora.webapi.testservices.FileToUpload import spray.json._ +import java.net.URLEncoder +import java.nio.file.Paths import scala.concurrent.Await import scala.concurrent.duration._ -import java.nio.file.Paths object DrawingsGodsV1ITSpec { val config: Config = ConfigFactory.parseString(""" @@ -89,7 +91,7 @@ class DrawingsGodsV1ITSpec // Upload the image to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToChlaus, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = Seq(FileToUpload(path = pathToChlaus, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head diff --git a/webapi/src/test/scala/org/knora/webapi/it/v1/ErrorV1ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v1/ErrorV1ITSpec.scala index e570f4c13a..30d72cfaad 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v1/ErrorV1ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v1/ErrorV1ITSpec.scala @@ -8,8 +8,7 @@ package org.knora.webapi.it.v1 import akka.http.scaladsl.model.StatusCodes import org.knora.webapi.ITKnoraLiveSpec import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol - -import scala.concurrent.duration._ +import zio._ /** * Causes an internal server error to see if logging is working correctly. 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 7e85d11279..8a6aedc058 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 @@ -5,30 +5,47 @@ package org.knora.webapi.it.v1 -import java.net.URLEncoder -import java.nio.file.{Files, Paths, StandardCopyOption} - -import akka.http.scaladsl.model._ +import akka.http.scaladsl.model.ContentType +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpCharsets +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpRequest +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.MediaTypes +import akka.http.scaladsl.model.Multipart +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, InvalidApiJsonException} -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} -import org.knora.webapi.messages.v2.routing.authenticationmessages.{AuthenticationV2JsonProtocol, LoginResponse} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.InvalidApiJsonException import org.knora.webapi.messages.store.sipimessages._ -import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol +import org.knora.webapi.messages.v2.routing.authenticationmessages.AuthenticationV2JsonProtocol +import org.knora.webapi.messages.v2.routing.authenticationmessages.LoginResponse import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.util.{FileUtil, MutableTestIri} -import org.xmlunit.builder.{DiffBuilder, Input} +import org.knora.webapi.testservices.FileToUpload +import org.knora.webapi.util.FileUtil +import org.knora.webapi.util.MutableTestIri +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff import spray.json._ +import java.net.URLEncoder +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.StandardCopyOption +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} import scala.xml._ -import scala.xml.transform.{RewriteRule, RuleTransformer} -import java.nio.file.Path +import scala.xml.transform.RewriteRule +import scala.xml.transform.RuleTransformer object KnoraSipiIntegrationV1ITSpec { val config: Config = ConfigFactory.parseString(""" @@ -205,7 +222,7 @@ class KnoraSipiIntegrationV1ITSpec // Upload the image to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToChlaus, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = Seq(FileToUpload(path = pathToChlaus, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -254,7 +271,8 @@ class KnoraSipiIntegrationV1ITSpec // Upload the image to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMarbles, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = + Seq(FileToUpload(path = pathToMarbles, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -328,7 +346,7 @@ class KnoraSipiIntegrationV1ITSpec // Upload the image to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = dest, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = Seq(FileToUpload(path = dest, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -400,7 +418,7 @@ class KnoraSipiIntegrationV1ITSpec filesToUpload = Seq( FileToUpload( path = pathToXSLTransformation, - mimeType = MediaTypes.`application/xml`.toContentType(HttpCharsets.`UTF-8`) + mimeType = org.apache.http.entity.ContentType.APPLICATION_XML ) ) ) @@ -521,7 +539,7 @@ class KnoraSipiIntegrationV1ITSpec filesToUpload = Seq( FileToUpload( path = pathToBEOLBodyXSLTransformation, - mimeType = MediaTypes.`application/xml`.toContentType(HttpCharsets.`UTF-8`) + mimeType = org.apache.http.entity.ContentType.APPLICATION_XML ) ) ) @@ -592,7 +610,7 @@ class KnoraSipiIntegrationV1ITSpec filesToUpload = Seq( FileToUpload( path = pathToBEOLGravsearchTemplate, - mimeType = MediaTypes.`text/plain`.toContentType(HttpCharsets.`UTF-8`) + mimeType = org.apache.http.entity.ContentType.TEXT_PLAIN ) ) ) @@ -627,7 +645,7 @@ class KnoraSipiIntegrationV1ITSpec filesToUpload = Seq( FileToUpload( path = pathToBEOLHeaderXSLTransformation, - mimeType = MediaTypes.`application/xml`.toContentType(HttpCharsets.`UTF-8`) + mimeType = org.apache.http.entity.ContentType.APPLICATION_XML ) ) ) @@ -751,7 +769,9 @@ class KnoraSipiIntegrationV1ITSpec // Upload the PDF file to Sipi. val pdfUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalPdf, mimeType = MediaTypes.`application/pdf`)) + filesToUpload = Seq( + FileToUpload(path = pathToMinimalPdf, mimeType = org.apache.http.entity.ContentType.create("application/pdf")) + ) ) val uploadedPdfFile: SipiUploadResponseEntry = pdfUploadResponse.uploadedFiles.head @@ -807,7 +827,9 @@ class KnoraSipiIntegrationV1ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestPdf, mimeType = MediaTypes.`application/pdf`)) + filesToUpload = Seq( + FileToUpload(path = pathToTestPdf, mimeType = org.apache.http.entity.ContentType.create("application/pdf")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -845,7 +867,9 @@ class KnoraSipiIntegrationV1ITSpec // Upload the Zip file to Sipi. val zipUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalZip, mimeType = MediaTypes.`application/zip`)) + filesToUpload = Seq( + FileToUpload(path = pathToMinimalZip, mimeType = org.apache.http.entity.ContentType.create("application/zip")) + ) ) val uploadedZipFile: SipiUploadResponseEntry = zipUploadResponse.uploadedFiles.head @@ -897,7 +921,9 @@ class KnoraSipiIntegrationV1ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestZip, mimeType = MediaTypes.`application/zip`)) + filesToUpload = Seq( + FileToUpload(path = pathToTestZip, mimeType = org.apache.http.entity.ContentType.create("application/zip")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -937,7 +963,8 @@ class KnoraSipiIntegrationV1ITSpec // Upload the WAV file to Sipi. val zipUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalWav, mimeType = MediaTypes.`audio/wav`)) + filesToUpload = + Seq(FileToUpload(path = pathToMinimalWav, mimeType = org.apache.http.entity.ContentType.create("audio/wav"))) ) val uploadedWavFile: SipiUploadResponseEntry = zipUploadResponse.uploadedFiles.head @@ -989,7 +1016,8 @@ class KnoraSipiIntegrationV1ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestWav, mimeType = MediaTypes.`audio/wav`)) + filesToUpload = + Seq(FileToUpload(path = pathToTestWav, mimeType = org.apache.http.entity.ContentType.create("audio/wav"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1030,7 +1058,8 @@ class KnoraSipiIntegrationV1ITSpec // Upload the video file to Sipi. val zipUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestVideo, mimeType = MediaTypes.`video/mp4`)) + filesToUpload = + Seq(FileToUpload(path = pathToTestVideo, mimeType = org.apache.http.entity.ContentType.create("video/mp4"))) ) val uploadedVideoFile: SipiUploadResponseEntry = zipUploadResponse.uploadedFiles.head @@ -1082,7 +1111,8 @@ class KnoraSipiIntegrationV1ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestVideo2, mimeType = MediaTypes.`video/mp4`)) + filesToUpload = + Seq(FileToUpload(path = pathToTestVideo2, mimeType = org.apache.http.entity.ContentType.create("video/mp4"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head diff --git a/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiPermissionsV1ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiPermissionsV1ITSpec.scala index 11054b72cb..3c3579a433 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiPermissionsV1ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v1/KnoraSipiPermissionsV1ITSpec.scala @@ -6,7 +6,8 @@ package org.knora.webapi.it.v1 import org.knora.webapi._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol /** * End-to-End (E2E) test specification for testing Knora-Sipi integration. Sipi must be running with the config file diff --git a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala index 4315878c62..0f0a9b44da 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala @@ -5,25 +5,30 @@ package org.knora.webapi.it.v2 -import java.net.URLEncoder -import java.nio.file.{Files, Paths} import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.BasicHttpCredentials import akka.http.scaladsl.unmarshalling.Unmarshal -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.store.sipimessages._ import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.messages.v2.routing.authenticationmessages._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} -import org.knora.webapi.messages.store.sipimessages._ -import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ import org.knora.webapi.models.filemodels._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.testservices.FileToUpload import org.knora.webapi.util.MutableTestIri +import java.net.URLEncoder +import java.nio.file.Files +import java.nio.file.Paths import scala.concurrent.Await import scala.concurrent.duration._ @@ -417,7 +422,8 @@ class KnoraSipiIntegrationV2ITSpec val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMarbles, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = + Seq(FileToUpload(path = pathToMarbles, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -476,10 +482,15 @@ class KnoraSipiIntegrationV2ITSpec } "reject an image file with the wrong file extension" in { - val exception = intercept[AssertionException] { + val exception = intercept[BadRequestException] { uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMarblesWithWrongExtension, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = Seq( + FileToUpload( + path = pathToMarblesWithWrongExtension, + mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF + ) + ) ) } @@ -491,7 +502,8 @@ class KnoraSipiIntegrationV2ITSpec val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTrp88, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = + Seq(FileToUpload(path = pathToTrp88, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -542,7 +554,8 @@ class KnoraSipiIntegrationV2ITSpec // Upload the image to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMarbles, mimeType = MediaTypes.`image/tiff`)) + filesToUpload = + Seq(FileToUpload(path = pathToMarbles, mimeType = org.apache.http.entity.ContentType.IMAGE_TIFF)) ) val internalFilename = sipiUploadResponse.uploadedFiles.head.internalFilename @@ -580,7 +593,9 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalPdf, mimeType = MediaTypes.`application/pdf`)) + filesToUpload = Seq( + FileToUpload(path = pathToMinimalPdf, mimeType = org.apache.http.entity.ContentType.create("application/pdf")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -646,7 +661,9 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestPdf, mimeType = MediaTypes.`application/pdf`)) + filesToUpload = Seq( + FileToUpload(path = pathToTestPdf, mimeType = org.apache.http.entity.ContentType.create("application/pdf")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -697,7 +714,9 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalZip, mimeType = MediaTypes.`application/zip`)) + filesToUpload = Seq( + FileToUpload(path = pathToMinimalZip, mimeType = org.apache.http.entity.ContentType.create("application/zip")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -729,7 +748,7 @@ class KnoraSipiIntegrationV2ITSpec val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, filesToUpload = - Seq(FileToUpload(path = pathToCsv1, mimeType = MediaTypes.`text/csv`.toContentType(HttpCharsets.`UTF-8`))) + Seq(FileToUpload(path = pathToCsv1, mimeType = org.apache.http.entity.ContentType.create("text/csv"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -790,7 +809,7 @@ class KnoraSipiIntegrationV2ITSpec val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, filesToUpload = - Seq(FileToUpload(path = pathToCsv2, mimeType = MediaTypes.`text/csv`.toContentType(HttpCharsets.`UTF-8`))) + Seq(FileToUpload(path = pathToCsv2, mimeType = org.apache.http.entity.ContentType.create("text/csv"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -837,7 +856,7 @@ class KnoraSipiIntegrationV2ITSpec val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, filesToUpload = - Seq(FileToUpload(path = pathToCsv1, mimeType = MediaTypes.`text/csv`.toContentType(HttpCharsets.`UTF-8`))) + Seq(FileToUpload(path = pathToCsv1, mimeType = org.apache.http.entity.ContentType.create("text/csv"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -861,8 +880,7 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = - Seq(FileToUpload(path = pathToXml1, mimeType = MediaTypes.`text/xml`.toContentType(HttpCharsets.`UTF-8`))) + filesToUpload = Seq(FileToUpload(path = pathToXml1, mimeType = org.apache.http.entity.ContentType.TEXT_XML)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -919,8 +937,7 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = - Seq(FileToUpload(path = pathToXml2, mimeType = MediaTypes.`text/xml`.toContentType(HttpCharsets.`UTF-8`))) + filesToUpload = Seq(FileToUpload(path = pathToXml2, mimeType = org.apache.http.entity.ContentType.TEXT_XML)) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -967,7 +984,9 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalZip, mimeType = MediaTypes.`application/zip`)) + filesToUpload = Seq( + FileToUpload(path = pathToMinimalZip, mimeType = org.apache.http.entity.ContentType.create("application/zip")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -991,7 +1010,9 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalZip, mimeType = MediaTypes.`application/zip`)) + filesToUpload = Seq( + FileToUpload(path = pathToMinimalZip, mimeType = org.apache.http.entity.ContentType.create("application/zip")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1051,7 +1072,9 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestZip, mimeType = MediaTypes.`application/zip`)) + filesToUpload = Seq( + FileToUpload(path = pathToTestZip, mimeType = org.apache.http.entity.ContentType.create("application/zip")) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1099,7 +1122,12 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTest7z, mimeType = MediaTypes.`application/x-7z-compressed`)) + filesToUpload = Seq( + FileToUpload( + path = pathToTest7z, + mimeType = org.apache.http.entity.ContentType.create("application/x-7z-compressed") + ) + ) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1159,7 +1187,8 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToMinimalWav, mimeType = MediaTypes.`audio/wav`)) + filesToUpload = + Seq(FileToUpload(path = pathToMinimalWav, mimeType = org.apache.http.entity.ContentType.create("audio/wav"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1217,7 +1246,8 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestWav, mimeType = MediaTypes.`audio/wav`)) + filesToUpload = + Seq(FileToUpload(path = pathToTestWav, mimeType = org.apache.http.entity.ContentType.create("audio/wav"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1264,7 +1294,8 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestVideo, mimeType = MediaTypes.`video/mp4`)) + filesToUpload = + Seq(FileToUpload(path = pathToTestVideo, mimeType = org.apache.http.entity.ContentType.create("video/mp4"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head @@ -1321,7 +1352,8 @@ class KnoraSipiIntegrationV2ITSpec // Upload the file to Sipi. val sipiUploadResponse: SipiUploadResponse = uploadToSipi( loginToken = loginToken, - filesToUpload = Seq(FileToUpload(path = pathToTestVideo2, mimeType = MediaTypes.`video/mp4`)) + filesToUpload = + Seq(FileToUpload(path = pathToTestVideo2, mimeType = org.apache.http.entity.ContentType.create("video/mp4"))) ) val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head diff --git a/webapi/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala index 116ac0fd28..5b45212520 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala @@ -5,13 +5,17 @@ package org.knora.webapi.messages -import java.time.Instant -import java.util.UUID import org.knora.webapi._ -import org.knora.webapi.exceptions.{AssertionException, BadRequestException} +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter.SalsahGuiAttributeDefinition -import org.knora.webapi.sharedtestdata.{SharedOntologyTestDataADM, SharedTestDataADM, SharedTestDataV1} +import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 + +import java.time.Instant +import java.util.UUID /** * Tests [[StringFormatter]]. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala index 7fa6871ddb..fa787e05dc 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/listsmessages/ListsMessagesADMSpec.scala @@ -11,8 +11,10 @@ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages.ListsErrorMessagesADM._ import org.knora.webapi.messages.admin.responder.valueObjects._ -import org.knora.webapi.messages.store.triplestoremessages.{StringLiteralSequenceV2, StringLiteralV2} -import org.knora.webapi.sharedtestdata.{SharedListsTestDataADM, SharedTestDataADM} +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.sharedtestdata.SharedListsTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM import spray.json._ import java.util.UUID diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala index c5879a7379..8d55571c26 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/permissionsmessages/PermissionsMessagesADMSpec.scala @@ -5,9 +5,9 @@ package org.knora.webapi.messages.admin.responder.permissionsmessages -import java.util.UUID import org.knora.webapi.CoreSpec -import org.knora.webapi.exceptions.{BadRequestException, ForbiddenException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.ForbiddenException import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.OntologyConstants.KnoraAdmin.AdministrativePermissionAbbreviations import org.knora.webapi.messages.OntologyConstants.KnoraBase.EntityPermissionAbbreviations @@ -17,6 +17,8 @@ import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataV1._ import org.knora.webapi.sharedtestdata._ +import java.util.UUID + /** * This spec is used to test subclasses of the [[PermissionsResponderRequestADM]] class. */ diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADMSpec.scala index fac7b3887d..d55d8bcb2c 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADMSpec.scala @@ -5,9 +5,11 @@ package org.knora.webapi.messages.admin.responder.projectsmessages -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, OntologyConstraintException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.OntologyConstraintException import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADMSpec.scala index 24d3f0f81d..caea9d5407 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/usersmessages/UsersMessagesADMSpec.scala @@ -5,11 +5,13 @@ package org.knora.webapi.messages.admin.responder.usersmessages -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionProfileType, PermissionsDataADM} +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionProfileType +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder diff --git a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/valueObjects/ValueObjectsADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/valueObjects/ValueObjectsADMSpec.scala index 673c0dfa81..0f86319a50 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/valueObjects/ValueObjectsADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/admin/responder/valueObjects/ValueObjectsADMSpec.scala @@ -4,7 +4,8 @@ */ package org.knora.webapi.messages.admin.responder.valueObjects -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory object ValueObjectsADMSpec { val config: Config = ConfigFactory.parseString(""" 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 23ea860fd5..dbb519ac73 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 @@ -5,8 +5,6 @@ package org.knora.webapi.util -import java.nio.file.Paths - import akka.testkit.ImplicitSender import akka.util.Timeout import org.knora.webapi._ @@ -15,11 +13,14 @@ import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstru import org.knora.webapi.messages.util.ConstructResponseUtilV2 import org.knora.webapi.messages.util.rdf.RdfFeatureFactory import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourcesSequenceV2 -import org.knora.webapi.responders.v2.{ResourcesResponderV2SpecFullData, ResourcesResponseCheckerV2} +import org.knora.webapi.responders.v2.ResourcesResponderV2SpecFullData +import org.knora.webapi.responders.v2.ResourcesResponseCheckerV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM +import java.nio.file.Paths +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} /** * Tests [[ConstructResponseUtilV2]]. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2SpecFullData.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2SpecFullData.scala index 1b770b29ad..7158f16749 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2SpecFullData.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2SpecFullData.scala @@ -1,20 +1,20 @@ package org.knora.webapi.util -import java.time.Instant - import org.knora.webapi.InternalSchema import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.util.PermissionUtilADM.{ChangeRightsPermission, ViewPermission} -import org.knora.webapi.messages.v2.responder.resourcemessages.{ReadResourceV2, ReadResourcesSequenceV2} -import org.knora.webapi.messages.v2.responder.standoffmessages.{ - StandoffDataTypeClasses, - StandoffTagIriAttributeV2, - StandoffTagV2 -} +import org.knora.webapi.messages.util.PermissionUtilADM.ChangeRightsPermission +import org.knora.webapi.messages.util.PermissionUtilADM.ViewPermission +import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourceV2 +import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourcesSequenceV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffDataTypeClasses +import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffTagIriAttributeV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.StandoffTagV2 import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import java.time.Instant + class ConstructResponseUtilV2SpecFullData(implicit stringFormatter: StringFormatter) { val expectedReadResourceForAnythingVisibleThingWithHiddenIntValuesAnythingAdmin = ReadResourcesSequenceV2( diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/DateUtilV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/DateUtilV1Spec.scala index dc179b58a0..aee1a8a3fc 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/DateUtilV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/DateUtilV1Spec.scala @@ -5,20 +5,19 @@ package org.knora.webapi.util -import java.util.{Calendar, GregorianCalendar} - import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.util.DateUtilV1 import org.knora.webapi.messages.util.DateUtilV1.DateRange -import org.knora.webapi.messages.v1.responder.valuemessages.{ - DateValueV1, - JulianDayNumberValueV1, - KnoraCalendarV1, - KnoraPrecisionV1 -} +import org.knora.webapi.messages.v1.responder.valuemessages.DateValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.JulianDayNumberValueV1 +import org.knora.webapi.messages.v1.responder.valuemessages.KnoraCalendarV1 +import org.knora.webapi.messages.v1.responder.valuemessages.KnoraPrecisionV1 import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike +import java.util.Calendar +import java.util.GregorianCalendar + /** * Tests [[DateUtilV1]]. */ diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/PermissionUtilADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/PermissionUtilADMSpec.scala index 926d8a3741..e55cf29e49 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/PermissionUtilADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/PermissionUtilADMSpec.scala @@ -9,11 +9,13 @@ import akka.testkit.ImplicitSender import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.messages.OntologyConstants -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionADM, PermissionType} +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionType import org.knora.webapi.messages.util.PermissionUtilADM import org.knora.webapi.messages.util.PermissionUtilADM._ import org.knora.webapi.routing.Authenticator -import org.knora.webapi.sharedtestdata.{SharedTestDataADM, SharedTestDataV1} +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 import scala.collection.Map diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala index de0871b7cb..84b32e6b52 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/JsonLDUtilSpec.scala @@ -5,13 +5,14 @@ package org.knora.webapi.util.rdf -import java.nio.file.Paths - import org.knora.webapi.CoreSpec import org.knora.webapi.feature._ import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.util.FileUtil -import spray.json.{JsValue, JsonParser} +import spray.json.JsValue +import spray.json.JsonParser + +import java.nio.file.Paths /** * Tests [[JsonLDUtil]]. 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 27b9761d52..2b76d46a3f 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 @@ -5,15 +5,16 @@ package org.knora.webapi.util.rdf -import java.nio.file.Paths - import org.knora.webapi._ import org.knora.webapi.feature._ import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.messages.v2.responder.{KnoraJsonLDResponseV2, KnoraTurtleResponseV2} +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 +import java.nio.file.Paths + /** * Tests the formatting of Knora API v2 responses. */ diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala index bc2e968868..16a5bb81fa 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfFormatUtilSpec.scala @@ -5,14 +5,19 @@ package org.knora.webapi.util.rdf -import java.io.{BufferedInputStream, ByteArrayInputStream, ByteArrayOutputStream} -import java.nio.file.{Files, Path, Paths} - +import org.knora.webapi.CoreSpec +import org.knora.webapi.IRI import org.knora.webapi.feature._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.util.FileUtil -import org.knora.webapi.{CoreSpec, IRI} + +import java.io.BufferedInputStream +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths /** * Tests implementations of [[RdfFormatUtil]]. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala index 85ed71f9d0..51064dd8a2 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala @@ -5,13 +5,15 @@ package org.knora.webapi.util.rdf -import java.io.{BufferedInputStream, FileInputStream} - +import org.knora.webapi.CoreSpec +import org.knora.webapi.IRI import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.feature._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ -import org.knora.webapi.{CoreSpec, IRI} + +import java.io.BufferedInputStream +import java.io.FileInputStream /** * Tests implementations of [[RdfModel]]. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala index d51af0e7e5..5db6d9e71a 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/ShaclValidatorSpec.scala @@ -5,8 +5,6 @@ package org.knora.webapi.util.rdf -import java.nio.file.Paths - import com.typesafe.config.ConfigFactory import org.knora.webapi.CoreSpec import org.knora.webapi.exceptions.AssertionException @@ -14,6 +12,8 @@ import org.knora.webapi.feature._ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.rdf._ +import java.nio.file.Paths + object ShaclValidatorSpec { val config: String = s""" @@ -33,23 +33,36 @@ object ShaclValidatorSpec { */ abstract class ShaclValidatorSpec(featureToggle: FeatureToggle) extends CoreSpec(ConfigFactory.parseString(ShaclValidatorSpec.config)) { - private val featureFactoryConfig: FeatureFactoryConfig = new TestFeatureFactoryConfig( - testToggles = Set(featureToggle), - parent = new KnoraSettingsFeatureFactoryConfig(settings) - ) + + private val featureFactoryConfig: FeatureFactoryConfig = + new TestFeatureFactoryConfig( + testToggles = Set(featureToggle), + parent = new KnoraSettingsFeatureFactoryConfig(settings) + ) private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(featureFactoryConfig) private val nodeFactory: RdfNodeFactory = RdfFeatureFactory.getRdfNodeFactory(featureFactoryConfig) private val shaclValidator: ShaclValidator = RdfFeatureFactory.getShaclValidator(featureFactoryConfig) - private val conformsIri: IriNode = nodeFactory.makeIriNode(OntologyConstants.Shacl.Conforms) - private val resultIri: IriNode = nodeFactory.makeIriNode(OntologyConstants.Shacl.Result) + private val conformsIri: IriNode = + nodeFactory + .makeIriNode(OntologyConstants.Shacl.Conforms) + + private val resultIri: IriNode = + nodeFactory + .makeIriNode(OntologyConstants.Shacl.Result) + private val sourceConstraintComponentIri: IriNode = - nodeFactory.makeIriNode(OntologyConstants.Shacl.SourceConstraintComponent) + nodeFactory + .makeIriNode(OntologyConstants.Shacl.SourceConstraintComponent) + private val datatypeConstraintComponentIri: IriNode = - nodeFactory.makeIriNode(OntologyConstants.Shacl.DatatypeConstraintComponent) + nodeFactory + .makeIriNode(OntologyConstants.Shacl.DatatypeConstraintComponent) + private val maxCountConstraintComponentIri: IriNode = - nodeFactory.makeIriNode(OntologyConstants.Shacl.MaxCountConstraintComponent) + nodeFactory + .makeIriNode(OntologyConstants.Shacl.MaxCountConstraintComponent) "ShaclValidator" should { "accept valid RDF" in { @@ -69,7 +82,7 @@ abstract class ShaclValidatorSpec(featureToggle: FeatureToggle) ) val shaclPath = Paths.get("test/person.ttl") - println(shaclPath) + val validationResult: ShaclValidationResult = shaclValidator.validate( rdfModel = validRdfModel, shaclPath = shaclPath @@ -98,7 +111,7 @@ abstract class ShaclValidatorSpec(featureToggle: FeatureToggle) ) val shaclPath = Paths.get("test/person.ttl") - println(shaclPath) + val validationResult: ShaclValidationResult = shaclValidator.validate( rdfModel = invalidRdfModel, shaclPath = shaclPath diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala index b0592569ab..c7a72eb209 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaFormatUtilSpec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.jenaimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOn} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOn import org.knora.webapi.util.rdf.RdfFormatUtilSpec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala index d0895edd8c..1411fd2e37 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaJsonLDUtilSpec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.jenaimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOn} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOn import org.knora.webapi.util.rdf.JsonLDUtilSpec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala index 384df813db..6714c00a71 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaKnoraResponseV2Spec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.jenaimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOn} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOn import org.knora.webapi.util.rdf.KnoraResponseV2Spec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala index 2200d36604..b2660aa90b 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaShaclValidatorSpec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.jenaimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOn} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOn import org.knora.webapi.util.rdf.ShaclValidatorSpec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala index 0099c0b681..474badba89 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JFormatUtilSpec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.rdf4jimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOff} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOff import org.knora.webapi.util.rdf.RdfFormatUtilSpec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala index c8c6181b6b..1e075d7748 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JJsonLDUtilSpec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.rdf4jimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOff} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOff import org.knora.webapi.util.rdf.JsonLDUtilSpec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala index fe0d9899ec..8394eba752 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JKnoraResponseV2Spec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.rdf4jimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOff} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOff import org.knora.webapi.util.rdf.KnoraResponseV2Spec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala index 6f3436e3e5..4a9718e7da 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/rdf4jimpl/RDF4JShaclValidatorSpec.scala @@ -5,7 +5,8 @@ package org.knora.webapi.util.rdf.rdf4jimpl -import org.knora.webapi.feature.{FeatureToggle, ToggleStateOff} +import org.knora.webapi.feature.FeatureToggle +import org.knora.webapi.feature.ToggleStateOff import org.knora.webapi.util.rdf.ShaclValidatorSpec /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/search/SparqlTransformerSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/search/SparqlTransformerSpec.scala index 2fca132d32..adb0760200 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/search/SparqlTransformerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/search/SparqlTransformerSpec.scala @@ -7,8 +7,9 @@ package org.knora.webapi.util.search import org.knora.webapi.CoreSpec import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.search._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.util.ApacheLuceneSupport.LuceneQueryString /** diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParserSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParserSpec.scala index f6a146b581..863ca1f330 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParserSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/search/gravsearch/GravsearchParserSpec.scala @@ -5,12 +5,14 @@ package org.knora.webapi.util.search.gravsearch +import org.knora.webapi.ApiV2Complex +import org.knora.webapi.ApiV2Simple +import org.knora.webapi.CoreSpec import org.knora.webapi.exceptions.GravsearchException import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.search._ import org.knora.webapi.messages.util.search.gravsearch.GravsearchParser -import org.knora.webapi.{ApiV2Complex, ApiV2Simple, CoreSpec} /** * Tests [[GravsearchParser]]. 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 4a0d3d89f2..ded3180fa0 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 @@ -8,12 +8,11 @@ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.search._ +import org.knora.webapi.messages.util.search.gravsearch.GravsearchParser +import org.knora.webapi.messages.util.search.gravsearch.GravsearchQueryChecker import org.knora.webapi.messages.util.search.gravsearch.prequery.NonTriplestoreSpecificGravsearchToCountPrequeryTransformer -import org.knora.webapi.messages.util.search.gravsearch.types.{ - GravsearchTypeInspectionRunner, - GravsearchTypeInspectionUtil -} -import org.knora.webapi.messages.util.search.gravsearch.{GravsearchParser, GravsearchQueryChecker} +import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionRunner +import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil import org.knora.webapi.sharedtestdata.SharedTestDataADM import scala.collection.mutable.ArrayBuffer 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 5499d51b70..fefd813b1a 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 @@ -8,12 +8,11 @@ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.ResponderData import org.knora.webapi.messages.util.search._ +import org.knora.webapi.messages.util.search.gravsearch.GravsearchParser +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, - GravsearchTypeInspectionUtil -} -import org.knora.webapi.messages.util.search.gravsearch.{GravsearchParser, GravsearchQueryChecker} +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 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 57dd4750df..3296e02f5f 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 @@ -15,8 +15,9 @@ import org.knora.webapi.messages.util.search.gravsearch.GravsearchParser import org.knora.webapi.messages.util.search.gravsearch.types._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} /** * Tests Gravsearch type inspection. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtilSpec.scala index acc11594ba..17b09a803f 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLToStandoffUtilSpec.scala @@ -5,14 +5,15 @@ package org.knora.webapi.util.standoff -import java.util.UUID - import org.knora.webapi.CoreSpec import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.util.standoff._ -import org.xmlunit.builder.{DiffBuilder, Input} +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff +import java.util.UUID + /** * Tests [[XMLToStandoffUtil]]. */ diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLUtilSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLUtilSpec.scala index 3511b3accd..8c5a3fc312 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLUtilSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/standoff/XMLUtilSpec.scala @@ -5,15 +5,16 @@ package org.knora.webapi.util.standoff -import java.nio.file.Paths - import org.knora.webapi.CoreSpec import org.knora.webapi.exceptions.StandoffConversionException import org.knora.webapi.messages.util.standoff.XMLUtil import org.knora.webapi.util.FileUtil -import org.xmlunit.builder.{DiffBuilder, Input} +import org.xmlunit.builder.DiffBuilder +import org.xmlunit.builder.Input import org.xmlunit.diff.Diff +import java.nio.file.Paths + /** * Tests [[org.knora.webapi.messages.util.standoff.XMLToStandoffUtil]]. */ diff --git a/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/permissionmessages/PermissionMessagesV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/permissionmessages/PermissionMessagesV1Spec.scala index 497c5df512..e1b81cf277 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/permissionmessages/PermissionMessagesV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/permissionmessages/PermissionMessagesV1Spec.scala @@ -1,7 +1,6 @@ package org.knora.webapi.messages.v1.responder.permissionmessages import org.knora.webapi.messages.admin.responder.permissionsmessages.ResourceCreateOperation -import org.knora.webapi.messages.v1.responder.usermessages.UsersResponderRequestV1 import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataV1 import org.knora.webapi.sharedtestdata.SharedTestDataV1._ diff --git a/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/sessionmessages/SessionMessagesV1.scala b/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/sessionmessages/SessionMessagesV1.scala index 47c674a3a6..7c36dc7780 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/sessionmessages/SessionMessagesV1.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/v1/responder/sessionmessages/SessionMessagesV1.scala @@ -5,7 +5,8 @@ package org.knora.webapi.messages.v1.responder.sessionmessages -import spray.json.{DefaultJsonProtocol, RootJsonFormat} +import spray.json.DefaultJsonProtocol +import spray.json.RootJsonFormat /** * Represents a response Knora returns when communicating with the 'v1/session' route during the 'login' operation. diff --git a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala index 0261dbdd34..e42a9747c5 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/ChangePropertyGuiElementRequestV2Spec.scala @@ -6,10 +6,12 @@ package org.knora.webapi.messages.v2.responder.ontologymessages import akka.util.Timeout -import org.knora.webapi.feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig} -import org.knora.webapi.messages.util.rdf.{JsonLDDocument, JsonLDUtil} -import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM import org.knora.webapi.AsyncCoreSpec +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.messages.util.rdf.JsonLDDocument +import org.knora.webapi.messages.util.rdf.JsonLDUtil +import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import java.util.UUID diff --git a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/InputOntologyV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/InputOntologyV2Spec.scala index 9cb73f2d8a..1cf26e7ca9 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/InputOntologyV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/v2/responder/ontologymessages/InputOntologyV2Spec.scala @@ -5,15 +5,17 @@ package org.knora.webapi.messages.v2.responder.ontologymessages -import java.time.Instant - +import org.knora.webapi.ApiV2Complex +import org.knora.webapi.CoreSpec import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.store.triplestoremessages.{SmartIriLiteralV2, StringLiteralV2} +import org.knora.webapi.messages.store.triplestoremessages.SmartIriLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.util.rdf.JsonLDUtil import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo -import org.knora.webapi.{ApiV2Complex, CoreSpec} + +import java.time.Instant /** * Tests [[InputOntologyV2]]. diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala index a1a23cb42e..069caa0510 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala @@ -6,18 +6,18 @@ package org.knora.webapi.models.filemodels import org.knora.webapi.ApiV2Complex -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.v2.responder.valuemessages.{ - ArchiveFileValueContentV2, - AudioFileValueContentV2, - DocumentFileValueContentV2, - FileValueContentV2, - FileValueV2, - MovingImageFileValueContentV2, - StillImageFileValueContentV2, - TextFileValueContentV2 -} +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +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.FileValueV2 +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 object FileModelUtil { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala index 3949d52912..df9d565d0a 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala @@ -7,11 +7,14 @@ package org.knora.webapi.models.filemodels import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM -import org.knora.webapi.messages.v2.responder.resourcemessages.{CreateResourceV2, CreateValueInNewResourceV2} -import org.knora.webapi.messages.v2.responder.valuemessages.{UpdateValueContentV2, UpdateValueRequestV2} -import org.knora.webapi.messages.{SmartIri, StringFormatter} +import org.knora.webapi.messages.v2.responder.resourcemessages.CreateResourceV2 +import org.knora.webapi.messages.v2.responder.resourcemessages.CreateValueInNewResourceV2 +import org.knora.webapi.messages.v2.responder.valuemessages.UpdateValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.UpdateValueRequestV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM import java.time.Instant diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala index c9b0a179cb..beb65d61e5 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala @@ -1,22 +1,20 @@ package org.knora.webapi.models.filemodels -import org.knora.webapi.{ApiV2Complex, CoreSpec} +import org.knora.webapi.ApiV2Complex +import org.knora.webapi.CoreSpec import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.v2.responder.resourcemessages.CreateValueInNewResourceV2 +import org.knora.webapi.messages.v2.responder.valuemessages.DocumentFileValueContentV2 +import org.knora.webapi.messages.v2.responder.valuemessages.FileValueV2 +import org.knora.webapi.messages.v2.responder.valuemessages.UpdateValueContentV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.v2.responder.resourcemessages.{CreateResourceV2, CreateValueInNewResourceV2} -import org.knora.webapi.messages.v2.responder.valuemessages.{ - DocumentFileValueContentV2, - FileValueV2, - UpdateValueContentV2, - UpdateValueRequestV2 -} +import spray.json.DefaultJsonProtocol._ +import spray.json._ import java.time.Instant import java.util.UUID -import spray.json._ -import spray.json.DefaultJsonProtocol._ class FileModelsSpec extends CoreSpec { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance diff --git a/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala b/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala index 6a085e0803..a200e36cd8 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModels.scala @@ -6,18 +6,17 @@ package org.knora.webapi.models.standoffmodels import org.knora.webapi.feature.FeatureFactoryConfig -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} +import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.util.rdf.JsonLDKeywords -import org.knora.webapi.messages.v2.responder.standoffmessages.{ - CreateMappingRequestMetadataV2, - CreateMappingRequestV2, - CreateMappingRequestXMLV2 -} +import org.knora.webapi.messages.v2.responder.standoffmessages.CreateMappingRequestMetadataV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.CreateMappingRequestV2 +import org.knora.webapi.messages.v2.responder.standoffmessages.CreateMappingRequestXMLV2 import org.knora.webapi.sharedtestdata.SharedTestDataV1.ANYTHING_PROJECT_IRI -import spray.json._ import spray.json.DefaultJsonProtocol._ -import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import spray.json._ import java.util.UUID diff --git a/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModelsSpec.scala b/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModelsSpec.scala index 0bbe0628de..50fb4f0e76 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModelsSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/standoffmodels/StandoffModelsSpec.scala @@ -7,9 +7,9 @@ package org.knora.webapi.models.standoffmodels import org.knora.webapi.CoreSpec import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.sharedtestdata.SharedTestDataV1.{ANYTHING_PROJECT_IRI, INCUNABULA_PROJECT_IRI} +import org.knora.webapi.sharedtestdata.SharedTestDataV1.ANYTHING_PROJECT_IRI +import org.knora.webapi.sharedtestdata.SharedTestDataV1.INCUNABULA_PROJECT_IRI import spray.json._ -import spray.json.DefaultJsonProtocol._ class StandoffModelsSpec extends CoreSpec { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance diff --git a/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1E2ESpec.scala index b004e0e77c..ff18be6a2f 100644 --- a/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1E2ESpec.scala @@ -5,14 +5,20 @@ package org.knora.webapi.other.v1 -import java.net.URLEncoder - +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes} import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} -import org.knora.webapi.util.{MutableTestIri, ResourceResponseExtractorMethods, ValuesResponseExtractorMethods} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol +import org.knora.webapi.util.MutableTestIri +import org.knora.webapi.util.ResourceResponseExtractorMethods +import org.knora.webapi.util.ValuesResponseExtractorMethods + +import java.net.URLEncoder object DrawingsGodsV1E2ESpec { val config = ConfigFactory.parseString(""" diff --git a/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala index 91f794807c..bead876957 100644 --- a/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/other/v1/DrawingsGodsV1Spec.scala @@ -5,19 +5,21 @@ package org.knora.webapi.other.v1 -import java.util.UUID - -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.messages.admin.responder.usersmessages._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.v1.responder.resourcemessages._ import org.knora.webapi.messages.v1.responder.valuemessages._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.util.MutableUserADM +import java.util.UUID import scala.concurrent.duration._ object DrawingsGodsV1Spec { diff --git a/webapi/src/test/scala/org/knora/webapi/other/v2/LumieresLausanneV2E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/other/v2/LumieresLausanneV2E2ESpec.scala index 5fdfe8e6df..6974d49263 100644 --- a/webapi/src/test/scala/org/knora/webapi/other/v2/LumieresLausanneV2E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/other/v2/LumieresLausanneV2E2ESpec.scala @@ -5,11 +5,16 @@ package org.knora.webapi.other.v2 +import akka.http.scaladsl.model.ContentTypes +import akka.http.scaladsl.model.HttpEntity +import akka.http.scaladsl.model.HttpResponse +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers.BasicHttpCredentials -import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes} -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, TriplestoreJsonProtocol} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol object LumieresLausanneV2E2ESpec { val config: Config = ConfigFactory.parseString(""" diff --git a/webapi/src/test/scala/org/knora/webapi/responders/IriLockerSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/IriLockerSpec.scala index 736622fa36..6fef6002dd 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/IriLockerSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/IriLockerSpec.scala @@ -1,14 +1,14 @@ package org.knora.webapi.responders -import java.util.UUID - import org.knora.webapi.IRI import org.knora.webapi.exceptions.ApplicationLockException import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike +import java.util.UUID +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} /** * Tests [[IriLocker]]. diff --git a/webapi/src/test/scala/org/knora/webapi/responders/MockableResponderManager.scala b/webapi/src/test/scala/org/knora/webapi/responders/MockableResponderManager.scala deleted file mode 100644 index fd320571dd..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/responders/MockableResponderManager.scala +++ /dev/null @@ -1,28 +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.responders - -import akka.actor._ -import org.knora.webapi.core.{ActorMaker, LiveActorMaker} -import org.knora.webapi.messages.util.ResponderData - -/** - * A subclass of [[ResponderManager]] that allows tests to substitute custom responders for the standard ones. - * - * @param mockRespondersOrStoreConnectors a [[Map]] containing the mock responders to be used instead of the live ones. - * The name of the actor (a constant from [[org.knora.webapi.responders]] is - * used as the key in the map. - * @param appActor the main application actor. - */ -class MockableResponderManager( - mockRespondersOrStoreConnectors: Map[String, ActorRef], - appActor: ActorRef, - responderData: ResponderData -) extends ResponderManager(appActor, responderData) - with LiveActorMaker { - this: ActorMaker => - -} diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala index 98a4342903..809ef16b17 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/GroupsResponderADMSpec.scala @@ -11,9 +11,12 @@ package org.knora.webapi.responders.admin import akka.actor.Status.Failure import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, DuplicateValueException, NotFoundException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DuplicateValueException +import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.messages.admin.responder.groupsmessages._ import org.knora.webapi.messages.admin.responder.usersmessages.UserInformationTypeADM import org.knora.webapi.messages.admin.responder.valueObjects._ diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala index edac044f2a..8c52d6ef96 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/ListsResponderADMSpec.scala @@ -7,19 +7,22 @@ package org.knora.webapi.responders.admin import akka.actor.Status.Failure import akka.testkit._ -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, DuplicateValueException, UpdateNotPerformedException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DuplicateValueException +import org.knora.webapi.exceptions.UpdateNotPerformedException import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.{ - ListChildNodeCreatePayloadADM, - ListRootNodeCreatePayloadADM -} +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.messages.admin.responder.valueObjects._ -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, StringLiteralV2} +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.sharedtestdata.SharedListsTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataV1._ -import org.knora.webapi.sharedtestdata.{SharedListsTestDataADM, SharedTestDataADM} import org.knora.webapi.util.MutableTestIri import java.util.UUID diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala index bd64f8fcd5..f94e99538b 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/PermissionsResponderADMSpec.scala @@ -5,26 +5,35 @@ package org.knora.webapi.responders.admin -import java.util.UUID import akka.actor.Status.Failure import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, DuplicateValueException, ForbiddenException, NotFoundException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DuplicateValueException +import org.knora.webapi.exceptions.ForbiddenException +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.OntologyConstants.KnoraBase.EntityPermissionAbbreviations +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsMessagesUtilADM.PermissionTypeAndCodes import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.util.{KnoraSystemInstances, PermissionUtilADM} -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} +import org.knora.webapi.messages.util.KnoraSystemInstances +import org.knora.webapi.messages.util.PermissionUtilADM +import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM import org.knora.webapi.sharedtestdata.SharedPermissionsTestData._ -import org.knora.webapi.sharedtestdata.{SharedOntologyTestDataADM, SharedTestDataADM, SharedTestDataV1} +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 import org.knora.webapi.util.cache.CacheUtil import org.scalatest.PrivateMethodTester +import java.util.UUID import scala.collection.Map +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} object PermissionsResponderADMSpec { diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala index 60ed078ac6..cf213a9dd2 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala @@ -11,15 +11,19 @@ package org.knora.webapi.responders.admin import akka.actor.Status.Failure import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, DuplicateValueException, NotFoundException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DuplicateValueException +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.permissionsmessages._ import org.knora.webapi.messages.admin.responder.projectsmessages._ import org.knora.webapi.messages.admin.responder.usersmessages.UserInformationTypeADM import org.knora.webapi.messages.admin.responder.valueObjects._ import org.knora.webapi.messages.store.triplestoremessages._ -import org.knora.webapi.messages.{OntologyConstants, StringFormatter} import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.MutableTestIri diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala index 4745e745e9..05966dddc5 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala @@ -6,7 +6,8 @@ package org.knora.webapi.responders.admin import akka.testkit._ -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM import org.knora.webapi.messages.admin.responder.sipimessages._ 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 7c9fafb729..0ad60c87ee 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 @@ -5,31 +5,34 @@ package org.knora.webapi.responders.admin -import java.util.UUID import akka.actor.Status.Failure import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadRequestException, DuplicateValueException, ForbiddenException, NotFoundException} +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.DuplicateValueException +import org.knora.webapi.exceptions.ForbiddenException +import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.groupsmessages.{GroupMembersGetRequestADM, GroupMembersGetResponseADM} +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupMembersGetRequestADM +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupMembersGetResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages._ import org.knora.webapi.messages.admin.responder.usersmessages._ -import org.knora.webapi.messages.admin.responder.valueObjects.{ - Username, - Email, - GivenName, - FamilyName, - Password, - LanguageCode, - SystemAdmin, - UserStatus -} +import org.knora.webapi.messages.admin.responder.valueObjects.Email +import org.knora.webapi.messages.admin.responder.valueObjects.FamilyName +import org.knora.webapi.messages.admin.responder.valueObjects.GivenName +import org.knora.webapi.messages.admin.responder.valueObjects.LanguageCode +import org.knora.webapi.messages.admin.responder.valueObjects.Password +import org.knora.webapi.messages.admin.responder.valueObjects.SystemAdmin +import org.knora.webapi.messages.admin.responder.valueObjects.UserStatus +import org.knora.webapi.messages.admin.responder.valueObjects.Username import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraPasswordCredentialsV2 import org.knora.webapi.routing.Authenticator import org.knora.webapi.sharedtestdata.SharedTestDataADM +import java.util.UUID import scala.concurrent.duration._ object UsersResponderADMSpec { diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ListsResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ListsResponderV1Spec.scala index 8aab1f96d9..1ea827c6da 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ListsResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ListsResponderV1Spec.scala @@ -6,7 +6,8 @@ package org.knora.webapi.responders.v1 import akka.testkit._ -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.v1.responder.listmessages._ diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala index ae504d1c88..05c055730d 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/OntologyResponderV1Spec.scala @@ -11,7 +11,9 @@ import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.util.MessageUtil import org.knora.webapi.messages.v1.responder.ontologymessages._ -import org.knora.webapi.sharedtestdata.{SharedOntologyTestDataADM, SharedTestDataADM, SharedTestDataV1} +import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataV1 import scala.concurrent.duration._ diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala index c42f1f95da..6dd74a6e54 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/ProjectsResponderV1Spec.scala @@ -11,7 +11,8 @@ package org.knora.webapi.responders.v1 import akka.actor.Status.Failure import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.messages.v1.responder.projectmessages._ 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 835dc7bc0b..03502017eb 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 @@ -5,13 +5,11 @@ package org.knora.webapi.responders.v1 -import akka.actor.ActorRef -import akka.actor.Props import akka.testkit.ImplicitSender import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.config.AppConfig import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.exceptions.OntologyConstraintException @@ -30,12 +28,16 @@ import org.knora.webapi.messages.util.rdf.SparqlSelectResult import org.knora.webapi.messages.v1.responder.resourcemessages._ import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings._ import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util._ import spray.json.JsValue +import zio.& +import zio.ZLayer import java.util.UUID import scala.concurrent.duration._ @@ -658,11 +660,15 @@ class ResourcesResponderV1Spec extends CoreSpec(ResourcesResponderV1Spec.config) RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") ) - /* we need to run our app with the mocked sipi actor */ - override lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + /* we need to run our app with the mocked sipi implementation */ + override lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceMockImpl.layer, + AppConfig.live + ) // The default timeout for receiving reply messages from actors. private val timeout = 60.seconds 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 6dc44cb2d4..78fbdc52b8 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,13 +5,15 @@ package org.knora.webapi.responders.v1 -import java.nio.file.Paths - import akka.actor.ActorSystem import org.knora.webapi.messages.v1.responder.resourcemessages._ -import org.knora.webapi.settings.{KnoraSettings, KnoraSettingsImpl} +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl import org.knora.webapi.util.FileUtil -import spray.json.{JsValue, JsonParser} +import spray.json.JsValue +import spray.json.JsonParser + +import java.nio.file.Paths object ResourcesResponderV1SpecContextData { 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 e8800a1612..56d157627c 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 @@ -8,8 +8,10 @@ package org.knora.webapi.responders.v1 import akka.actor.ActorSystem 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, XMLTag} -import org.knora.webapi.settings.{KnoraSettings, KnoraSettingsImpl} +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 { diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala index 1faeb1d458..b3167ec0b0 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v1/UsersResponderV1Spec.scala @@ -11,7 +11,8 @@ package org.knora.webapi.responders.v1 import akka.actor.Status.Failure import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi._ import org.knora.webapi.exceptions.NotFoundException import org.knora.webapi.messages.v1.responder.usermessages._ 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 c88278afba..b4e96b4a15 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 @@ -5,13 +5,11 @@ package org.knora.webapi.responders.v1 -import akka.actor.ActorRef -import akka.actor.Props import akka.testkit.ImplicitSender import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import org.knora.webapi._ -import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.config.AppConfig import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants @@ -23,11 +21,15 @@ import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceFullGetRe import org.knora.webapi.messages.v1.responder.resourcemessages.ResourceFullResponseV1 import org.knora.webapi.messages.v1.responder.valuemessages._ import org.knora.webapi.messages.v2.responder.standoffmessages._ -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings._ import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util.MutableTestIri +import zio.& +import zio.ZLayer import java.time.Instant import java.util.UUID @@ -61,11 +63,15 @@ class ValuesResponderV1Spec extends CoreSpec(ValuesResponderV1Spec.config) with import ValuesResponderV1Spec._ - /* we need to run our app with the mocked sipi actor */ - override lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + /* we need to run our app with the mocked sipi implementation */ + override lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceMockImpl.layer, + AppConfig.live + ) override lazy val rdfDataObjects = List( RdfDataObject( diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala index 16162bc662..94eff9caea 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2Spec.scala @@ -9,12 +9,10 @@ import akka.testkit.ImplicitSender import org.knora.webapi.CoreSpec import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.v2.responder.listsmessages.{ - ListGetRequestV2, - ListGetResponseV2, - NodeGetRequestV2, - NodeGetResponseV2 -} +import org.knora.webapi.messages.v2.responder.listsmessages.ListGetRequestV2 +import org.knora.webapi.messages.v2.responder.listsmessages.ListGetResponseV2 +import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetRequestV2 +import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetResponseV2 import org.knora.webapi.sharedtestdata.SharedTestDataADM import scala.concurrent.duration._ diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2SpecFullData.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2SpecFullData.scala index 68b6f97c0e..9d11930ac7 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2SpecFullData.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ListsResponderV2SpecFullData.scala @@ -3,8 +3,10 @@ package org.knora.webapi.responders.v2 import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.listsmessages import org.knora.webapi.messages.admin.responder.listsmessages.ListADM -import org.knora.webapi.messages.store.triplestoremessages.{StringLiteralSequenceV2, StringLiteralV2} -import org.knora.webapi.messages.v2.responder.listsmessages.{ListGetResponseV2, NodeGetResponseV2} +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.v2.responder.listsmessages.ListGetResponseV2 +import org.knora.webapi.messages.v2.responder.listsmessages.NodeGetResponseV2 import org.knora.webapi.sharedtestdata.SharedListsTestDataADM class ListsResponderV2SpecFullData(implicit stringFormatter: StringFormatter) { diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala index d7f1805df1..3a1bab1022 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala @@ -9,20 +9,21 @@ import akka.testkit.ImplicitSender import org.knora.webapi._ import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages._ import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.util.rdf.SparqlSelectResult +import org.knora.webapi.messages.v2.responder.CanDoResponseV2 +import org.knora.webapi.messages.v2.responder.SuccessResponseV2 import org.knora.webapi.messages.v2.responder.ontologymessages.Cardinality.KnoraCardinalityInfo import org.knora.webapi.messages.v2.responder.ontologymessages._ -import org.knora.webapi.messages.v2.responder.resourcemessages.{ - CreateResourceRequestV2, - CreateResourceV2, - CreateValueInNewResourceV2, - ReadResourcesSequenceV2 -} +import org.knora.webapi.messages.v2.responder.resourcemessages.CreateResourceRequestV2 +import org.knora.webapi.messages.v2.responder.resourcemessages.CreateResourceV2 +import org.knora.webapi.messages.v2.responder.resourcemessages.CreateValueInNewResourceV2 +import org.knora.webapi.messages.v2.responder.resourcemessages.ReadResourcesSequenceV2 import org.knora.webapi.messages.v2.responder.valuemessages.IntegerValueContentV2 -import org.knora.webapi.messages.v2.responder.{CanDoResponseV2, SuccessResponseV2} -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.MutableTestIri @@ -30,7 +31,6 @@ import java.time.Instant import java.util.UUID import scala.concurrent.duration._ import scala.language.postfixOps -import akka.japi.Predicate /** * Tests [[OntologyResponderV2]]. 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 de73ee28c9..c56ac7a4c6 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 @@ -5,11 +5,9 @@ package org.knora.webapi.responders.v2 -import akka.actor.ActorRef -import akka.actor.Props import akka.testkit.ImplicitSender import org.knora.webapi._ -import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.config.AppConfig import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.OntologyConstants @@ -28,13 +26,17 @@ import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.models.filemodels._ import org.knora.webapi.responders.v2.ResourcesResponseCheckerV2.compareReadResourcesSequenceV2Response -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.settings._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util._ import org.xmlunit.builder.DiffBuilder import org.xmlunit.builder.Input import org.xmlunit.diff.Diff +import zio.& +import zio.ZLayer import java.time.Instant import java.time.temporal.ChronoUnit @@ -404,11 +406,15 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { private val graphTestData = new GraphTestData - /* we need to run our app with the mocked sipi actor */ - override lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + /* we need to run our app with the mocked sipi implementation */ + override lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceMockImpl.layer, + AppConfig.live + ) override lazy val rdfDataObjects = 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/responders/v2/ResourcesResponderV2SpecFullData.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2SpecFullData.scala index c4f2c1f440..3d4a0aec21 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2SpecFullData.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2SpecFullData.scala @@ -1,16 +1,17 @@ package org.knora.webapi.responders.v2 -import java.time.Instant - import org.knora.webapi.InternalSchema import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.util.CalendarNameJulian +import org.knora.webapi.messages.util.DatePrecisionYear import org.knora.webapi.messages.util.PermissionUtilADM._ -import org.knora.webapi.messages.util.{CalendarNameJulian, DatePrecisionYear} import org.knora.webapi.messages.v2.responder.resourcemessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import java.time.Instant + // 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 class ResourcesResponderV2SpecFullData(implicit stringFormatter: StringFormatter) { diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponseCheckerV2SpecFullData.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponseCheckerV2SpecFullData.scala index 666fa08fb1..35940c658b 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponseCheckerV2SpecFullData.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponseCheckerV2SpecFullData.scala @@ -1,16 +1,17 @@ package org.knora.webapi.responders.v2 -import java.time.Instant - import org.knora.webapi.InternalSchema import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.util.CalendarNameJulian +import org.knora.webapi.messages.util.DatePrecisionYear import org.knora.webapi.messages.util.PermissionUtilADM._ -import org.knora.webapi.messages.util.{CalendarNameJulian, DatePrecisionYear} import org.knora.webapi.messages.v2.responder.resourcemessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import java.time.Instant + // FIXME: Rename to something without spec in the name since it is not a spec class ResourcesResponseCheckerV2SpecFullData(implicit stringFormatter: StringFormatter) { diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala index 6967411b3b..03df557c1e 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2Spec.scala @@ -6,21 +6,19 @@ package org.knora.webapi.responders.v2 import akka.testkit.ImplicitSender +import org.knora.webapi.ApiV2Complex +import org.knora.webapi.CoreSpec +import org.knora.webapi.SchemaOptions import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.v2.responder.resourcemessages._ import org.knora.webapi.messages.v2.responder.searchmessages._ -import org.knora.webapi.messages.v2.responder.valuemessages.{ - HierarchicalListValueContentV2, - ReadValueV2, - StillImageFileValueContentV2 -} -import org.knora.webapi.messages.{SmartIri, StringFormatter} +import org.knora.webapi.messages.v2.responder.valuemessages.ReadValueV2 +import org.knora.webapi.messages.v2.responder.valuemessages.StillImageFileValueContentV2 import org.knora.webapi.responders.v2.ResourcesResponseCheckerV2.compareReadResourcesSequenceV2Response import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.{ApiV2Complex, CoreSpec, IRI, SchemaOptions} -import java.util.UUID import scala.concurrent.duration._ /** diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2SpecFullData.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2SpecFullData.scala index 984513cf01..8369f7f3d9 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2SpecFullData.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/SearchResponderV2SpecFullData.scala @@ -1,8 +1,5 @@ package org.knora.webapi.responders.v2 -import java.time.Instant -import java.util.UUID - import akka.actor.ActorSystem import org.knora.webapi._ import org.knora.webapi.messages.IriConversions._ @@ -14,6 +11,9 @@ import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.sharedtestdata.SharedTestDataADM +import java.time.Instant +import java.util.UUID + class SearchResponderV2SpecFullData(implicit stringFormatter: StringFormatter) { implicit lazy val system: ActorSystem = ActorSystem("webapi") diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala index 66800d553c..2dd4829836 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala @@ -5,36 +5,40 @@ package org.knora.webapi.responders.v2 -import java.time.Instant -import java.util.UUID -import akka.actor.{ActorRef, Props} import akka.testkit.ImplicitSender import org.knora.webapi._ -import org.knora.webapi.app.ApplicationActor +import org.knora.webapi.config.AppConfig import org.knora.webapi.exceptions._ import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.triplestoremessages._ +import org.knora.webapi.messages.util.CalendarNameGregorian +import org.knora.webapi.messages.util.DatePrecisionYear +import org.knora.webapi.messages.util.KnoraSystemInstances +import org.knora.webapi.messages.util.PermissionUtilADM import org.knora.webapi.messages.util.rdf.SparqlSelectResult import org.knora.webapi.messages.util.search.gravsearch.GravsearchParser -import org.knora.webapi.messages.util.{ - CalendarNameGregorian, - DatePrecisionYear, - KnoraSystemInstances, - PermissionUtilADM -} import org.knora.webapi.messages.v2.responder._ import org.knora.webapi.messages.v2.responder.resourcemessages._ import org.knora.webapi.messages.v2.responder.searchmessages.GravsearchRequestV2 import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} -import org.knora.webapi.models.filemodels.{ChangeFileRequest, FileType} -import org.knora.webapi.settings.{KnoraDispatchers, _} +import org.knora.webapi.models.filemodels.ChangeFileRequest +import org.knora.webapi.models.filemodels.FileType import org.knora.webapi.sharedtestdata.SharedTestDataADM -import org.knora.webapi.store.iiif.MockSipiConnector +import org.knora.webapi.store.cacheservice.CacheServiceManager +import org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl +import org.knora.webapi.store.iiif.IIIFServiceManager +import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl import org.knora.webapi.util.MutableTestIri +import zio.& +import zio.ZLayer +import java.time.Instant +import java.util.UUID import scala.concurrent.duration._ /** @@ -58,11 +62,15 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { private val mimeTypeTIFF = "image/tiff" private val mimeTypeJP2 = "image/jp2" - /* we need to run our app with the mocked sipi actor */ - override lazy val appActor: ActorRef = system.actorOf( - Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - name = APPLICATION_MANAGER_ACTOR_NAME - ) + /* we need to run our app with the mocked sipi implementation */ + override lazy val effectLayers = + ZLayer.make[CacheServiceManager & IIIFServiceManager & AppConfig]( + CacheServiceManager.layer, + CacheServiceInMemImpl.layer, + IIIFServiceManager.layer, + IIIFServiceMockImpl.layer, + AppConfig.live + ) override lazy val rdfDataObjects = List( RdfDataObject( @@ -4203,8 +4211,6 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ) responderManager ! changeFileMessage - println(changeFileMessage) - expectMsgPF(timeout) { case updateValueResponse: UpdateValueResponseV2 => stillImageFileValueIri.set(updateValueResponse.valueIri) } @@ -4244,7 +4250,7 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { val valueContent = StillImageFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = FileValueV2( - internalFilename = MockSipiConnector.FAILURE_FILENAME, // tells the mock Sipi responder to simulate failure + internalFilename = "failure.jp2", // tells the mock Sipi responder to simulate failure internalMimeType = mimeTypeJP2, originalFilename = Some("test.tiff"), originalMimeType = Some(mimeTypeTIFF) @@ -4279,7 +4285,7 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { val valueContent = StillImageFileValueContentV2( ontologySchema = ApiV2Complex, fileValue = FileValueV2( - internalFilename = MockSipiConnector.FAILURE_FILENAME, // tells the mock Sipi responder to simulate failure + internalFilename = "failure.jp2", // tells the mock Sipi responder to simulate failure internalMimeType = mimeTypeJP2, originalFilename = Some("test.tiff"), originalMimeType = Some(mimeTypeTIFF) 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 ca5cf415bb..0430a87d9e 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CacheSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/CacheSpec.scala @@ -6,24 +6,30 @@ package org.knora.webapi.responders.v2.ontology import akka.actor.Props -import org.knora.webapi.feature.{FeatureFactoryConfig, KnoraSettingsFeatureFactoryConfig} -import org.knora.webapi.messages.store.triplestoremessages.{RdfDataObject, SmartIriLiteralV2, StringLiteralV2} +import org.knora.webapi.IntegrationSpec +import org.knora.webapi.InternalSchema +import org.knora.webapi.TestContainerFuseki +import org.knora.webapi.feature.FeatureFactoryConfig +import org.knora.webapi.feature.KnoraSettingsFeatureFactoryConfig +import org.knora.webapi.messages.OntologyConstants +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.SmartIriLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.util.KnoraSystemInstances -import org.knora.webapi.messages.v2.responder.ontologymessages.{ - PredicateInfoV2, - PropertyInfoContentV2, - ReadOntologyV2, - ReadPropertyInfoV2 -} -import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import org.knora.webapi.messages.v2.responder.ontologymessages.PredicateInfoV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.PropertyInfoContentV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.ReadOntologyV2 +import org.knora.webapi.messages.v2.responder.ontologymessages.ReadPropertyInfoV2 import org.knora.webapi.settings.KnoraDispatchers import org.knora.webapi.store.triplestore.http.HttpTriplestoreConnector import org.knora.webapi.util.cache.CacheUtil -import org.knora.webapi.{IntegrationSpec, InternalSchema, TestContainerFuseki} import java.time.Instant +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} import scala.language.postfixOps /** diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala index 52e34a533d..600882a2c9 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ontology/DeleteCardinalitiesFromClassSpec.scala @@ -6,12 +6,15 @@ package org.knora.webapi.responders.v2.ontology import akka.actor.Props +import org.knora.webapi.IntegrationSpec +import org.knora.webapi.InternalSchema +import org.knora.webapi.TestContainerFuseki import org.knora.webapi.messages.IriConversions._ -import org.knora.webapi.messages.{SmartIri, StringFormatter} +import org.knora.webapi.messages.SmartIri +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.settings.KnoraDispatchers import org.knora.webapi.store.triplestore.http.HttpTriplestoreConnector -import org.knora.webapi.{IntegrationSpec, InternalSchema, TestContainerFuseki} /** * This spec is used to test [[org.knora.webapi.responders.v2.ontology.Cardinalities]]. 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 1c636b7332..a0fa0c90f0 100644 --- a/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/routing/AuthenticatorSpec.scala @@ -8,13 +8,13 @@ package org.knora.webapi.routing import akka.testkit.ImplicitSender import akka.util.Timeout import org.knora.webapi._ -import org.knora.webapi.exceptions.{BadCredentialsException, BadRequestException} +import org.knora.webapi.exceptions.BadCredentialsException +import org.knora.webapi.exceptions.BadRequestException import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.usersmessages.{UserADM, UserIdentifierADM} -import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.{ - KnoraJWTTokenCredentialsV2, - KnoraPasswordCredentialsV2 -} +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM +import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraJWTTokenCredentialsV2 +import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2.KnoraPasswordCredentialsV2 import org.knora.webapi.routing.Authenticator.AUTHENTICATION_INVALIDATION_CACHE_NAME import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.cache.CacheUtil 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 579f0fd399..67f2eb9f41 100644 --- a/webapi/src/test/scala/org/knora/webapi/routing/JWTHelperSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/routing/JWTHelperSpec.scala @@ -6,7 +6,8 @@ package org.knora.webapi.routing import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import org.knora.webapi.CoreSpec import org.knora.webapi.sharedtestdata.SharedTestDataADM import spray.json.JsString diff --git a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedListsTestDataADM.scala b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedListsTestDataADM.scala index 6433bab674..cb3efe603d 100644 --- a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedListsTestDataADM.scala +++ b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedListsTestDataADM.scala @@ -1,12 +1,11 @@ package org.knora.webapi.sharedtestdata -import org.knora.webapi.messages.admin.responder.listsmessages.{ - ListChildNodeADM, - ListChildNodeInfoADM, - ListRootNodeInfoADM, - NodePathElementADM -} -import org.knora.webapi.messages.store.triplestoremessages.{StringLiteralSequenceV2, StringLiteralV2} +import org.knora.webapi.messages.admin.responder.listsmessages.ListChildNodeADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListChildNodeInfoADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListRootNodeInfoADM +import org.knora.webapi.messages.admin.responder.listsmessages.NodePathElementADM +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 object SharedListsTestDataADM { diff --git a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedPermissionsTestData.scala b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedPermissionsTestData.scala index 720870abdc..3e42bb1a39 100644 --- a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedPermissionsTestData.scala +++ b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedPermissionsTestData.scala @@ -6,12 +6,10 @@ package org.knora.webapi.sharedtestdata import org.knora.webapi.messages.OntologyConstants -import org.knora.webapi.messages.admin.responder.permissionsmessages.{ - AdministrativePermissionADM, - DefaultObjectAccessPermissionADM, - ObjectAccessPermissionADM, - PermissionADM -} +import org.knora.webapi.messages.admin.responder.permissionsmessages.AdministrativePermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.DefaultObjectAccessPermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.ObjectAccessPermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionADM import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM._ import org.knora.webapi.sharedtestdata.SharedTestDataV1._ diff --git a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala index 9a5ec7f63e..615f80c3df 100644 --- a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala +++ b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala @@ -5,17 +5,18 @@ package org.knora.webapi.sharedtestdata -import java.time.Instant - import org.knora.webapi.IRI import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.groupsmessages.GroupADM -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionADM, PermissionsDataADM} +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.util.KnoraSystemInstances +import java.time.Instant + /** * This object holds the same user which are loaded with 'test_data/all_data/admin-data.ttl'. Using this object * in tests, allows easier updating of details as they change over time. diff --git a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataV1.scala b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataV1.scala index e69cdeabdd..71aec46c01 100644 --- a/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataV1.scala +++ b/webapi/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataV1.scala @@ -2,9 +2,11 @@ package org.knora.webapi.sharedtestdata import org.knora.webapi.IRI import org.knora.webapi.messages.OntologyConstants -import org.knora.webapi.messages.admin.responder.permissionsmessages.{PermissionADM, PermissionsDataADM} +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionADM +import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1 -import org.knora.webapi.messages.v1.responder.usermessages.{UserDataV1, UserProfileV1} +import org.knora.webapi.messages.v1.responder.usermessages.UserDataV1 +import org.knora.webapi.messages.v1.responder.usermessages.UserProfileV1 import org.knora.webapi.sharedtestdata.SharedOntologyTestDataADM.IMAGES_ONTOLOGY_IRI /** diff --git a/webapi/src/test/scala/org/knora/webapi/store/MockableStoreManager.scala b/webapi/src/test/scala/org/knora/webapi/store/MockableStoreManager.scala deleted file mode 100644 index bdaa9750d4..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/store/MockableStoreManager.scala +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store - -import akka.actor.{ActorRef, Props} -import org.knora.webapi.core.LiveActorMaker -import org.knora.webapi.settings.{KnoraDispatchers, _} -import org.knora.webapi.store.cacheservice.api.CacheService -import org.knora.webapi.store.iiif.MockableIIIFManager -import zio.ZLayer -import org.knora.webapi.store.cacheservice.CacheServiceManager - -class MockableStoreManager(mockStoreConnectors: Map[String, ActorRef], appActor: ActorRef, csm: CacheServiceManager) - extends StoreManager(appActor, csm) - with LiveActorMaker { - - /** - * Starts the MockableIIIFManager - */ - override lazy val iiifManager: ActorRef = makeActor( - Props(new MockableIIIFManager(mockStoreConnectors) with LiveActorMaker) - .withDispatcher(KnoraDispatchers.KnoraActorDispatcher), - IIIFManagerActorName - ) - -} diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala index f85e1aab9d..9fdda0222d 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/config/RedisTestConfig.scala @@ -1,8 +1,8 @@ package org.knora.webapi.store.cacheservice.config -import zio._ import org.knora.webapi.store.cacheservice.config.RedisConfig import org.knora.webapi.testcontainers.RedisTestContainer +import zio._ object RedisTestConfig { val hardcoded: ULayer[RedisConfig] = ZLayer.succeed(RedisConfig("localhost", 6379)) diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala index 6050270102..a090267176 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheInMemImplSpec.scala @@ -5,7 +5,6 @@ package org.knora.webapi.store.cacheservice.impl -import org.knora.webapi.UnitSpec import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM @@ -13,11 +12,9 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.store.cacheservice.api.CacheService +import zio.ZLayer import zio.test.Assertion._ -import zio.test.TestAspect.ignore -import zio.test.TestAspect.timeout import zio.test._ -import zio.ZLayer /** * This spec is used to test [[org.knora.webapi.store.cacheservice.impl.CacheServiceInMemImpl]]. diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala index 980509ce7c..c7a04fd23a 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/impl/CacheRedisImplSpec.scala @@ -5,8 +5,6 @@ package org.knora.webapi.store.cacheservice.impl -import org.knora.webapi.TestContainerRedis -import org.knora.webapi.UnitSpec import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM @@ -15,7 +13,6 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.store.cacheservice.api.CacheService import org.knora.webapi.store.cacheservice.config.RedisTestConfig -import org.knora.webapi.store.cacheservice.settings.CacheServiceSettings import org.knora.webapi.testcontainers.RedisTestContainer import zio._ import zio.test.Assertion._ diff --git a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala index 2194858ce1..36dec9198b 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/cacheservice/serialization/CacheSerializationSpec.scala @@ -5,15 +5,12 @@ package org.knora.webapi.store.cacheservice.serialization -import com.typesafe.config.ConfigFactory import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.sharedtestdata.SharedTestDataADM - -import zio.test._ import zio.test.Assertion._ -import zio.test.TestAspect.{ignore, timeout} -import org.knora.webapi.store.cacheservice.api.CacheService +import zio.test.TestAspect.ignore +import zio.test._ /** * This spec is used to test [[CacheSerialization]]. diff --git a/webapi/src/test/scala/org/knora/webapi/store/iiif/MockSipiConnector.scala b/webapi/src/test/scala/org/knora/webapi/store/iiif/MockSipiConnector.scala deleted file mode 100644 index e8dfc7fa8f..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/store/iiif/MockSipiConnector.scala +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.iiif - -import akka.actor.{Actor, ActorLogging, ActorSystem} -import akka.http.scaladsl.util.FastFuture -import org.knora.webapi.exceptions.SipiException -import org.knora.webapi.messages.store.sipimessages._ -import org.knora.webapi.messages.v2.responder.SuccessResponseV2 -import org.knora.webapi.settings.KnoraDispatchers -import org.knora.webapi.util.ActorUtil._ - -import scala.concurrent.ExecutionContext -import scala.util.{Failure, Success, Try} - -/** - * Constants for [[MockSipiConnector]]. - */ -object MockSipiConnector { - - /** - * A request to [[MockSipiConnector]] with this filename will always cause the responder to simulate a Sipi - * error. - */ - val FAILURE_FILENAME: String = "failure.jp2" -} - -/** - * Takes the place of [[SipiConnector]] for tests without an actual Sipi server, by returning hard-coded responses - * simulating responses from Sipi. - */ -class MockSipiConnector extends Actor with ActorLogging { - - implicit val system: ActorSystem = context.system - implicit val executionContext: ExecutionContext = system.dispatchers.lookup(KnoraDispatchers.KnoraActorDispatcher) - - def receive = { - case getFileMetadataRequest: GetFileMetadataRequest => - try2Message(sender(), getFileMetadata(getFileMetadataRequest), log) - case moveTemporaryFileToPermanentStorageRequest: MoveTemporaryFileToPermanentStorageRequest => - try2Message(sender(), moveTemporaryFileToPermanentStorage(moveTemporaryFileToPermanentStorageRequest), log) - case deleteTemporaryFileRequest: DeleteTemporaryFileRequest => - try2Message(sender(), deleteTemporaryFile(deleteTemporaryFileRequest), log) - case IIIFServiceGetStatus => future2Message(sender(), FastFuture.successful(IIIFServiceStatusOK), log) - case other => handleUnexpectedMessage(sender(), other, log, this.getClass.getName) - } - - private def getFileMetadata(getFileMetadataRequestV2: GetFileMetadataRequest): Try[GetFileMetadataResponse] = - Success { - GetFileMetadataResponse( - originalFilename = Some("test2.tiff"), - originalMimeType = Some("image/tiff"), - internalMimeType = "image/jp2", - width = Some(512), - height = Some(256), - pageCount = None, - duration = None, - fps = None - ) - } - - private def moveTemporaryFileToPermanentStorage( - moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest - ): Try[SuccessResponseV2] = - if (moveTemporaryFileToPermanentStorageRequestV2.internalFilename == MockSipiConnector.FAILURE_FILENAME) { - Failure(SipiException("Sipi failed to move file to permanent storage")) - } else { - Success(SuccessResponseV2("Moved file to permanent storage")) - } - - private def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Try[SuccessResponseV2] = - if (deleteTemporaryFileRequestV2.internalFilename == MockSipiConnector.FAILURE_FILENAME) { - Failure(SipiException("Sipi failed to delete temporary file")) - } else { - Success(SuccessResponseV2("Deleted temporary file")) - } -} diff --git a/webapi/src/test/scala/org/knora/webapi/store/iiif/MockableIIIFManager.scala b/webapi/src/test/scala/org/knora/webapi/store/iiif/MockableIIIFManager.scala deleted file mode 100644 index 8f26fbc00c..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/store/iiif/MockableIIIFManager.scala +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.store.iiif - -import akka.actor.ActorRef -import org.knora.webapi.core.LiveActorMaker -import org.knora.webapi.settings.SipiConnectorActorName - -/** - * A subclass of [[IIIFManager]] that allows tests to substitute standard connector for a custom one. - * - * @param mockStoreConnectors a [[Map]] containing the mock connectors to be used instead of the live ones. - * The name of the actor (a constant from [[org.knora.webapi.store]] is used as the - * key in the map. - */ -class MockableIIIFManager(mockStoreConnectors: Map[String, ActorRef]) extends IIIFManager with LiveActorMaker { - - /** - * Initialised to the value of the key 'SipiConnectorActorName' in `mockStoreConnectors` if provided, otherwise - * the default SipiConnector is used. - */ - override lazy val sipiConnector: ActorRef = - mockStoreConnectors.getOrElse(SipiConnectorActorName, makeDefaultSipiConnector) - -} diff --git a/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala b/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala new file mode 100644 index 0000000000..39663efa66 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/store/iiif/impl/IIIFServiceMockImpl.scala @@ -0,0 +1,70 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.store.iiif.impl + +import org.knora.webapi.exceptions.SipiException +import org.knora.webapi.messages.store.sipimessages._ +import org.knora.webapi.messages.v2.responder.SuccessResponseV2 +import org.knora.webapi.store.iiif.api.IIIFService +import zio._ + +/** + * Can be used in place of [[IIIFServiceSipiImpl]] for tests without an actual Sipi server, by returning hard-coded + * responses simulating responses from Sipi. + */ +case class IIIFServiceMockImpl(str: String) extends IIIFService { + + /** + * A request with this filename will always cause a Sipi error. + */ + private val FAILURE_FILENAME: String = "failure.jp2" + + def getFileMetadata(getFileMetadataRequestV2: GetFileMetadataRequest): Task[GetFileMetadataResponse] = + ZIO.succeed( + GetFileMetadataResponse( + originalFilename = Some("test2.tiff"), + originalMimeType = Some("image/tiff"), + internalMimeType = "image/jp2", + width = Some(512), + height = Some(256), + pageCount = None, + duration = None, + fps = None + ) + ) + + def moveTemporaryFileToPermanentStorage( + moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest + ): Task[SuccessResponseV2] = + if (moveTemporaryFileToPermanentStorageRequestV2.internalFilename == FAILURE_FILENAME) { + ZIO.fail(SipiException("Sipi failed to move file to permanent storage")) + } else { + ZIO.succeed(SuccessResponseV2("Moved file to permanent storage")) + } + + def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Task[SuccessResponseV2] = + if (deleteTemporaryFileRequestV2.internalFilename == FAILURE_FILENAME) { + ZIO.fail(SipiException("Sipi failed to delete temporary file")) + } else { + ZIO.succeed(SuccessResponseV2("Deleted temporary file")) + } + + override def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): Task[SipiGetTextFileResponse] = ??? + + override def getStatus(): Task[IIIFServiceStatusResponse] = ZIO.succeed(IIIFServiceStatusOK) +} + +object IIIFServiceMockImpl { + + val layer: ZLayer[Any, Nothing, IIIFService] = { + ZLayer { + for { + _ <- ZIO.debug("blub") + } yield IIIFServiceMockImpl("blub") + }.tap(_ => ZIO.debug(">>> Mock Sipi IIIF Service Initialized <<<")) + } + +} diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala index 3637be7977..96e9e2117d 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala @@ -5,12 +5,13 @@ package org.knora.webapi.store.triplestore.upgrade.plugins -import java.io.{BufferedInputStream, FileInputStream} - import org.knora.webapi.CoreSpec import org.knora.webapi.messages.util.ErrorHandlingMap import org.knora.webapi.messages.util.rdf._ +import java.io.BufferedInputStream +import java.io.FileInputStream + /** * Provides helper methods for specs that test upgrade plugins. */ diff --git a/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala b/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala new file mode 100644 index 0000000000..ac2b2b6be6 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/testcontainers/FusekiTestContainer.scala @@ -0,0 +1,48 @@ +package org.knora.webapi.testcontainers + +import org.knora.webapi.http.version.BuildInfo +import org.testcontainers.containers.GenericContainer +import org.testcontainers.utility.DockerImageName +import zio._ + +import java.net.NetworkInterface +import java.net.UnknownHostException +import scala.jdk.CollectionConverters._ + +final case class FusekiTestContainer(container: GenericContainer[Nothing]) + +object FusekiTestContainer { + + /** + * A functional effect that initiates a Fuseki Testcontainer + */ + val acquire: Task[GenericContainer[Nothing]] = ZIO.attemptBlocking { + // get local IP address, which we need for SIPI + val localIpAddress: String = NetworkInterface.getNetworkInterfaces.asScala.toSeq + .filter(!_.isLoopback) + .flatMap(_.getInetAddresses.asScala.toSeq.filter(_.getAddress.length == 4).map(_.toString)) + .headOption + .getOrElse(throw new UnknownHostException("No suitable network interface found")) + + val fusekiImageName: DockerImageName = DockerImageName.parse(BuildInfo.fuseki) + val fusekiContainer = new GenericContainer(fusekiImageName) + fusekiContainer.withExposedPorts(3030) + fusekiContainer.withEnv("ADMIN_PASSWORD", "test") + fusekiContainer.withEnv("JVM_ARGS", "-Xmx3G") + fusekiContainer.start() + fusekiContainer + }.orDie.tap(_ => ZIO.debug(">>> Acquire Fuseki TestContainer executed <<<")) + + def release(container: GenericContainer[Nothing]): URIO[Any, Unit] = ZIO.attemptBlocking { + container.stop() + }.orDie.tap(_ => ZIO.debug(">>> Release Fuseki TestContainer executed <<<")) + + val layer: ZLayer[Any, Nothing, FusekiTestContainer] = { + ZLayer { + for { + // tc <- ZIO.acquireRelease(acquire)(release(_)).orDie + tc <- acquire.orDie + } yield FusekiTestContainer(tc) + }.tap(_ => ZIO.debug(">>> Fuseki Test Container Initialized <<<")) + } +} diff --git a/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala b/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala index 56af893890..e77d092448 100644 --- a/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala +++ b/webapi/src/test/scala/org/knora/webapi/testcontainers/RedisTestContainer.scala @@ -11,13 +11,13 @@ object RedisTestContainer { /** * A functional effect that initiates a Redis Testcontainer */ - val aquireRedisTestContainer: Task[GenericContainer[Nothing]] = ZIO.attemptBlocking { + val acquireRedisTestContainer: Task[GenericContainer[Nothing]] = ZIO.attemptBlocking { val RedisImageName: DockerImageName = DockerImageName.parse("redis:5") val container = new GenericContainer(RedisImageName) container.withExposedPorts(6379) container.start() container - }.orDie.tap(_ => ZIO.debug(">>> aquireRedisTestContainer executed <<<")) + }.orDie.tap(_ => ZIO.debug(">>> acquireRedisTestContainer executed <<<")) def releaseRedisTestContainer(container: GenericContainer[Nothing]): URIO[Any, Unit] = ZIO.attemptBlocking { container.stop() @@ -26,7 +26,7 @@ object RedisTestContainer { val layer: ZLayer[Any, Nothing, RedisTestContainer] = { ZLayer.scoped { for { - tc <- ZIO.acquireRelease(aquireRedisTestContainer)(releaseRedisTestContainer(_)).orDie + tc <- ZIO.acquireRelease(acquireRedisTestContainer)(releaseRedisTestContainer(_)).orDie } yield RedisTestContainer(tc) }.tap(_ => ZIO.debug(">>> Redis Test Container Initialized <<<")) } diff --git a/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala b/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala new file mode 100644 index 0000000000..eb4cee9168 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/testcontainers/SipiTestContainer.scala @@ -0,0 +1,64 @@ +package org.knora.webapi.testcontainers + +import org.knora.webapi.http.version.BuildInfo +import org.testcontainers.containers.BindMode +import org.testcontainers.containers.GenericContainer +import org.testcontainers.utility.DockerImageName +import zio._ + +import java.net.NetworkInterface +import java.net.UnknownHostException +import scala.jdk.CollectionConverters._ + +final case class SipiTestContainer(container: GenericContainer[Nothing]) + +object SipiTestContainer { + + /** + * A functional effect that initiates a Sipi Testcontainer + */ + val acquire: Task[GenericContainer[Nothing]] = ZIO.attemptBlocking { + // get local IP address, which we need for SIPI + val localIpAddress: String = NetworkInterface.getNetworkInterfaces.asScala.toSeq + .filter(!_.isLoopback) + .flatMap(_.getInetAddresses.asScala.toSeq.filter(_.getAddress.length == 4).map(_.toString)) + .headOption + .getOrElse(throw new UnknownHostException("No suitable network interface found")) + + val sipiImageName: DockerImageName = DockerImageName.parse(s"daschswiss/knora-sipi:${BuildInfo.version}") + val sipiContainer = new GenericContainer(sipiImageName) + sipiContainer.withExposedPorts(1024) + sipiContainer.withEnv("KNORA_WEBAPI_KNORA_API_EXTERNAL_HOST", "0.0.0.0") + sipiContainer.withEnv("KNORA_WEBAPI_KNORA_API_EXTERNAL_PORT", "3333") + sipiContainer.withEnv("SIPI_EXTERNAL_PROTOCOL", "http") + sipiContainer.withEnv("SIPI_EXTERNAL_HOSTNAME", "0.0.0.0") + sipiContainer.withEnv("SIPI_EXTERNAL_PORT", "1024") + sipiContainer.withEnv("SIPI_WEBAPI_HOSTNAME", localIpAddress) + sipiContainer.withEnv("SIPI_WEBAPI_PORT", "3333") + + sipiContainer.withCommand("--config=/sipi/config/sipi.docker-config.lua") + + // TODO: Needs https://github.com/scalameta/metals/issues/3623 to be resolved + sipiContainer.withClasspathResourceMapping( + // "/sipi/config/sipi.docker-config.lua" + "/sipi.docker-config.lua", + "/sipi/config/sipi.docker-config.lua", + BindMode.READ_ONLY + ) + sipiContainer.start() + sipiContainer + }.tap(_ => ZIO.debug(">>> Acquire Sipi TestContainer executed <<<")) + + def release(container: GenericContainer[Nothing]): Task[Unit] = ZIO.attemptBlocking { + container.stop() + }.tap(_ => ZIO.debug(">>> Release Sipi TestContainer executed <<<")) + + val layer: ZLayer[Any, Nothing, SipiTestContainer] = { + ZLayer { + for { + // tc <- ZIO.acquireRelease(acquire)(release(_)).orDie + tc <- acquire.orDie + } yield SipiTestContainer(tc) + }.tap(_ => ZIO.debug(">>> Sipi TestContainer initialized <<<")) + } +} diff --git a/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala b/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala new file mode 100644 index 0000000000..cc54ef24c0 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/testservices/TestClientService.scala @@ -0,0 +1,371 @@ +package org.knora.webapi.testservices + +import akka.actor.ActorSystem +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 +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.protocol.HttpClientContext +import org.apache.http.config.SocketConfig +import org.apache.http.entity.ContentType +import org.apache.http.entity.mime.HttpMultipartMode +import org.apache.http.entity.mime.MultipartEntityBuilder +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager +import org.apache.http.util.EntityUtils +import org.knora.webapi.config.AppConfig +import org.knora.webapi.exceptions.AssertionException +import org.knora.webapi.exceptions.BadRequestException +import org.knora.webapi.exceptions.NotFoundException +import org.knora.webapi.exceptions.SipiException +import org.knora.webapi.messages.store.sipimessages.SipiUploadResponse +import org.knora.webapi.messages.store.sipimessages.SipiUploadResponseJsonProtocol._ +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.KnoraDispatchers +import org.knora.webapi.settings.KnoraSettings +import org.knora.webapi.settings.KnoraSettingsImpl +import org.knora.webapi.util.SipiUtil +import spray.json.JsObject +import spray.json._ +import zio._ + +import java.nio.file.Path +import java.util.concurrent.TimeUnit +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.duration.FiniteDuration + +/** + * Represents a file to be uploaded to the IIF Service. + * + * @param path the path of the file. + * @param mimeType the MIME type of the file. + */ +final case class FileToUpload(path: Path, mimeType: ContentType) + +/** + * Represents an image file to be uploaded to the IIF Service. + * + * @param fileToUpload the file to be uploaded. + * @param width the image's width in pixels. + * @param height the image's height in pixels. + */ +final case class InputFile(fileToUpload: FileToUpload, width: Int, height: Int) + +final case class TestClientService(config: AppConfig, httpClient: CloseableHttpClient, actorSystem: ActorSystem) + extends TriplestoreJsonProtocol + with RequestBuilding { + + implicit val system: ActorSystem = actorSystem + 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 + + /** + * Loads test data. + */ + def loadTestData(rdfDataObjects: Seq[RdfDataObject]): Task[Unit] = { + + val loadRequest = Post( + config.knoraApi.internalKnoraApiBaseUrl + "/admin/store/ResetTriplestoreContent", + akka.http.scaladsl.model + .HttpEntity( + akka.http.scaladsl.model.ContentTypes.`application/json`, + rdfDataObjects.toJson.compactPrint + ) + ) + + for { + _ <- ZIO.debug("Loading test data started ...") + _ <- singleAwaitingRequest(loadRequest, 101.seconds) + _ <- ZIO.debug("... loading test data done.") + } yield () + } + + /** + * Performs a http request. + */ + def singleAwaitingRequest( + request: akka.http.scaladsl.model.HttpRequest, + duration: zio.Duration = 60.seconds + ): Task[akka.http.scaladsl.model.HttpResponse] = + ZIO + .fromFuture[akka.http.scaladsl.model.HttpResponse](executionContext => + akka.http.scaladsl.Http().singleRequest(request) + ) + .timeout(duration) + .some + .mapError(error => + error match { + case None => throw AssertionException("Request timed out.") + case Some(throwable) => throw throwable + } + ) + + /** + * Performs a http request and returns the body of the response. + */ + def getResponseString(request: akka.http.scaladsl.model.HttpRequest): Task[String] = + for { + response <- singleAwaitingRequest(request) + // _ <- ZIO.debug(response) + body <- + ZIO + .attemptBlocking( + Await.result( + response.entity.toStrict(FiniteDuration(1, TimeUnit.SECONDS)).map(_.data.decodeString("UTF-8")), + FiniteDuration(1, TimeUnit.SECONDS) + ) + ) + .mapError(error => + throw AssertionException(s"Got HTTP ${response.status.intValue}\n REQUEST: $request, \n RESPONSE: $error") + ) + } yield body + + /** + * Performs a http request and dosn't return the string (only error channel). + */ + def checkResponseOK(request: akka.http.scaladsl.model.HttpRequest): Task[Unit] = + for { + // _ <- ZIO.debug(request) + _ <- getResponseString(request) + } yield () + + /** + * Performs a http request and tries to parse the response body as Json. + */ + def getResponseJson(request: akka.http.scaladsl.model.HttpRequest): Task[JsObject] = + for { + body <- getResponseString(request) + json <- ZIO.succeed(body.parseJson.asJsObject) + } yield json + + /** + * Performs a http request and tries to parse the response body as JsonLD. + */ + def getResponseJsonLD(request: akka.http.scaladsl.model.HttpRequest): Task[JsonLDDocument] = + for { + body <- getResponseString(request) + // _ <- ZIO.debug(body) + json <- ZIO.succeed(JsonLDUtil.parseJsonLD(body)) + } yield json + + /** + * Uploads a file to the IIF Service and returns the information in Sipi's response. + * The upload creates a multipart/form-data request which can contain multiple files. + * + * @param loginToken the login token to be included in the request to Sipi. + * @param filesToUpload the files to be uploaded. + * @return a [[SipiUploadResponse]] representing Sipi's response. + */ + def uploadToSipi(loginToken: String, filesToUpload: Seq[FileToUpload]): Task[SipiUploadResponse] = { + + // builds the url for the operation + def uploadUrl(token: String) = ZIO.succeed(s"${config.sipi.internalBaseUrl}/upload?token=$token") + + // create the entity builder + val builder: MultipartEntityBuilder = MultipartEntityBuilder.create() + builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE) + + // add each file to the entity builder + filesToUpload.foreach { fileToUpload => + builder.addBinaryBody( + "file", + fileToUpload.path.toFile(), + fileToUpload.mimeType, + fileToUpload.path.getFileName.toString + ) + } + + // build our entity + val requestEntity: http.HttpEntity = builder.build() + + // build the request + def request(url: String, requestEntity: http.HttpEntity) = { + val req = new http.client.methods.HttpPost(url) + req.setEntity(requestEntity) + req + } + + for { + url <- uploadUrl(loginToken) + entity <- ZIO.succeed(requestEntity) + req <- ZIO.succeed(request(url, entity)) + // _ <- ZIO.debug(req) + response <- doSipiRequest(req) + sipiResponse <- ZIO.succeed(response.parseJson.asJsObject.convertTo[SipiUploadResponse]) + } yield sipiResponse + } + + /** + * Makes an HTTP request to DSP-API and returns the response. + * + * @param request the HTTP request. + * @return DSP-API's response. + */ + private def doDspApiRequest(request: http.HttpRequest): Task[String] = { + val targetHost: HttpHost = + new HttpHost(config.knoraApi.internalHost, config.knoraApi.internalPort, "http") + val httpContext: HttpClientContext = HttpClientContext.create() + var maybeResponse: Option[CloseableHttpResponse] = None + + val response: Task[String] = ZIO.attemptBlocking { + maybeResponse = Some(httpClient.execute(targetHost, request, httpContext)) + + val responseEntityStr: String = Option(maybeResponse.get.getEntity) match { + case Some(responseEntity) => EntityUtils.toString(responseEntity) + case None => "" + } + + val statusCode: Int = maybeResponse.get.getStatusLine.getStatusCode + val statusCategory: Int = statusCode / 100 + + // Was the request successful? + if (statusCategory == 2) { + // Yes. + responseEntityStr + } else { + // No. Throw an appropriate exception. + if (statusCode == 404) { + throw NotFoundException(responseEntityStr) + } else { + throw BadRequestException(s"DSP-API responded with HTTP status code $statusCode: $responseEntityStr") + } + } + } + + maybeResponse match { + case Some(response) => response.close() + case None => () + } + + response + } + + /** + * Makes an HTTP request to Sipi and returns the response. + * + * @param request the HTTP request. + * @return Sipi's response. + */ + private def doSipiRequest(request: http.HttpRequest): Task[String] = { + val targetHost: HttpHost = + new HttpHost(config.sipi.internalHost, config.sipi.internalPort, config.sipi.internalProtocol) + val httpContext: HttpClientContext = HttpClientContext.create() + var maybeResponse: Option[CloseableHttpResponse] = None + + val response: Task[String] = ZIO.attemptBlocking { + maybeResponse = Some(httpClient.execute(targetHost, request, httpContext)) + + val responseEntityStr: String = Option(maybeResponse.get.getEntity) match { + case Some(responseEntity) => EntityUtils.toString(responseEntity) + case None => "" + } + + val statusCode: Int = maybeResponse.get.getStatusLine.getStatusCode + val statusCategory: Int = statusCode / 100 + + // Was the request successful? + if (statusCategory == 2) { + // Yes. + responseEntityStr + } else { + // No. Throw an appropriate exception. + val sipiErrorMsg = SipiUtil.getSipiErrorMessage(responseEntityStr) + + if (statusCode == 404) { + throw NotFoundException(sipiErrorMsg) + } else if (statusCategory == 4) { + throw BadRequestException(s"Sipi responded with HTTP status code $statusCode: $sipiErrorMsg") + } else { + throw SipiException(s"Sipi responded with HTTP status code $statusCode: $sipiErrorMsg") + } + } + } + + maybeResponse match { + case Some(response) => response.close() + case None => () + } + + response + } +} + +object TestClientService extends Accessible[TestClientService] { + + /** + * Acquires a configured httpClient, backed by a connection pool, + * to be used in communicating with SIPI. + */ + private def acquire(config: AppConfig) = ZIO.attemptBlocking { + + // timeout from config + val sipiTimeoutMillis = config.sipi.timeoutInSeconds.toMillis.toInt + + // Create a connection manager with custom configuration. + val connManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager() + + // Create socket configuration + val socketConfig: SocketConfig = SocketConfig + .custom() + .setTcpNoDelay(true) + .build(); + + // Configure the connection manager to use socket configuration by default. + connManager.setDefaultSocketConfig(socketConfig) + + // Validate connections after 1 sec of inactivity + connManager.setValidateAfterInactivity(1000); + + // Configure total max or per route limits for persistent connections + // that can be kept in the pool or leased by the connection manager. + connManager.setMaxTotal(100) + connManager.setDefaultMaxPerRoute(10) + + // Sipi custom default request config + val defaultRequestConfig = RequestConfig + .custom() + .setConnectTimeout(sipiTimeoutMillis) + .setConnectionRequestTimeout(sipiTimeoutMillis) + .setSocketTimeout(sipiTimeoutMillis) + .build() + + // Create an HttpClient with the given custom dependencies and configuration. + val httpClient: CloseableHttpClient = HttpClients + .custom() + .setConnectionManager(connManager) + .setDefaultRequestConfig(defaultRequestConfig) + .build() + + httpClient + }.tap(_ => ZIO.logDebug(">>> Acquire Test Client Service <<<")).orDie + + /** + * Releases the httpClient, freeing all resources. + */ + private def release(httpClient: CloseableHttpClient)(implicit system: ActorSystem) = ZIO.attemptBlocking { + akka.http.scaladsl.Http().shutdownAllConnectionPools() + httpClient.close() + }.tap(_ => ZIO.logDebug(">>> Release Test Client Service <<<")).orDie + + def layer(config: AppConfig, actorSystem: ActorSystem): ZLayer[Any, Nothing, TestClientService] = { + implicit val system = actorSystem + + ZLayer.scoped { + for { + // _ <- ZIO.debug(config.sipi) + httpClient <- ZIO.acquireRelease(acquire(config))(release(_)) + } yield TestClientService(config, httpClient, actorSystem) + }.tap(_ => ZIO.logDebug(">>> Test Client Service initialized <<<")) + } + +} 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 169bbd9713..adf4b501ae 100644 --- a/webapi/src/test/scala/org/knora/webapi/util/AkkaHttpUtils.scala +++ b/webapi/src/test/scala/org/knora/webapi/util/AkkaHttpUtils.scala @@ -6,15 +6,18 @@ package org.knora.webapi.util import akka.actor.ActorSystem -import akka.http.scaladsl.model.{HttpResponse, StatusCodes} +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._ +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext, Future} /** * Object containing methods for dealing with [[HttpResponse]] diff --git a/webapi/src/test/scala/org/knora/webapi/util/StartupUtils.scala b/webapi/src/test/scala/org/knora/webapi/util/StartupUtils.scala index d9be93bf9a..1552e04dcc 100644 --- a/webapi/src/test/scala/org/knora/webapi/util/StartupUtils.scala +++ b/webapi/src/test/scala/org/knora/webapi/util/StartupUtils.scala @@ -10,11 +10,14 @@ import akka.pattern.ask import akka.util.Timeout import com.typesafe.scalalogging.LazyLogging import org.knora.webapi.core.Core -import org.knora.webapi.messages.app.appmessages.{AppState, AppStates, GetAppState} +import org.knora.webapi.messages.app.appmessages.AppState +import org.knora.webapi.messages.app.appmessages.AppStates +import org.knora.webapi.messages.app.appmessages.GetAppState import org.knora.webapi.settings.KnoraDispatchers +import scala.concurrent.Await +import scala.concurrent.Future import scala.concurrent.duration._ -import scala.concurrent.{Await, Future} /** * This trait is only used for testing. It is necessary so that E2E tests will only start diff --git a/webapi/src/test/scala/org/knora/webapi/util/StringLiteralSequenceV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/util/StringLiteralSequenceV2Spec.scala index 48d7bd020d..ac78c4b1ca 100644 --- a/webapi/src/test/scala/org/knora/webapi/util/StringLiteralSequenceV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/util/StringLiteralSequenceV2Spec.scala @@ -7,7 +7,8 @@ package org.knora.webapi.util import org.knora.webapi.CoreSpec import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.store.triplestoremessages.{StringLiteralSequenceV2, StringLiteralV2} +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 /** * Tests [[StringLiteralSequenceV2]]. 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 7f06c6b99f..990c522690 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,20 +5,19 @@ package org.knora.webapi.util.cache -import akka.testkit.ImplicitSender -import com.typesafe.config.{Config, ConfigFactory} -import org.knora.webapi.UnitSpec -import org.knora.webapi.routing.Authenticator -import org.knora.webapi.sharedtestdata.SharedTestDataV1 -import akka.testkit.TestKit -import org.scalatest.wordspec.AnyWordSpecLike import akka.actor.ActorSystem -import org.scalatest.matchers.should.Matchers -import org.scalatest.BeforeAndAfterAll +import akka.testkit.TestKit +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging +import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.routing.Authenticator import org.knora.webapi.settings.KnoraSettings import org.knora.webapi.settings.KnoraSettingsImpl -import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.sharedtestdata.SharedTestDataV1 +import org.scalatest.BeforeAndAfterAll +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpecLike object CacheUtilSpec { val config: Config = ConfigFactory.parseString("""