src/web: replace adhoc MEntity::to_json by the model_json one
[nit.git] / src / web / web_actions.nit
index 448ee77..60d39c2 100644 (file)
@@ -16,6 +16,7 @@
 module web_actions
 
 import web_views
+import uml
 
 # Display the tree of all loaded mentities.
 class TreeAction
@@ -23,7 +24,7 @@ class TreeAction
 
        redef fun answer(request, url) do
                var model = init_model_view(request)
-               var view = new HtmlHomePage(model.model)
+               var view = new HtmlHomePage(model.to_tree)
                return render_view(view)
        end
 end
@@ -35,19 +36,15 @@ class SearchAction
        # TODO handle more than full namespaces.
        redef fun answer(request, url) do
                var namespace = request.param("namespace")
-               if namespace == null or namespace.is_empty then
-                       return render_error(400, "Missing :namespace.")
-               end
                var model = init_model_view(request)
-               var mentities = model.mentities_by_namespace(namespace)
+               var mentity = find_mentity(model, namespace)
+               if mentity == null then
+                       return render_error(404, "No mentity found")
+               end
                if request.is_json_asked then
-                       var json = new JsonArray
-                       for mentity in mentities do
-                               json.add mentity.to_json
-                       end
-                       return render_json(json)
+                       return render_json(mentity.to_json)
                end
-               var view = new HtmlResultPage(namespace, mentities)
+               var view = new HtmlResultPage(namespace or else "null", [mentity])
                return render_view(view)
        end
 end
@@ -59,18 +56,14 @@ class CodeAction
        # Modelbuilder used to access sources.
        var modelbuilder: ModelBuilder
 
-       # TODO handle more than full namespaces.
        redef fun answer(request, url) do
                var namespace = request.param("namespace")
-               if namespace == null or namespace.is_empty then
-                       return render_error(400, "Missing :namespace.")
-               end
                var model = init_model_view(request)
-               var mentities = model.mentities_by_namespace(namespace)
-               if mentities.is_empty then
-                       return render_error(404, "No mentity matching this namespace.")
+               var mentity = find_mentity(model, namespace)
+               if mentity == null then
+                       return render_error(404, "No mentity found")
                end
-               var view = new HtmlSourcePage(modelbuilder, mentities.first)
+               var view = new HtmlSourcePage(modelbuilder, mentity)
                return render_view(view)
        end
 end
@@ -85,15 +78,43 @@ class DocAction
        # TODO handle more than full namespaces.
        redef fun answer(request, url) do
                var namespace = request.param("namespace")
-               if namespace == null or namespace.is_empty then
-                       return render_error(400, "Missing :namespace.")
+               var model = init_model_view(request)
+               var mentity = find_mentity(model, namespace)
+               if mentity == null then
+                       return render_error(404, "No mentity found")
                end
+               var view = new HtmlDocPage(modelbuilder, mentity)
+               return render_view(view)
+       end
+end
+
+# Return an UML diagram for `namespace`.
+class UMLDiagramAction
+       super ModelAction
+
+       # Mainmodule used for hierarchy flattening.
+       var mainmodule: MModule
+
+       redef fun answer(request, url) do
+               var namespace = request.param("namespace")
                var model = init_model_view(request)
-               var mentities = model.mentities_by_namespace(namespace)
-               if mentities.is_empty then
-                       return render_error(404, "No mentity matching this namespace.")
+               var mentity = find_mentity(model, namespace)
+               if mentity == null then
+                       return render_error(404, "No mentity found")
                end
-               var view = new HtmlDocPage(modelbuilder, mentities.first)
+
+               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
+                       return render_error(404, "No diagram matching this namespace.")
+               end
+               var view = new HtmlDotPage(dot, mentity.as(not null).html_name)
                return render_view(view)
        end
 end
@@ -128,19 +149,3 @@ class RandomAction
                return render_view(view)
        end
 end
-
-redef class MEntity
-
-       # Return `self` as a JsonObject.
-       fun to_json: JsonObject do
-               var obj = new JsonObject
-               obj["name"] = html_name
-               obj["namespace"] = html_raw_namespace
-               var mdoc = self.mdoc
-               if mdoc != null then
-                       obj["synopsis"] = mdoc.content.first.html_escape
-                       obj["mdoc"] = mdoc.content.join("\n").html_escape
-               end
-               return obj
-       end
-end