From f08ecab418034f99f6fcf0a469d02f3435345cc2 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 22 Jul 2018 00:06:06 +0800 Subject: renamings --- cask/src/cask/Annotations.scala | 68 ---------------------------- cask/src/cask/Endpoints.scala | 68 ++++++++++++++++++++++++++++ cask/src/cask/Main.scala | 6 +-- cask/src/cask/Routes.scala | 20 ++++---- cask/test/src/test/cask/VariableRoutes.scala | 4 +- 5 files changed, 82 insertions(+), 84 deletions(-) delete mode 100644 cask/src/cask/Annotations.scala create mode 100644 cask/src/cask/Endpoints.scala diff --git a/cask/src/cask/Annotations.scala b/cask/src/cask/Annotations.scala deleted file mode 100644 index 17e6b0a..0000000 --- a/cask/src/cask/Annotations.scala +++ /dev/null @@ -1,68 +0,0 @@ -package cask - -import cask.Router.EntryPoint -import io.undertow.server.HttpServerExchange -import collection.JavaConverters._ - -trait EndpointAnnotation[R]{ - val path: String - def subpath: Boolean = false - def wrapMethodOutput(t: R): Any - def parseMethodInput[T](implicit p: ParamReader[T]) = p - - def handle(exchange: HttpServerExchange, - remaining: Seq[String], - bindings: Map[String, String], - routes: Routes, - entryPoint: EntryPoint[Routes, (HttpServerExchange, Seq[String])]): Router.Result[Response] -} -trait RouteBase extends EndpointAnnotation[Response]{ - def wrapMethodOutput(t: Response) = t - def handle(exchange: HttpServerExchange, - remaining: Seq[String], - bindings: Map[String, String], - routes: Routes, - entryPoint: EntryPoint[Routes, (HttpServerExchange, Seq[String])]): Router.Result[Response] = { - val allBindings = - bindings.toSeq ++ - exchange.getQueryParameters - .asScala - .toSeq - .flatMap{case (k, vs) => vs.asScala.map((k, _))} - - entryPoint.invoke(routes, (exchange, remaining), allBindings.map{case (k, v) => (k, Some(v))}) - .asInstanceOf[Router.Result[Response]] - } -} -class get(val path: String, override val subpath: Boolean = false) extends RouteBase -class post(val path: String, override val subpath: Boolean = false) extends RouteBase -class put(val path: String, override val subpath: Boolean = false) extends RouteBase -class route(val path: String, val methods: Seq[String], override val subpath: Boolean = false) extends RouteBase -class static(val path: String) extends EndpointAnnotation[String] { - override def subpath = true - def wrapOutput(t: String) = t - - def wrapMethodOutput(t: String) = t - - def handle(exchange: HttpServerExchange, - remaining: Seq[String], - bindings: Map[String, String], - routes: Routes, - entryPoint: EntryPoint[Routes, (HttpServerExchange, Seq[String])]): Router.Result[Response] = { - entryPoint.invoke(routes, (exchange, remaining), Nil).asInstanceOf[Router.Result[String]] match{ - case Router.Result.Success(s) => - val relPath = java.nio.file.Paths.get( - s + "/" + remaining.mkString("/") - ) - if (java.nio.file.Files.exists(relPath) && java.nio.file.Files.isRegularFile(relPath)){ - Router.Result.Success(Response(java.nio.file.Files.newInputStream(relPath))) - }else{ - Router.Result.Success(Response("", 404)) - } - - case e: Router.Result.Error => e - - } - - } -} diff --git a/cask/src/cask/Endpoints.scala b/cask/src/cask/Endpoints.scala new file mode 100644 index 0000000..8363104 --- /dev/null +++ b/cask/src/cask/Endpoints.scala @@ -0,0 +1,68 @@ +package cask + +import cask.Router.EntryPoint +import io.undertow.server.HttpServerExchange +import collection.JavaConverters._ + +trait Endpoint[R]{ + val path: String + def subpath: Boolean = false + def wrapMethodOutput(t: R): Any + def parseMethodInput[T](implicit p: ParamReader[T]) = p + + def handle(exchange: HttpServerExchange, + remaining: Seq[String], + bindings: Map[String, String], + routes: Routes, + entryPoint: EntryPoint[Routes, (HttpServerExchange, Seq[String])]): Router.Result[Response] +} +trait WebEndpoint extends Endpoint[Response]{ + def wrapMethodOutput(t: Response) = t + def handle(exchange: HttpServerExchange, + remaining: Seq[String], + bindings: Map[String, String], + routes: Routes, + entryPoint: EntryPoint[Routes, (HttpServerExchange, Seq[String])]): Router.Result[Response] = { + val allBindings = + bindings.toSeq ++ + exchange.getQueryParameters + .asScala + .toSeq + .flatMap{case (k, vs) => vs.asScala.map((k, _))} + + entryPoint.invoke(routes, (exchange, remaining), allBindings.map{case (k, v) => (k, Some(v))}) + .asInstanceOf[Router.Result[Response]] + } +} +class get(val path: String, override val subpath: Boolean = false) extends WebEndpoint +class post(val path: String, override val subpath: Boolean = false) extends WebEndpoint +class put(val path: String, override val subpath: Boolean = false) extends WebEndpoint +class route(val path: String, val methods: Seq[String], override val subpath: Boolean = false) extends WebEndpoint +class static(val path: String) extends Endpoint[String] { + override def subpath = true + def wrapOutput(t: String) = t + + def wrapMethodOutput(t: String) = t + + def handle(exchange: HttpServerExchange, + remaining: Seq[String], + bindings: Map[String, String], + routes: Routes, + entryPoint: EntryPoint[Routes, (HttpServerExchange, Seq[String])]): Router.Result[Response] = { + entryPoint.invoke(routes, (exchange, remaining), Nil).asInstanceOf[Router.Result[String]] match{ + case Router.Result.Success(s) => + val relPath = java.nio.file.Paths.get( + s + "/" + remaining.mkString("/") + ) + if (java.nio.file.Files.exists(relPath) && java.nio.file.Files.isRegularFile(relPath)){ + Router.Result.Success(Response(java.nio.file.Files.newInputStream(relPath))) + }else{ + Router.Result.Success(Response("", 404)) + } + + case e: Router.Result.Error => e + + } + + } +} diff --git a/cask/src/cask/Main.scala b/cask/src/cask/Main.scala index 4469a1e..8cdbd4f 100644 --- a/cask/src/cask/Main.scala +++ b/cask/src/cask/Main.scala @@ -3,7 +3,7 @@ import cask.Router.EntryPoint import java.io.OutputStream import java.nio.ByteBuffer -import cask.Routes.Metadata +import cask.Routes.RoutesEndpointsMetadata import io.undertow.Undertow import io.undertow.server.handlers.BlockingHandler import io.undertow.server.{HttpHandler, HttpServerExchange} @@ -22,10 +22,10 @@ abstract class BaseMain{ lazy val routeList = for{ routes <- allRoutes - route <- routes.caskMetadata.value.map(x => x: Routes.RouteMetadata[_]) + route <- routes.caskMetadata.value.map(x => x: Routes.EndpointMetadata[_]) } yield (routes, route) - lazy val routeTrie = DispatchTrie.construct[(Routes, Routes.RouteMetadata[_])](0, + lazy val routeTrie = DispatchTrie.construct[(Routes, Routes.EndpointMetadata[_])](0, for((route, metadata) <- routeList) yield (Util.splitPath(metadata.metadata.path): IndexedSeq[String], (route, metadata), metadata.metadata.subpath) ) diff --git a/cask/src/cask/Routes.scala b/cask/src/cask/Routes.scala index 0145c91..01783f0 100644 --- a/cask/src/cask/Routes.scala +++ b/cask/src/cask/Routes.scala @@ -31,18 +31,18 @@ object Response{ } object Routes{ - case class RouteMetadata[T](metadata: EndpointAnnotation[_], - entryPoint: EntryPoint[T, (HttpServerExchange, Seq[String])]) - case class Metadata[T](value: RouteMetadata[T]*) - object Metadata{ + case class EndpointMetadata[T](metadata: Endpoint[_], + entryPoint: EntryPoint[T, (HttpServerExchange, Seq[String])]) + case class RoutesEndpointsMetadata[T](value: EndpointMetadata[T]*) + object RoutesEndpointsMetadata{ implicit def initialize[T] = macro initializeImpl[T] - implicit def initializeImpl[T: c.WeakTypeTag](c: Context): c.Expr[Metadata[T]] = { + implicit def initializeImpl[T: c.WeakTypeTag](c: Context): c.Expr[RoutesEndpointsMetadata[T]] = { import c.universe._ val router = new cask.Router[c.type](c) val routeParts = for{ m <- c.weakTypeOf[T].members - annot <- m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[EndpointAnnotation[_]]) + annot <- m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[Endpoint[_]]) } yield { val annotObject = q"new ${annot.tree.tpe}(..${annot.tree.children.tail})" val annotObjectSym = c.universe.TermName(c.freshName("annotObject")) @@ -57,22 +57,22 @@ object Routes{ q"""{ val $annotObjectSym = $annotObject - cask.Routes.RouteMetadata($annotObjectSym, $route) + cask.Routes.EndpointMetadata($annotObjectSym, $route) }""" } - c.Expr[Metadata[T]](q"""cask.Routes.Metadata(..$routeParts)""") + c.Expr[RoutesEndpointsMetadata[T]](q"""cask.Routes.RoutesEndpointsMetadata(..$routeParts)""") } } } trait Routes{ - private[this] var metadata0: Routes.Metadata[this.type] = null + private[this] var metadata0: Routes.RoutesEndpointsMetadata[this.type] = null def caskMetadata = if (metadata0 != null) metadata0 else throw new Exception("Routes not yet initialize") - protected[this] def initialize()(implicit routes: Routes.Metadata[this.type]): Unit = { + protected[this] def initialize()(implicit routes: Routes.RoutesEndpointsMetadata[this.type]): Unit = { metadata0 = routes } } diff --git a/cask/test/src/test/cask/VariableRoutes.scala b/cask/test/src/test/cask/VariableRoutes.scala index 1dda4e6..d1816ab 100644 --- a/cask/test/src/test/cask/VariableRoutes.scala +++ b/cask/test/src/test/cask/VariableRoutes.scala @@ -1,7 +1,5 @@ package test.cask -import cask.Subpath - object VariableRoutes extends cask.MainRoutes{ @cask.get("/user/:userName") def showUserProfile(userName: String) = { @@ -14,7 +12,7 @@ object VariableRoutes extends cask.MainRoutes{ } @cask.get("/path", subpath = true) - def showSubpath(subPath: Subpath) = { + def showSubpath(subPath: cask.Subpath) = { s"Subpath ${subPath.value}" } -- cgit v1.2.3