From c948b1f2c1c7a5246d5c1a7cba05e6e27a9d7b57 Mon Sep 17 00:00:00 2001 From: vlad Date: Sat, 16 Jul 2016 15:55:19 -0400 Subject: Modules consolidation --- src/main/scala/com/drivergrp/core/DriverApp.scala | 77 -------------- src/main/scala/com/drivergrp/core/Swagger.scala | 45 -------- src/main/scala/com/drivergrp/core/app.scala | 115 +++++++++++++++++++++ src/main/scala/com/drivergrp/core/core.scala | 39 +++++++ src/main/scala/com/drivergrp/core/database.scala | 1 - src/main/scala/com/drivergrp/core/generators.scala | 2 - src/main/scala/com/drivergrp/core/id.scala | 24 ----- src/main/scala/com/drivergrp/core/module.scala | 39 ------- src/main/scala/com/drivergrp/core/package.scala | 19 ---- src/main/scala/com/drivergrp/core/rest.scala | 42 +++++++- 10 files changed, 195 insertions(+), 208 deletions(-) delete mode 100644 src/main/scala/com/drivergrp/core/DriverApp.scala delete mode 100644 src/main/scala/com/drivergrp/core/Swagger.scala create mode 100644 src/main/scala/com/drivergrp/core/app.scala create mode 100644 src/main/scala/com/drivergrp/core/core.scala delete mode 100644 src/main/scala/com/drivergrp/core/id.scala delete mode 100644 src/main/scala/com/drivergrp/core/module.scala delete mode 100644 src/main/scala/com/drivergrp/core/package.scala (limited to 'src/main/scala/com/drivergrp') diff --git a/src/main/scala/com/drivergrp/core/DriverApp.scala b/src/main/scala/com/drivergrp/core/DriverApp.scala deleted file mode 100644 index b361c15..0000000 --- a/src/main/scala/com/drivergrp/core/DriverApp.scala +++ /dev/null @@ -1,77 +0,0 @@ -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.logging.{Logger, TypesafeScalaLogger} -import com.drivergrp.core.module.Module -import com.typesafe.config.Config -import org.slf4j.LoggerFactory - - -class DriverApp(modules: Seq[Module], - log: Logger = new TypesafeScalaLogger( - com.typesafe.scalalogging.Logger(LoggerFactory.getLogger(classOf[DriverApp]))), - config: Config = com.drivergrp.core.config.loadDefaultConfig, - interface: String = "localhost", port: Int = 8080) { - - def run() = { - activateServices(modules) - scheduleServicesDeactivation(modules) - bindHttp(modules) - } - - protected def bindHttp(modules: Seq[Module]) { - implicit val actorSystem = ActorSystem("spray-routing", config) - implicit val executionContext = actorSystem.dispatcher - implicit val materializer = ActorMaterializer()(actorSystem) - - val serviceTypes = modules.flatMap(_.routeTypes) - val swaggerService = new Swagger(actorSystem, serviceTypes, config) - val swaggerRoutes = swaggerService.routes ~ swaggerService.swaggerUI - - Http()(actorSystem).bindAndHandle( - route2HandlerFlow(logRequestResult("log")(modules.map(_.route).foldLeft(swaggerRoutes) { _ ~ _ })), - interface, port)(materializer) - } - - /** - * Initializes services - */ - protected def activateServices(services: Seq[Module]) = { - services.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(services: Seq[Module]) = { - Runtime.getRuntime.addShutdownHook(new Thread() { - override def run(): Unit = { - services.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") - } - } - }) - } -} diff --git a/src/main/scala/com/drivergrp/core/Swagger.scala b/src/main/scala/com/drivergrp/core/Swagger.scala deleted file mode 100644 index 428920c..0000000 --- a/src/main/scala/com/drivergrp/core/Swagger.scala +++ /dev/null @@ -1,45 +0,0 @@ -package com.drivergrp.core - -import akka.actor.ActorSystem -import akka.stream.ActorMaterializer -import com.github.swagger.akka.model._ -import com.github.swagger.akka.{HasActorSystem, SwaggerHttpService} -import com.typesafe.config.Config - -import scala.reflect.runtime.universe._ - - -class Swagger(override val actorSystem: ActorSystem, - override val apiTypes: Seq[Type], - val config: Config) extends SwaggerHttpService with HasActorSystem { - - val materializer = ActorMaterializer()(actorSystem) - - override val host = "localhost:8080" //the url of your api, not swagger's json endpoint - override val basePath = config.getString("swagger.basePath") - override val apiDocsPath = config.getString("swagger.docsPath") - - override val info = Info( - config.getString("swagger.apiInfo.description"), - config.getString("swagger.apiVersion"), - config.getString("swagger.apiInfo.title"), - config.getString("swagger.apiInfo.termsOfServiceUrl"), - contact = Some(Contact( - config.getString("swagger.apiInfo.contact.name"), - config.getString("swagger.apiInfo.contact.url"), - config.getString("swagger.apiInfo.contact.email") - )), - license = Some(License( - config.getString("swagger.apiInfo.license"), - config.getString("swagger.apiInfo.licenseUrl") - )), - vendorExtensions = Map()) - - def swaggerUI = get { - pathPrefix("") { - pathEndOrSingleSlash { - getFromResource("swagger-ui/index.html") - } - } ~ getFromResourceDirectory("swagger-ui") - } -} \ No newline at end of file diff --git a/src/main/scala/com/drivergrp/core/app.scala b/src/main/scala/com/drivergrp/core/app.scala new file mode 100644 index 0000000..34a92e3 --- /dev/null +++ b/src/main/scala/com/drivergrp/core/app.scala @@ -0,0 +1,115 @@ +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.logging.{Logger, TypesafeScalaLogger} +import akka.http.scaladsl.server.{Route, RouteConcatenation} +import com.drivergrp.core.rest.Swagger +import com.typesafe.config.Config +import org.slf4j.LoggerFactory + + +object app { + + class DriverApp(modules: Seq[Module], + log: Logger = new TypesafeScalaLogger( + com.typesafe.scalalogging.Logger(LoggerFactory.getLogger(classOf[DriverApp]))), + config: Config = com.drivergrp.core.config.loadDefaultConfig, + interface: String = "localhost", port: Int = 8080) { + + def run() = { + activateServices(modules) + scheduleServicesDeactivation(modules) + bindHttp(modules) + } + + protected def bindHttp(modules: Seq[Module]) { + implicit val actorSystem = ActorSystem("spray-routing", config) + implicit val executionContext = actorSystem.dispatcher + implicit val materializer = ActorMaterializer()(actorSystem) + + val serviceTypes = modules.flatMap(_.routeTypes) + val swaggerService = new Swagger(actorSystem, serviceTypes, config) + val swaggerRoutes = swaggerService.routes ~ swaggerService.swaggerUI + + Http()(actorSystem).bindAndHandle( + route2HandlerFlow(logRequestResult("log")(modules.map(_.route).foldLeft(swaggerRoutes) { _ ~ _ })), + interface, port)(materializer) + } + + /** + * Initializes services + */ + protected def activateServices(services: Seq[Module]) = { + services.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(services: Seq[Module]) = { + Runtime.getRuntime.addShutdownHook(new Thread() { + override def run(): Unit = { + services.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") + } + } + }) + } + } + + + import scala.reflect.runtime.universe._ + + trait Module { + val name: String + def route: Route + def routeTypes: Seq[Type] + + def activate(): Unit = {} + def deactivate(): Unit = {} + } + + class SimpleModule(val name: String, val route: Route, routeType: Type) extends Module { + def routeTypes: Seq[Type] = Seq(routeType) + } + + /** + * Module implementation which may be used to composed a few + * + * @param name more general name of the composite module, + * must be provided as there is no good way to automatically + * generalize the name from the composed modules' names + * @param modules modules to compose into a single one + */ + class CompositeModule(val name: String, modules: Seq[Module]) + extends Module with RouteConcatenation { + + def route: Route = modules.map(_.route).reduce(_ ~ _) + def routeTypes = modules.flatMap(_.routeTypes) + + override def activate() = modules.foreach(_.activate()) + override def deactivate() = modules.reverse.foreach(_.deactivate()) + } +} diff --git a/src/main/scala/com/drivergrp/core/core.scala b/src/main/scala/com/drivergrp/core/core.scala new file mode 100644 index 0000000..51459a7 --- /dev/null +++ b/src/main/scala/com/drivergrp/core/core.scala @@ -0,0 +1,39 @@ +package com.drivergrp + +import scalaz.Equal + + +package object core { + import scala.language.reflectiveCalls + + def make[T](v: => T)(f: T => Unit): T = { + val value = v; f(value); value + } + + def using[R <: { def close() }, P](r: => R)(f: R => P): P = { + val resource = r + try { + f(resource) + } finally { + resource.close() + } + } + + + trait Tagged[+V, +Tag] + type @@[+V, +Tag] = V with Tagged[V, Tag] + + type Id[+Tag] = Long @@ Tag + object Id { + def apply[Tag](value: Long) = value.asInstanceOf[Id[Tag]] + } + + implicit def idEqual[T]: Equal[Id[T]] = Equal.equal[Id[T]](_ == _) + + type Name[+Tag] = String @@ Tag + object Name { + def apply[Tag](value: String) = value.asInstanceOf[Name[Tag]] + } + + implicit def nameEqual[T]: Equal[Name[T]] = Equal.equal[Name[T]](_ == _) +} diff --git a/src/main/scala/com/drivergrp/core/database.scala b/src/main/scala/com/drivergrp/core/database.scala index 89cfac1..b23c953 100644 --- a/src/main/scala/com/drivergrp/core/database.scala +++ b/src/main/scala/com/drivergrp/core/database.scala @@ -1,6 +1,5 @@ package com.drivergrp.core -import com.drivergrp.core.id.{Id, Name} import scala.concurrent.Future import slick.backend.DatabaseConfig import slick.driver.JdbcProfile diff --git a/src/main/scala/com/drivergrp/core/generators.scala b/src/main/scala/com/drivergrp/core/generators.scala index 89d6e56..7f51078 100644 --- a/src/main/scala/com/drivergrp/core/generators.scala +++ b/src/main/scala/com/drivergrp/core/generators.scala @@ -1,8 +1,6 @@ package com.drivergrp.core import java.math.MathContext - -import com.drivergrp.core.id.{Id, Name} import com.drivergrp.core.time.{Time, TimeRange} import scala.reflect.ClassTag diff --git a/src/main/scala/com/drivergrp/core/id.scala b/src/main/scala/com/drivergrp/core/id.scala deleted file mode 100644 index 29b8d99..0000000 --- a/src/main/scala/com/drivergrp/core/id.scala +++ /dev/null @@ -1,24 +0,0 @@ -package com.drivergrp.core - -import scalaz._ - - -object id { - - trait Tagged[+V, +Tag] - type @@[+V, +Tag] = V with Tagged[V, Tag] - - type Id[+Tag] = Long @@ Tag - object Id { - def apply[Tag](value: Long) = value.asInstanceOf[Id[Tag]] - } - - implicit def idEqual[T]: Equal[Id[T]] = Equal.equal[Id[T]](_ == _) - - type Name[+Tag] = String @@ Tag - object Name { - def apply[Tag](value: String) = value.asInstanceOf[Name[Tag]] - } - - implicit def nameEqual[T]: Equal[Name[T]] = Equal.equal[Name[T]](_ == _) -} diff --git a/src/main/scala/com/drivergrp/core/module.scala b/src/main/scala/com/drivergrp/core/module.scala deleted file mode 100644 index 94dd6a3..0000000 --- a/src/main/scala/com/drivergrp/core/module.scala +++ /dev/null @@ -1,39 +0,0 @@ -package com.drivergrp.core - -import akka.http.scaladsl.server.{Route, RouteConcatenation} - - -object module { - import scala.reflect.runtime.universe._ - - trait Module { - val name: String - def route: Route - def routeTypes: Seq[Type] - - def activate(): Unit = {} - def deactivate(): Unit = {} - } - - class SimpleModule(val name: String, val route: Route, routeType: Type) extends Module { - def routeTypes: Seq[Type] = Seq(routeType) - } - - /** - * Module implementation which may be used to composed a few - * - * @param name more general name of the composite module, - * must be provided as there is no good way to automatically - * generalize the name from the composed modules' names - * @param modules modules to compose into a single one - */ - class CompositeModule(val name: String, modules: Seq[Module]) - extends Module with RouteConcatenation { - - def route: Route = modules.map(_.route).reduce(_ ~ _) - def routeTypes = modules.flatMap(_.routeTypes) - - override def activate() = modules.foreach(_.activate()) - override def deactivate() = modules.reverse.foreach(_.deactivate()) - } -} \ No newline at end of file diff --git a/src/main/scala/com/drivergrp/core/package.scala b/src/main/scala/com/drivergrp/core/package.scala deleted file mode 100644 index 3c19431..0000000 --- a/src/main/scala/com/drivergrp/core/package.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.drivergrp - - -package object core { - import scala.language.reflectiveCalls - - def make[T](v: => T)(f: T => Unit): T = { - val value = v; f(value); value - } - - def using[R <: { def close() }, P](r: => R)(f: R => P): P = { - val resource = r - try { - f(resource) - } finally { - resource.close() - } - } -} diff --git a/src/main/scala/com/drivergrp/core/rest.scala b/src/main/scala/com/drivergrp/core/rest.scala index 51823da..71aed94 100644 --- a/src/main/scala/com/drivergrp/core/rest.scala +++ b/src/main/scala/com/drivergrp/core/rest.scala @@ -7,11 +7,13 @@ import akka.http.scaladsl.server.{Directive, _} import akka.http.scaladsl.util.FastFuture._ import akka.stream.ActorMaterializer import akka.util.Timeout -import com.drivergrp.core.id.{Id, Name} import com.drivergrp.core.logging.Logger import com.drivergrp.core.stats.Stats import com.drivergrp.core.time.TimeRange import com.drivergrp.core.time.provider.TimeProvider +import com.github.swagger.akka.model._ +import com.github.swagger.akka.{HasActorSystem, SwaggerHttpService} +import com.typesafe.config.Config import spray.json.{DeserializationException, JsNumber, JsString, JsValue, RootJsonFormat} import scala.concurrent.duration._ @@ -97,4 +99,42 @@ object rest { optionT.run.fast.transformWith(t ⇒ inner(Tuple1(t))(ctx)) } } + + + import scala.reflect.runtime.universe._ + + class Swagger(override val actorSystem: ActorSystem, + override val apiTypes: Seq[Type], + val config: Config) extends SwaggerHttpService with HasActorSystem { + + val materializer = ActorMaterializer()(actorSystem) + + override val host = "localhost:8080" //the url of your api, not swagger's json endpoint + override val basePath = config.getString("swagger.basePath") + override val apiDocsPath = config.getString("swagger.docsPath") + + override val info = Info( + config.getString("swagger.apiInfo.description"), + config.getString("swagger.apiVersion"), + config.getString("swagger.apiInfo.title"), + config.getString("swagger.apiInfo.termsOfServiceUrl"), + contact = Some(Contact( + config.getString("swagger.apiInfo.contact.name"), + config.getString("swagger.apiInfo.contact.url"), + config.getString("swagger.apiInfo.contact.email") + )), + license = Some(License( + config.getString("swagger.apiInfo.license"), + config.getString("swagger.apiInfo.licenseUrl") + )), + vendorExtensions = Map()) + + def swaggerUI = get { + pathPrefix("") { + pathEndOrSingleSlash { + getFromResource("swagger-ui/index.html") + } + } ~ getFromResourceDirectory("swagger-ui") + } + } } -- cgit v1.2.3