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
.view
))
33 metrics
.register
(new CNOP(config
.view
))
34 metrics
.register
(new CNOC(config
.view
))
35 metrics
.register
(new CNOD(config
.view
))
36 metrics
.register
(new CNOAC(config
.view
))
37 metrics
.register
(new CNOAA(config
.view
))
38 metrics
.register
(new CNOAI(config
.view
))
39 metrics
.register
(new CDIT(config
.view
))
40 metrics
.register
(new CNBP(config
.view
))
41 metrics
.register
(new CNBA(config
.view
))
42 metrics
.register
(new CNBM(config
.view
))
43 metrics
.register
(new CNBI(config
.view
))
44 metrics
.register
(new CNBV(config
.view
))
45 metrics
.register
(new CNBIP(config
.view
))
46 metrics
.register
(new CNBRP(config
.view
))
47 metrics
.register
(new CNBHP(config
.view
))
48 metrics
.register
(new CNBLP(config
.view
))
52 private fun mmodules_metrics
: MetricSet do
53 var metrics
= new MetricSet
54 metrics
.register
(new MNOA(config
.view
))
55 metrics
.register
(new MNOP(config
.view
))
56 metrics
.register
(new MNOC(config
.view
))
57 metrics
.register
(new MNOD(config
.view
))
58 metrics
.register
(new MDIT(config
.view
))
59 metrics
.register
(new MNBD(config
.view
))
60 metrics
.register
(new MNBI(config
.view
))
61 metrics
.register
(new MNBR(config
.view
))
62 metrics
.register
(new MNBCC(config
.view
))
63 metrics
.register
(new MNBAC(config
.view
))
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
)