nit: Added link to `CONTRIBUTING.md` from the README
[nit.git] / src / web / web_actions.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Nitcorn actions used by the nitweb server.
16 module web_actions
17
18 import web_views
19 import uml
20
21 # Display the tree of all loaded mentities.
22 class TreeAction
23 super ModelAction
24
25 redef fun get(req, res) do
26 var model = init_model_view(req)
27 var view = new HtmlHomePage(model.to_tree)
28 res.send_view(view)
29 end
30 end
31
32 # Display the list of mentities matching `namespace`.
33 class SearchAction
34 super ModelAction
35
36 # TODO handle more than full namespaces.
37 redef fun get(req, res) do
38 var namespace = req.param("namespace")
39 var model = init_model_view(req)
40 var mentity = find_mentity(model, namespace)
41 if mentity == null then
42 res.error(404)
43 return
44 end
45 if req.is_json_asked then
46 res.json(mentity.to_json)
47 return
48 end
49 var view = new HtmlResultPage(namespace or else "null", [mentity])
50 res.send_view(view)
51 end
52 end
53
54 # Display a MEntity source code.
55 class CodeAction
56 super ModelAction
57
58 # Modelbuilder used to access sources.
59 var modelbuilder: ModelBuilder
60
61 redef fun get(req, res) do
62 var namespace = req.param("namespace")
63 var model = init_model_view(req)
64 var mentity = find_mentity(model, namespace)
65 if mentity == null then
66 res.error(404)
67 return
68 end
69 var view = new HtmlSourcePage(modelbuilder, mentity)
70 res.send_view(view)
71 end
72 end
73
74 # Display the doc of a MEntity.
75 class DocAction
76 super ModelAction
77
78 # Modelbuilder used to access sources.
79 var modelbuilder: ModelBuilder
80
81 redef fun get(req, res) do
82 var namespace = req.param("namespace")
83 var model = init_model_view(req)
84 var mentity = find_mentity(model, namespace)
85 if mentity == null then
86 res.error(404)
87 return
88 end
89 if req.is_json_asked then
90 res.json(mentity.to_json)
91 return
92 end
93
94 var view = new HtmlDocPage(modelbuilder, mentity)
95 res.send_view(view)
96 end
97 end
98
99 # Return an UML diagram for `namespace`.
100 class UMLDiagramAction
101 super ModelAction
102
103 # Mainmodule used for hierarchy flattening.
104 var mainmodule: MModule
105
106 redef fun get(req, res) do
107 var namespace = req.param("namespace")
108 var model = init_model_view(req)
109 var mentity = find_mentity(model, namespace)
110 if mentity == null then
111 res.error(404)
112 return
113 end
114
115 var dot
116 if mentity isa MClassDef then mentity = mentity.mclass
117 if mentity isa MClass then
118 var uml = new UMLModel(model, mainmodule)
119 dot = uml.generate_class_uml.write_to_string
120 else if mentity isa MModule then
121 var uml = new UMLModel(model, mentity)
122 dot = uml.generate_package_uml.write_to_string
123 else
124 res.error(404)
125 return
126 end
127 var view = new HtmlDotPage(dot, mentity.as(not null).html_name)
128 res.send_view(view)
129 end
130 end
131
132 # Return a random list of MEntities.
133 class RandomAction
134 super ModelAction
135
136 redef fun get(req, res) do
137 var n = req.int_arg("n") or else 10
138 var k = req.string_arg("k") or else "modules"
139 var model = init_model_view(req)
140 var mentities: Array[MEntity]
141 if k == "modules" then
142 mentities = model.mmodules.to_a
143 else if k == "classdefs" then
144 mentities = model.mclassdefs.to_a
145 else
146 mentities = model.mpropdefs.to_a
147 end
148 mentities.shuffle
149 mentities = mentities.sub(0, n)
150 if req.is_json_asked then
151 var json = new JsonArray
152 for mentity in mentities do
153 json.add mentity.to_json
154 end
155 res.json(json)
156 return
157 end
158 var view = new HtmlResultPage("random", mentities)
159 res.send_view(view)
160 end
161 end