nitweb: migrate /uml to /api/uml/:entity
authorAlexandre Terrasa <alexandre@moz-code.org>
Fri, 20 May 2016 02:57:06 +0000 (22:57 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Mon, 30 May 2016 15:04:39 +0000 (11:04 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/nitweb.nit
src/web/model_api.nit
src/web/web_actions.nit
src/web/web_views.nit

index 8fb2094..1df4153 100644 (file)
@@ -51,7 +51,6 @@ private class NitwebPhase
 
                app.use("/api", new APIRouter(model, modelbuilder, mainmodule))
                app.use("/doc/:namespace", new DocAction(model, mainmodule, modelbuilder))
-               app.use("/uml/:namespace", new UMLDiagramAction(model, mainmodule))
                app.use("/", new TreeAction(model, mainmodule))
 
                app.listen(host, port.to_i)
index 78d6063..f6ad2e5 100644 (file)
@@ -16,6 +16,7 @@ module model_api
 
 import web_base
 import highlight
+import uml
 
 # Specific handler for nitweb API.
 abstract class APIHandler
@@ -71,6 +72,7 @@ class APIRouter
                use("/search", new APISearch(model, mainmodule))
                use("/random", new APIRandom(model, mainmodule))
                use("/code/:id", new APIEntityCode(model, mainmodule, modelbuilder))
+               use("/uml/:id", new APIEntityUML(model, mainmodule))
        end
 end
 
@@ -170,6 +172,40 @@ class APIRandom
        end
 end
 
+
+# Return a UML representation of MEntity.
+#
+# Example: `GET /entity/core::Array/uml`
+class APIEntityUML
+       super APIHandler
+
+       redef fun get(req, res) do
+               var mentity = mentity_from_uri(req, res)
+               var dot
+               if mentity isa MClassDef then mentity = mentity.mclass
+               if mentity isa MClass then
+                       var uml = new UMLModel(view, mainmodule)
+                       dot = uml.generate_class_uml.write_to_string
+               else if mentity isa MModule then
+                       var uml = new UMLModel(view, mentity)
+                       dot = uml.generate_package_uml.write_to_string
+               else
+                       res.error 404
+                       return
+               end
+               res.send render_svg(dot)
+       end
+
+       # Render a `dot` string as a svg image.
+       fun render_svg(dot: String): String do
+               var proc = new ProcessDuplex("dot", "-Tsvg")
+               var svg = proc.write_and_read(dot)
+               proc.close
+               proc.wait
+               return svg
+       end
+end
+
 # Return the source code of MEntity.
 #
 # Example: `GET /entity/core::Array/code`
index 0e8175f..13a7db7 100644 (file)
@@ -53,36 +53,3 @@ class DocAction
                res.send_view(view)
        end
 end
-
-# Return an UML diagram for `namespace`.
-class UMLDiagramAction
-       super ModelHandler
-
-       # Mainmodule used for hierarchy flattening.
-       var mainmodule: MModule
-
-       redef fun get(req, res) do
-               var namespace = req.param("namespace")
-               var model = init_model_view(req)
-               var mentity = find_mentity(model, namespace)
-               if mentity == null then
-                       res.error(404)
-                       return
-               end
-
-               var dot
-               if mentity isa MClassDef then mentity = mentity.mclass
-               if mentity isa MClass then
-                       var uml = new UMLModel(model, mainmodule)
-                       dot = uml.generate_class_uml.write_to_string
-               else if mentity isa MModule then
-                       var uml = new UMLModel(model, mentity)
-                       dot = uml.generate_package_uml.write_to_string
-               else
-                       res.error(404)
-                       return
-               end
-               var view = new HtmlDotPage(dot, mentity.as(not null).html_name)
-               res.send_view(view)
-       end
-end
index 67e6925..d8f8c9f 100644 (file)
@@ -91,29 +91,3 @@ class HtmlDocPage
                return tpl
        end
 end
-
-# Display the source for each mentities
-class HtmlDotPage
-       super NitView
-
-       # Dot to process.
-       var dot: Text
-
-       # Page title.
-       var title: String
-
-       redef fun render do
-               var tpl = new Template
-               tpl.add new Header(1, title)
-               tpl.add render_dot
-               return tpl
-       end
-
-       private fun render_dot: String do
-               var proc = new ProcessDuplex("dot", "-Tsvg", "-Tcmapx")
-               var svg = proc.write_and_read(dot)
-               proc.close
-               proc.wait
-               return svg
-       end
-end