001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020 package org.sonar.api.measures;
021
022 import com.google.common.annotations.Beta;
023 import com.google.common.base.Predicate;
024 import com.google.common.collect.Iterables;
025 import com.google.common.collect.Lists;
026 import org.sonar.api.resources.Scopes;
027 import org.sonar.api.utils.SonarException;
028
029 import javax.annotation.Nullable;
030
031 import java.lang.reflect.Field;
032 import java.util.List;
033
034 /**
035 * @since 1.10
036 */
037 public final class CoreMetrics {
038
039 // the following fields are not final to avoid compile-time constants used by plugins
040 public static String DOMAIN_SIZE = "Size";
041 public static String DOMAIN_TESTS = "Tests";
042 public static String DOMAIN_INTEGRATION_TESTS = "Tests (Integration)";
043 public static String DOMAIN_OVERALL_TESTS = "Tests (Overall)";
044 public static String DOMAIN_COMPLEXITY = "Complexity";
045 public static String DOMAIN_DOCUMENTATION = "Documentation";
046 public static String DOMAIN_SCM = "SCM";
047
048 /**
049 * @deprecated in 3.6. Replaced by concept of issues.
050 */
051 @Deprecated
052 public static String DOMAIN_REVIEWS = "Reviews";
053 public static String DOMAIN_ISSUES = "Issues";
054 public static String DOMAIN_GENERAL = "General";
055 public static String DOMAIN_DUPLICATION = "Duplication";
056 public static String DOMAIN_DESIGN = "Design";
057
058 /**
059 * @since 4.0
060 */
061 public static String DOMAIN_TECHNICAL_DEBT = "Technical Debt";
062
063 public static final String LINES_KEY = "lines";
064 public static final Metric<Integer> LINES = new Metric.Builder(LINES_KEY, "Lines", Metric.ValueType.INT)
065 .setDescription("Lines")
066 .setDirection(Metric.DIRECTION_WORST)
067 .setQualitative(false)
068 .setDomain(DOMAIN_SIZE)
069 .setFormula(new SumChildValuesFormula(false))
070 .create();
071
072 public static final String GENERATED_LINES_KEY = "generated_lines";
073 public static final Metric<Integer> GENERATED_LINES = new Metric.Builder(GENERATED_LINES_KEY, "Generated Lines", Metric.ValueType.INT)
074 .setDescription("Number of generated lines")
075 .setDirection(Metric.DIRECTION_WORST)
076 .setQualitative(false)
077 .setDomain(DOMAIN_SIZE)
078 .setBestValue(0.0)
079 .setOptimizedBestValue(true)
080 .setFormula(new SumChildValuesFormula(false))
081 .create();
082
083 public static final String NCLOC_KEY = "ncloc";
084 public static final Metric<Integer> NCLOC = new Metric.Builder(NCLOC_KEY, "Lines of code", Metric.ValueType.INT)
085 .setDescription("Non Commenting Lines of Code")
086 .setDirection(Metric.DIRECTION_WORST)
087 .setQualitative(false)
088 .setDomain(DOMAIN_SIZE)
089 .setFormula(new SumChildValuesFormula(false))
090 .create();
091
092 /**
093 * @since 4.4
094 */
095 public static final String NCLOC_LANGUAGE_DISTRIBUTION_KEY = "ncloc_language_distribution";
096
097 /**
098 * @since 4.4
099 */
100 public static final Metric<String> NCLOC_LANGUAGE_DISTRIBUTION = new Metric.Builder(NCLOC_LANGUAGE_DISTRIBUTION_KEY, "Lines of code per language", Metric.ValueType.DATA)
101 .setDescription("Non Commenting Lines of Code Distributed By Language")
102 .setDirection(Metric.DIRECTION_WORST)
103 .setQualitative(false)
104 .setDomain(DOMAIN_SIZE)
105 .create();
106
107 public static final String GENERATED_NCLOC_KEY = "generated_ncloc";
108 public static final Metric<Integer> GENERATED_NCLOC = new Metric.Builder(GENERATED_NCLOC_KEY, "Generated lines of code", Metric.ValueType.INT)
109 .setDescription("Generated non Commenting Lines of Code")
110 .setDirection(Metric.DIRECTION_WORST)
111 .setQualitative(false)
112 .setDomain(DOMAIN_SIZE)
113 .setBestValue(0.0)
114 .setOptimizedBestValue(true)
115 .setFormula(new SumChildValuesFormula(false))
116 .create();
117
118 public static final String CLASSES_KEY = "classes";
119 public static final Metric<Integer> CLASSES = new Metric.Builder(CLASSES_KEY, "Classes", Metric.ValueType.INT)
120 .setDescription("Classes")
121 .setDirection(Metric.DIRECTION_WORST)
122 .setQualitative(false)
123 .setDomain(DOMAIN_SIZE)
124 .setFormula(new SumChildValuesFormula(false))
125 .create();
126
127 public static final String FILES_KEY = "files";
128 public static final Metric<Integer> FILES = new Metric.Builder(FILES_KEY, "Files", Metric.ValueType.INT)
129 .setDescription("Number of files")
130 .setDirection(Metric.DIRECTION_WORST)
131 .setQualitative(false)
132 .setDomain(DOMAIN_SIZE)
133 .create();
134
135 public static final String DIRECTORIES_KEY = "directories";
136 public static final Metric<Integer> DIRECTORIES = new Metric.Builder(DIRECTORIES_KEY, "Directories", Metric.ValueType.INT)
137 .setDescription("Directories")
138 .setDirection(Metric.DIRECTION_WORST)
139 .setQualitative(false)
140 .setDomain(DOMAIN_SIZE)
141 .create();
142
143 /**
144 * @deprecated since 4.2 there is now only directory
145 */
146 @Deprecated
147 public static final String PACKAGES_KEY = "packages";
148 /**
149 * @deprecated since 4.2 there is now only directory
150 */
151 @Deprecated
152 public static final Metric<Integer> PACKAGES = new Metric.Builder(PACKAGES_KEY, "Packages", Metric.ValueType.INT)
153 .setDescription("Packages")
154 .setDirection(Metric.DIRECTION_WORST)
155 .setQualitative(false)
156 .setDomain(DOMAIN_SIZE)
157 .setFormula(new SumChildValuesFormula(false))
158 .setHidden(true)
159 .create();
160
161 public static final String FUNCTIONS_KEY = "functions";
162 public static final Metric<Integer> FUNCTIONS = new Metric.Builder(FUNCTIONS_KEY, "Functions", Metric.ValueType.INT)
163 .setDescription("Functions")
164 .setDirection(Metric.DIRECTION_WORST)
165 .setQualitative(false)
166 .setDomain(DOMAIN_SIZE)
167 .setFormula(new SumChildValuesFormula(false))
168 .create();
169
170 public static final String ACCESSORS_KEY = "accessors";
171 public static final Metric<Integer> ACCESSORS = new Metric.Builder(ACCESSORS_KEY, "Accessors", Metric.ValueType.INT)
172 .setDescription("Accessors")
173 .setDirection(Metric.DIRECTION_WORST)
174 .setQualitative(false)
175 .setDomain(DOMAIN_SIZE)
176 .setFormula(new SumChildValuesFormula(false))
177 .create();
178
179 public static final String STATEMENTS_KEY = "statements";
180 public static final Metric<Integer> STATEMENTS = new Metric.Builder(STATEMENTS_KEY, "Statements", Metric.ValueType.INT)
181 .setDescription("Number of statements")
182 .setDirection(Metric.DIRECTION_WORST)
183 .setQualitative(false)
184 .setDomain(DOMAIN_SIZE)
185 .setFormula(new SumChildValuesFormula(false))
186 .create();
187
188 public static final String PUBLIC_API_KEY = "public_api";
189 public static final Metric<Integer> PUBLIC_API = new Metric.Builder(PUBLIC_API_KEY, "Public API", Metric.ValueType.INT)
190 .setDescription("Public API")
191 .setDirection(Metric.DIRECTION_WORST)
192 .setQualitative(false)
193 .setDomain(DOMAIN_SIZE)
194 .setFormula(new SumChildValuesFormula(false))
195 .create();
196
197 /**
198 * @since 3.0
199 */
200 public static final String PROJECTS_KEY = "projects";
201
202 /**
203 * @since 3.0
204 */
205 public static final Metric<Integer> PROJECTS = new Metric.Builder(PROJECTS_KEY, "Projects", Metric.ValueType.INT)
206 .setDescription("Number of projects")
207 .setDirection(Metric.DIRECTION_WORST)
208 .setQualitative(false)
209 .setDomain(DOMAIN_SIZE)
210 .create();
211
212 // --------------------------------------------------------------------------------------------------------------------
213 //
214 // DOCUMENTATION
215 //
216 // --------------------------------------------------------------------------------------------------------------------
217
218 public static final String COMMENT_LINES_KEY = "comment_lines";
219 public static final Metric<Integer> COMMENT_LINES = new Metric.Builder(COMMENT_LINES_KEY, "Comment lines", Metric.ValueType.INT)
220 .setDescription("Number of comment lines")
221 .setDirection(Metric.DIRECTION_BETTER)
222 .setQualitative(false)
223 .setDomain(DOMAIN_DOCUMENTATION)
224 .setFormula(new SumChildValuesFormula(false))
225 .create();
226
227 public static final String COMMENT_LINES_DENSITY_KEY = "comment_lines_density";
228 public static final Metric<Double> COMMENT_LINES_DENSITY = new Metric.Builder(COMMENT_LINES_DENSITY_KEY, "Comments (%)", Metric.ValueType.PERCENT)
229 .setDescription("Comments balanced by ncloc + comment lines")
230 .setDirection(Metric.DIRECTION_BETTER)
231 .setQualitative(true)
232 .setDomain(DOMAIN_DOCUMENTATION)
233 .create();
234
235 /**
236 * @deprecated since 3.3 - see SONAR-3768
237 */
238 @Deprecated
239 public static final String COMMENT_BLANK_LINES_KEY = "comment_blank_lines";
240
241 /**
242 * @deprecated since 3.3 - see SONAR-3768
243 */
244 @Deprecated
245 public static final Metric<Integer> COMMENT_BLANK_LINES = new Metric.Builder(COMMENT_BLANK_LINES_KEY, "Blank comments", Metric.ValueType.INT)
246 .setDescription("Comments that do not contain comments")
247 .setDirection(Metric.DIRECTION_WORST)
248 .setQualitative(false)
249 .setDomain(DOMAIN_DOCUMENTATION)
250 .setFormula(new SumChildValuesFormula(false))
251 .setBestValue(0.0)
252 .setOptimizedBestValue(true)
253 .setHidden(true)
254 .create();
255
256 public static final String PUBLIC_DOCUMENTED_API_DENSITY_KEY = "public_documented_api_density";
257 public static final Metric<Double> PUBLIC_DOCUMENTED_API_DENSITY = new Metric.Builder(PUBLIC_DOCUMENTED_API_DENSITY_KEY, "Public documented API (%)", Metric.ValueType.PERCENT)
258 .setDescription("Public documented classes and functions balanced by ncloc")
259 .setDirection(Metric.DIRECTION_BETTER)
260 .setQualitative(true)
261 .setDomain(DOMAIN_DOCUMENTATION)
262 .setWorstValue(0.0)
263 .setBestValue(100.0)
264 .setOptimizedBestValue(true)
265 .create();
266
267 public static final String PUBLIC_UNDOCUMENTED_API_KEY = "public_undocumented_api";
268 public static final Metric<Integer> PUBLIC_UNDOCUMENTED_API = new Metric.Builder(PUBLIC_UNDOCUMENTED_API_KEY, "Public undocumented API", Metric.ValueType.INT)
269 .setDescription("Public undocumented classes, functions and variables")
270 .setDirection(Metric.DIRECTION_WORST)
271 .setQualitative(true)
272 .setDomain(DOMAIN_DOCUMENTATION)
273 .setBestValue(0.0)
274 .setDirection(Metric.DIRECTION_WORST)
275 .setOptimizedBestValue(true)
276 .setFormula(new SumChildValuesFormula(false))
277 .create();
278
279 /**
280 * @deprecated since 4.2 - see SONAR-4990
281 */
282 @Deprecated
283 public static final String COMMENTED_OUT_CODE_LINES_KEY = "commented_out_code_lines";
284
285 /**
286 * @deprecated since 4.2 - see SONAR-4990
287 */
288 @Deprecated
289 public static final Metric<Integer> COMMENTED_OUT_CODE_LINES = new Metric.Builder(COMMENTED_OUT_CODE_LINES_KEY, "Commented-out LOC", Metric.ValueType.INT)
290 .setDescription("Commented lines of code")
291 .setDirection(Metric.DIRECTION_WORST)
292 .setQualitative(true)
293 .setDomain(DOMAIN_DOCUMENTATION)
294 .setFormula(new SumChildValuesFormula(false))
295 .setBestValue(0.0)
296 .setOptimizedBestValue(true)
297 .setHidden(true)
298 .create();
299
300 // --------------------------------------------------------------------------------------------------------------------
301 //
302 // COMPLEXITY
303 //
304 // --------------------------------------------------------------------------------------------------------------------
305
306 public static final String COMPLEXITY_KEY = "complexity";
307 public static final Metric<Integer> COMPLEXITY = new Metric.Builder(COMPLEXITY_KEY, "Complexity", Metric.ValueType.INT)
308 .setDescription("Cyclomatic complexity")
309 .setDirection(Metric.DIRECTION_WORST)
310 .setQualitative(false)
311 .setDomain(DOMAIN_COMPLEXITY)
312 .setFormula(new SumChildValuesFormula(false))
313 .create();
314
315 public static final String FILE_COMPLEXITY_KEY = "file_complexity";
316 public static final Metric<Double> FILE_COMPLEXITY = new Metric.Builder(FILE_COMPLEXITY_KEY, "Complexity /file", Metric.ValueType.FLOAT)
317 .setDescription("Complexity average by file")
318 .setDirection(Metric.DIRECTION_WORST)
319 .setQualitative(true)
320 .setDomain(DOMAIN_COMPLEXITY)
321 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY, CoreMetrics.FILES))
322 .create();
323
324 /**
325 * @since 3.6
326 */
327 public static final String COMPLEXITY_IN_CLASSES_KEY = "complexity_in_classes";
328
329 /**
330 * @since 3.6
331 */
332 public static final Metric<Integer> COMPLEXITY_IN_CLASSES = new Metric.Builder(COMPLEXITY_IN_CLASSES_KEY, "Complexity in classes", Metric.ValueType.INT)
333 .setDescription("Cyclomatic complexity in classes")
334 .setHidden(true)
335 .setDirection(Metric.DIRECTION_WORST)
336 .setQualitative(false)
337 .setDomain(DOMAIN_COMPLEXITY)
338 .setFormula(new SumChildValuesFormula(false))
339 .setDeleteHistoricalData(true)
340 .create();
341
342 public static final String CLASS_COMPLEXITY_KEY = "class_complexity";
343
344 /**
345 * Information about the cyclomatic complexity per class, calculated by divided the complexity in classes by the number of classes.
346 * If the complexity in classes is not available, the complexity of the file is used.
347 */
348 public static final Metric<Double> CLASS_COMPLEXITY = new Metric.Builder(CLASS_COMPLEXITY_KEY, "Complexity /class", Metric.ValueType.FLOAT)
349 .setDescription("Complexity average by class")
350 .setDirection(Metric.DIRECTION_WORST)
351 .setQualitative(true)
352 .setDomain(DOMAIN_COMPLEXITY)
353 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY_IN_CLASSES, CoreMetrics.CLASSES).setFallbackForMainMetric(CoreMetrics.COMPLEXITY))
354 .create();
355
356 /**
357 * @since 3.6
358 */
359 public static final String COMPLEXITY_IN_FUNCTIONS_KEY = "complexity_in_functions";
360
361 /**
362 * @since 3.6
363 */
364 public static final Metric<Integer> COMPLEXITY_IN_FUNCTIONS = new Metric.Builder(COMPLEXITY_IN_FUNCTIONS_KEY, "Complexity in functions", Metric.ValueType.INT)
365 .setDescription("Cyclomatic complexity in functions")
366 .setHidden(true)
367 .setDirection(Metric.DIRECTION_WORST)
368 .setQualitative(false)
369 .setDomain(DOMAIN_COMPLEXITY)
370 .setFormula(new SumChildValuesFormula(false))
371 .setDeleteHistoricalData(true)
372 .create();
373
374 public static final String FUNCTION_COMPLEXITY_KEY = "function_complexity";
375
376 /**
377 * Information about the cyclomatic complexity per function, calculated by divided the complexity in functions by the number of functions.
378 * If the complexity in functions is not available, the complexity of the file is used.
379 */
380 public static final Metric<Double> FUNCTION_COMPLEXITY = new Metric.Builder(FUNCTION_COMPLEXITY_KEY, "Complexity /function", Metric.ValueType.FLOAT)
381 .setDescription("Complexity average by function")
382 .setDirection(Metric.DIRECTION_WORST)
383 .setQualitative(true)
384 .setDomain(DOMAIN_COMPLEXITY)
385 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY_IN_FUNCTIONS, CoreMetrics.FUNCTIONS).setFallbackForMainMetric(CoreMetrics.COMPLEXITY))
386 .create();
387
388 /**
389 * @deprecated in 3.0 - see SONAR-3289
390 */
391 @Deprecated
392 public static final String CLASS_COMPLEXITY_DISTRIBUTION_KEY = "class_complexity_distribution";
393
394 /**
395 * @deprecated in 3.0 - see SONAR-3289
396 */
397 @Deprecated
398 public static final Metric<String> CLASS_COMPLEXITY_DISTRIBUTION = new Metric.Builder(CLASS_COMPLEXITY_DISTRIBUTION_KEY, "Classes distribution /complexity",
399 Metric.ValueType.DISTRIB)
400 .setDescription("Classes distribution /complexity")
401 .setDirection(Metric.DIRECTION_NONE)
402 .setQualitative(true)
403 .setDomain(DOMAIN_COMPLEXITY)
404 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY))
405 .setHidden(true)
406 .create();
407
408 public static final String FUNCTION_COMPLEXITY_DISTRIBUTION_KEY = "function_complexity_distribution";
409 public static final Metric<String> FUNCTION_COMPLEXITY_DISTRIBUTION = new Metric.Builder(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, "Functions distribution /complexity",
410 Metric.ValueType.DISTRIB)
411 .setDescription("Functions distribution /complexity")
412 .setDirection(Metric.DIRECTION_NONE)
413 .setQualitative(true)
414 .setDomain(DOMAIN_COMPLEXITY)
415 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY))
416 .create();
417
418 public static final String FILE_COMPLEXITY_DISTRIBUTION_KEY = "file_complexity_distribution";
419 public static final Metric<String> FILE_COMPLEXITY_DISTRIBUTION = new Metric.Builder(FILE_COMPLEXITY_DISTRIBUTION_KEY, "Files distribution /complexity", Metric.ValueType.DISTRIB)
420 .setDescription("Files distribution /complexity")
421 .setDirection(Metric.DIRECTION_NONE)
422 .setQualitative(true)
423 .setDomain(DOMAIN_COMPLEXITY)
424 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY))
425 .create();
426
427 // --------------------------------------------------------------------------------------------------------------------
428 //
429 // UNIT TESTS
430 //
431 // --------------------------------------------------------------------------------------------------------------------
432
433 public static final String TESTS_KEY = "tests";
434
435 /**
436 * Value of measure for this metric can be saved from Sensor, taking into account following rules:
437 * <ul>
438 * <li>Non-zero value should be saved for resources representing tests. And Sonar provides default Decorator, which will decorate parent resources.</li>
439 * <li>Should include {@link #TEST_FAILURES} and {@link #TEST_ERRORS}, but should not include {@link #SKIPPED_TESTS}.</li>
440 * </ul>
441 */
442 public static final Metric<Integer> TESTS = new Metric.Builder(TESTS_KEY, "Unit tests", Metric.ValueType.INT)
443 .setDescription("Number of unit tests")
444 .setDirection(Metric.DIRECTION_WORST)
445 .setQualitative(false)
446 .setDomain(DOMAIN_TESTS)
447 .create();
448
449 public static final String TEST_EXECUTION_TIME_KEY = "test_execution_time";
450 public static final Metric<Integer> TEST_EXECUTION_TIME = new Metric.Builder(TEST_EXECUTION_TIME_KEY, "Unit tests duration", Metric.ValueType.MILLISEC)
451 .setDescription("Execution duration of unit tests")
452 .setDirection(Metric.DIRECTION_WORST)
453 .setQualitative(false)
454 .setDomain(DOMAIN_TESTS)
455 .create();
456
457 public static final String TEST_ERRORS_KEY = "test_errors";
458 public static final Metric<Integer> TEST_ERRORS = new Metric.Builder(TEST_ERRORS_KEY, "Unit test errors", Metric.ValueType.INT)
459 .setDescription("Number of unit test errors")
460 .setDirection(Metric.DIRECTION_WORST)
461 .setQualitative(true)
462 .setDomain(DOMAIN_TESTS)
463 .setBestValue(0.0)
464 .setOptimizedBestValue(true)
465 .create();
466
467 public static final String SKIPPED_TESTS_KEY = "skipped_tests";
468 public static final Metric<Integer> SKIPPED_TESTS = new Metric.Builder(SKIPPED_TESTS_KEY, "Skipped unit tests", Metric.ValueType.INT)
469 .setDescription("Number of skipped unit tests")
470 .setDirection(Metric.DIRECTION_WORST)
471 .setQualitative(true)
472 .setDomain(DOMAIN_TESTS)
473 .setBestValue(0.0)
474 .setOptimizedBestValue(true)
475 .create();
476
477 public static final String TEST_FAILURES_KEY = "test_failures";
478 public static final Metric<Integer> TEST_FAILURES = new Metric.Builder(TEST_FAILURES_KEY, "Unit test failures", Metric.ValueType.INT)
479 .setDescription("Number of unit test failures")
480 .setDirection(Metric.DIRECTION_WORST)
481 .setQualitative(true)
482 .setDomain(DOMAIN_TESTS)
483 .setBestValue(0.0)
484 .setOptimizedBestValue(true)
485 .create();
486
487 public static final String TEST_SUCCESS_DENSITY_KEY = "test_success_density";
488 public static final Metric<Double> TEST_SUCCESS_DENSITY = new Metric.Builder(TEST_SUCCESS_DENSITY_KEY, "Unit test success (%)", Metric.ValueType.PERCENT)
489 .setDescription("Density of successful unit tests")
490 .setDirection(Metric.DIRECTION_BETTER)
491 .setQualitative(true)
492 .setDomain(DOMAIN_TESTS)
493 .setWorstValue(0.0)
494 .setBestValue(100.0)
495 .setOptimizedBestValue(true)
496 .create();
497
498 public static final String TEST_DATA_KEY = "test_data";
499 public static final Metric<String> TEST_DATA = new Metric.Builder(TEST_DATA_KEY, "Unit tests details", Metric.ValueType.DATA)
500 .setDescription("Unit tests details")
501 .setDirection(Metric.DIRECTION_WORST)
502 .setDomain(DOMAIN_TESTS)
503 .create();
504
505 public static final String COVERAGE_KEY = "coverage";
506 public static final Metric<Double> COVERAGE = new Metric.Builder(COVERAGE_KEY, "Coverage", Metric.ValueType.PERCENT)
507 .setDescription("Coverage by unit tests")
508 .setDirection(Metric.DIRECTION_BETTER)
509 .setQualitative(true)
510 .setDomain(DOMAIN_TESTS)
511 .setWorstValue(0.0)
512 .setBestValue(100.0)
513 .create();
514
515 public static final String NEW_COVERAGE_KEY = "new_coverage";
516 public static final Metric<Double> NEW_COVERAGE = new Metric.Builder(NEW_COVERAGE_KEY, "Coverage on new code", Metric.ValueType.PERCENT)
517 .setDescription("Coverage of new/changed code")
518 .setDirection(Metric.DIRECTION_BETTER)
519 .setQualitative(true)
520 .setDomain(DOMAIN_TESTS)
521 .setWorstValue(0.0)
522 .setBestValue(100.0)
523 .setDeleteHistoricalData(true)
524 .create();
525
526 public static final String LINES_TO_COVER_KEY = "lines_to_cover";
527
528 /**
529 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
530 */
531 public static final Metric<Integer> LINES_TO_COVER = new Metric.Builder(LINES_TO_COVER_KEY, "Lines to cover", Metric.ValueType.INT)
532 .setDescription("Lines to cover")
533 .setDirection(Metric.DIRECTION_BETTER)
534 .setQualitative(false)
535 .setDomain(DOMAIN_TESTS)
536 .setFormula(new SumChildValuesFormula(false))
537 .create();
538
539 public static final String NEW_LINES_TO_COVER_KEY = "new_lines_to_cover";
540 public static final Metric<Integer> NEW_LINES_TO_COVER = new Metric.Builder(NEW_LINES_TO_COVER_KEY, "Lines to cover on new code", Metric.ValueType.INT)
541 .setDescription("Lines to cover on new code")
542 .setDirection(Metric.DIRECTION_WORST)
543 .setQualitative(false)
544 .setDomain(DOMAIN_TESTS)
545 .setFormula(new SumChildValuesFormula(false))
546 .setDeleteHistoricalData(true)
547 .create();
548
549 public static final String UNCOVERED_LINES_KEY = "uncovered_lines";
550
551 /**
552 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
553 */
554 public static final Metric<Integer> UNCOVERED_LINES = new Metric.Builder(UNCOVERED_LINES_KEY, "Uncovered lines", Metric.ValueType.INT)
555 .setDescription("Uncovered lines")
556 .setDirection(Metric.DIRECTION_WORST)
557 .setDomain(DOMAIN_TESTS)
558 .setFormula(new SumChildValuesFormula(false))
559 .setBestValue(0.0)
560 .create();
561
562 public static final String NEW_UNCOVERED_LINES_KEY = "new_uncovered_lines";
563 public static final Metric<Integer> NEW_UNCOVERED_LINES = new Metric.Builder(NEW_UNCOVERED_LINES_KEY, "Uncovered lines on new code", Metric.ValueType.INT)
564 .setDescription("Uncovered lines on new code")
565 .setDirection(Metric.DIRECTION_WORST)
566 .setDomain(DOMAIN_TESTS)
567 .setFormula(new SumChildValuesFormula(false))
568 .setBestValue(0.0)
569 .setDeleteHistoricalData(true)
570 .create();
571
572 public static final String LINE_COVERAGE_KEY = "line_coverage";
573 public static final Metric<Double> LINE_COVERAGE = new Metric.Builder(LINE_COVERAGE_KEY, "Line coverage", Metric.ValueType.PERCENT)
574 .setDescription("Line coverage")
575 .setDirection(Metric.DIRECTION_BETTER)
576 .setQualitative(true)
577 .setDomain(DOMAIN_TESTS)
578 .setWorstValue(0.0)
579 .setBestValue(100.0)
580 .create();
581
582 public static final String NEW_LINE_COVERAGE_KEY = "new_line_coverage";
583 public static final Metric<Double> NEW_LINE_COVERAGE = new Metric.Builder(NEW_LINE_COVERAGE_KEY, "Line coverage on new code", Metric.ValueType.PERCENT)
584 .setDescription("Line coverage of added/changed code")
585 .setDirection(Metric.DIRECTION_BETTER)
586 .setQualitative(true)
587 .setWorstValue(0.0)
588 .setBestValue(100.0)
589 .setDomain(DOMAIN_TESTS)
590 .setDeleteHistoricalData(true)
591 .create();
592
593 public static final String COVERAGE_LINE_HITS_DATA_KEY = "coverage_line_hits_data";
594
595 /**
596 * Key-value pairs, where key - is a number of line, and value - is a number of hits for this line.
597 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
598 */
599 public static final Metric<String> COVERAGE_LINE_HITS_DATA = new Metric.Builder(COVERAGE_LINE_HITS_DATA_KEY, "Coverage hits by line", Metric.ValueType.DATA)
600 .setDomain(DOMAIN_TESTS)
601 .setDeleteHistoricalData(true)
602 .create();
603
604 public static final String CONDITIONS_TO_COVER_KEY = "conditions_to_cover";
605
606 /**
607 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
608 */
609 public static final Metric<Integer> CONDITIONS_TO_COVER = new Metric.Builder(CONDITIONS_TO_COVER_KEY, "Branches to cover", Metric.ValueType.INT)
610 .setDescription("Branches to cover")
611 .setDomain(DOMAIN_TESTS)
612 .setFormula(new SumChildValuesFormula(false))
613 .setHidden(true)
614 .create();
615
616 public static final String NEW_CONDITIONS_TO_COVER_KEY = "new_conditions_to_cover";
617 public static final Metric<Integer> NEW_CONDITIONS_TO_COVER = new Metric.Builder(NEW_CONDITIONS_TO_COVER_KEY, "Branches to cover on new code", Metric.ValueType.INT)
618 .setDescription("Branches to cover on new code")
619 .setDomain(DOMAIN_TESTS)
620 .setFormula(new SumChildValuesFormula(false))
621 .setDeleteHistoricalData(true)
622 .setHidden(true)
623 .create();
624
625 public static final String UNCOVERED_CONDITIONS_KEY = "uncovered_conditions";
626
627 /**
628 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
629 */
630 public static final Metric<Integer> UNCOVERED_CONDITIONS = new Metric.Builder(UNCOVERED_CONDITIONS_KEY, "Uncovered branches", Metric.ValueType.INT)
631 .setDescription("Uncovered branches")
632 .setDirection(Metric.DIRECTION_WORST)
633 .setDomain(DOMAIN_TESTS)
634 .setFormula(new SumChildValuesFormula(false))
635 .setBestValue(0.0)
636 .create();
637
638 public static final String NEW_UNCOVERED_CONDITIONS_KEY = "new_uncovered_conditions";
639 public static final Metric<Integer> NEW_UNCOVERED_CONDITIONS = new Metric.Builder(NEW_UNCOVERED_CONDITIONS_KEY, "Uncovered branches on new code", Metric.ValueType.INT)
640 .setDescription("Uncovered branches on new code")
641 .setDirection(Metric.DIRECTION_WORST)
642 .setDomain(DOMAIN_TESTS)
643 .setFormula(new SumChildValuesFormula(false))
644 .setBestValue(0.0)
645 .setDeleteHistoricalData(true)
646 .create();
647
648 public static final String BRANCH_COVERAGE_KEY = "branch_coverage";
649 public static final Metric<Double> BRANCH_COVERAGE = new Metric.Builder(BRANCH_COVERAGE_KEY, "Condition coverage", Metric.ValueType.PERCENT)
650 .setDescription("Condition coverage")
651 .setDirection(Metric.DIRECTION_BETTER)
652 .setQualitative(true)
653 .setDomain(DOMAIN_TESTS)
654 .setWorstValue(0.0)
655 .setBestValue(100.0)
656 .create();
657
658 public static final String NEW_BRANCH_COVERAGE_KEY = "new_branch_coverage";
659 public static final Metric<Double> NEW_BRANCH_COVERAGE = new Metric.Builder(NEW_BRANCH_COVERAGE_KEY, "Condition coverage on new code", Metric.ValueType.PERCENT)
660 .setDescription("Condition coverage of new/changed code")
661 .setDirection(Metric.DIRECTION_BETTER)
662 .setQualitative(true)
663 .setDomain(DOMAIN_TESTS)
664 .setWorstValue(0.0)
665 .setBestValue(100.0)
666 .setDeleteHistoricalData(true)
667 .create();
668
669 public static final String CONDITIONS_BY_LINE_KEY = "conditions_by_line";
670
671 /**
672 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
673 *
674 * @since 2.7
675 */
676 public static final Metric<String> CONDITIONS_BY_LINE = new Metric.Builder(CONDITIONS_BY_LINE_KEY, "Conditions by line", Metric.ValueType.DATA)
677 .setDomain(DOMAIN_TESTS)
678 .setDeleteHistoricalData(true)
679 .create();
680
681 public static final String COVERED_CONDITIONS_BY_LINE_KEY = "covered_conditions_by_line";
682
683 /**
684 * Use {@link CoverageMeasuresBuilder} to build measure for this metric.
685 *
686 * @since 2.7
687 */
688 public static final Metric<String> COVERED_CONDITIONS_BY_LINE = new Metric.Builder(COVERED_CONDITIONS_BY_LINE_KEY, "Covered conditions by line", Metric.ValueType.DATA)
689 .setDomain(DOMAIN_TESTS)
690 .setDeleteHistoricalData(true)
691 .create();
692
693 // --------------------------------------------------------------------------------------------------------------------
694 //
695 // INTEGRATION TESTS
696 //
697 // --------------------------------------------------------------------------------------------------------------------
698
699 /**
700 * @since 2.12
701 */
702 public static final String IT_COVERAGE_KEY = "it_coverage";
703
704 /**
705 * @since 2.12
706 */
707 public static final Metric<Double> IT_COVERAGE = new Metric.Builder(IT_COVERAGE_KEY, "IT coverage", Metric.ValueType.PERCENT)
708 .setDescription("Coverage by integration tests")
709 .setDirection(Metric.DIRECTION_BETTER)
710 .setQualitative(true)
711 .setDomain(DOMAIN_INTEGRATION_TESTS)
712 .setWorstValue(0.0)
713 .setBestValue(100.0)
714 .create();
715
716 /**
717 * @since 2.12
718 */
719 public static final String NEW_IT_COVERAGE_KEY = "new_it_coverage";
720
721 /**
722 * @since 2.12
723 */
724 public static final Metric<Double> NEW_IT_COVERAGE = new Metric.Builder(NEW_IT_COVERAGE_KEY, "Coverage by IT on new code", Metric.ValueType.PERCENT)
725 .setDescription("Integration Tests Coverage of new/changed code")
726 .setDirection(Metric.DIRECTION_BETTER)
727 .setQualitative(true)
728 .setDomain(DOMAIN_INTEGRATION_TESTS)
729 .setWorstValue(0.0)
730 .setBestValue(100.0)
731 .setDeleteHistoricalData(true)
732 .create();
733
734 /**
735 * @since 2.12
736 */
737 public static final String IT_LINES_TO_COVER_KEY = "it_lines_to_cover";
738
739 /**
740 * @since 2.12
741 */
742 public static final Metric<Integer> IT_LINES_TO_COVER = new Metric.Builder(IT_LINES_TO_COVER_KEY, "IT lines to cover", Metric.ValueType.INT)
743 .setDescription("Lines to cover by Integration Tests")
744 .setDirection(Metric.DIRECTION_BETTER)
745 .setDomain(DOMAIN_INTEGRATION_TESTS)
746 .setQualitative(false)
747 .setFormula(new SumChildValuesFormula(false))
748 .setHidden(true)
749 .create();
750
751 /**
752 * @since 2.12
753 */
754 public static final String NEW_IT_LINES_TO_COVER_KEY = "new_it_lines_to_cover";
755
756 /**
757 * @since 2.12
758 */
759 public static final Metric<Integer> NEW_IT_LINES_TO_COVER = new Metric.Builder(NEW_IT_LINES_TO_COVER_KEY, "Lines to cover by IT on new code", Metric.ValueType.INT)
760 .setDescription("Lines to cover by Integration Tests on new code")
761 .setDirection(Metric.DIRECTION_WORST)
762 .setQualitative(false)
763 .setDomain(DOMAIN_INTEGRATION_TESTS)
764 .setFormula(new SumChildValuesFormula(false))
765 .setDeleteHistoricalData(true)
766 .create();
767
768 /**
769 * @since 2.12
770 */
771 public static final String IT_UNCOVERED_LINES_KEY = "it_uncovered_lines";
772
773 /**
774 * @since 2.12
775 */
776 public static final Metric<Integer> IT_UNCOVERED_LINES = new Metric.Builder(IT_UNCOVERED_LINES_KEY, "IT uncovered lines", Metric.ValueType.INT)
777 .setDescription("IT uncovered lines")
778 .setDirection(Metric.DIRECTION_WORST)
779 .setQualitative(false)
780 .setDomain(DOMAIN_INTEGRATION_TESTS)
781 .setFormula(new SumChildValuesFormula(false))
782 .create();
783
784 /**
785 * @since 2.12
786 */
787 public static final String NEW_IT_UNCOVERED_LINES_KEY = "new_it_uncovered_lines";
788
789 /**
790 * @since 2.12
791 */
792 public static final Metric<Integer> NEW_IT_UNCOVERED_LINES = new Metric.Builder(NEW_IT_UNCOVERED_LINES_KEY, "Uncovered lines by IT on new code", Metric.ValueType.INT)
793 .setDescription("Uncovered lines by IT on new code")
794 .setDirection(Metric.DIRECTION_WORST)
795 .setDomain(DOMAIN_INTEGRATION_TESTS)
796 .setFormula(new SumChildValuesFormula(false))
797 .setBestValue(0.0)
798 .setDeleteHistoricalData(true)
799 .create();
800
801 /**
802 * @since 2.12
803 */
804 public static final String IT_LINE_COVERAGE_KEY = "it_line_coverage";
805
806 /**
807 * @since 2.12
808 */
809 public static final Metric<Double> IT_LINE_COVERAGE = new Metric.Builder(IT_LINE_COVERAGE_KEY, "IT line coverage", Metric.ValueType.PERCENT)
810 .setDescription("IT line coverage")
811 .setDirection(Metric.DIRECTION_BETTER)
812 .setQualitative(true)
813 .setDomain(DOMAIN_INTEGRATION_TESTS)
814 .create();
815
816 /**
817 * @since 2.12
818 */
819 public static final String NEW_IT_LINE_COVERAGE_KEY = "new_it_line_coverage";
820
821 /**
822 * @since 2.12
823 */
824 public static final Metric<Double> NEW_IT_LINE_COVERAGE = new Metric.Builder(NEW_IT_LINE_COVERAGE_KEY, "Line coverage by IT on new code", Metric.ValueType.PERCENT)
825 .setDescription("Line Coverage by Integration Tests of added/changed code")
826 .setDirection(Metric.DIRECTION_BETTER)
827 .setQualitative(true)
828 .setWorstValue(0.0)
829 .setBestValue(100.0)
830 .setDomain(DOMAIN_INTEGRATION_TESTS)
831 .setDeleteHistoricalData(true)
832 .create();
833
834 /**
835 * @since 2.12
836 */
837 public static final String IT_COVERAGE_LINE_HITS_DATA_KEY = "it_coverage_line_hits_data";
838
839 /**
840 * @since 2.12
841 */
842 public static final Metric<String> IT_COVERAGE_LINE_HITS_DATA = new Metric.Builder(IT_COVERAGE_LINE_HITS_DATA_KEY, "IT coverage hits data", Metric.ValueType.DATA)
843 .setDescription("Integration Tests Code coverage line hits data")
844 .setDirection(Metric.DIRECTION_NONE)
845 .setQualitative(false)
846 .setDomain(DOMAIN_INTEGRATION_TESTS)
847 .setDeleteHistoricalData(true)
848 .create();
849
850 /**
851 * @since 2.12
852 */
853 public static final String IT_CONDITIONS_TO_COVER_KEY = "it_conditions_to_cover";
854
855 /**
856 * @since 2.12
857 */
858 public static final Metric<Integer> IT_CONDITIONS_TO_COVER = new Metric.Builder(IT_CONDITIONS_TO_COVER_KEY, "IT branches to cover", Metric.ValueType.INT)
859 .setDescription("Integration Tests conditions to cover")
860 .setDirection(Metric.DIRECTION_BETTER)
861 .setQualitative(false)
862 .setDomain(DOMAIN_INTEGRATION_TESTS)
863 .setFormula(new SumChildValuesFormula(false))
864 .setHidden(true)
865 .create();
866
867 /**
868 * @since 2.12
869 */
870 public static final String NEW_IT_CONDITIONS_TO_COVER_KEY = "new_it_conditions_to_cover";
871
872 /**
873 * @since 2.12
874 */
875 public static final Metric<Integer> NEW_IT_CONDITIONS_TO_COVER = new Metric.Builder(NEW_IT_CONDITIONS_TO_COVER_KEY, "Branches to cover by IT on new code", Metric.ValueType.INT)
876 .setDescription("Branches to cover by Integration Tests on new code")
877 .setDomain(DOMAIN_INTEGRATION_TESTS)
878 .setFormula(new SumChildValuesFormula(false))
879 .setDeleteHistoricalData(true)
880 .setHidden(true)
881 .create();
882
883 /**
884 * @since 2.12
885 */
886 public static final String IT_UNCOVERED_CONDITIONS_KEY = "it_uncovered_conditions";
887
888 /**
889 * @since 2.12
890 */
891 public static final Metric<Integer> IT_UNCOVERED_CONDITIONS = new Metric.Builder(IT_UNCOVERED_CONDITIONS_KEY, "IT uncovered branches", Metric.ValueType.INT)
892 .setDescription("Integration Tests uncovered conditions")
893 .setDirection(Metric.DIRECTION_WORST)
894 .setDomain(DOMAIN_INTEGRATION_TESTS)
895 .setFormula(new SumChildValuesFormula(false))
896 .create();
897
898 /**
899 * @since 2.12
900 */
901 public static final String NEW_IT_UNCOVERED_CONDITIONS_KEY = "new_it_uncovered_conditions";
902
903 /**
904 * @since 2.12
905 */
906 public static final Metric<Integer> NEW_IT_UNCOVERED_CONDITIONS = new Metric.Builder(NEW_IT_UNCOVERED_CONDITIONS_KEY, "Uncovered branches by IT on new code",
907 Metric.ValueType.INT)
908 .setDescription("Uncovered branches by Integration Tests on new code")
909 .setDirection(Metric.DIRECTION_WORST)
910 .setDomain(DOMAIN_INTEGRATION_TESTS)
911 .setFormula(new SumChildValuesFormula(false))
912 .setBestValue(0.0)
913 .setDeleteHistoricalData(true)
914 .create();
915
916 /**
917 * @since 2.12
918 */
919 public static final String IT_BRANCH_COVERAGE_KEY = "it_branch_coverage";
920
921 /**
922 * @since 2.12
923 */
924 public static final Metric<Double> IT_BRANCH_COVERAGE = new Metric.Builder(IT_BRANCH_COVERAGE_KEY, "IT condition coverage", Metric.ValueType.PERCENT)
925 .setDescription("IT condition coverage")
926 .setDirection(Metric.DIRECTION_BETTER)
927 .setQualitative(true)
928 .setDomain(DOMAIN_INTEGRATION_TESTS)
929 .setWorstValue(0.0)
930 .setBestValue(100.0)
931 .create();
932
933 /**
934 * @since 2.12
935 */
936 public static final String NEW_IT_BRANCH_COVERAGE_KEY = "new_it_branch_coverage";
937
938 /**
939 * @since 2.12
940 */
941 public static final Metric<Double> NEW_IT_BRANCH_COVERAGE = new Metric.Builder(NEW_IT_BRANCH_COVERAGE_KEY, "Condition coverage by IT on new code", Metric.ValueType.PERCENT)
942 .setDescription("Condition coverage by Integration Tests of new/changed code")
943 .setDirection(Metric.DIRECTION_BETTER)
944 .setQualitative(true)
945 .setDomain(DOMAIN_INTEGRATION_TESTS)
946 .setWorstValue(0.0)
947 .setBestValue(100.0)
948 .setDeleteHistoricalData(true)
949 .create();
950
951 /**
952 * @since 2.12
953 */
954 public static final String IT_CONDITIONS_BY_LINE_KEY = "it_conditions_by_line";
955
956 /**
957 * @since 2.12
958 */
959 public static final Metric<String> IT_CONDITIONS_BY_LINE = new Metric.Builder(IT_CONDITIONS_BY_LINE_KEY, "IT conditions by line", Metric.ValueType.DATA)
960 .setDomain(DOMAIN_INTEGRATION_TESTS)
961 .setDeleteHistoricalData(true)
962 .create();
963
964 /**
965 * @since 2.12
966 */
967 public static final String IT_COVERED_CONDITIONS_BY_LINE_KEY = "it_covered_conditions_by_line";
968
969 /**
970 * @since 2.12
971 */
972 public static final Metric<String> IT_COVERED_CONDITIONS_BY_LINE = new Metric.Builder(IT_COVERED_CONDITIONS_BY_LINE_KEY, "IT covered conditions by line", Metric.ValueType.DATA)
973 .setDomain(DOMAIN_INTEGRATION_TESTS)
974 .setDeleteHistoricalData(true)
975 .create();
976
977 // --------------------------------------------------------------------------------------------------------------------
978 //
979 // OVERALL TESTS
980 //
981 // --------------------------------------------------------------------------------------------------------------------
982
983 /**
984 * @since 3.3
985 */
986 public static final String OVERALL_COVERAGE_KEY = "overall_coverage";
987
988 /**
989 * @since 3.3
990 */
991 public static final Metric<Double> OVERALL_COVERAGE = new Metric.Builder(OVERALL_COVERAGE_KEY, "Overall coverage", Metric.ValueType.PERCENT)
992 .setDescription("Overall test coverage")
993 .setDirection(Metric.DIRECTION_BETTER)
994 .setQualitative(true)
995 .setDomain(DOMAIN_OVERALL_TESTS)
996 .setWorstValue(0.0)
997 .setBestValue(100.0)
998 .create();
999
1000 /**
1001 * @since 3.3
1002 */
1003 public static final String NEW_OVERALL_COVERAGE_KEY = "new_overall_coverage";
1004
1005 /**
1006 * @since 3.3
1007 */
1008 public static final Metric<Double> NEW_OVERALL_COVERAGE = new Metric.Builder(NEW_OVERALL_COVERAGE_KEY, "Overall coverage on new code", Metric.ValueType.PERCENT)
1009 .setDescription("Overall coverage of new/changed code")
1010 .setDirection(Metric.DIRECTION_BETTER)
1011 .setQualitative(true)
1012 .setDomain(DOMAIN_OVERALL_TESTS)
1013 .setWorstValue(0.0)
1014 .setBestValue(100.0)
1015 .setDeleteHistoricalData(true)
1016 .create();
1017
1018 /**
1019 * @since 3.3
1020 */
1021 public static final String OVERALL_LINES_TO_COVER_KEY = "overall_lines_to_cover";
1022
1023 /**
1024 * @since 3.3
1025 */
1026 public static final Metric<Integer> OVERALL_LINES_TO_COVER = new Metric.Builder(OVERALL_LINES_TO_COVER_KEY, "Overall lines to cover", Metric.ValueType.INT)
1027 .setDescription("Overall lines to cover by all tests")
1028 .setDirection(Metric.DIRECTION_BETTER)
1029 .setDomain(DOMAIN_OVERALL_TESTS)
1030 .setQualitative(false)
1031 .setFormula(new SumChildValuesFormula(false))
1032 .setHidden(true)
1033 .create();
1034
1035 /**
1036 * @since 3.3
1037 */
1038 public static final String NEW_OVERALL_LINES_TO_COVER_KEY = "new_overall_lines_to_cover";
1039
1040 /**
1041 * @since 3.3
1042 */
1043 public static final Metric<Integer> NEW_OVERALL_LINES_TO_COVER = new Metric.Builder(NEW_OVERALL_LINES_TO_COVER_KEY, "Overall lines to cover on new code", Metric.ValueType.INT)
1044 .setDescription("New lines to cover by all tests")
1045 .setDirection(Metric.DIRECTION_WORST)
1046 .setQualitative(false)
1047 .setDomain(DOMAIN_OVERALL_TESTS)
1048 .setFormula(new SumChildValuesFormula(false))
1049 .setDeleteHistoricalData(true)
1050 .create();
1051
1052 /**
1053 * @since 3.3
1054 */
1055 public static final String OVERALL_UNCOVERED_LINES_KEY = "overall_uncovered_lines";
1056
1057 /**
1058 * @since 3.3
1059 */
1060 public static final Metric<Integer> OVERALL_UNCOVERED_LINES = new Metric.Builder(OVERALL_UNCOVERED_LINES_KEY, "Overall uncovered lines", Metric.ValueType.INT)
1061 .setDescription("Uncovered lines by all tests")
1062 .setDirection(Metric.DIRECTION_WORST)
1063 .setQualitative(false)
1064 .setDomain(DOMAIN_OVERALL_TESTS)
1065 .setFormula(new SumChildValuesFormula(false))
1066 .create();
1067
1068 /**
1069 * @since 3.3
1070 */
1071 public static final String NEW_OVERALL_UNCOVERED_LINES_KEY = "new_overall_uncovered_lines";
1072
1073 /**
1074 * @since 3.3
1075 */
1076 public static final Metric<Integer> NEW_OVERALL_UNCOVERED_LINES = new Metric.Builder(NEW_OVERALL_UNCOVERED_LINES_KEY, "Overall uncovered lines on new code", Metric.ValueType.INT)
1077 .setDescription("New lines that are not covered by any tests")
1078 .setDirection(Metric.DIRECTION_WORST)
1079 .setDomain(DOMAIN_OVERALL_TESTS)
1080 .setFormula(new SumChildValuesFormula(false))
1081 .setBestValue(0.0)
1082 .setDeleteHistoricalData(true)
1083 .create();
1084
1085 /**
1086 * @since 3.3
1087 */
1088 public static final String OVERALL_LINE_COVERAGE_KEY = "overall_line_coverage";
1089
1090 /**
1091 * @since 3.3
1092 */
1093 public static final Metric<Double> OVERALL_LINE_COVERAGE = new Metric.Builder(OVERALL_LINE_COVERAGE_KEY, "Overall line coverage", Metric.ValueType.PERCENT)
1094 .setDescription("Line coverage by all tests")
1095 .setDirection(Metric.DIRECTION_BETTER)
1096 .setQualitative(true)
1097 .setDomain(DOMAIN_OVERALL_TESTS)
1098 .create();
1099
1100 /**
1101 * @since 3.3
1102 */
1103 public static final String NEW_OVERALL_LINE_COVERAGE_KEY = "new_overall_line_coverage";
1104
1105 /**
1106 * @since 3.3
1107 */
1108 public static final Metric<Double> NEW_OVERALL_LINE_COVERAGE = new Metric.Builder(NEW_OVERALL_LINE_COVERAGE_KEY, "Overall line coverage on new code", Metric.ValueType.PERCENT)
1109 .setDescription("Line coverage of added/changed code by all tests")
1110 .setDirection(Metric.DIRECTION_BETTER)
1111 .setQualitative(true)
1112 .setWorstValue(0.0)
1113 .setBestValue(100.0)
1114 .setDomain(DOMAIN_OVERALL_TESTS)
1115 .setDeleteHistoricalData(true)
1116 .create();
1117
1118 /**
1119 * @since 3.3
1120 */
1121 public static final String OVERALL_COVERAGE_LINE_HITS_DATA_KEY = "overall_coverage_line_hits_data";
1122
1123 /**
1124 * @since 3.3
1125 */
1126 public static final Metric<String> OVERALL_COVERAGE_LINE_HITS_DATA = new Metric.Builder(OVERALL_COVERAGE_LINE_HITS_DATA_KEY, "Overall coverage hits by line",
1127 Metric.ValueType.DATA)
1128 .setDescription("Coverage hits by all tests and by line")
1129 .setDirection(Metric.DIRECTION_NONE)
1130 .setQualitative(false)
1131 .setDomain(DOMAIN_OVERALL_TESTS)
1132 .setDeleteHistoricalData(true)
1133 .create();
1134
1135 /**
1136 * @since 3.3
1137 */
1138 public static final String OVERALL_CONDITIONS_TO_COVER_KEY = "overall_conditions_to_cover";
1139
1140 /**
1141 * @since 3.3
1142 */
1143 public static final Metric<Integer> OVERALL_CONDITIONS_TO_COVER = new Metric.Builder(OVERALL_CONDITIONS_TO_COVER_KEY, "Overall branches to cover", Metric.ValueType.INT)
1144 .setDescription("Branches to cover by all tests")
1145 .setDirection(Metric.DIRECTION_BETTER)
1146 .setQualitative(false)
1147 .setDomain(DOMAIN_OVERALL_TESTS)
1148 .setFormula(new SumChildValuesFormula(false))
1149 .setHidden(true)
1150 .create();
1151
1152 /**
1153 * @since 3.3
1154 */
1155 public static final String NEW_OVERALL_CONDITIONS_TO_COVER_KEY = "new_overall_conditions_to_cover";
1156
1157 /**
1158 * @since 3.3
1159 */
1160 public static final Metric<Integer> NEW_OVERALL_CONDITIONS_TO_COVER = new Metric.Builder(NEW_OVERALL_CONDITIONS_TO_COVER_KEY, "Overall branches to cover on new code",
1161 Metric.ValueType.INT)
1162 .setDescription("New branches to cover by all tests")
1163 .setDomain(DOMAIN_OVERALL_TESTS)
1164 .setFormula(new SumChildValuesFormula(false))
1165 .setDeleteHistoricalData(true)
1166 .setHidden(true)
1167 .create();
1168
1169 /**
1170 * @since 3.3
1171 */
1172 public static final String OVERALL_UNCOVERED_CONDITIONS_KEY = "overall_uncovered_conditions";
1173
1174 /**
1175 * @since 3.3
1176 */
1177 public static final Metric<Integer> OVERALL_UNCOVERED_CONDITIONS = new Metric.Builder(OVERALL_UNCOVERED_CONDITIONS_KEY, "Overall uncovered branches", Metric.ValueType.INT)
1178 .setDescription("Uncovered branches by all tests")
1179 .setDirection(Metric.DIRECTION_WORST)
1180 .setDomain(DOMAIN_OVERALL_TESTS)
1181 .setFormula(new SumChildValuesFormula(false))
1182 .create();
1183
1184 /**
1185 * @since 3.3
1186 */
1187 public static final String NEW_OVERALL_UNCOVERED_CONDITIONS_KEY = "new_overall_uncovered_conditions";
1188
1189 /**
1190 * @since 3.3
1191 */
1192 public static final Metric<Integer> NEW_OVERALL_UNCOVERED_CONDITIONS = new Metric.Builder(NEW_OVERALL_UNCOVERED_CONDITIONS_KEY, "Overall uncovered branches on new code",
1193 Metric.ValueType.INT)
1194 .setDescription("New branches that are not covered by any test")
1195 .setDirection(Metric.DIRECTION_WORST)
1196 .setDomain(DOMAIN_OVERALL_TESTS)
1197 .setFormula(new SumChildValuesFormula(false))
1198 .setBestValue(0.0)
1199 .setDeleteHistoricalData(true)
1200 .create();
1201
1202 /**
1203 * @since 3.3
1204 */
1205 public static final String OVERALL_BRANCH_COVERAGE_KEY = "overall_branch_coverage";
1206
1207 /**
1208 * @since 3.3
1209 */
1210 public static final Metric<Double> OVERALL_BRANCH_COVERAGE = new Metric.Builder(OVERALL_BRANCH_COVERAGE_KEY, "Overall condition coverage", Metric.ValueType.PERCENT)
1211 .setDescription("Condition coverage by all tests")
1212 .setDirection(Metric.DIRECTION_BETTER)
1213 .setQualitative(true)
1214 .setDomain(DOMAIN_OVERALL_TESTS)
1215 .setWorstValue(0.0)
1216 .setBestValue(100.0)
1217 .create();
1218
1219 /**
1220 * @since 3.3
1221 */
1222 public static final String NEW_OVERALL_BRANCH_COVERAGE_KEY = "new_overall_branch_coverage";
1223
1224 /**
1225 * @since 3.3
1226 */
1227 public static final Metric<Double> NEW_OVERALL_BRANCH_COVERAGE = new Metric.Builder(NEW_OVERALL_BRANCH_COVERAGE_KEY, "Overall condition coverage on new code",
1228 Metric.ValueType.PERCENT)
1229 .setDescription("Condition coverage of new/changed code by all tests")
1230 .setDirection(Metric.DIRECTION_BETTER)
1231 .setQualitative(true)
1232 .setDomain(DOMAIN_OVERALL_TESTS)
1233 .setWorstValue(0.0)
1234 .setBestValue(100.0)
1235 .setDeleteHistoricalData(true)
1236 .create();
1237
1238 /**
1239 * @since 3.3
1240 */
1241 public static final String OVERALL_CONDITIONS_BY_LINE_KEY = "overall_conditions_by_line";
1242
1243 /**
1244 * @since 3.3
1245 */
1246 public static final Metric<String> OVERALL_CONDITIONS_BY_LINE = new Metric.Builder(OVERALL_CONDITIONS_BY_LINE_KEY, "Overall conditions by line", Metric.ValueType.DATA)
1247 .setDescription("Overall conditions by all tests and by line")
1248 .setDomain(DOMAIN_OVERALL_TESTS)
1249 .setDeleteHistoricalData(true)
1250 .create();
1251
1252 /**
1253 * @since 3.3
1254 */
1255 public static final String OVERALL_COVERED_CONDITIONS_BY_LINE_KEY = "overall_covered_conditions_by_line";
1256
1257 /**
1258 * @since 3.3
1259 */
1260 public static final Metric<String> OVERALL_COVERED_CONDITIONS_BY_LINE = new Metric.Builder(OVERALL_COVERED_CONDITIONS_BY_LINE_KEY, "Overall covered branches by line",
1261 Metric.ValueType.DATA)
1262 .setDescription("Overall covered branches by all tests and by line")
1263 .setDomain(DOMAIN_OVERALL_TESTS)
1264 .setDeleteHistoricalData(true)
1265 .create();
1266
1267 // --------------------------------------------------------------------------------------------------------------------
1268 //
1269 // DUPLICATIONS
1270 //
1271 // --------------------------------------------------------------------------------------------------------------------
1272
1273 public static final String DUPLICATED_LINES_KEY = "duplicated_lines";
1274 public static final Metric<Integer> DUPLICATED_LINES = new Metric.Builder(DUPLICATED_LINES_KEY, "Duplicated lines", Metric.ValueType.INT)
1275 .setDescription("Duplicated lines")
1276 .setDirection(Metric.DIRECTION_WORST)
1277 .setQualitative(true)
1278 .setDomain(DOMAIN_DUPLICATION)
1279 .setBestValue(0.0)
1280 .setOptimizedBestValue(true)
1281 .create();
1282
1283 public static final String DUPLICATED_BLOCKS_KEY = "duplicated_blocks";
1284 public static final Metric<Integer> DUPLICATED_BLOCKS = new Metric.Builder(DUPLICATED_BLOCKS_KEY, "Duplicated blocks", Metric.ValueType.INT)
1285 .setDescription("Duplicated blocks")
1286 .setDirection(Metric.DIRECTION_WORST)
1287 .setQualitative(true)
1288 .setDomain(DOMAIN_DUPLICATION)
1289 .setBestValue(0.0)
1290 .setOptimizedBestValue(true)
1291 .create();
1292
1293 public static final String DUPLICATED_FILES_KEY = "duplicated_files";
1294
1295 /**
1296 * For files: if it contains duplicates, then 1, otherwise 0.
1297 * For other resources: amount of files under this resource with duplicates.
1298 */
1299 public static final Metric<Integer> DUPLICATED_FILES = new Metric.Builder(DUPLICATED_FILES_KEY, "Duplicated files", Metric.ValueType.INT)
1300 .setDescription("Duplicated files")
1301 .setDirection(Metric.DIRECTION_WORST)
1302 .setQualitative(true)
1303 .setDomain(DOMAIN_DUPLICATION)
1304 .setBestValue(0.0)
1305 .setOptimizedBestValue(true)
1306 .create();
1307
1308 public static final String DUPLICATED_LINES_DENSITY_KEY = "duplicated_lines_density";
1309 public static final Metric<Double> DUPLICATED_LINES_DENSITY = new Metric.Builder(DUPLICATED_LINES_DENSITY_KEY, "Duplicated lines (%)", Metric.ValueType.PERCENT)
1310 .setDescription("Duplicated lines balanced by statements")
1311 .setDirection(Metric.DIRECTION_WORST)
1312 .setQualitative(true)
1313 .setDomain(DOMAIN_DUPLICATION)
1314 .setWorstValue(50.0)
1315 .setBestValue(0.0)
1316 .setOptimizedBestValue(true)
1317 .create();
1318
1319 /**
1320 * @deprecated since 4.5. Internal storage of duplication is not an API.
1321 */
1322 @Deprecated
1323 public static final String DUPLICATIONS_DATA_KEY = "duplications_data";
1324
1325 /**
1326 * Information about duplications, which is represented as an XML string.
1327 * <p>
1328 * Here is the format (since Sonar 2.12):
1329 * <pre>
1330 * <duplications>
1331 * <!-- Multiple groups: -->
1332 * <g>
1333 * <!-- Multiple blocks: -->
1334 * <b r="[resource key]" s="[first line]" l="[number of lines]" />
1335 * ...
1336 * </g>
1337 * ...
1338 * </duplications>
1339 * </pre>
1340 * </p>
1341 * @deprecated since 4.5. Internal storage of duplication is not an API.
1342 */
1343 @Deprecated
1344 public static final Metric<String> DUPLICATIONS_DATA = new Metric.Builder(DUPLICATIONS_DATA_KEY, "Duplications details", Metric.ValueType.DATA)
1345 .setDescription("Duplications details")
1346 .setDirection(Metric.DIRECTION_NONE)
1347 .setQualitative(false)
1348 .setDomain(DOMAIN_DUPLICATION)
1349 .setDeleteHistoricalData(true)
1350 .create();
1351
1352 /**
1353 * @since 4.5 used by dev cockpit.
1354 */
1355 @Beta
1356 public static final String DUPLICATION_LINES_DATA_KEY = "duplication_lines_data";
1357
1358 /**
1359 * Information about duplication in file.
1360 * Key-value pairs, where key - is a number of line, and value - is an indicator of whether line is duplicated somewhere (1) or not (0).
1361 *
1362 * @see org.sonar.api.measures.FileLinesContext
1363 * @since 4.5 used by dev cockpit
1364 */
1365 @Beta
1366 public static final Metric<String> DUPLICATION_LINES_DATA = new Metric.Builder(DUPLICATION_LINES_DATA_KEY, "duplication_lines_data", Metric.ValueType.DATA)
1367 .setHidden(true)
1368 .setDomain(DOMAIN_DUPLICATION)
1369 .create();
1370
1371 // --------------------------------------------------------------------------------------------------------------------
1372 //
1373 // CODING RULES
1374 //
1375 // --------------------------------------------------------------------------------------------------------------------
1376
1377 public static final String VIOLATIONS_KEY = "violations";
1378 public static final Metric<Integer> VIOLATIONS = new Metric.Builder(VIOLATIONS_KEY, "Issues", Metric.ValueType.INT)
1379 .setDescription("Issues")
1380 .setDirection(Metric.DIRECTION_WORST)
1381 .setQualitative(true)
1382 .setDomain(DOMAIN_ISSUES)
1383 .setBestValue(0.0)
1384 .setOptimizedBestValue(true)
1385 .create();
1386
1387 public static final String BLOCKER_VIOLATIONS_KEY = "blocker_violations";
1388 public static final Metric<Integer> BLOCKER_VIOLATIONS = new Metric.Builder(BLOCKER_VIOLATIONS_KEY, "Blocker issues", Metric.ValueType.INT)
1389 .setDescription("Blocker issues")
1390 .setDirection(Metric.DIRECTION_WORST)
1391 .setQualitative(true)
1392 .setDomain(DOMAIN_ISSUES)
1393 .setBestValue(0.0)
1394 .setOptimizedBestValue(true)
1395 .create();
1396
1397 public static final String CRITICAL_VIOLATIONS_KEY = "critical_violations";
1398 public static final Metric<Integer> CRITICAL_VIOLATIONS = new Metric.Builder(CRITICAL_VIOLATIONS_KEY, "Critical issues", Metric.ValueType.INT)
1399 .setDescription("Critical issues")
1400 .setDirection(Metric.DIRECTION_WORST)
1401 .setQualitative(true)
1402 .setDomain(DOMAIN_ISSUES)
1403 .setBestValue(0.0)
1404 .setOptimizedBestValue(true)
1405 .create();
1406
1407 public static final String MAJOR_VIOLATIONS_KEY = "major_violations";
1408 public static final Metric<Integer> MAJOR_VIOLATIONS = new Metric.Builder(MAJOR_VIOLATIONS_KEY, "Major issues", Metric.ValueType.INT)
1409 .setDescription("Major issues")
1410 .setDirection(Metric.DIRECTION_WORST)
1411 .setQualitative(true)
1412 .setDomain(DOMAIN_ISSUES)
1413 .setBestValue(0.0)
1414 .setOptimizedBestValue(true)
1415 .create();
1416
1417 public static final String MINOR_VIOLATIONS_KEY = "minor_violations";
1418 public static final Metric<Integer> MINOR_VIOLATIONS = new Metric.Builder(MINOR_VIOLATIONS_KEY, "Minor issues", Metric.ValueType.INT)
1419 .setDescription("Minor issues")
1420 .setDirection(Metric.DIRECTION_WORST)
1421 .setQualitative(true)
1422 .setDomain(DOMAIN_ISSUES)
1423 .setBestValue(0.0)
1424 .setOptimizedBestValue(true)
1425 .create();
1426
1427 public static final String INFO_VIOLATIONS_KEY = "info_violations";
1428 public static final Metric<Integer> INFO_VIOLATIONS = new Metric.Builder(INFO_VIOLATIONS_KEY, "Info issues", Metric.ValueType.INT)
1429 .setDescription("Info issues")
1430 .setDirection(Metric.DIRECTION_WORST)
1431 .setQualitative(true)
1432 .setDomain(DOMAIN_ISSUES)
1433 .setBestValue(0.0)
1434 .setOptimizedBestValue(true)
1435 .create();
1436
1437 public static final String NEW_VIOLATIONS_KEY = "new_violations";
1438 public static final Metric<Integer> NEW_VIOLATIONS = new Metric.Builder(NEW_VIOLATIONS_KEY, "New issues", Metric.ValueType.INT)
1439 .setDescription("New Issues")
1440 .setDirection(Metric.DIRECTION_WORST)
1441 .setQualitative(true)
1442 .setDomain(DOMAIN_ISSUES)
1443 .setBestValue(0.0)
1444 .setOptimizedBestValue(true)
1445 .setDeleteHistoricalData(true)
1446 .create();
1447
1448 public static final String NEW_BLOCKER_VIOLATIONS_KEY = "new_blocker_violations";
1449 public static final Metric<Integer> NEW_BLOCKER_VIOLATIONS = new Metric.Builder(NEW_BLOCKER_VIOLATIONS_KEY, "New Blocker issues", Metric.ValueType.INT)
1450 .setDescription("New Blocker issues")
1451 .setDirection(Metric.DIRECTION_WORST)
1452 .setQualitative(true)
1453 .setDomain(DOMAIN_ISSUES)
1454 .setBestValue(0.0)
1455 .setOptimizedBestValue(true)
1456 .setDeleteHistoricalData(true)
1457 .create();
1458
1459 public static final String NEW_CRITICAL_VIOLATIONS_KEY = "new_critical_violations";
1460 public static final Metric<Integer> NEW_CRITICAL_VIOLATIONS = new Metric.Builder(NEW_CRITICAL_VIOLATIONS_KEY, "New Critical issues", Metric.ValueType.INT)
1461 .setDescription("New Critical issues")
1462 .setDirection(Metric.DIRECTION_WORST)
1463 .setQualitative(true)
1464 .setDomain(DOMAIN_ISSUES)
1465 .setBestValue(0.0)
1466 .setOptimizedBestValue(true)
1467 .setDeleteHistoricalData(true)
1468 .create();
1469
1470 public static final String NEW_MAJOR_VIOLATIONS_KEY = "new_major_violations";
1471 public static final Metric<Integer> NEW_MAJOR_VIOLATIONS = new Metric.Builder(NEW_MAJOR_VIOLATIONS_KEY, "New Major issues", Metric.ValueType.INT)
1472 .setDescription("New Major issues")
1473 .setDirection(Metric.DIRECTION_WORST)
1474 .setQualitative(true)
1475 .setDomain(DOMAIN_ISSUES)
1476 .setBestValue(0.0)
1477 .setOptimizedBestValue(true)
1478 .setDeleteHistoricalData(true)
1479 .create();
1480
1481 public static final String NEW_MINOR_VIOLATIONS_KEY = "new_minor_violations";
1482 public static final Metric<Integer> NEW_MINOR_VIOLATIONS = new Metric.Builder(NEW_MINOR_VIOLATIONS_KEY, "New Minor issues", Metric.ValueType.INT)
1483 .setDescription("New Minor issues")
1484 .setDirection(Metric.DIRECTION_WORST)
1485 .setQualitative(true)
1486 .setDomain(DOMAIN_ISSUES)
1487 .setBestValue(0.0)
1488 .setOptimizedBestValue(true)
1489 .setDeleteHistoricalData(true)
1490 .create();
1491
1492 public static final String NEW_INFO_VIOLATIONS_KEY = "new_info_violations";
1493 public static final Metric<Integer> NEW_INFO_VIOLATIONS = new Metric.Builder(NEW_INFO_VIOLATIONS_KEY, "New Info issues", Metric.ValueType.INT)
1494 .setDescription("New Info issues")
1495 .setDirection(Metric.DIRECTION_WORST)
1496 .setQualitative(true)
1497 .setDomain(DOMAIN_ISSUES)
1498 .setBestValue(0.0)
1499 .setOptimizedBestValue(true)
1500 .setDeleteHistoricalData(true)
1501 .create();
1502
1503 /**
1504 * @since 3.6
1505 */
1506 public static final String FALSE_POSITIVE_ISSUES_KEY = "false_positive_issues";
1507
1508 /**
1509 * @since 3.6
1510 */
1511 public static final Metric<Integer> FALSE_POSITIVE_ISSUES = new Metric.Builder(FALSE_POSITIVE_ISSUES_KEY, "False positive issues", Metric.ValueType.INT)
1512 .setDescription("False positive issues")
1513 .setDirection(Metric.DIRECTION_WORST)
1514 .setDomain(DOMAIN_ISSUES)
1515 .setBestValue(0.0)
1516 .setOptimizedBestValue(true)
1517 .create();
1518
1519 /**
1520 * @since 3.6
1521 */
1522 public static final String OPEN_ISSUES_KEY = "open_issues";
1523
1524 /**
1525 * @since 3.6
1526 */
1527 public static final Metric<Integer> OPEN_ISSUES = new Metric.Builder(OPEN_ISSUES_KEY, "Open issues", Metric.ValueType.INT)
1528 .setDescription("Open issues")
1529 .setDirection(Metric.DIRECTION_WORST)
1530 .setDomain(DOMAIN_ISSUES)
1531 .setBestValue(0.0)
1532 .setOptimizedBestValue(true)
1533 .create();
1534
1535 /**
1536 * @since 3.6
1537 */
1538 public static final String REOPENED_ISSUES_KEY = "reopened_issues";
1539
1540 /**
1541 * @since 3.6
1542 */
1543 public static final Metric<Integer> REOPENED_ISSUES = new Metric.Builder(REOPENED_ISSUES_KEY, "Reopened issues", Metric.ValueType.INT)
1544 .setDescription("Reopened issues")
1545 .setDirection(Metric.DIRECTION_WORST)
1546 .setQualitative(true)
1547 .setDomain(DOMAIN_ISSUES)
1548 .setBestValue(0.0)
1549 .setOptimizedBestValue(true)
1550 .create();
1551
1552 /**
1553 * @since 3.6
1554 */
1555 public static final String CONFIRMED_ISSUES_KEY = "confirmed_issues";
1556
1557 /**
1558 * @since 3.6
1559 */
1560 public static final Metric<Integer> CONFIRMED_ISSUES = new Metric.Builder(CONFIRMED_ISSUES_KEY, "Confirmed issues", Metric.ValueType.INT)
1561 .setDescription("Confirmed issues")
1562 .setDirection(Metric.DIRECTION_WORST)
1563 .setQualitative(true)
1564 .setDomain(DOMAIN_ISSUES)
1565 .setBestValue(0.0)
1566 .setOptimizedBestValue(true)
1567 .create();
1568
1569 // --------------------------------------------------------------------------------------------------------------------
1570 //
1571 // DESIGN
1572 //
1573 // --------------------------------------------------------------------------------------------------------------------
1574
1575 /**
1576 * @deprecated since 3.7.1
1577 */
1578 @Deprecated
1579 public static final String ABSTRACTNESS_KEY = "abstractness";
1580 /**
1581 * @deprecated since 3.7.1
1582 */
1583 @Deprecated
1584 public static final Metric<Double> ABSTRACTNESS = new Metric.Builder(ABSTRACTNESS_KEY, "Abstractness", Metric.ValueType.PERCENT)
1585 .setDescription("Abstractness")
1586 .setDirection(Metric.DIRECTION_NONE)
1587 .setQualitative(false)
1588 .setDomain(DOMAIN_DESIGN)
1589 .setHidden(true)
1590 .create();
1591
1592 /**
1593 * @deprecated since 3.7.1
1594 */
1595 @Deprecated
1596 public static final String INSTABILITY_KEY = "instability";
1597 /**
1598 * @deprecated since 3.7.1
1599 */
1600 @Deprecated
1601 public static final Metric<Double> INSTABILITY = new Metric.Builder(INSTABILITY_KEY, "Instability", Metric.ValueType.PERCENT)
1602 .setDescription("Instability")
1603 .setDirection(Metric.DIRECTION_NONE)
1604 .setQualitative(false)
1605 .setDomain(DOMAIN_DESIGN)
1606 .setHidden(true)
1607 .create();
1608
1609 /**
1610 * @deprecated since 3.7.1
1611 */
1612 @Deprecated
1613 public static final String DISTANCE_KEY = "distance";
1614 /**
1615 * @deprecated since 3.7.1
1616 */
1617 @Deprecated
1618 public static final Metric<Double> DISTANCE = new Metric.Builder(DISTANCE_KEY, "Distance", Metric.ValueType.FLOAT)
1619 .setDescription("Distance")
1620 .setDirection(Metric.DIRECTION_NONE)
1621 .setQualitative(false)
1622 .setDomain(DOMAIN_DESIGN)
1623 .setHidden(true)
1624 .create();
1625
1626 /**
1627 * @deprecated since 4.0. See SONAR-4643
1628 */
1629 @Deprecated
1630 public static final String DEPTH_IN_TREE_KEY = "dit";
1631 /**
1632 * @deprecated since 4.0. See SONAR-4643
1633 */
1634 @Deprecated
1635 public static final Metric<Integer> DEPTH_IN_TREE = new Metric.Builder(DEPTH_IN_TREE_KEY, "Depth in Tree", Metric.ValueType.INT)
1636 .setDescription("Depth in Inheritance Tree")
1637 .setDirection(Metric.DIRECTION_NONE)
1638 .setQualitative(false)
1639 .setDomain(DOMAIN_DESIGN)
1640 .setHidden(true)
1641 .create();
1642
1643 /**
1644 * @deprecated since 4.0. See SONAR-4643
1645 */
1646 @Deprecated
1647 public static final String NUMBER_OF_CHILDREN_KEY = "noc";
1648 /**
1649 * @deprecated since 4.0. See SONAR-4643
1650 */
1651 @Deprecated
1652 public static final Metric<Integer> NUMBER_OF_CHILDREN = new Metric.Builder(NUMBER_OF_CHILDREN_KEY, "Number of Children", Metric.ValueType.INT)
1653 .setDescription("Number of Children")
1654 .setDirection(Metric.DIRECTION_NONE)
1655 .setQualitative(false)
1656 .setDomain(DOMAIN_DESIGN)
1657 .setHidden(true)
1658 .create();
1659
1660 /**
1661 * @deprecated since 4.2. See SONAR-5042
1662 */
1663 @Deprecated
1664 public static final String RFC_KEY = "rfc";
1665
1666 /**
1667 * @deprecated since 4.2. See SONAR-5042
1668 */
1669 @Deprecated
1670 public static final Metric<Integer> RFC = new Metric.Builder(RFC_KEY, "RFC", Metric.ValueType.INT)
1671 .setDescription("Response for Class")
1672 .setDirection(Metric.DIRECTION_WORST)
1673 .setQualitative(false)
1674 .setDomain(DOMAIN_DESIGN)
1675 .setFormula(new WeightedMeanAggregationFormula(CoreMetrics.FILES, false))
1676 .setHidden(true)
1677 .create();
1678
1679 /**
1680 * @deprecated since 4.2. See SONAR-5042
1681 */
1682 @Deprecated
1683 public static final String RFC_DISTRIBUTION_KEY = "rfc_distribution";
1684
1685 /**
1686 * @deprecated since 4.2. See SONAR-5042
1687 */
1688 @Deprecated
1689 public static final Metric<String> RFC_DISTRIBUTION = new Metric.Builder(RFC_DISTRIBUTION_KEY, "Class distribution /RFC", Metric.ValueType.DISTRIB)
1690 .setDescription("Class distribution /RFC")
1691 .setDirection(Metric.DIRECTION_NONE)
1692 .setQualitative(true)
1693 .setDomain(DOMAIN_DESIGN)
1694 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY))
1695 .setHidden(true)
1696 .create();
1697
1698 /**
1699 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1700 */
1701 @Deprecated
1702 public static final String LCOM4_KEY = "lcom4";
1703
1704 /**
1705 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1706 */
1707 @Deprecated
1708 public static final Metric<Double> LCOM4 = new Metric.Builder(LCOM4_KEY, "LCOM4", Metric.ValueType.FLOAT)
1709 .setDescription("Lack of Cohesion of Functions")
1710 .setDirection(Metric.DIRECTION_WORST)
1711 .setQualitative(true)
1712 .setDomain(DOMAIN_DESIGN)
1713 .setBestValue(1.0)
1714 .setHidden(true)
1715 .create();
1716
1717 /**
1718 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1719 */
1720 @Deprecated
1721 public static final String LCOM4_BLOCKS_KEY = "lcom4_blocks";
1722
1723 /**
1724 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1725 */
1726 @Deprecated
1727 public static final Metric<String> LCOM4_BLOCKS = new Metric.Builder(LCOM4_BLOCKS_KEY, "LCOM4 blocks", Metric.ValueType.DATA)
1728 .setDescription("LCOM4 blocks")
1729 .setDirection(Metric.DIRECTION_NONE)
1730 .setQualitative(false)
1731 .setDomain(DOMAIN_DESIGN)
1732 .setDeleteHistoricalData(true)
1733 .setHidden(true)
1734 .create();
1735
1736 /**
1737 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1738 */
1739 @Deprecated
1740 public static final String LCOM4_DISTRIBUTION_KEY = "lcom4_distribution";
1741
1742 /**
1743 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1744 */
1745 @Deprecated
1746 public static final Metric<String> LCOM4_DISTRIBUTION = new Metric.Builder(LCOM4_DISTRIBUTION_KEY, "Class distribution /LCOM4", Metric.ValueType.DISTRIB)
1747 .setDescription("Class distribution /LCOM4")
1748 .setDirection(Metric.DIRECTION_NONE)
1749 .setQualitative(true)
1750 .setDomain(DOMAIN_DESIGN)
1751 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY))
1752 .setHidden(true)
1753 .create();
1754
1755 /**
1756 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1757 */
1758 @Deprecated
1759 public static final String SUSPECT_LCOM4_DENSITY_KEY = "suspect_lcom4_density";
1760
1761 /**
1762 * @deprecated in 4.1. See http://jira.codehaus.org/browse/SONAR-4853
1763 */
1764 @Deprecated
1765 public static final Metric<Double> SUSPECT_LCOM4_DENSITY = new Metric.Builder(SUSPECT_LCOM4_DENSITY_KEY, "Suspect LCOM4 density", Metric.ValueType.PERCENT)
1766 .setDescription("Density of classes having LCOM4>1")
1767 .setDirection(Metric.DIRECTION_WORST)
1768 .setQualitative(true)
1769 .setDomain(DOMAIN_DESIGN)
1770 .setHidden(true)
1771 .create();
1772
1773 /**
1774 * @deprecated since 3.7.1
1775 */
1776 @Deprecated
1777 public static final String AFFERENT_COUPLINGS_KEY = "ca";
1778 /**
1779 * @deprecated since 3.7.1
1780 */
1781 @Deprecated
1782 public static final Metric<Integer> AFFERENT_COUPLINGS = new Metric.Builder(AFFERENT_COUPLINGS_KEY, "Afferent couplings", Metric.ValueType.INT)
1783 .setDescription("Afferent couplings")
1784 .setDirection(Metric.DIRECTION_WORST)
1785 .setQualitative(false)
1786 .setDomain(DOMAIN_DESIGN)
1787 .setHidden(true)
1788 .create();
1789
1790 /**
1791 * @deprecated since 3.7.1
1792 */
1793 @Deprecated
1794 public static final String EFFERENT_COUPLINGS_KEY = "ce";
1795 /**
1796 * @deprecated since 3.7.1
1797 */
1798 @Deprecated
1799 public static final Metric<Integer> EFFERENT_COUPLINGS = new Metric.Builder(EFFERENT_COUPLINGS_KEY, "Efferent couplings", Metric.ValueType.INT)
1800 .setDescription("Efferent couplings")
1801 .setDirection(Metric.DIRECTION_WORST)
1802 .setQualitative(false)
1803 .setDomain(DOMAIN_DESIGN)
1804 .setHidden(true)
1805 .create();
1806
1807 public static final String DEPENDENCY_MATRIX_KEY = "dsm";
1808 public static final Metric<String> DEPENDENCY_MATRIX = new Metric.Builder(DEPENDENCY_MATRIX_KEY, "Dependency Matrix", Metric.ValueType.DATA)
1809 .setDescription("Dependency Matrix")
1810 .setDirection(Metric.DIRECTION_NONE)
1811 .setQualitative(false)
1812 .setDomain(DOMAIN_DESIGN)
1813 .setDeleteHistoricalData(true)
1814 .create();
1815
1816 public static final String PACKAGE_CYCLES_KEY = "package_cycles";
1817 public static final Metric<Integer> PACKAGE_CYCLES = new Metric.Builder(PACKAGE_CYCLES_KEY, "Package cycles", Metric.ValueType.INT)
1818 .setDescription("Package cycles")
1819 .setDirection(Metric.DIRECTION_WORST)
1820 .setQualitative(true)
1821 .setDomain(DOMAIN_DESIGN)
1822 .setBestValue(0.0)
1823 .setFormula(new SumChildValuesFormula(false))
1824 .create();
1825
1826 public static final String PACKAGE_TANGLE_INDEX_KEY = "package_tangle_index";
1827 public static final Metric<Double> PACKAGE_TANGLE_INDEX = new Metric.Builder(PACKAGE_TANGLE_INDEX_KEY, "Package tangle index", Metric.ValueType.PERCENT)
1828 .setDescription("Package tangle index")
1829 .setDirection(Metric.DIRECTION_WORST)
1830 .setQualitative(true)
1831 .setBestValue(0.0)
1832 .setDomain(DOMAIN_DESIGN)
1833 .create();
1834
1835 public static final String PACKAGE_TANGLES_KEY = "package_tangles";
1836 public static final Metric<Integer> PACKAGE_TANGLES = new Metric.Builder(PACKAGE_TANGLES_KEY, "File dependencies to cut", Metric.ValueType.INT)
1837 .setDescription("File dependencies to cut")
1838 .setDirection(Metric.DIRECTION_WORST)
1839 .setQualitative(false)
1840 .setDomain(DOMAIN_DESIGN)
1841 .setFormula(new SumChildValuesFormula(false))
1842 .create();
1843
1844 public static final String PACKAGE_FEEDBACK_EDGES_KEY = "package_feedback_edges";
1845 public static final Metric<Integer> PACKAGE_FEEDBACK_EDGES = new Metric.Builder(PACKAGE_FEEDBACK_EDGES_KEY, "Package dependencies to cut", Metric.ValueType.INT)
1846 .setDescription("Package dependencies to cut")
1847 .setDirection(Metric.DIRECTION_WORST)
1848 .setQualitative(false)
1849 .setDomain(DOMAIN_DESIGN)
1850 .setFormula(new SumChildValuesFormula(false))
1851 .setBestValue(0.0)
1852 .create();
1853
1854 public static final String PACKAGE_EDGES_WEIGHT_KEY = "package_edges_weight";
1855 public static final Metric<Integer> PACKAGE_EDGES_WEIGHT = new Metric.Builder(PACKAGE_EDGES_WEIGHT_KEY, "Package edges weight", Metric.ValueType.INT)
1856 .setDescription("Package edges weight")
1857 .setDirection(Metric.DIRECTION_BETTER)
1858 .setQualitative(false)
1859 .setDomain(DOMAIN_DESIGN)
1860 .setFormula(new SumChildValuesFormula(false))
1861 .setHidden(true)
1862 .setDeleteHistoricalData(true)
1863 .create();
1864
1865 public static final String FILE_CYCLES_KEY = "file_cycles";
1866 public static final Metric<Integer> FILE_CYCLES = new Metric.Builder(FILE_CYCLES_KEY, "File cycles", Metric.ValueType.INT)
1867 .setDescription("File cycles")
1868 .setDirection(Metric.DIRECTION_WORST)
1869 .setQualitative(true)
1870 .setDomain(DOMAIN_DESIGN)
1871 .setHidden(true)
1872 .setDeleteHistoricalData(true)
1873 .setBestValue(0.0)
1874 .create();
1875
1876 public static final String FILE_TANGLE_INDEX_KEY = "file_tangle_index";
1877 public static final Metric<Double> FILE_TANGLE_INDEX = new Metric.Builder(FILE_TANGLE_INDEX_KEY, "File tangle index", Metric.ValueType.PERCENT)
1878 .setDescription("File tangle index")
1879 .setDirection(Metric.DIRECTION_WORST)
1880 .setQualitative(true)
1881 .setDomain(DOMAIN_DESIGN)
1882 .setHidden(true)
1883 .setDeleteHistoricalData(true)
1884 .setBestValue(0.0)
1885 .create();
1886
1887 public static final String FILE_TANGLES_KEY = "file_tangles";
1888 public static final Metric<Integer> FILE_TANGLES = new Metric.Builder(FILE_TANGLES_KEY, "File tangles", Metric.ValueType.INT)
1889 .setDescription("Files tangles")
1890 .setDirection(Metric.DIRECTION_WORST)
1891 .setQualitative(false)
1892 .setDomain(DOMAIN_DESIGN)
1893 .setHidden(true)
1894 .setDeleteHistoricalData(true)
1895 .create();
1896
1897 public static final String FILE_FEEDBACK_EDGES_KEY = "file_feedback_edges";
1898 public static final Metric<Integer> FILE_FEEDBACK_EDGES = new Metric.Builder(FILE_FEEDBACK_EDGES_KEY, "Suspect file dependencies", Metric.ValueType.INT)
1899 .setDescription("Suspect file dependencies")
1900 .setDirection(Metric.DIRECTION_WORST)
1901 .setQualitative(false)
1902 .setDomain(DOMAIN_DESIGN)
1903 .setHidden(true)
1904 .setDeleteHistoricalData(true)
1905 .setBestValue(0.0)
1906 .create();
1907
1908 public static final String FILE_EDGES_WEIGHT_KEY = "file_edges_weight";
1909 public static final Metric<Integer> FILE_EDGES_WEIGHT = new Metric.Builder(FILE_EDGES_WEIGHT_KEY, "File edges weight", Metric.ValueType.INT)
1910 .setDescription("File edges weight")
1911 .setDirection(Metric.DIRECTION_BETTER)
1912 .setQualitative(false)
1913 .setDomain(DOMAIN_DESIGN)
1914 .setHidden(true)
1915 .setDeleteHistoricalData(true)
1916 .create();
1917
1918 // --------------------------------------------------------------------------------------------------------------------
1919 //
1920 // SCM
1921 // These metrics are computed by the SCM Activity plugin, since version 1.2 and introduced here since version 2.7.
1922 //
1923 // --------------------------------------------------------------------------------------------------------------------
1924
1925 /**
1926 * @since 2.7
1927 */
1928 public static final String SCM_AUTHORS_BY_LINE_KEY = "authors_by_line";
1929
1930 /**
1931 * Key-value pairs, where key - is a number of line, and value - is an author for this line.
1932 *
1933 * @see org.sonar.api.utils.KeyValueFormat#formatIntString(java.util.Map)
1934 * @see org.sonar.api.utils.KeyValueFormat#parseIntString(String)
1935 * @since 2.7
1936 */
1937 public static final Metric<String> SCM_AUTHORS_BY_LINE = new Metric.Builder(SCM_AUTHORS_BY_LINE_KEY, "Authors by line", Metric.ValueType.DATA)
1938 .setDomain(DOMAIN_SCM)
1939 .create();
1940
1941 /**
1942 * @since 2.7
1943 */
1944 public static final String SCM_REVISIONS_BY_LINE_KEY = "revisions_by_line";
1945
1946 /**
1947 * Key-value pairs, where key - is a number of line, and value - is a revision for this line.
1948 *
1949 * @see org.sonar.api.utils.KeyValueFormat#formatIntString(java.util.Map)
1950 * @see org.sonar.api.utils.KeyValueFormat#parseIntString(String)
1951 * @since 2.7
1952 */
1953 public static final Metric<String> SCM_REVISIONS_BY_LINE = new Metric.Builder(SCM_REVISIONS_BY_LINE_KEY, "Revisions by line", Metric.ValueType.DATA)
1954 .setDomain(DOMAIN_SCM)
1955 .create();
1956
1957 /**
1958 * @since 2.7
1959 */
1960 public static final String SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY = "last_commit_datetimes_by_line";
1961
1962 /**
1963 * Key-value pairs, where key - is a number of line, and value - is a date of last commit for this line.
1964 *
1965 * @see org.sonar.api.utils.KeyValueFormat#formatIntDateTime(java.util.Map)
1966 * @see org.sonar.api.utils.KeyValueFormat#parseIntDateTime(String)
1967 * @since 2.7
1968 */
1969 public static final Metric<String> SCM_LAST_COMMIT_DATETIMES_BY_LINE = new Metric.Builder(SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY, "Last commit dates by line",
1970 Metric.ValueType.DATA)
1971 .setDomain(DOMAIN_SCM)
1972 .create();
1973
1974 // --------------------------------------------------------------------------------------------------------------------
1975 //
1976 // REVIEWS (since 2.14)
1977 //
1978 // --------------------------------------------------------------------------------------------------------------------
1979
1980 /**
1981 * @since 2.14
1982 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
1983 */
1984 @Deprecated
1985 public static final String UNREVIEWED_VIOLATIONS_KEY = "unreviewed_violations";
1986
1987 /**
1988 * @since 2.14
1989 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
1990 */
1991 @Deprecated
1992 public static final Metric<Integer> UNREVIEWED_VIOLATIONS = new Metric.Builder(UNREVIEWED_VIOLATIONS_KEY, "Unreviewed violations", Metric.ValueType.INT)
1993 .setDescription("Violations that have not been reviewed yet")
1994 .setDirection(Metric.DIRECTION_WORST)
1995 .setDomain(DOMAIN_REVIEWS)
1996 .setBestValue(0.0)
1997 .setOptimizedBestValue(true)
1998 .setHidden(true)
1999 .create();
2000
2001 /**
2002 * @since 2.14
2003 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2004 */
2005 @Deprecated
2006 public static final String NEW_UNREVIEWED_VIOLATIONS_KEY = "new_unreviewed_violations";
2007
2008 /**
2009 * @since 2.14
2010 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2011 */
2012 @Deprecated
2013 public static final Metric<Integer> NEW_UNREVIEWED_VIOLATIONS = new Metric.Builder(NEW_UNREVIEWED_VIOLATIONS_KEY, "New unreviewed violations", Metric.ValueType.INT)
2014 .setDescription("New violations that have not been reviewed yet")
2015 .setDirection(Metric.DIRECTION_WORST)
2016 .setQualitative(true)
2017 .setDomain(DOMAIN_REVIEWS)
2018 .setBestValue(0.0)
2019 .setOptimizedBestValue(true)
2020 .setDeleteHistoricalData(true)
2021 .setHidden(true)
2022 .create();
2023
2024 /**
2025 * @since 2.14
2026 * @deprecated in 3.6. This measure is replaced by {@link #FALSE_POSITIVE_ISSUES_KEY}.
2027 */
2028 @Deprecated
2029 public static final String FALSE_POSITIVE_REVIEWS_KEY = "false_positive_reviews";
2030
2031 /**
2032 * @since 2.14
2033 * @deprecated in 3.6. This measure is replaced by {@link #FALSE_POSITIVE_ISSUES}.
2034 */
2035 @Deprecated
2036 public static final Metric<Integer> FALSE_POSITIVE_REVIEWS = new Metric.Builder(FALSE_POSITIVE_REVIEWS_KEY, "False-positive reviews", Metric.ValueType.INT)
2037 .setDescription("Active false-positive reviews")
2038 .setDirection(Metric.DIRECTION_WORST)
2039 .setDomain(DOMAIN_REVIEWS)
2040 .setBestValue(0.0)
2041 .setOptimizedBestValue(true)
2042 .setHidden(true)
2043 .create();
2044
2045 /**
2046 * @since 2.14
2047 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2048 */
2049 @Deprecated
2050 public static final String ACTIVE_REVIEWS_KEY = "active_reviews";
2051
2052 /**
2053 * @since 2.14
2054 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2055 */
2056 @Deprecated
2057 public static final Metric<Integer> ACTIVE_REVIEWS = new Metric.Builder(ACTIVE_REVIEWS_KEY, "Active reviews", Metric.ValueType.INT)
2058 .setDescription("Active open and reopened reviews")
2059 .setDirection(Metric.DIRECTION_WORST)
2060 .setDomain(DOMAIN_REVIEWS)
2061 .setBestValue(0.0)
2062 .setOptimizedBestValue(true)
2063 .setHidden(true)
2064 .create();
2065
2066 /**
2067 * @since 2.14
2068 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2069 */
2070 @Deprecated
2071 public static final String UNASSIGNED_REVIEWS_KEY = "unassigned_reviews";
2072
2073 /**
2074 * @since 2.14
2075 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2076 */
2077 @Deprecated
2078 public static final Metric<Integer> UNASSIGNED_REVIEWS = new Metric.Builder(UNASSIGNED_REVIEWS_KEY, "Unassigned reviews", Metric.ValueType.INT)
2079 .setDescription("Active unassigned reviews")
2080 .setDirection(Metric.DIRECTION_WORST)
2081 .setDomain(DOMAIN_REVIEWS)
2082 .setBestValue(0.0)
2083 .setOptimizedBestValue(true)
2084 .setHidden(true)
2085 .create();
2086
2087 /**
2088 * @since 2.14
2089 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2090 */
2091 @Deprecated
2092 public static final String UNPLANNED_REVIEWS_KEY = "unplanned_reviews";
2093
2094 /**
2095 * @since 2.14
2096 * @deprecated in 3.6. This measure is not fed anymore since introduction of issues.
2097 */
2098 @Deprecated
2099 public static final Metric<Integer> UNPLANNED_REVIEWS = new Metric.Builder(UNPLANNED_REVIEWS_KEY, "Unplanned reviews", Metric.ValueType.INT)
2100 .setDescription("Active unplanned reviews")
2101 .setDirection(Metric.DIRECTION_WORST)
2102 .setDomain(DOMAIN_REVIEWS)
2103 .setBestValue(0.0)
2104 .setOptimizedBestValue(true)
2105 .setHidden(true)
2106 .create();
2107
2108 // --------------------------------------------------------------------------------------------------------------------
2109 //
2110 // TECHNICAL DEBT
2111 //
2112 // --------------------------------------------------------------------------------------------------------------------
2113
2114 /**
2115 * @since 4.0
2116 */
2117 public static final String TECHNICAL_DEBT_KEY = "sqale_index";
2118
2119 /**
2120 * @since 4.0
2121 */
2122 public static final Metric<Long> TECHNICAL_DEBT = new Metric.Builder(TECHNICAL_DEBT_KEY, "Technical Debt", Metric.ValueType.WORK_DUR)
2123 .setDomain(DOMAIN_TECHNICAL_DEBT)
2124 .setDirection(Metric.DIRECTION_WORST)
2125 .setOptimizedBestValue(true)
2126 .setBestValue(0.0)
2127 .setQualitative(true)
2128 .create();
2129
2130 /**
2131 * @since 4.1
2132 */
2133 public static final String NEW_TECHNICAL_DEBT_KEY = "new_technical_debt";
2134
2135 /**
2136 * @since 4.1
2137 */
2138 public static final Metric<Long> NEW_TECHNICAL_DEBT = new Metric.Builder(NEW_TECHNICAL_DEBT_KEY, "Technical Debt on new code", Metric.ValueType.WORK_DUR)
2139 .setDescription("Technical Debt of new code")
2140 .setDomain(DOMAIN_TECHNICAL_DEBT)
2141 .setDirection(Metric.DIRECTION_WORST)
2142 .setOptimizedBestValue(true)
2143 .setBestValue(0.0)
2144 .setQualitative(true)
2145 .setDeleteHistoricalData(true)
2146 .create();
2147
2148 /**
2149 * @since 4.5
2150 */
2151 public static final String SQALE_RATING_KEY = "sqale_rating";
2152
2153 /**
2154 * @since 4.5
2155 */
2156 public static final Metric<String> SQALE_RATING = new Metric.Builder(SQALE_RATING_KEY, "SQALE Rating", Metric.ValueType.RATING)
2157 .setDomain(DOMAIN_TECHNICAL_DEBT)
2158 .setDirection(Metric.DIRECTION_WORST)
2159 .setQualitative(true)
2160 .setBestValue(1.0)
2161 .setWorstValue(5.0)
2162 .create();
2163
2164 /**
2165 * @since 4.5
2166 */
2167 public static final String DEVELOPMENT_COST_KEY = "development_cost";
2168
2169 /**
2170 * @since 4.5
2171 */
2172 public static final Metric<String> DEVELOPMENT_COST = new Metric.Builder(DEVELOPMENT_COST_KEY, "SQALE Development Cost", Metric.ValueType.STRING)
2173 .setDomain(DOMAIN_TECHNICAL_DEBT)
2174 .setDirection(Metric.DIRECTION_WORST)
2175 .setOptimizedBestValue(true)
2176 .setBestValue(0.0)
2177 .setQualitative(true)
2178 .setHidden(true)
2179 .create();
2180
2181 /**
2182 * @since 4.5
2183 */
2184 public static final String SQALE_DEBT_RATIO_KEY = "sqale_debt_ratio";
2185
2186 /**
2187 * @since 4.5
2188 */
2189 public static final Metric<Double> SQALE_DEBT_RATIO = new Metric.Builder(SQALE_DEBT_RATIO_KEY, "SQALE Technical Debt Ratio", Metric.ValueType.PERCENT)
2190 .setDescription("Ratio of the technical debt compared to what it would cost to develop the whole source code from scratch.")
2191 .setDomain(DOMAIN_TECHNICAL_DEBT)
2192 .setDirection(Metric.DIRECTION_WORST)
2193 .setOptimizedBestValue(true)
2194 .setBestValue(0.0)
2195 .setQualitative(true)
2196 .create();
2197
2198 // --------------------------------------------------------------------------------------------------------------------
2199 //
2200 // FILE DATA
2201 //
2202 // --------------------------------------------------------------------------------------------------------------------
2203
2204 /**
2205 * @since 2.14
2206 */
2207 @Beta
2208 public static final String NCLOC_DATA_KEY = "ncloc_data";
2209
2210 /**
2211 * Information about lines of code in file.
2212 * Key-value pairs, where key - is a number of line, and value - is an indicator of whether line contains code (1) or not (0).
2213 *
2214 * @see org.sonar.api.measures.FileLinesContext
2215 * @since 2.14
2216 */
2217 @Beta
2218 public static final Metric<String> NCLOC_DATA = new Metric.Builder(NCLOC_DATA_KEY, "ncloc_data", Metric.ValueType.DATA)
2219 .setHidden(true)
2220 .setDomain(DOMAIN_SIZE)
2221 .create();
2222
2223 /**
2224 * @since 2.14
2225 */
2226 @Beta
2227 public static final String COMMENT_LINES_DATA_KEY = "comment_lines_data";
2228
2229 /**
2230 * Information about comments in file.
2231 * Key-value pairs, where key - is a number of line, and value - is an indicator of whether line contains comment (1) or not (0).
2232 *
2233 * @see org.sonar.api.measures.FileLinesContext
2234 * @since 2.14
2235 */
2236 @Beta
2237 public static final Metric<String> COMMENT_LINES_DATA = new Metric.Builder(COMMENT_LINES_DATA_KEY, "comment_lines_data", Metric.ValueType.DATA)
2238 .setHidden(true)
2239 .setDomain(DOMAIN_DOCUMENTATION)
2240 .create();
2241
2242 // --------------------------------------------------------------------------------------------------------------------
2243 //
2244 // OTHERS
2245 //
2246 // --------------------------------------------------------------------------------------------------------------------
2247
2248 public static final String ALERT_STATUS_KEY = "alert_status";
2249 public static final Metric<Metric.Level> ALERT_STATUS = new Metric.Builder(ALERT_STATUS_KEY, "Quality Gate Status", Metric.ValueType.LEVEL)
2250 .setDescription("The project status with regard to its quality gate.")
2251 .setDirection(Metric.DIRECTION_BETTER)
2252 .setQualitative(true)
2253 .setDomain(DOMAIN_GENERAL)
2254 .create();
2255
2256 /**
2257 * @since 4.4
2258 */
2259 public static final String QUALITY_GATE_DETAILS_KEY = "quality_gate_details";
2260 /**
2261 * The project detailed status with regard to its quality gate.
2262 * Storing the global quality gate status, along with all evaluated conditions, into a JSON object.
2263 * @since 4.4
2264 */
2265 public static final Metric<String> QUALITY_GATE_DETAILS = new Metric.Builder(QUALITY_GATE_DETAILS_KEY, "Quality Gate Details", Metric.ValueType.DATA)
2266 .setDescription("The project detailed status with regard to its quality gate.")
2267 .setDomain(DOMAIN_GENERAL)
2268 .create();
2269
2270 /**
2271 * @deprecated since 4.4 doesn't support multi-language. See {@link #QUALITY_PROFILES_KEY}
2272 */
2273 @Deprecated
2274 public static final String PROFILE_KEY = "profile";
2275 /**
2276 * @deprecated since 4.4 doesn't support multi-language. See {@link #QUALITY_PROFILES_KEY}
2277 */
2278 @Deprecated
2279 public static final Metric<String> PROFILE = new Metric.Builder(PROFILE_KEY, "Profile", Metric.ValueType.DATA)
2280 .setDescription("Selected quality profile")
2281 .setDomain(DOMAIN_GENERAL)
2282 .create();
2283
2284 /**
2285 * @since 2.9
2286 * @deprecated since 4.4 doesn't support multi-language. See {@link #QUALITY_PROFILES_KEY}
2287 */
2288 @Deprecated
2289 public static final String PROFILE_VERSION_KEY = "profile_version";
2290 /**
2291 * @since 2.9
2292 * @deprecated since 4.4 doesn't support multi-language. See {@link #QUALITY_PROFILES_KEY}
2293 */
2294 @Deprecated
2295 public static final Metric<Integer> PROFILE_VERSION = new Metric.Builder(PROFILE_VERSION_KEY, "Profile version", Metric.ValueType.INT)
2296 .setDescription("Selected quality profile version")
2297 .setQualitative(false)
2298 .setDomain(DOMAIN_GENERAL)
2299 .setHidden(true)
2300 .create();
2301
2302 /**
2303 * @since 4.4
2304 */
2305 public static final String QUALITY_PROFILES_KEY = "quality_profiles";
2306
2307 /**
2308 * @since 4.4
2309 */
2310 public static final Metric<String> QUALITY_PROFILES = new Metric.Builder(QUALITY_PROFILES_KEY, "Profiles", Metric.ValueType.DATA)
2311 .setDescription("Details of quality profiles used during analysis")
2312 .setQualitative(false)
2313 .setDomain(DOMAIN_GENERAL)
2314 .setHidden(true)
2315 .create();
2316
2317 private static final List<Metric> METRICS;
2318
2319 static {
2320 METRICS = Lists.newLinkedList();
2321 for (Field field : CoreMetrics.class.getFields()) {
2322 if (Metric.class.isAssignableFrom(field.getType())) {
2323 try {
2324 Metric metric = (Metric) field.get(null);
2325 METRICS.add(metric);
2326 } catch (IllegalAccessException e) {
2327 throw new SonarException("can not introspect " + CoreMetrics.class + " to get metrics", e);
2328 }
2329 }
2330 }
2331 }
2332
2333 private CoreMetrics() {
2334 // only static stuff
2335 }
2336
2337 public static List<Metric> getMetrics() {
2338 return METRICS;
2339 }
2340
2341 public static Metric getMetric(final String key) {
2342 return Iterables.find(METRICS, new Predicate<Metric>() {
2343 @Override
2344 public boolean apply(@Nullable Metric input) {
2345 return input != null && input.getKey().equals(key);
2346 }
2347 });
2348 }
2349 }