module web_actions
import web_views
-import model::model_collect
+import uml
# Display the tree of all loaded mentities.
class TreeAction
- super NitAction
+ super ModelAction
- # Model to explore and render.
- var model: Model
-
- # View to render.
- var view = new HtmlHomePage(model) is lazy
-
- redef fun answer(request, url) do return render_view(view)
+ redef fun get(req, res) do
+ var model = init_model_view(req)
+ var view = new HtmlHomePage(model.to_tree)
+ res.send_view(view)
+ end
end
# Display the list of mentities matching `namespace`.
class SearchAction
- super NitAction
-
- # Model to explore and render.
- var model: Model
+ super ModelAction
# 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.")
+ 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 mentities = model.collect_by_namespace(namespace)
- 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)
+ if req.is_json_asked then
+ res.json(mentity.to_json)
+ return
end
- var view = new HtmlResultPage(namespace, mentities)
- return render_view(view)
+ var view = new HtmlResultPage(namespace or else "null", [mentity])
+ res.send_view(view)
end
end
# Display a MEntity source code.
class CodeAction
- super NitAction
-
- # Model to explore and render.
- var model: Model
+ super ModelAction
# 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.")
+ 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 mentities = model.collect_by_namespace(namespace)
- if mentities.is_empty then
- return render_error(404, "No mentity matching this namespace.")
- end
- var view = new HtmlSourcePage(modelbuilder, mentities.first)
- return render_view(view)
+ var view = new HtmlSourcePage(modelbuilder, mentity)
+ res.send_view(view)
end
end
# Display the doc of a MEntity.
class DocAction
- super NitAction
-
- # Model to explore and render.
- var model: Model
+ super ModelAction
# 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.")
+ 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 mentities = model.collect_by_namespace(namespace)
- if mentities.is_empty then
- return render_error(404, "No mentity matching this namespace.")
+ if req.is_json_asked then
+ res.json(mentity.to_json)
+ return
end
- var view = new HtmlDocPage(modelbuilder, mentities.first)
- return render_view(view)
+
+ var view = new HtmlDocPage(modelbuilder, mentity)
+ res.send_view(view)
+ end
+end
+
+# Return an UML diagram for `namespace`.
+class UMLDiagramAction
+ super ModelAction
+
+ # 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
# Return a random list of MEntities.
class RandomAction
- super NitAction
-
- # Model to explore and render.
- var model: Model
+ super ModelAction
- # TODO handle more than full namespaces.
- redef fun answer(request, url) do
- var n = request.int_arg("n") or else 10
- var k = request.string_arg("k") or else "modules"
+ redef fun get(req, res) do
+ var n = req.int_arg("n") or else 10
+ var k = req.string_arg("k") or else "modules"
+ var model = init_model_view(req)
var mentities: Array[MEntity]
if k == "modules" then
mentities = model.mmodules.to_a
else if k == "classdefs" then
- mentities = new Array[MClassDef]
- for mclass in model.mclasses do
- mentities.add_all(mclass.mclassdefs)
- end
+ mentities = model.mclassdefs.to_a
else
- mentities = new Array[MPropDef]
- for mprop in model.mproperties do
- mentities.add_all(mprop.mpropdefs)
- end
+ mentities = model.mpropdefs.to_a
end
mentities.shuffle
mentities = mentities.sub(0, n)
- if request.is_json_asked then
+ if req.is_json_asked then
var json = new JsonArray
for mentity in mentities do
json.add mentity.to_json
end
- return render_json(json)
+ res.json(json)
+ return
end
var view = new HtmlResultPage("random", mentities)
- 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
+ res.send_view(view)
end
end