From caef1e236434d17c19d3509148415a89c3dfce78 Mon Sep 17 00:00:00 2001 From: Override-6 Date: Wed, 23 Nov 2022 12:10:32 +0100 Subject: [PATCH] mise en place structure globale et exemple de fonctionnement --- API/build.gradle | 10 +---- .../main/scala/org/tbasket/api/Endpoint.scala | 38 ++++++++++++++++ .../tbasket/api/event/RequestHandler.scala | 7 +++ DB/build.gradle | 9 +--- build.gradle | 43 ++++++++++++------- src/main/resources/server.properties | 1 + .../scala/org/tbasket/EndpointSetup.scala | 32 ++++++++++++++ .../ExternalBasketServerException.scala | 8 ++++ .../InternalBasketServerException.scala | 8 ++++ src/main/scala/org/tbasket/Main.scala | 8 +++- 10 files changed, 132 insertions(+), 32 deletions(-) create mode 100644 API/src/main/scala/org/tbasket/api/Endpoint.scala create mode 100644 API/src/main/scala/org/tbasket/api/event/RequestHandler.scala create mode 100644 src/main/resources/server.properties create mode 100644 src/main/scala/org/tbasket/EndpointSetup.scala create mode 100644 src/main/scala/org/tbasket/ExternalBasketServerException.scala create mode 100644 src/main/scala/org/tbasket/InternalBasketServerException.scala diff --git a/API/build.gradle b/API/build.gradle index d2838b7..236aa0e 100644 --- a/API/build.gradle +++ b/API/build.gradle @@ -1,11 +1,5 @@ -group 'org.tbasket.api' -version '1.0-SNAPSHOT' - -repositories { - mavenCentral() -} +group "org.tbasket.api" dependencies { - implementation 'com.typesafe.akka:akka-http_3:10.5.0-M1' - + implementation 'com.typesafe.akka:akka-http_2.13:10.5.0-M1' } \ No newline at end of file diff --git a/API/src/main/scala/org/tbasket/api/Endpoint.scala b/API/src/main/scala/org/tbasket/api/Endpoint.scala new file mode 100644 index 0000000..60f463b --- /dev/null +++ b/API/src/main/scala/org/tbasket/api/Endpoint.scala @@ -0,0 +1,38 @@ +package org.tbasket.api + +import akka.actor.typed.ActorSystem +import akka.actor.typed.javadsl.Behaviors +import akka.http.scaladsl.Http +import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse} +import akka.http.scaladsl.server.Directives._ + +import scala.concurrent.ExecutionContextExecutor + +class Endpoint(url: String, port: Int) { +implicit val system: ActorSystem[_] = ActorSystem(Behaviors.empty, "main") +implicit val ec : ExecutionContextExecutor = system.executionContext + +private var count = 0 + +def countEntity = HttpEntity(ContentTypes.`application/json`, s"value: $count") + +private val server = Http().newServerAt(url, port) + +server.bind(concat( + path("counter") { + get { + println("got get request") + complete(countEntity) + } + }, + path("counter") { + post { + println("got request") + count += 1 + complete(HttpResponse(entity = countEntity)) + } + } +)) + + +} diff --git a/API/src/main/scala/org/tbasket/api/event/RequestHandler.scala b/API/src/main/scala/org/tbasket/api/event/RequestHandler.scala new file mode 100644 index 0000000..17354ce --- /dev/null +++ b/API/src/main/scala/org/tbasket/api/event/RequestHandler.scala @@ -0,0 +1,7 @@ +package org.tbasket.api.event + +trait RequestHandler { + + def handle() + +} diff --git a/DB/build.gradle b/DB/build.gradle index 003bf32..2f7f270 100644 --- a/DB/build.gradle +++ b/DB/build.gradle @@ -1,12 +1,5 @@ - -group 'org.tbasket.db' -version '1.0-SNAPSHOT' - -repositories { - mavenCentral() -} +group "org.tbasket.api" dependencies { implementation 'io.getquill:quill_2.12:3.2.0' - } diff --git a/build.gradle b/build.gradle index fe48070..815c0bc 100644 --- a/build.gradle +++ b/build.gradle @@ -4,35 +4,48 @@ plugins { id 'application' } -println("Running build on java version ${System.getProperty("java.version")}.") - +final var scalaVersion = "2.13" mainClassName = 'org.tbasket.Main' - group 'org.tbasket' -version '1.0-SNAPSHOT' + +println("Running gradle on java version ${System.getProperty("java.version")}.") repositories { mavenCentral() } + +dependencies { + implementation project(':API') + implementation project(':DB') + implementation "io.circe:circe-core_$scalaVersion:0.15.0-M1" + +} + +test { + useJUnitPlatform() +} + +run { + standardInput = System.in +} + allprojects { apply plugin: 'scala' + version '1.0-SNAPSHOT' + + repositories { + mavenCentral() + } dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' - implementation 'org.scala-lang:scala-library:2.13.10' - implementation 'com.typesafe.akka:akka-actor_3:2.7.0' + implementation "org.scala-lang:scala-library:$scalaVersion.10" + implementation "com.typesafe.akka:akka-actor-typed_$scalaVersion:2.7.0" + implementation "com.typesafe.akka:akka-stream-typed_$scalaVersion:2.7.0" + } } - -dependencies { - implementation project(':API') - implementation project(':DB') -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties new file mode 100644 index 0000000..824af47 --- /dev/null +++ b/src/main/resources/server.properties @@ -0,0 +1 @@ +endpoint.url=localhost:48485 \ No newline at end of file diff --git a/src/main/scala/org/tbasket/EndpointSetup.scala b/src/main/scala/org/tbasket/EndpointSetup.scala new file mode 100644 index 0000000..1466dba --- /dev/null +++ b/src/main/scala/org/tbasket/EndpointSetup.scala @@ -0,0 +1,32 @@ +package org.tbasket + +import org.tbasket.api.Endpoint + +import java.util.Properties + +object EndpointSetup { + + final val EndpointUrl = "endpoint.url" + final val EndpointUrlDefault = s"localhost:48485" + + def setupEndpoint(): Endpoint = { + println("Initializing API endpoint...") + val endpoint = createEndpoint() + + endpoint + } + + private def createEndpoint(): Endpoint = { + val properties = new Properties() + val in = getClass.getClassLoader.getResourceAsStream("server.properties") + properties.load(in) + val (url, port) = properties + .getProperty(EndpointUrl, EndpointUrlDefault) match { + case s"$ip:$port/$endpointPath" => (ip + "/" + endpointPath, port.toInt) + case s"$ip:$port" => (ip, port.toInt) + case v => throw new InternalBasketServerException(s"$EndpointUrl property value is wrong: $v must be :/[endpointPath]") + } + new Endpoint(url, port) + } + +} diff --git a/src/main/scala/org/tbasket/ExternalBasketServerException.scala b/src/main/scala/org/tbasket/ExternalBasketServerException.scala new file mode 100644 index 0000000..640ebf2 --- /dev/null +++ b/src/main/scala/org/tbasket/ExternalBasketServerException.scala @@ -0,0 +1,8 @@ +package org.tbasket + +/** + * exception thrown when an error occurs due to an external fault from the server. + * */ +class ExternalBasketServerException(msg: String, cause: Throwable = null) extends Exception(msg, cause) { + +} diff --git a/src/main/scala/org/tbasket/InternalBasketServerException.scala b/src/main/scala/org/tbasket/InternalBasketServerException.scala new file mode 100644 index 0000000..eb8ae7d --- /dev/null +++ b/src/main/scala/org/tbasket/InternalBasketServerException.scala @@ -0,0 +1,8 @@ +package org.tbasket + +/** + * exception thrown when an error occurs due to an internal fault of the server or its maintainers. + * */ +class InternalBasketServerException(msg: String, cause: Throwable = null) extends Exception(msg, cause) { + +} diff --git a/src/main/scala/org/tbasket/Main.scala b/src/main/scala/org/tbasket/Main.scala index 0738586..d0882bb 100644 --- a/src/main/scala/org/tbasket/Main.scala +++ b/src/main/scala/org/tbasket/Main.scala @@ -1,9 +1,15 @@ package org.tbasket +import scala.io.StdIn + object Main { def main(args: Array[String]): Unit = { - println("Hello Server !") + val endpoint = EndpointSetup.setupEndpoint() + println("enter to exit") + StdIn.readLine() } + + }