aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2018-09-12 17:30:33 -0700
committerJakob Odersky <jakob@odersky.com>2018-10-09 16:19:39 -0700
commiteb6f97b4cac548999cbf192ee83d9ba9a253b7c8 (patch)
tree6d75a23efc841a6f51e780913387000206d1fe94
parent4d1197099ce4e721c18bf4cacbb2e1980e4210b5 (diff)
downloaddriver-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.
-rw-r--r--build.sbt9
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/Converters.scala (renamed from src/main/scala/xyz/driver/core/database/Converters.scala)3
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/PatchedHsqldbProfile.scala (renamed from src/main/scala/xyz/driver/core/database/PatchedHsqldbProfile.scala)0
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/Repository.scala (renamed from src/main/scala/xyz/driver/core/database/Repository.scala)0
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/SlickGetResultSupport.scala (renamed from src/main/scala/xyz/driver/core/database/SlickGetResultSupport.scala)0
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/database.scala (renamed from src/main/scala/xyz/driver/core/database/database.scala)0
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/package.scala (renamed from src/main/scala/xyz/driver/core/database/package.scala)0
-rw-r--r--core-database/src/test/scala/xyz/driver/core/database/DatabaseTest.scala (renamed from src/test/scala/xyz/driver/core/database/DatabaseTest.scala)0
-rw-r--r--core-rest/src/main/scala/xyz/driver/core/json.scala2
-rw-r--r--core-rest/src/main/scala/xyz/driver/core/rest/DriverRoute.scala3
-rw-r--r--core-rest/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala3
-rw-r--r--src/main/scala/xyz/driver/core/database/MdcAsyncExecutor.scala53
12 files changed, 8 insertions, 65 deletions
diff --git a/build.sbt b/build.sbt
index 4f32af7..c57a7ca 100644
--- a/build.sbt
+++ b/build.sbt
@@ -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
- }
- }
-}