1 # This file is part of NIT ( http://www.nitlanguage.org ).
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
23 use
("/metrics/structural/:id", new APIStructuralMetrics(config
))
27 class APIStructuralMetrics
30 private fun mclasses_metrics
: MetricSet do
31 var metrics
= new MetricSet
32 metrics
.register
(new CNOA(config
.model
, config
.mainmodule
, config
.filter
))
33 metrics
.register
(new CNOP(config
.model
, config
.mainmodule
, config
.filter
))
34 metrics
.register
(new CNOC(config
.model
, config
.mainmodule
, config
.filter
))
35 metrics
.register
(new CNOD(config
.model
, config
.mainmodule
, config
.filter
))
36 metrics
.register
(new CNOAC(config
.model
, config
.mainmodule
, config
.filter
))
37 metrics
.register
(new CNOAA(config
.model
, config
.mainmodule
, config
.filter
))
38 metrics
.register
(new CNOAI(config
.model
, config
.mainmodule
, config
.filter
))
39 metrics
.register
(new CDIT(config
.model
, config
.mainmodule
, config
.filter
))
40 metrics
.register
(new CNBP(config
.model
, config
.mainmodule
, config
.filter
))
41 metrics
.register
(new CNBA(config
.model
, config
.mainmodule
, config
.filter
))
42 metrics
.register
(new CNBM(config
.model
, config
.mainmodule
, config
.filter
))
43 metrics
.register
(new CNBI(config
.model
, config
.mainmodule
, config
.filter
))
44 metrics
.register
(new CNBV(config
.model
, config
.mainmodule
, config
.filter
))
45 metrics
.register
(new CNBIP(config
.model
, config
.mainmodule
, config
.filter
))
46 metrics
.register
(new CNBRP(config
.model
, config
.mainmodule
, config
.filter
))
47 metrics
.register
(new CNBHP(config
.model
, config
.mainmodule
, config
.filter
))
48 metrics
.register
(new CNBLP(config
.model
, config
.mainmodule
, config
.filter
))
52 private fun mmodules_metrics
: MetricSet do
53 var metrics
= new MetricSet
54 metrics
.register
(new MNOA(config
.model
, config
.mainmodule
, config
.filter
))
55 metrics
.register
(new MNOP(config
.model
, config
.mainmodule
, config
.filter
))
56 metrics
.register
(new MNOC(config
.model
, config
.mainmodule
, config
.filter
))
57 metrics
.register
(new MNOD(config
.model
, config
.mainmodule
, config
.filter
))
58 metrics
.register
(new MDIT(config
.model
, config
.mainmodule
, config
.filter
))
59 metrics
.register
(new MNBD(config
.model
, config
.mainmodule
, config
.filter
))
60 metrics
.register
(new MNBI(config
.model
, config
.mainmodule
, config
.filter
))
61 metrics
.register
(new MNBR(config
.model
, config
.mainmodule
, config
.filter
))
62 metrics
.register
(new MNBCC(config
.model
, config
.mainmodule
, config
.filter
))
63 metrics
.register
(new MNBAC(config
.model
, config
.mainmodule
, config
.filter
))
67 redef fun get
(req
, res
) do
68 var mentity
= mentity_from_uri
(req
, res
)
69 if mentity
== null then return
70 var metrics
= mentity
.collect_metrics
(self)
71 if metrics
== null then
72 res
.api_error
(404, "No metric for mentity `{mentity.full_name}`")
75 res
.api_json
(req
, metrics
)
80 private fun collect_metrics
(h
: APIStructuralMetrics): nullable JsonObject do return null
84 redef fun collect_metrics
(h
) do
85 var mclasses
= new HashSet[MClass]
86 for mgroup
in self.mgroups
do
87 for mmodule
in mgroup
.mmodules
do mclasses
.add_all mmodule
.intro_mclasses
90 var mclasses_metrics
= h
.mclasses_metrics
91 mclasses_metrics
.collect
(new HashSet[MClass].from
(mclasses
))
93 var mmodules
= new HashSet[MModule]
94 for mgroup
in self.mgroups
do
95 mmodules
.add_all mgroup
.mmodules
98 var mmodules_metrics
= h
.mmodules_metrics
99 mmodules_metrics
.collect
(new HashSet[MModule].from
(mmodules
))
101 var metrics
= new JsonObject
102 metrics
["mclasses"] = mclasses_metrics
103 metrics
["mmodules"] = mmodules_metrics
109 redef fun collect_metrics
(h
) do
110 var mclasses
= new HashSet[MClass]
111 for mmodule
in self.mmodules
do mclasses
.add_all mmodule
.intro_mclasses
113 var mclasses_metrics
= h
.mclasses_metrics
114 mclasses_metrics
.collect
(new HashSet[MClass].from
(mclasses
))
116 var mmodules_metrics
= h
.mmodules_metrics
117 mmodules_metrics
.collect
(new HashSet[MModule].from
(mmodules
))
119 var metrics
= new JsonObject
120 metrics
["mclasses"] = mclasses_metrics
121 metrics
["mmodules"] = mmodules_metrics
127 redef fun collect_metrics
(h
) do
128 var mclasses_metrics
= h
.mclasses_metrics
129 mclasses_metrics
.collect
(new HashSet[MClass].from
(intro_mclasses
))
131 var mmodule_metrics
= h
.mmodules_metrics
132 mmodule_metrics
.collect
(new HashSet[MModule].from
([self]))
134 var metrics
= new JsonObject
135 metrics
["mclasses"] = mclasses_metrics
136 metrics
["mmodule"] = mmodule_metrics
142 redef fun collect_metrics
(h
) do
143 var mclass_metrics
= h
.mclasses_metrics
144 mclass_metrics
.collect
(new HashSet[MClass].from
([self]))
146 var metrics
= new JsonObject
147 metrics
["mclass"] = mclass_metrics
152 redef class MetricSet
155 redef fun core_serialize_to
(v
) do
156 for metric
in metrics
do
157 v
.serialize_attribute
(metric
.name
, metric
)
165 redef fun core_serialize_to
(v
) do
166 v
.serialize_attribute
("name", name
)
167 v
.serialize_attribute
("desc", desc
)
168 v
.serialize_attribute
("empty", values
.is_empty
)
169 if values
.not_empty
then v
.serialize_attribute
("avg", avg
)
170 if values
.not_empty
then v
.serialize_attribute
("std_dev", std_dev
)
171 if values
.not_empty
then v
.serialize_attribute
("threshold", threshold
)
175 redef class IntMetric
176 redef fun core_serialize_to
(v
) do
178 if values
.not_empty
then v
.serialize_attribute
("sum", sum
)
182 redef class FloatMetric
183 redef fun core_serialize_to
(v
) do
185 if values
.not_empty
then v
.serialize_attribute
("sum", sum
)
189 redef class MModuleMetric
190 redef fun core_serialize_to
(v
) do
192 if values
.not_empty
then v
.serialize_attribute
("min", min
)
193 if values
.not_empty
then v
.serialize_attribute
("max", max
)
194 var values
= new JsonObject
196 values
[value
.full_name
] = new MetricEntry(value
, self[value
])
198 v
.serialize_attribute
("values", values
)
202 redef class MClassMetric
203 redef fun core_serialize_to
(v
) do
205 if values
.not_empty
then v
.serialize_attribute
("min", min
)
206 if values
.not_empty
then v
.serialize_attribute
("max", max
)
207 var values
= new JsonObject
209 values
[value
.full_name
] = new MetricEntry(value
, self[value
])
211 v
.serialize_attribute
("values", values
)
215 private class MetricEntry
221 redef fun core_serialize_to
(v
) do
222 v
.serialize_attribute
("mentity", mentity
)
223 v
.serialize_attribute
("value", if value
isa JsonObject then value
else value
.to_s
)