diff options
author | Jakob Odersky <jakob@driver.xyz> | 2018-09-12 17:30:33 -0700 |
---|---|---|
committer | Jakob Odersky <jakob@odersky.com> | 2018-10-09 16:19:39 -0700 |
commit | eb6f97b4cac548999cbf192ee83d9ba9a253b7c8 (patch) | |
tree | 6d75a23efc841a6f51e780913387000206d1fe94 | |
parent | 4d1197099ce4e721c18bf4cacbb2e1980e4210b5 (diff) | |
download | driver-core-eb6f97b4cac548999cbf192ee83d9ba9a253b7c8.tar.gz driver-core-eb6f97b4cac548999cbf192ee83d9ba9a253b7c8.tar.bz2 driver-core-eb6f97b4cac548999cbf192ee83d9ba9a253b7c8.zip |
Move database-related functionality to separate project
This committ includes a breaking change. The database-specific utility
"Converters" trait threw an exception "DatabaseException" defined in
the rest package, thus breaking the dependency graph. The solution was
to move the DatabaseException class from rest to database and not
inherit ServiceExceptio any more.
Unfortunately, the rest classes also require the database exception in
propagating errors so this funtionality has been removed. The
rationale is:
1. Database exceptions are rare and result in 500 errors anyway
making the status code opaque to what actual error caused it.
2. In core 2.0, an improved tracing framework will make diagnosing
and following database errors easier, thereby attenuating the need
to forward details on service exceptions in responses.
12 files changed, 8 insertions, 65 deletions
@@ -72,9 +72,14 @@ lazy val `core-messaging` = project .dependsOn(`core-reporting`) .settings(testdeps) +lazy val `core-database` = project + .enablePlugins(LibraryPlugin) + .dependsOn(`core-types`) + .settings(testdeps) + lazy val `core-init` = project .enablePlugins(LibraryPlugin) - .dependsOn(`core-reporting`, `core-storage`, `core-messaging`, `core-rest`) + .dependsOn(`core-reporting`, `core-storage`, `core-messaging`, `core-rest`, `core-database`) .settings(testdeps) lazy val core = project @@ -91,5 +96,5 @@ lazy val core = project s"https://github.com/drivergroup/driver-core/blob/master€{FILE_PATH}.scala" ) ) - .dependsOn(`core-types`, `core-rest`, `core-reporting`, `core-storage`, `core-messaging`, `core-init`) + .dependsOn(`core-types`, `core-rest`, `core-reporting`, `core-storage`, `core-messaging`, `core-database`, `core-init`) .settings(testdeps) diff --git a/src/main/scala/xyz/driver/core/database/Converters.scala b/core-database/src/main/scala/xyz/driver/core/database/Converters.scala index ad79abf..b0054ad 100644 --- a/src/main/scala/xyz/driver/core/database/Converters.scala +++ b/core-database/src/main/scala/xyz/driver/core/database/Converters.scala @@ -1,7 +1,5 @@ package xyz.driver.core.database -import xyz.driver.core.rest.errors.DatabaseException - import scala.reflect.ClassTag /** @@ -24,3 +22,4 @@ trait Converters { query.map(expectValid[ADT](mapper, _)) } } +final case class DatabaseException(message: String = "Database access error") extends RuntimeException(message) diff --git a/src/main/scala/xyz/driver/core/database/PatchedHsqldbProfile.scala b/core-database/src/main/scala/xyz/driver/core/database/PatchedHsqldbProfile.scala index e2efd32..e2efd32 100644 --- a/src/main/scala/xyz/driver/core/database/PatchedHsqldbProfile.scala +++ b/core-database/src/main/scala/xyz/driver/core/database/PatchedHsqldbProfile.scala diff --git a/src/main/scala/xyz/driver/core/database/Repository.scala b/core-database/src/main/scala/xyz/driver/core/database/Repository.scala index 5d7f787..5d7f787 100644 --- a/src/main/scala/xyz/driver/core/database/Repository.scala +++ b/core-database/src/main/scala/xyz/driver/core/database/Repository.scala diff --git a/src/main/scala/xyz/driver/core/database/SlickGetResultSupport.scala b/core-database/src/main/scala/xyz/driver/core/database/SlickGetResultSupport.scala index 8293371..8293371 100644 --- a/src/main/scala/xyz/driver/core/database/SlickGetResultSupport.scala +++ b/core-database/src/main/scala/xyz/driver/core/database/SlickGetResultSupport.scala diff --git a/src/main/scala/xyz/driver/core/database/database.scala b/core-database/src/main/scala/xyz/driver/core/database/database.scala index bd20b54..bd20b54 100644 --- a/src/main/scala/xyz/driver/core/database/database.scala +++ b/core-database/src/main/scala/xyz/driver/core/database/database.scala diff --git a/src/main/scala/xyz/driver/core/database/package.scala b/core-database/src/main/scala/xyz/driver/core/database/package.scala index aee14c6..aee14c6 100644 --- a/src/main/scala/xyz/driver/core/database/package.scala +++ b/core-database/src/main/scala/xyz/driver/core/database/package.scala diff --git a/src/test/scala/xyz/driver/core/database/DatabaseTest.scala b/core-database/src/test/scala/xyz/driver/core/database/DatabaseTest.scala index 8d2a4ac..8d2a4ac 100644 --- a/src/test/scala/xyz/driver/core/database/DatabaseTest.scala +++ b/core-database/src/test/scala/xyz/driver/core/database/DatabaseTest.scala diff --git a/core-rest/src/main/scala/xyz/driver/core/json.scala b/core-rest/src/main/scala/xyz/driver/core/json.scala index edc2347..40888aa 100644 --- a/core-rest/src/main/scala/xyz/driver/core/json.scala +++ b/core-rest/src/main/scala/xyz/driver/core/json.scala @@ -383,7 +383,6 @@ object json extends PathMatchers with Unmarshallers { case _: ResourceNotFoundException => "ResourceNotFoundException" case _: ExternalServiceException => "ExternalServiceException" case _: ExternalServiceTimeoutException => "ExternalServiceTimeoutException" - case _: DatabaseException => "DatabaseException" } { case "InvalidInputException" => jsonFormat(InvalidInputException, "message") case "InvalidActionException" => jsonFormat(InvalidActionException, "message") @@ -392,7 +391,6 @@ object json extends PathMatchers with Unmarshallers { case "ExternalServiceException" => jsonFormat(ExternalServiceException, "serviceName", "serviceMessage", "serviceException") case "ExternalServiceTimeoutException" => jsonFormat(ExternalServiceTimeoutException, "message") - case "DatabaseException" => jsonFormat(DatabaseException, "message") } } diff --git a/core-rest/src/main/scala/xyz/driver/core/rest/DriverRoute.scala b/core-rest/src/main/scala/xyz/driver/core/rest/DriverRoute.scala index 911e306..b94f611 100644 --- a/core-rest/src/main/scala/xyz/driver/core/rest/DriverRoute.scala +++ b/core-rest/src/main/scala/xyz/driver/core/rest/DriverRoute.scala @@ -88,9 +88,6 @@ trait DriverRoute { case e: ExternalServiceTimeoutException => log.error("Service timeout error", e) StatusCodes.GatewayTimeout - case e: DatabaseException => - log.error("Database error", e) - StatusCodes.InternalServerError } { (ctx: RequestContext) => diff --git a/core-rest/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala b/core-rest/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala index f2962c9..b43a1d3 100644 --- a/core-rest/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala +++ b/core-rest/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala @@ -22,6 +22,3 @@ final case class ExternalServiceException( final case class ExternalServiceTimeoutException(serviceName: String) extends ServiceException(s"$serviceName took too long to respond") - -final case class DatabaseException(override val message: String = "Database access error") - extends ServiceException(message) diff --git a/src/main/scala/xyz/driver/core/database/MdcAsyncExecutor.scala b/src/main/scala/xyz/driver/core/database/MdcAsyncExecutor.scala deleted file mode 100644 index 5939efb..0000000 --- a/src/main/scala/xyz/driver/core/database/MdcAsyncExecutor.scala +++ /dev/null @@ -1,53 +0,0 @@ -/** Code ported from "de.geekonaut" %% "slickmdc" % "1.0.0" - * License: @see https://github.com/AVGP/slickmdc/blob/master/LICENSE - * Blog post: @see http://50linesofco.de/post/2016-07-01-slick-and-slf4j-mdc-logging-in-scala.html - */ -package xyz.driver.core -package database - -import java.util.concurrent._ -import java.util.concurrent.atomic.AtomicInteger - -import scala.concurrent._ -import com.typesafe.scalalogging.StrictLogging -import slick.util.AsyncExecutor - -import logging.MdcExecutionContext - -/** Taken from the original Slick AsyncExecutor and simplified - * @see https://github.com/slick/slick/blob/3.1/slick/src/main/scala/slick/util/AsyncExecutor.scala - */ -object MdcAsyncExecutor extends StrictLogging { - - /** Create an AsyncExecutor with a fixed-size thread pool. - * - * @param name The name for the thread pool. - * @param numThreads The number of threads in the pool. - */ - def apply(name: String, numThreads: Int): AsyncExecutor = { - new AsyncExecutor { - val tf = new DaemonThreadFactory(name + "-") - - lazy val executionContext = { - new MdcExecutionContext(ExecutionContext.fromExecutor(Executors.newFixedThreadPool(numThreads, tf))) - } - - def close(): Unit = {} - } - } - - def default(name: String = "AsyncExecutor.default"): AsyncExecutor = apply(name, 20) - - private class DaemonThreadFactory(namePrefix: String) extends ThreadFactory { - private[this] val group = - Option(System.getSecurityManager).fold(Thread.currentThread.getThreadGroup)(_.getThreadGroup) - private[this] val threadNumber = new AtomicInteger(1) - - def newThread(r: Runnable): Thread = { - val t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement, 0) - if (!t.isDaemon) t.setDaemon(true) - if (t.getPriority != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY) - t - } - } -} |