/data/test/scala/c442b0441ade0b063027faf787571b1b44a88552GnresolverMicroservice.scala

https://github.com/aliostad/deep-learning-lang-detection · Scala · 83 lines · 76 code · 7 blank · 0 comment · 1 complexity · 91e2c3a6f10c6d07e25879eac5eec45a MD5 · raw file

  1. package org.globalnames
  2. package resolver
  3. package api
  4. import java.io.File
  5. import java.nio.file.Paths
  6. import akka.actor.ActorSystem
  7. import akka.event.Logging
  8. import akka.http.scaladsl.Http
  9. import akka.stream.ActorMaterializer
  10. import com.typesafe.config.ConfigFactory
  11. import model.db.NameStrings
  12. import slick.jdbc.PostgresProfile.api._
  13. import scala.concurrent.duration._
  14. import scalaz._
  15. import Scalaz.{get => _, _}
  16. object GnresolverMicroservice extends App with Service {
  17. override implicit val system = ActorSystem()
  18. override implicit val executor = system.dispatcher
  19. override implicit val materializer = ActorMaterializer()
  20. override val logger = Logging(system, getClass)
  21. override val config = {
  22. val loggerPath = for {
  23. prop <- util.Properties.propOrNone("config")
  24. path <- new File(prop).exists().option { prop }
  25. } yield path
  26. loggerPath match {
  27. case Some(lp) =>
  28. logger.info(s"Loading config from $lp")
  29. val customConfig = ConfigFactory.parseFile(new File(lp))
  30. ConfigFactory.load(customConfig)
  31. case None => logger.info("Loading default config"); ConfigFactory.load()
  32. }
  33. }
  34. override val database = Database.forConfig("postgresql")
  35. override val matcher = {
  36. val dumpPath = {
  37. val dumpFolder = {
  38. val folder = config.getString("gnresolver.gnmatcher.dump-folder")
  39. folder.isEmpty ? System.getProperty("java.io.tmpdir") | folder
  40. }
  41. val dumpFile = config.getString("gnresolver.gnmatcher.dump-file")
  42. Paths.get(dumpFolder, dumpFile).toString
  43. }
  44. val useDump = config.getBoolean("gnresolver.gnmatcher.use-dump")
  45. val useFuzzyMatcher = config.getBoolean("gnresolver.gnmatcher.use-fuzzy-matcher")
  46. logger.info(s"Matcher: dump file path -- $dumpPath")
  47. logger.info(s"Matcher: use dump file -- $useDump")
  48. logger.info(s"Matcher: use fuzzy matcher -- $useFuzzyMatcher")
  49. def createMatcher = {
  50. val nameStrings = scala.concurrent.Await.result(
  51. database.run(TableQuery[NameStrings].map { _.canonical }.result.map { _.flatten }),
  52. 15.minutes
  53. )
  54. Matcher(nameStrings, maxDistance = 1)
  55. }
  56. val matcher = (useFuzzyMatcher, useDump, new File(dumpPath).exists()) match {
  57. case (false, _, _) =>
  58. logger.info("Matcher: using empty fuzzy matcher")
  59. Matcher(Seq(), maxDistance = 0)
  60. case (_, true, true) =>
  61. logger.info("Matcher: dump file is found. Restoring from dump...")
  62. Matcher.restore(dumpPath)
  63. case (_, true, false) =>
  64. logger.info("Matcher: dump file is not found. Creating dump...")
  65. val matcher = createMatcher
  66. matcher.dump(dumpPath)
  67. matcher
  68. case (_, false, _) => createMatcher
  69. }
  70. logger.info("Matcher: restored")
  71. matcher
  72. }
  73. Http().bindAndHandle(routes,
  74. config.getString("http.interface"),
  75. config.getInt("http.port"))
  76. }