aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/com/drivergrp/core/DriverApp.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/com/drivergrp/core/DriverApp.scala')
-rw-r--r--src/main/scala/com/drivergrp/core/DriverApp.scala75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/scala/com/drivergrp/core/DriverApp.scala b/src/main/scala/com/drivergrp/core/DriverApp.scala
new file mode 100644
index 0000000..01fee03
--- /dev/null
+++ b/src/main/scala/com/drivergrp/core/DriverApp.scala
@@ -0,0 +1,75 @@
+package com.drivergrp.core
+
+import akka.actor.ActorSystem
+import akka.http.scaladsl.Http
+import akka.http.scaladsl.server.Directives._
+import akka.http.scaladsl.server.RouteResult._
+import akka.stream.ActorMaterializer
+import com.drivergrp.core.config.ConfigModule
+import com.drivergrp.core.logging.LoggerModule
+
+
+trait DriverApp {
+ this: ConfigModule with LoggerModule =>
+
+ def interface: String = "localhost"
+ def port: Int = 8080
+
+ def services: Seq[Service]
+
+
+ val servicesInstances = services
+ activateServices(servicesInstances)
+ scheduleServicesDeactivation(servicesInstances)
+
+ implicit val actorSystem = ActorSystem("spray-routing", config)
+ implicit val executionContext = actorSystem.dispatcher
+ implicit val materializer = ActorMaterializer()(actorSystem)
+
+ val serviceTypes = servicesInstances.flatMap(_.serviceTypes)
+ val swaggerService = new Swagger(actorSystem, serviceTypes, config)
+ val swaggerRoutes = swaggerService.routes ~ swaggerService.swaggerUI
+
+ Http()(actorSystem).bindAndHandle(
+ route2HandlerFlow(logRequestResult("log")(servicesInstances.map(_.route).foldLeft(swaggerRoutes) { _ ~ _ })),
+ interface, port)(materializer)
+
+
+ /**
+ * Initializes services
+ */
+ protected def activateServices(servicesInstances: Seq[Service]) = {
+ servicesInstances.foreach { service =>
+ Console.print(s"Service ${service.name} starts ...")
+ try {
+ service.activate()
+ } catch {
+ case t: Throwable =>
+ log.fatal(s"Service ${service.name} failed to activate", t)
+ Console.print(" Failed! (check log)")
+ }
+ Console.println(" Done")
+ }
+ }
+
+ /**
+ * Schedules services to be deactivated on the app shutdown
+ */
+ protected def scheduleServicesDeactivation(servicesInstances: Seq[Service]) = {
+ Runtime.getRuntime.addShutdownHook(new Thread() {
+ override def run(): Unit = {
+ servicesInstances.foreach { service =>
+ Console.print(s"Service ${service.name} shutting down ...")
+ try {
+ service.deactivate()
+ } catch {
+ case t: Throwable =>
+ log.fatal(s"Service ${service.name} failed to deactivate", t)
+ Console.print(" Failed! (check log)")
+ }
+ Console.println(" Done")
+ }
+ }
+ })
+ }
+}