diff options
Diffstat (limited to 'tools/gui/src/JettyServer.scala')
-rw-r--r-- | tools/gui/src/JettyServer.scala | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/tools/gui/src/JettyServer.scala b/tools/gui/src/JettyServer.scala new file mode 100644 index 0000000..d6024c2 --- /dev/null +++ b/tools/gui/src/JettyServer.scala @@ -0,0 +1,67 @@ +import java.net.MalformedURLException +import javax.servlet.http.{HttpServletRequest, HttpServletResponse} + +import org.eclipse.jetty.server.{Request, Server} +import org.eclipse.jetty.server.handler._ + +import scala.util.{Failure, Success, Try} + +abstract class JettyServer(port: Int, staticFilesUrl: String) { + + private val handlerOfStatic = { + val handler = new ContextHandler("/") + val resourceHandler = new ResourceHandler + resourceHandler.setDirectoriesListed(true) + resourceHandler.setResourceBase(staticFilesUrl) + handler.setHandler(resourceHandler) + handler + } + + private val handlerOfApi = { + val handlerWrapper = new ContextHandler("/api/") + val handler = new AbstractHandler { + override def handle(target: String, + baseRequest: Request, + request: HttpServletRequest, + response: HttpServletResponse) = { + response.setContentType("application/json") + response.setCharacterEncoding("UTF-8") + + route(request.getMethod, target, request.getParameter) match { + case Success(result) => + response.getWriter.write(result) + case Failure(e: MalformedURLException) => + response.setStatus(HttpServletResponse.SC_NOT_FOUND) + response.getWriter.write(e.getMessage) + case Failure(e) => + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR) + response.getWriter.write(s"${e.getClass.getName}: ${e.getMessage}") + } + + baseRequest.setHandled(true) + } + } + handlerWrapper.setHandler(handler) + handlerWrapper + } + + private val server = { + val s = new Server(port) + val handlers = new HandlerCollection + handlers.setHandlers(Array(handlerOfStatic, handlerOfApi, new DefaultHandler)) + s.setHandler(handlers) + s + } + + def start() = { + server.start() + println(s"UI server started at localhost:$port") + } + + def stop() = { + server.stop() + println("UI server stopped.") + } + + def route(method: String, path: String, param: String => String): Try[String] +} |