1 /*
2  * sys-emu - A system emulator for tutorials
3  * Copyright (C) 2018 - 2019 osdevelopment-info
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Affero General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Affero General Public License for more details.
14  *
15  * You should have received a copy of the GNU Affero General Public License
16  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package info.osdevelopment.sysemu.rest
19 
20 import akka.actor.{Actor, ActorLogging, ActorSystem, Props}
21 import akka.event.slf4j.SLF4JLogging
22 import akka.http.scaladsl.Http
23 import akka.http.scaladsl.Http.ServerBinding
24 import akka.http.scaladsl.model.StatusCodes
25 import akka.http.scaladsl.server.Directives._
26 import akka.http.scaladsl.server.Route
27 import info.osdevelopment.sysemu.config.Configuration
28 import info.osdevelopment.sysemu.system.SystemRepository
29 import io.swagger.v3.oas.annotations.OpenAPIDefinition
30 import io.swagger.v3.oas.annotations.info.{Contact, Info, License}
31 
32 import scala.concurrent.{ExecutionContextExecutor, Future}
33 
34 @OpenAPIDefinition(
35   info =  new Info(
36     title = "sys-emu",
37     version = "0.1",
38     description = "Remote interface for sys-emu",
39     license = new License(name = "GNU AGPLv3", url = "https://www.gnu.org/licenses/agpl.html"),
40     contact = new Contact(url = "https://sys-emu.osdevelopment.info")
41   )
42 )
43 class RestServer(implicit val actorSystem: ActorSystem, val config: Configuration) extends SLF4JLogging {
44 
45   object ShutdownActor {
46 
47     def props(): Props = Props(new ShutdownActor())
48 
49   }
50 
51   class ShutdownActor extends Actor with ActorLogging {
52 
53     override def receive: Actor.Receive = {
54       case "shutdown" => shutdown()
55     }
56 
57   }
58 
59   var bindingFuture: Option[Future[ServerBinding]] = None
60 
61   implicit val executionContext: ExecutionContextExecutor = actorSystem.dispatcher
62   val shutdownActor = actorSystem.actorOf(ShutdownActor.props())
63   val systemRepository = SystemRepository()
64 
65   def start(): Unit = {
66     bindingFuture match {
67       case None => bindingFuture = Some(Http().bindAndHandle(this.route, config.serviceHost, config.servicePort))
68       case _ => log.warn("Tried to start an already running server")
69     }
70   }
71 
72   def shutdown(): Unit = {
73     bindingFuture match {
74       case Some(future) =>
75         future.flatMap(_.unbind())
76         actorSystem.terminate()
77       case None => log.warn("Tried to shutdown a not running server")
78     }
79   }
80 
81   def route: Route = {
82     new RestProcessorService().route ~
83     new RestSystemService(systemRepository).route ~
84     SwaggerService.routes ~
85     path("swagger-ui") {
86       getFromResource("swagger-ui/index.html")
87     } ~
88     getFromResourceDirectory("swagger-ui") ~
89     path("shutdown") {
90       post {
91         shutdownActor ! "shutdown"
92         complete(StatusCodes.OK)
93       }
94     }
95   }
96 
97 }
Line Stmt Id Pos Tree Symbol Code
47 514 1871 - 1897 ApplyToImplicitArgs akka.actor.Props.apply akka.actor.Props.apply[RestServer.this.ShutdownActor](new RestServer.this.ShutdownActor())((ClassTag.apply[RestServer.this.ShutdownActor](classOf[info.osdevelopment.sysemu.rest.RestServer$ShutdownActor]): scala.reflect.ClassTag[RestServer.this.ShutdownActor]))
47 513 1877 - 1896 Apply info.osdevelopment.sysemu.rest.RestServer.ShutdownActor.<init> new RestServer.this.ShutdownActor()
53 516 2003 - 2003 Apply info.osdevelopment.sysemu.rest.RestServer.ShutdownActor.$anonfun.<init> new $anonfun()
54 515 2030 - 2040 Apply info.osdevelopment.sysemu.rest.RestServer.shutdown RestServer.this.shutdown()
59 517 2106 - 2110 Select scala.None scala.None
61 518 2172 - 2194 Select akka.actor.ActorSystem.dispatcher RestServer.this.actorSystem.dispatcher
62 519 2237 - 2258 Apply info.osdevelopment.sysemu.rest.RestServer.ShutdownActor.props RestServer.this.ShutdownActor.props()
62 520 2217 - 2259 Apply akka.actor.ActorRefFactory.actorOf RestServer.this.actorSystem.actorOf(RestServer.this.ShutdownActor.props())
63 521 2285 - 2303 Apply info.osdevelopment.sysemu.system.SystemRepository.apply info.osdevelopment.sysemu.system.SystemRepository.apply()
66 522 2333 - 2346 Select info.osdevelopment.sysemu.rest.RestServer.bindingFuture RestServer.this.bindingFuture
67 523 2399 - 2399 Select info.osdevelopment.sysemu.rest.RestServer.actorSystem RestServer.this.actorSystem
67 532 2421 - 2421 Select info.osdevelopment.sysemu.rest.RestServer.actorSystem RestServer.this.actorSystem
67 541 2415 - 2415 Select info.osdevelopment.sysemu.rest.RestServer.actorSystem RestServer.this.actorSystem
67 540 2402 - 2402 Select akka.http.scaladsl.HttpExt.bindAndHandle$default$6 qual$1.bindAndHandle$default$6
67 525 2416 - 2426 Select info.osdevelopment.sysemu.rest.RestServer.route this.route
67 534 2421 - 2421 Select info.osdevelopment.sysemu.rest.RestServer.executionContext RestServer.this.executionContext
67 543 2395 - 2467 Apply akka.http.scaladsl.HttpExt.bindAndHandle qual$1.bindAndHandle(x$9, x$10, x$11, x$12, x$13, x$14)(stream.this.Materializer.matFromSystem(RestServer.this.actorSystem))
67 537 2416 - 2426 ApplyToImplicitArgs akka.http.scaladsl.server.RouteResult.route2HandlerFlow server.this.RouteResult.route2HandlerFlow(x$1)(x$2, x$3, x$4, x$5, x$6, x$7, x$8)
67 528 2421 - 2421 Select info.osdevelopment.sysemu.rest.RestServer.actorSystem RestServer.this.actorSystem
67 531 2421 - 2421 ApplyToImplicitArgs akka.stream.Materializer.matFromSystem stream.this.Materializer.matFromSystem(RestServer.this.actorSystem)
67 530 2421 - 2421 Select info.osdevelopment.sysemu.rest.RestServer.actorSystem RestServer.this.actorSystem
67 539 2402 - 2402 Select akka.http.scaladsl.HttpExt.bindAndHandle$default$5 qual$1.bindAndHandle$default$5
67 542 2415 - 2415 ApplyToImplicitArgs akka.stream.Materializer.matFromSystem stream.this.Materializer.matFromSystem(RestServer.this.actorSystem)
67 524 2395 - 2401 ApplyToImplicitArgs akka.http.scaladsl.Http.apply akka.http.scaladsl.Http.apply()(RestServer.this.actorSystem)
67 533 2421 - 2421 ApplyToImplicitArgs akka.http.scaladsl.server.LowerPriorityRoutingLogImplicits.fromActorSystem server.this.RoutingLog.fromActorSystem(RestServer.this.actorSystem)
67 545 2374 - 2468 Apply info.osdevelopment.sysemu.rest.RestServer.bindingFuture_= RestServer.this.bindingFuture_=(scala.Some.apply[scala.concurrent.Future[akka.http.scaladsl.Http.ServerBinding]]({ <artifact> val qual$1: akka.http.scaladsl.HttpExt = akka.http.scaladsl.Http.apply()(RestServer.this.actorSystem); <artifact> val x$9: akka.stream.scaladsl.Flow[akka.http.scaladsl.model.HttpRequest,akka.http.scaladsl.model.HttpResponse,akka.NotUsed] @scala.reflect.internal.annotations.uncheckedBounds = { <artifact> val x$1: akka.http.scaladsl.server.Route = this.route; <artifact> val x$2: akka.http.scaladsl.settings.RoutingSettings = settings.this.RoutingSettings.default(RestServer.this.actorSystem); <artifact> val x$3: akka.http.scaladsl.settings.ParserSettings = settings.this.ParserSettings.default(RestServer.this.actorSystem); <artifact> val x$4: akka.stream.Materializer = stream.this.Materializer.matFromSystem(RestServer.this.actorSystem); <artifact> val x$5: akka.http.scaladsl.server.RoutingLog = server.this.RoutingLog.fromActorSystem(RestServer.this.actorSystem); <artifact> val x$6: scala.concurrent.ExecutionContextExecutor = RestServer.this.executionContext; <artifact> val x$7: akka.http.scaladsl.server.RejectionHandler = server.this.RouteResult.route2HandlerFlow$default$7(x$1); <artifact> val x$8: akka.http.scaladsl.server.ExceptionHandler = server.this.RouteResult.route2HandlerFlow$default$8(x$1); server.this.RouteResult.route2HandlerFlow(x$1)(x$2, x$3, x$4, x$5, x$6, x$7, x$8) }; <artifact> val x$10: String = RestServer.this.config.serviceHost; <artifact> val x$11: Int = RestServer.this.config.servicePort; <artifact> val x$12: akka.http.scaladsl.ConnectionContext = qual$1.bindAndHandle$default$4; <artifact> val x$13: akka.http.scaladsl.settings.ServerSettings = qual$1.bindAndHandle$default$5; <artifact> val x$14: akka.event.LoggingAdapter = qual$1.bindAndHandle$default$6; qual$1.bindAndHandle(x$9, x$10, x$11, x$12, x$13, x$14)(stream.this.Materializer.matFromSystem(RestServer.this.actorSystem)) }))
67 527 2421 - 2421 ApplyToImplicitArgs akka.http.scaladsl.settings.SettingsCompanion.default settings.this.RoutingSettings.default(RestServer.this.actorSystem)
67 536 2421 - 2421 Apply akka.http.scaladsl.server.RouteResult.route2HandlerFlow$default$8 server.this.RouteResult.route2HandlerFlow$default$8(x$1)
67 535 2421 - 2421 Apply akka.http.scaladsl.server.RouteResult.route2HandlerFlow$default$7 server.this.RouteResult.route2HandlerFlow$default$7(x$1)
67 544 2390 - 2468 Apply scala.Some.apply scala.Some.apply[scala.concurrent.Future[akka.http.scaladsl.Http.ServerBinding]]({ <artifact> val qual$1: akka.http.scaladsl.HttpExt = akka.http.scaladsl.Http.apply()(RestServer.this.actorSystem); <artifact> val x$9: akka.stream.scaladsl.Flow[akka.http.scaladsl.model.HttpRequest,akka.http.scaladsl.model.HttpResponse,akka.NotUsed] @scala.reflect.internal.annotations.uncheckedBounds = { <artifact> val x$1: akka.http.scaladsl.server.Route = this.route; <artifact> val x$2: akka.http.scaladsl.settings.RoutingSettings = settings.this.RoutingSettings.default(RestServer.this.actorSystem); <artifact> val x$3: akka.http.scaladsl.settings.ParserSettings = settings.this.ParserSettings.default(RestServer.this.actorSystem); <artifact> val x$4: akka.stream.Materializer = stream.this.Materializer.matFromSystem(RestServer.this.actorSystem); <artifact> val x$5: akka.http.scaladsl.server.RoutingLog = server.this.RoutingLog.fromActorSystem(RestServer.this.actorSystem); <artifact> val x$6: scala.concurrent.ExecutionContextExecutor = RestServer.this.executionContext; <artifact> val x$7: akka.http.scaladsl.server.RejectionHandler = server.this.RouteResult.route2HandlerFlow$default$7(x$1); <artifact> val x$8: akka.http.scaladsl.server.ExceptionHandler = server.this.RouteResult.route2HandlerFlow$default$8(x$1); server.this.RouteResult.route2HandlerFlow(x$1)(x$2, x$3, x$4, x$5, x$6, x$7, x$8) }; <artifact> val x$10: String = RestServer.this.config.serviceHost; <artifact> val x$11: Int = RestServer.this.config.servicePort; <artifact> val x$12: akka.http.scaladsl.ConnectionContext = qual$1.bindAndHandle$default$4; <artifact> val x$13: akka.http.scaladsl.settings.ServerSettings = qual$1.bindAndHandle$default$5; <artifact> val x$14: akka.event.LoggingAdapter = qual$1.bindAndHandle$default$6; qual$1.bindAndHandle(x$9, x$10, x$11, x$12, x$13, x$14)(stream.this.Materializer.matFromSystem(RestServer.this.actorSystem)) })
67 526 2421 - 2421 Select info.osdevelopment.sysemu.rest.RestServer.actorSystem RestServer.this.actorSystem
67 529 2421 - 2421 ApplyToImplicitArgs akka.http.scaladsl.settings.SettingsCompanion.default settings.this.ParserSettings.default(RestServer.this.actorSystem)
67 538 2402 - 2402 Select akka.http.scaladsl.HttpExt.bindAndHandle$default$4 qual$1.bindAndHandle$default$4
68 546 2485 - 2537 Apply org.slf4j.Logger.warn RestServer.this.log.warn("Tried to start an already running server")
73 547 2580 - 2593 Select info.osdevelopment.sysemu.rest.RestServer.bindingFuture RestServer.this.bindingFuture
75 550 2637 - 2663 ApplyToImplicitArgs scala.concurrent.Future.flatMap future.flatMap[akka.Done](((x$1: akka.http.scaladsl.Http.ServerBinding) => x$1.unbind()))(RestServer.this.executionContext)
75 549 2651 - 2651 Select info.osdevelopment.sysemu.rest.RestServer.executionContext RestServer.this.executionContext
75 548 2652 - 2662 Apply akka.http.scaladsl.Http.ServerBinding.unbind x$1.unbind()
76 552 2693 - 2693 Literal <nosymbol> ()
76 551 2672 - 2695 Apply akka.actor.ActorSystem.terminate RestServer.this.actorSystem.terminate()
77 553 2715 - 2765 Apply org.slf4j.Logger.warn RestServer.this.log.warn("Tried to shutdown a not running server")
82 557 2804 - 2888 Apply akka.http.scaladsl.server.RouteConcatenation.RouteWithConcatenation.~ akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(new RestProcessorService().route).~(new RestSystemService(RestServer.this.systemRepository).route)
82 554 2804 - 2836 Select info.osdevelopment.sysemu.rest.RestProcessorService.route new RestProcessorService().route
83 559 2804 - 2916 Apply akka.http.scaladsl.server.RouteConcatenation.RouteWithConcatenation.~ akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(new RestProcessorService().route).~(new RestSystemService(RestServer.this.systemRepository).route)).~(SwaggerService.routes)
83 555 2865 - 2881 Select info.osdevelopment.sysemu.rest.RestServer.systemRepository RestServer.this.systemRepository
83 556 2843 - 2888 Select info.osdevelopment.sysemu.rest.RestSystemService.route new RestSystemService(RestServer.this.systemRepository).route
84 558 2895 - 2916 Select com.github.swagger.akka.SwaggerHttpService.routes SwaggerService.routes
84 566 2804 - 2996 Apply akka.http.scaladsl.server.RouteConcatenation.RouteWithConcatenation.~ akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(new RestProcessorService().route).~(new RestSystemService(RestServer.this.systemRepository).route)).~(SwaggerService.routes)).~(server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("swagger-ui"))).apply(akka.http.scaladsl.server.Directives.getFromResource("swagger-ui/index.html")(directives.this.ContentTypeResolver.Default)))
85 561 2923 - 2941 Apply akka.http.scaladsl.server.directives.PathDirectives.path akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("swagger-ui"))
85 560 2928 - 2940 ApplyImplicitView akka.http.scaladsl.server.ImplicitPathMatcherConstruction._segmentStringToPathMatcher akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("swagger-ui")
85 565 2923 - 2996 Apply scala.Function1.apply server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("swagger-ui"))).apply(akka.http.scaladsl.server.Directives.getFromResource("swagger-ui/index.html")(directives.this.ContentTypeResolver.Default))
86 564 2950 - 2990 ApplyToImplicitArgs akka.http.scaladsl.server.directives.FileAndResourceDirectives.getFromResource akka.http.scaladsl.server.Directives.getFromResource("swagger-ui/index.html")(directives.this.ContentTypeResolver.Default)
86 563 2965 - 2965 Select akka.http.scaladsl.server.directives.ContentTypeResolver.Default directives.this.ContentTypeResolver.Default
86 562 2966 - 2989 Literal <nosymbol> "swagger-ui/index.html"
87 571 2804 - 3041 Apply akka.http.scaladsl.server.RouteConcatenation.RouteWithConcatenation.~ akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(new RestProcessorService().route).~(new RestSystemService(RestServer.this.systemRepository).route)).~(SwaggerService.routes)).~(server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("swagger-ui"))).apply(akka.http.scaladsl.server.Directives.getFromResource("swagger-ui/index.html")(directives.this.ContentTypeResolver.Default)))).~(akka.http.scaladsl.server.Directives.getFromResourceDirectory("swagger-ui", akka.http.scaladsl.server.Directives.getFromResourceDirectory$default$2)(directives.this.ContentTypeResolver.Default))
88 568 3003 - 3003 Select akka.http.scaladsl.server.directives.FileAndResourceDirectives.getFromResourceDirectory$default$2 akka.http.scaladsl.server.Directives.getFromResourceDirectory$default$2
88 567 3028 - 3040 Literal <nosymbol> "swagger-ui"
88 570 3003 - 3041 ApplyToImplicitArgs akka.http.scaladsl.server.directives.FileAndResourceDirectives.getFromResourceDirectory akka.http.scaladsl.server.Directives.getFromResourceDirectory("swagger-ui", akka.http.scaladsl.server.Directives.getFromResourceDirectory$default$2)(directives.this.ContentTypeResolver.Default)
88 569 3027 - 3027 Select akka.http.scaladsl.server.directives.ContentTypeResolver.Default directives.this.ContentTypeResolver.Default
88 586 2804 - 3161 Apply akka.http.scaladsl.server.RouteConcatenation.RouteWithConcatenation.~ akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(akka.http.scaladsl.server.Directives._enhanceRouteWithConcatenation(new RestProcessorService().route).~(new RestSystemService(RestServer.this.systemRepository).route)).~(SwaggerService.routes)).~(server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("swagger-ui"))).apply(akka.http.scaladsl.server.Directives.getFromResource("swagger-ui/index.html")(directives.this.ContentTypeResolver.Default)))).~(akka.http.scaladsl.server.Directives.getFromResourceDirectory("swagger-ui", akka.http.scaladsl.server.Directives.getFromResourceDirectory$default$2)(directives.this.ContentTypeResolver.Default))).~(server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("shutdown"))).apply(server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.post).apply({ { <artifact> val qual$1: akka.actor.ScalaActorRef = actor.this.`package`.actorRef2Scala(RestServer.this.shutdownActor); <artifact> val x$1: String("shutdown") = "shutdown"; <artifact> val x$2: akka.actor.ActorRef = qual$1.!$default$2("shutdown"); qual$1.!("shutdown")(x$2) }; akka.http.scaladsl.server.Directives.complete(marshalling.this.ToResponseMarshallable.apply[akka.http.scaladsl.model.StatusCodes.Success](akka.http.scaladsl.model.StatusCodes.OK)(marshalling.this.Marshaller.fromStatusCode)) })))
89 585 3048 - 3161 Apply scala.Function1.apply server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("shutdown"))).apply(server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.post).apply({ { <artifact> val qual$1: akka.actor.ScalaActorRef = actor.this.`package`.actorRef2Scala(RestServer.this.shutdownActor); <artifact> val x$1: String("shutdown") = "shutdown"; <artifact> val x$2: akka.actor.ActorRef = qual$1.!$default$2("shutdown"); qual$1.!("shutdown")(x$2) }; akka.http.scaladsl.server.Directives.complete(marshalling.this.ToResponseMarshallable.apply[akka.http.scaladsl.model.StatusCodes.Success](akka.http.scaladsl.model.StatusCodes.OK)(marshalling.this.Marshaller.fromStatusCode)) }))
89 573 3048 - 3064 Apply akka.http.scaladsl.server.directives.PathDirectives.path akka.http.scaladsl.server.Directives.path[Unit](akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("shutdown"))
89 572 3053 - 3063 ApplyImplicitView akka.http.scaladsl.server.ImplicitPathMatcherConstruction._segmentStringToPathMatcher akka.http.scaladsl.server.Directives._segmentStringToPathMatcher("shutdown")
90 584 3073 - 3155 Apply scala.Function1.apply server.this.Directive.addByNameNullaryApply(akka.http.scaladsl.server.Directives.post).apply({ { <artifact> val qual$1: akka.actor.ScalaActorRef = actor.this.`package`.actorRef2Scala(RestServer.this.shutdownActor); <artifact> val x$1: String("shutdown") = "shutdown"; <artifact> val x$2: akka.actor.ActorRef = qual$1.!$default$2("shutdown"); qual$1.!("shutdown")(x$2) }; akka.http.scaladsl.server.Directives.complete(marshalling.this.ToResponseMarshallable.apply[akka.http.scaladsl.model.StatusCodes.Success](akka.http.scaladsl.model.StatusCodes.OK)(marshalling.this.Marshaller.fromStatusCode)) })
90 574 3073 - 3077 Select akka.http.scaladsl.server.directives.MethodDirectives.post akka.http.scaladsl.server.Directives.post
91 577 3104 - 3114 Literal <nosymbol> "shutdown"
91 576 3088 - 3101 ApplyImplicitView akka.actor.actorRef2Scala actor.this.`package`.actorRef2Scala(RestServer.this.shutdownActor)
91 579 3088 - 3114 ApplyToImplicitArgs akka.actor.ScalaActorRef.! qual$1.!("shutdown")(x$2)
91 575 3088 - 3101 Select info.osdevelopment.sysemu.rest.RestServer.shutdownActor RestServer.this.shutdownActor
91 578 3102 - 3102 Apply akka.actor.ScalaActorRef.!$default$2 qual$1.!$default$2("shutdown")
92 582 3132 - 3146 ApplyToImplicitArgs akka.http.scaladsl.marshalling.ToResponseMarshallable.apply marshalling.this.ToResponseMarshallable.apply[akka.http.scaladsl.model.StatusCodes.Success](akka.http.scaladsl.model.StatusCodes.OK)(marshalling.this.Marshaller.fromStatusCode)
92 581 3144 - 3144 Select akka.http.scaladsl.marshalling.PredefinedToResponseMarshallers.fromStatusCode marshalling.this.Marshaller.fromStatusCode
92 580 3132 - 3146 Select akka.http.scaladsl.model.StatusCodes.OK akka.http.scaladsl.model.StatusCodes.OK
92 583 3123 - 3147 Apply akka.http.scaladsl.server.directives.RouteDirectives.complete akka.http.scaladsl.server.Directives.complete(marshalling.this.ToResponseMarshallable.apply[akka.http.scaladsl.model.StatusCodes.Success](akka.http.scaladsl.model.StatusCodes.OK)(marshalling.this.Marshaller.fromStatusCode))