001/* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2012 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar 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 * Sonar 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 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020package org.sonar.api.measures; 021 022import com.google.common.annotations.Beta; 023import com.google.common.collect.Lists; 024import org.apache.commons.lang.StringUtils; 025import org.sonar.api.resources.Scopes; 026import org.sonar.api.utils.SonarException; 027 028import java.lang.reflect.Field; 029import java.util.List; 030 031/** 032 * @since 1.10 033 */ 034public final class CoreMetrics { 035 036 private CoreMetrics() { 037 // only static stuff 038 } 039 040 public static final String DOMAIN_SIZE = "Size"; 041 public static final String DOMAIN_TESTS = "Tests"; 042 public static final String DOMAIN_INTEGRATION_TESTS = "Integration Tests"; 043 public static final String DOMAIN_COMPLEXITY = "Complexity"; 044 public static final String DOMAIN_DOCUMENTATION = "Documentation"; 045 public static final String DOMAIN_RULES = "Rules"; 046 public static final String DOMAIN_SCM = "SCM"; 047 public static final String DOMAIN_REVIEWS = "Reviews"; 048 049 /** 050 * @deprecated since 2.5 See SONAR-2007 051 */ 052 @Deprecated 053 public static final String DOMAIN_RULE_CATEGORIES = "Rule categories"; 054 055 public static final String DOMAIN_GENERAL = "General"; 056 public static final String DOMAIN_DUPLICATION = "Duplication"; 057 public static final String DOMAIN_DESIGN = "Design"; 058 059 public static final String LINES_KEY = "lines"; 060 public static final Metric LINES = new Metric.Builder(LINES_KEY, "Lines", Metric.ValueType.INT) 061 .setDescription("Lines") 062 .setDirection(Metric.DIRECTION_WORST) 063 .setQualitative(false) 064 .setDomain(DOMAIN_SIZE) 065 .setFormula(new SumChildValuesFormula(false)) 066 .create(); 067 068 public static final String GENERATED_LINES_KEY = "generated_lines"; 069 public static final Metric GENERATED_LINES = new Metric.Builder(GENERATED_LINES_KEY, "Generated Lines", Metric.ValueType.INT) 070 .setDescription("Number of generated lines") 071 .setDirection(Metric.DIRECTION_WORST) 072 .setQualitative(false) 073 .setDomain(DOMAIN_SIZE) 074 .setBestValue(0.0) 075 .setOptimizedBestValue(true) 076 .setFormula(new SumChildValuesFormula(false)) 077 .create(); 078 079 public static final String NCLOC_KEY = "ncloc"; 080 public static final Metric NCLOC = new Metric.Builder(NCLOC_KEY, "Lines of code", Metric.ValueType.INT) 081 .setDescription("Non Commenting Lines of Code") 082 .setDirection(Metric.DIRECTION_WORST) 083 .setQualitative(false) 084 .setDomain(DOMAIN_SIZE) 085 .setFormula(new SumChildValuesFormula(false)) 086 .create(); 087 088 public static final String GENERATED_NCLOC_KEY = "generated_ncloc"; 089 public static final Metric GENERATED_NCLOC = new Metric.Builder(GENERATED_NCLOC_KEY, "Generated lines of code", Metric.ValueType.INT) 090 .setDescription("Generated non Commenting Lines of Code") 091 .setDirection(Metric.DIRECTION_WORST) 092 .setQualitative(false) 093 .setDomain(DOMAIN_SIZE) 094 .setBestValue(0.0) 095 .setOptimizedBestValue(true) 096 .setFormula(new SumChildValuesFormula(false)) 097 .create(); 098 099 public static final String CLASSES_KEY = "classes"; 100 public static final Metric CLASSES = new Metric.Builder(CLASSES_KEY, "Classes", Metric.ValueType.INT) 101 .setDescription("Classes") 102 .setDirection(Metric.DIRECTION_WORST) 103 .setQualitative(false) 104 .setDomain(DOMAIN_SIZE) 105 .setFormula(new SumChildValuesFormula(false)) 106 .create(); 107 108 public static final String FILES_KEY = "files"; 109 public static final Metric FILES = new Metric.Builder(FILES_KEY, "Files", Metric.ValueType.INT) 110 .setDescription("Number of files") 111 .setDirection(Metric.DIRECTION_WORST) 112 .setQualitative(false) 113 .setDomain(DOMAIN_SIZE) 114 .create(); 115 116 public static final String DIRECTORIES_KEY = "directories"; 117 public static final Metric DIRECTORIES = new Metric.Builder(DIRECTORIES_KEY, "Directories", Metric.ValueType.INT) 118 .setDescription("Directories") 119 .setDirection(Metric.DIRECTION_WORST) 120 .setQualitative(false) 121 .setDomain(DOMAIN_SIZE) 122 .create(); 123 124 public static final String PACKAGES_KEY = "packages"; 125 public static final Metric PACKAGES = new Metric.Builder(PACKAGES_KEY, "Packages", Metric.ValueType.INT) 126 .setDescription("Packages") 127 .setDirection(Metric.DIRECTION_WORST) 128 .setQualitative(false) 129 .setDomain(DOMAIN_SIZE) 130 .setFormula(new SumChildValuesFormula(false)) 131 .create(); 132 133 public static final String FUNCTIONS_KEY = "functions"; 134 public static final Metric FUNCTIONS = new Metric.Builder(FUNCTIONS_KEY, "Methods", Metric.ValueType.INT) 135 .setDescription("Methods") 136 .setDirection(Metric.DIRECTION_WORST) 137 .setQualitative(false) 138 .setDomain(DOMAIN_SIZE) 139 .setFormula(new SumChildValuesFormula(false)) 140 .create(); 141 142 public static final String ACCESSORS_KEY = "accessors"; 143 public static final Metric ACCESSORS = new Metric.Builder(ACCESSORS_KEY, "Accessors", Metric.ValueType.INT) 144 .setDescription("Accessors") 145 .setDirection(Metric.DIRECTION_WORST) 146 .setQualitative(false) 147 .setDomain(DOMAIN_SIZE) 148 .setFormula(new SumChildValuesFormula(false)) 149 .create(); 150 151 /** 152 * @deprecated since Sonar 2.14 - See SONAR-3239 153 */ 154 @Deprecated 155 public static final String PARAGRAPHS_KEY = "paragraphs"; 156 /** 157 * @deprecated since Sonar 2.14 - See SONAR-3239 158 */ 159 @Deprecated 160 public static final Metric PARAGRAPHS = new Metric.Builder(PARAGRAPHS_KEY, "Paragraphs", Metric.ValueType.INT) 161 .setDescription("Number of paragraphs") 162 .setDirection(Metric.DIRECTION_WORST) 163 .setQualitative(false) 164 .setDomain(DOMAIN_SIZE) 165 .setFormula(new SumChildValuesFormula(false)) 166 .create(); 167 168 public static final String STATEMENTS_KEY = "statements"; 169 public static final Metric STATEMENTS = new Metric.Builder(STATEMENTS_KEY, "Statements", Metric.ValueType.INT) 170 .setDescription("Number of statements") 171 .setDirection(Metric.DIRECTION_WORST) 172 .setQualitative(false) 173 .setDomain(DOMAIN_SIZE) 174 .setFormula(new SumChildValuesFormula(false)) 175 .create(); 176 177 public static final String PUBLIC_API_KEY = "public_api"; 178 public static final Metric PUBLIC_API = new Metric.Builder(PUBLIC_API_KEY, "Public API", Metric.ValueType.INT) 179 .setDescription("Public API") 180 .setDirection(Metric.DIRECTION_WORST) 181 .setQualitative(false) 182 .setDomain(DOMAIN_SIZE) 183 .setFormula(new SumChildValuesFormula(false)) 184 .create(); 185 186 /** 187 * @since 3.0 188 */ 189 public static final String PROJECTS_KEY = "projects"; 190 191 /** 192 * @since 3.0 193 */ 194 public static final Metric PROJECTS = new Metric.Builder(PROJECTS_KEY, "Projects", Metric.ValueType.INT) 195 .setDescription("Number of projects") 196 .setDirection(Metric.DIRECTION_WORST) 197 .setQualitative(false) 198 .setDomain(DOMAIN_SIZE) 199 .create(); 200 201 // -------------------------------------------------------------------------------------------------------------------- 202 // 203 // DOCUMENTATION 204 // 205 // -------------------------------------------------------------------------------------------------------------------- 206 207 public static final String COMMENT_LINES_KEY = "comment_lines"; 208 public static final Metric COMMENT_LINES = new Metric.Builder(COMMENT_LINES_KEY, "Comment lines", Metric.ValueType.INT) 209 .setDescription("Number of comment lines") 210 .setDirection(Metric.DIRECTION_BETTER) 211 .setQualitative(false) 212 .setDomain(DOMAIN_DOCUMENTATION) 213 .setFormula(new SumChildValuesFormula(false)) 214 .create(); 215 216 public static final String COMMENT_LINES_DENSITY_KEY = "comment_lines_density"; 217 public static final Metric COMMENT_LINES_DENSITY = new Metric.Builder(COMMENT_LINES_DENSITY_KEY, "Comments (%)", Metric.ValueType.PERCENT) 218 .setDescription("Comments balanced by ncloc + comment lines") 219 .setDirection(Metric.DIRECTION_BETTER) 220 .setQualitative(true) 221 .setDomain(DOMAIN_DOCUMENTATION) 222 .create(); 223 224 public static final String COMMENT_BLANK_LINES_KEY = "comment_blank_lines"; 225 public static final Metric COMMENT_BLANK_LINES = new Metric.Builder(COMMENT_BLANK_LINES_KEY, "Blank comments", Metric.ValueType.INT) 226 .setDescription("Comments that do not contain comments") 227 .setDirection(Metric.DIRECTION_WORST) 228 .setQualitative(false) 229 .setDomain(DOMAIN_DOCUMENTATION) 230 .setFormula(new SumChildValuesFormula(false)) 231 .setBestValue(0.0) 232 .setOptimizedBestValue(true) 233 .create(); 234 235 public static final String PUBLIC_DOCUMENTED_API_DENSITY_KEY = "public_documented_api_density"; 236 public static final Metric PUBLIC_DOCUMENTED_API_DENSITY = new Metric.Builder(PUBLIC_DOCUMENTED_API_DENSITY_KEY, "Public documented API (%)", Metric.ValueType.PERCENT) 237 .setDescription("Public documented classes and methods balanced by ncloc") 238 .setDirection(Metric.DIRECTION_BETTER) 239 .setQualitative(true) 240 .setDomain(DOMAIN_DOCUMENTATION) 241 .setWorstValue(0.0) 242 .setBestValue(100.0) 243 .setOptimizedBestValue(true) 244 .create(); 245 246 public static final String PUBLIC_UNDOCUMENTED_API_KEY = "public_undocumented_api"; 247 public static final Metric PUBLIC_UNDOCUMENTED_API = new Metric.Builder(PUBLIC_UNDOCUMENTED_API_KEY, "Public undocumented API", Metric.ValueType.INT) 248 .setDescription("Public undocumented classes, methods and variables") 249 .setDirection(Metric.DIRECTION_WORST) 250 .setQualitative(true) 251 .setDomain(DOMAIN_DOCUMENTATION) 252 .setBestValue(0.0) 253 .setDirection(Metric.DIRECTION_WORST) 254 .setOptimizedBestValue(true) 255 .setFormula(new SumChildValuesFormula(false)) 256 .create(); 257 258 public static final String COMMENTED_OUT_CODE_LINES_KEY = "commented_out_code_lines"; 259 public static final Metric COMMENTED_OUT_CODE_LINES = new Metric.Builder(COMMENTED_OUT_CODE_LINES_KEY, "Commented-out LOC", Metric.ValueType.INT) 260 .setDescription("Commented lines of code") 261 .setDirection(Metric.DIRECTION_WORST) 262 .setQualitative(true) 263 .setDomain(DOMAIN_DOCUMENTATION) 264 .setFormula(new SumChildValuesFormula(false)) 265 .setBestValue(0.0) 266 .setOptimizedBestValue(true) 267 .create(); 268 269 // -------------------------------------------------------------------------------------------------------------------- 270 // 271 // COMPLEXITY 272 // 273 // -------------------------------------------------------------------------------------------------------------------- 274 275 public static final String COMPLEXITY_KEY = "complexity"; 276 public static final Metric COMPLEXITY = new Metric.Builder(COMPLEXITY_KEY, "Complexity", Metric.ValueType.INT) 277 .setDescription("Cyclomatic complexity") 278 .setDirection(Metric.DIRECTION_WORST) 279 .setQualitative(false) 280 .setDomain(DOMAIN_COMPLEXITY) 281 .setFormula(new SumChildValuesFormula(false)) 282 .create(); 283 284 public static final String CLASS_COMPLEXITY_KEY = "class_complexity"; 285 public static final Metric CLASS_COMPLEXITY = new Metric.Builder(CLASS_COMPLEXITY_KEY, "Complexity /class", Metric.ValueType.FLOAT) 286 .setDescription("Complexity average by class") 287 .setDirection(Metric.DIRECTION_WORST) 288 .setQualitative(true) 289 .setDomain(DOMAIN_COMPLEXITY) 290 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY, CoreMetrics.CLASSES)) 291 .create(); 292 293 public static final String FUNCTION_COMPLEXITY_KEY = "function_complexity"; 294 public static final Metric FUNCTION_COMPLEXITY = new Metric.Builder(FUNCTION_COMPLEXITY_KEY, "Complexity /method", Metric.ValueType.FLOAT) 295 .setDescription("Complexity average by method") 296 .setDirection(Metric.DIRECTION_WORST) 297 .setQualitative(true) 298 .setDomain(DOMAIN_COMPLEXITY) 299 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY, CoreMetrics.FUNCTIONS)) 300 .create(); 301 302 public static final String FILE_COMPLEXITY_KEY = "file_complexity"; 303 public static final Metric FILE_COMPLEXITY = new Metric.Builder(FILE_COMPLEXITY_KEY, "Complexity /file", Metric.ValueType.FLOAT) 304 .setDescription("Complexity average by file") 305 .setDirection(Metric.DIRECTION_WORST) 306 .setQualitative(true) 307 .setDomain(DOMAIN_COMPLEXITY) 308 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY, CoreMetrics.FILES)) 309 .create(); 310 311 /** 312 * @deprecated since Sonar 2.14 - See SONAR-3239 313 */ 314 @Deprecated 315 public static final String PARAGRAPH_COMPLEXITY_KEY = "paragraph_complexity"; 316 317 /** 318 * @deprecated since Sonar 2.14 - See SONAR-3239 319 */ 320 @Deprecated 321 public static final Metric PARAGRAPH_COMPLEXITY = new Metric.Builder(PARAGRAPH_COMPLEXITY_KEY, "Complexity /paragraph", Metric.ValueType.FLOAT) 322 .setDescription("Complexity average by paragraph") 323 .setDirection(Metric.DIRECTION_WORST) 324 .setQualitative(true) 325 .setDomain(DOMAIN_COMPLEXITY) 326 .setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY, CoreMetrics.PARAGRAPHS)) 327 .create(); 328 329 /** 330 * @deprecated in 3.0 - see SONAR-3289 331 */ 332 @Deprecated 333 public static final String CLASS_COMPLEXITY_DISTRIBUTION_KEY = "class_complexity_distribution"; 334 335 /** 336 * @deprecated in 3.0 - see SONAR-3289 337 */ 338 @Deprecated 339 public static final Metric CLASS_COMPLEXITY_DISTRIBUTION = new Metric.Builder(CLASS_COMPLEXITY_DISTRIBUTION_KEY, "Classes distribution /complexity", Metric.ValueType.DISTRIB) 340 .setDescription("Classes distribution /complexity") 341 .setDirection(Metric.DIRECTION_NONE) 342 .setQualitative(true) 343 .setDomain(DOMAIN_COMPLEXITY) 344 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) 345 .create(); 346 347 public static final String FUNCTION_COMPLEXITY_DISTRIBUTION_KEY = "function_complexity_distribution"; 348 public static final Metric FUNCTION_COMPLEXITY_DISTRIBUTION = new Metric.Builder(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, "Functions distribution /complexity", 349 Metric.ValueType.DISTRIB) 350 .setDescription("Functions distribution /complexity") 351 .setDirection(Metric.DIRECTION_NONE) 352 .setQualitative(true) 353 .setDomain(DOMAIN_COMPLEXITY) 354 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) 355 .create(); 356 357 public static final String FILE_COMPLEXITY_DISTRIBUTION_KEY = "file_complexity_distribution"; 358 public static final Metric FILE_COMPLEXITY_DISTRIBUTION = new Metric.Builder(FILE_COMPLEXITY_DISTRIBUTION_KEY, "Files distribution /complexity", Metric.ValueType.DISTRIB) 359 .setDescription("Files distribution /complexity") 360 .setDirection(Metric.DIRECTION_NONE) 361 .setQualitative(true) 362 .setDomain(DOMAIN_COMPLEXITY) 363 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) 364 .create(); 365 366 /** 367 * @deprecated since Sonar 2.14 - See SONAR-3239 368 */ 369 @Deprecated 370 public static final String PARAGRAPH_COMPLEXITY_DISTRIBUTION_KEY = "paragraph_complexity_distribution"; 371 /** 372 * @deprecated since Sonar 2.14 - See SONAR-3239 373 */ 374 @Deprecated 375 public static final Metric PARAGRAPH_COMPLEXITY_DISTRIBUTION = new Metric.Builder(PARAGRAPH_COMPLEXITY_DISTRIBUTION_KEY, "Paragraph distribution /complexity", 376 Metric.ValueType.DISTRIB) 377 .setDescription("Paragraph distribution /complexity") 378 .setDirection(Metric.DIRECTION_NONE) 379 .setQualitative(true) 380 .setDomain(DOMAIN_COMPLEXITY) 381 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) 382 .create(); 383 384 // -------------------------------------------------------------------------------------------------------------------- 385 // 386 // UNIT TESTS 387 // 388 // -------------------------------------------------------------------------------------------------------------------- 389 390 public static final String TESTS_KEY = "tests"; 391 392 /** 393 * Value of measure for this metric can be saved from Sensor, taking into account following rules: 394 * <ul> 395 * <li>If tool (like Maven Surefire Plugin) has not been activated to run unit tests, then Sensor should not save anything. For example there is no such tool for COBOL.</li> 396 * <li>If tool has been activated, but there was no unit tests to run, then zero value should be saved for project.</li> 397 * <li>Non-zero value should be saved for resources representing tests. And Sonar provides default Decorator, which will decorate parent resources.</li> 398 * <li>Should include {@link #TEST_FAILURES} and {@link #TEST_ERRORS}, but should not include {@link #SKIPPED_TESTS}.</li> 399 * </ul> 400 */ 401 public static final Metric TESTS = new Metric.Builder(TESTS_KEY, "Unit tests", Metric.ValueType.INT) 402 .setDescription("Number of unit tests") 403 .setDirection(Metric.DIRECTION_WORST) 404 .setQualitative(false) 405 .setDomain(DOMAIN_TESTS) 406 .create(); 407 408 public static final String TEST_EXECUTION_TIME_KEY = "test_execution_time"; 409 public static final Metric TEST_EXECUTION_TIME = new Metric.Builder(TEST_EXECUTION_TIME_KEY, "Unit tests duration", Metric.ValueType.MILLISEC) 410 .setDescription("Execution duration of unit tests") 411 .setDirection(Metric.DIRECTION_WORST) 412 .setQualitative(false) 413 .setDomain(DOMAIN_TESTS) 414 .create(); 415 416 public static final String TEST_ERRORS_KEY = "test_errors"; 417 public static final Metric TEST_ERRORS = new Metric.Builder(TEST_ERRORS_KEY, "Unit test errors", Metric.ValueType.INT) 418 .setDescription("Number of unit test errors") 419 .setDirection(Metric.DIRECTION_WORST) 420 .setQualitative(true) 421 .setDomain(DOMAIN_TESTS) 422 .setBestValue(0.0) 423 .setOptimizedBestValue(true) 424 .create(); 425 426 public static final String SKIPPED_TESTS_KEY = "skipped_tests"; 427 public static final Metric SKIPPED_TESTS = new Metric.Builder(SKIPPED_TESTS_KEY, "Skipped unit tests", Metric.ValueType.INT) 428 .setDescription("Number of skipped unit tests") 429 .setDirection(Metric.DIRECTION_WORST) 430 .setQualitative(true) 431 .setDomain(DOMAIN_TESTS) 432 .setBestValue(0.0) 433 .setOptimizedBestValue(true) 434 .create(); 435 436 public static final String TEST_FAILURES_KEY = "test_failures"; 437 public static final Metric TEST_FAILURES = new Metric.Builder(TEST_FAILURES_KEY, "Unit test failures", Metric.ValueType.INT) 438 .setDescription("Number of unit test failures") 439 .setDirection(Metric.DIRECTION_WORST) 440 .setQualitative(true) 441 .setDomain(DOMAIN_TESTS) 442 .setBestValue(0.0) 443 .setOptimizedBestValue(true) 444 .create(); 445 446 public static final String TEST_SUCCESS_DENSITY_KEY = "test_success_density"; 447 public static final Metric TEST_SUCCESS_DENSITY = new Metric.Builder(TEST_SUCCESS_DENSITY_KEY, "Unit test success (%)", Metric.ValueType.PERCENT) 448 .setDescription("Density of successful unit tests") 449 .setDirection(Metric.DIRECTION_BETTER) 450 .setQualitative(true) 451 .setDomain(DOMAIN_TESTS) 452 .setWorstValue(0.0) 453 .setBestValue(100.0) 454 .setOptimizedBestValue(true) 455 .create(); 456 457 public static final String TEST_DATA_KEY = "test_data"; 458 public static final Metric TEST_DATA = new Metric.Builder(TEST_DATA_KEY, "Unit tests details", Metric.ValueType.DATA) 459 .setDescription("Unit tests details") 460 .setDirection(Metric.DIRECTION_WORST) 461 .setDomain(DOMAIN_TESTS) 462 .create(); 463 464 public static final String COVERAGE_KEY = "coverage"; 465 public static final Metric COVERAGE = new Metric.Builder(COVERAGE_KEY, "Coverage", Metric.ValueType.PERCENT) 466 .setDescription("Coverage by unit tests") 467 .setDirection(Metric.DIRECTION_BETTER) 468 .setQualitative(true) 469 .setDomain(DOMAIN_TESTS) 470 .setWorstValue(0.0) 471 .setBestValue(100.0) 472 .create(); 473 474 public static final String NEW_COVERAGE_KEY = "new_coverage"; 475 public static final Metric NEW_COVERAGE = new Metric.Builder(NEW_COVERAGE_KEY, "New coverage", Metric.ValueType.PERCENT) 476 .setDescription("Coverage of new/changed code") 477 .setDirection(Metric.DIRECTION_BETTER) 478 .setQualitative(true) 479 .setDomain(DOMAIN_TESTS) 480 .setWorstValue(0.0) 481 .setBestValue(100.0) 482 .setDeleteHistoricalData(true) 483 .create(); 484 485 public static final String LINES_TO_COVER_KEY = "lines_to_cover"; 486 487 /** 488 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 489 */ 490 public static final Metric LINES_TO_COVER = new Metric.Builder(LINES_TO_COVER_KEY, "Lines to cover", Metric.ValueType.INT) 491 .setDescription("Lines to cover") 492 .setDirection(Metric.DIRECTION_BETTER) 493 .setQualitative(false) 494 .setDomain(DOMAIN_TESTS) 495 .setFormula(new SumChildValuesFormula(false)) 496 .create(); 497 498 public static final String NEW_LINES_TO_COVER_KEY = "new_lines_to_cover"; 499 public static final Metric NEW_LINES_TO_COVER = new Metric.Builder(NEW_LINES_TO_COVER_KEY, "New lines to cover", Metric.ValueType.INT) 500 .setDescription("New lines to cover") 501 .setDirection(Metric.DIRECTION_WORST) 502 .setQualitative(false) 503 .setDomain(DOMAIN_TESTS) 504 .setFormula(new SumChildValuesFormula(false)) 505 .setDeleteHistoricalData(true) 506 .create(); 507 508 public static final String UNCOVERED_LINES_KEY = "uncovered_lines"; 509 510 /** 511 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 512 */ 513 public static final Metric UNCOVERED_LINES = new Metric.Builder(UNCOVERED_LINES_KEY, "Uncovered lines", Metric.ValueType.INT) 514 .setDescription("Uncovered lines") 515 .setDirection(Metric.DIRECTION_WORST) 516 .setDomain(DOMAIN_TESTS) 517 .setFormula(new SumChildValuesFormula(false)) 518 .setBestValue(0.0) 519 .create(); 520 521 public static final String NEW_UNCOVERED_LINES_KEY = "new_uncovered_lines"; 522 public static final Metric NEW_UNCOVERED_LINES = new Metric.Builder(NEW_UNCOVERED_LINES_KEY, "New uncovered lines", Metric.ValueType.INT) 523 .setDescription("New uncovered lines") 524 .setDirection(Metric.DIRECTION_WORST) 525 .setDomain(DOMAIN_TESTS) 526 .setFormula(new SumChildValuesFormula(false)) 527 .setBestValue(0.0) 528 .setDeleteHistoricalData(true) 529 .create(); 530 531 public static final String LINE_COVERAGE_KEY = "line_coverage"; 532 public static final Metric LINE_COVERAGE = new Metric.Builder(LINE_COVERAGE_KEY, "Line coverage", Metric.ValueType.PERCENT) 533 .setDescription("Line coverage") 534 .setDirection(Metric.DIRECTION_BETTER) 535 .setQualitative(true) 536 .setDomain(DOMAIN_TESTS) 537 .setWorstValue(0.0) 538 .setBestValue(100.0) 539 .create(); 540 541 public static final String NEW_LINE_COVERAGE_KEY = "new_line_coverage"; 542 public static final Metric NEW_LINE_COVERAGE = new Metric.Builder(NEW_LINE_COVERAGE_KEY, "New line coverage", Metric.ValueType.PERCENT) 543 .setDescription("Line coverage of added/changed code") 544 .setDirection(Metric.DIRECTION_BETTER) 545 .setQualitative(true) 546 .setWorstValue(0.0) 547 .setBestValue(100.0) 548 .setDomain(DOMAIN_TESTS) 549 .setDeleteHistoricalData(true) 550 .create(); 551 552 public static final String COVERAGE_LINE_HITS_DATA_KEY = "coverage_line_hits_data"; 553 554 /** 555 * Key-value pairs, where key - is a number of line, and value - is a number of hits for this line. 556 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 557 */ 558 public static final Metric COVERAGE_LINE_HITS_DATA = new Metric.Builder(COVERAGE_LINE_HITS_DATA_KEY, "Coverage hits by line", Metric.ValueType.DATA) 559 .setDomain(DOMAIN_TESTS) 560 .setDeleteHistoricalData(true) 561 .create(); 562 563 public static final String CONDITIONS_TO_COVER_KEY = "conditions_to_cover"; 564 565 /** 566 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 567 */ 568 public static final Metric CONDITIONS_TO_COVER = new Metric.Builder(CONDITIONS_TO_COVER_KEY, "Conditions to cover", Metric.ValueType.INT) 569 .setDescription("Conditions to cover") 570 .setDomain(DOMAIN_TESTS) 571 .setFormula(new SumChildValuesFormula(false)) 572 .setHidden(true) 573 .setDeleteHistoricalData(true) 574 .create(); 575 576 public static final String NEW_CONDITIONS_TO_COVER_KEY = "new_conditions_to_cover"; 577 public static final Metric NEW_CONDITIONS_TO_COVER = new Metric.Builder(NEW_CONDITIONS_TO_COVER_KEY, "New conditions to cover", Metric.ValueType.INT) 578 .setDescription("New conditions to cover") 579 .setDomain(DOMAIN_TESTS) 580 .setFormula(new SumChildValuesFormula(false)) 581 .setDeleteHistoricalData(true) 582 .create(); 583 584 public static final String UNCOVERED_CONDITIONS_KEY = "uncovered_conditions"; 585 586 /** 587 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 588 */ 589 public static final Metric UNCOVERED_CONDITIONS = new Metric.Builder(UNCOVERED_CONDITIONS_KEY, "Uncovered conditions", Metric.ValueType.INT) 590 .setDescription("Uncovered conditions") 591 .setDirection(Metric.DIRECTION_WORST) 592 .setDomain(DOMAIN_TESTS) 593 .setFormula(new SumChildValuesFormula(false)) 594 .setBestValue(0.0) 595 .create(); 596 597 public static final String NEW_UNCOVERED_CONDITIONS_KEY = "new_uncovered_conditions"; 598 public static final Metric NEW_UNCOVERED_CONDITIONS = new Metric.Builder(NEW_UNCOVERED_CONDITIONS_KEY, "New uncovered conditions", Metric.ValueType.INT) 599 .setDescription("New uncovered conditions") 600 .setDirection(Metric.DIRECTION_WORST) 601 .setDomain(DOMAIN_TESTS) 602 .setFormula(new SumChildValuesFormula(false)) 603 .setBestValue(0.0) 604 .setDeleteHistoricalData(true) 605 .create(); 606 607 public static final String BRANCH_COVERAGE_KEY = "branch_coverage"; 608 public static final Metric BRANCH_COVERAGE = new Metric.Builder(BRANCH_COVERAGE_KEY, "Branch coverage", Metric.ValueType.PERCENT) 609 .setDescription("Branch coverage") 610 .setDirection(Metric.DIRECTION_BETTER) 611 .setQualitative(true) 612 .setDomain(DOMAIN_TESTS) 613 .setWorstValue(0.0) 614 .setBestValue(100.0) 615 .create(); 616 617 public static final String NEW_BRANCH_COVERAGE_KEY = "new_branch_coverage"; 618 public static final Metric NEW_BRANCH_COVERAGE = new Metric.Builder(NEW_BRANCH_COVERAGE_KEY, "New branch coverage", Metric.ValueType.PERCENT) 619 .setDescription("Branch coverage of new/changed code") 620 .setDirection(Metric.DIRECTION_BETTER) 621 .setQualitative(true) 622 .setDomain(DOMAIN_TESTS) 623 .setWorstValue(0.0) 624 .setBestValue(100.0) 625 .setDeleteHistoricalData(true) 626 .create(); 627 628 /** 629 * @deprecated in 2.7. Replaced by {@link #CONDITIONS_BY_LINE_KEY} and {@link #COVERED_CONDITIONS_BY_LINE_KEY} 630 */ 631 @Deprecated 632 public static final String BRANCH_COVERAGE_HITS_DATA_KEY = "branch_coverage_hits_data"; 633 634 /** 635 * @deprecated in 2.7. Replaced by metrics {@link #CONDITIONS_BY_LINE} and {@link #COVERED_CONDITIONS_BY_LINE} 636 */ 637 @Deprecated 638 public static final Metric BRANCH_COVERAGE_HITS_DATA = new Metric.Builder(BRANCH_COVERAGE_HITS_DATA_KEY, "Branch coverage hits", Metric.ValueType.DATA) 639 .setDomain(DOMAIN_TESTS) 640 .setDeleteHistoricalData(true) 641 .create(); 642 643 public static final String CONDITIONS_BY_LINE_KEY = "conditions_by_line"; 644 645 /** 646 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 647 * 648 * @since 2.7 649 */ 650 public static final Metric CONDITIONS_BY_LINE = new Metric.Builder(CONDITIONS_BY_LINE_KEY, "Conditions by line", Metric.ValueType.DATA) 651 .setDomain(DOMAIN_TESTS) 652 .setDeleteHistoricalData(true) 653 .create(); 654 655 public static final String COVERED_CONDITIONS_BY_LINE_KEY = "covered_conditions_by_line"; 656 657 /** 658 * Use {@link CoverageMeasuresBuilder} to build measure for this metric. 659 * 660 * @since 2.7 661 */ 662 public static final Metric COVERED_CONDITIONS_BY_LINE = new Metric.Builder(COVERED_CONDITIONS_BY_LINE_KEY, "Covered conditions by line", Metric.ValueType.DATA) 663 .setDomain(DOMAIN_TESTS) 664 .setDeleteHistoricalData(true) 665 .create(); 666 667 // -------------------------------------------------------------------------------------------------------------------- 668 // 669 // INTEGRATION TESTS 670 // 671 // -------------------------------------------------------------------------------------------------------------------- 672 673 /** 674 * @since 2.12 675 */ 676 public static final String IT_COVERAGE_KEY = "it_coverage"; 677 678 /** 679 * @since 2.12 680 */ 681 public static final Metric IT_COVERAGE = new Metric.Builder(IT_COVERAGE_KEY, "IT Coverage", Metric.ValueType.PERCENT) 682 .setDescription("Coverage by integration tests") 683 .setDirection(Metric.DIRECTION_BETTER) 684 .setQualitative(true) 685 .setDomain(DOMAIN_INTEGRATION_TESTS) 686 .setWorstValue(0.0) 687 .setBestValue(100.0) 688 .create(); 689 690 /** 691 * @since 2.12 692 */ 693 public static final String NEW_IT_COVERAGE_KEY = "new_it_coverage"; 694 695 /** 696 * @since 2.12 697 */ 698 public static final Metric NEW_IT_COVERAGE = new Metric.Builder(NEW_IT_COVERAGE_KEY, "New Coverage by IT", Metric.ValueType.PERCENT) 699 .setDescription("Integration Tests Coverage of new/changed code") 700 .setDirection(Metric.DIRECTION_BETTER) 701 .setQualitative(true) 702 .setDomain(DOMAIN_INTEGRATION_TESTS) 703 .setWorstValue(0.0) 704 .setBestValue(100.0) 705 .setDeleteHistoricalData(true) 706 .create(); 707 708 /** 709 * @since 2.12 710 */ 711 public static final String IT_LINES_TO_COVER_KEY = "it_lines_to_cover"; 712 713 /** 714 * @since 2.12 715 */ 716 public static final Metric IT_LINES_TO_COVER = new Metric.Builder(IT_LINES_TO_COVER_KEY, "IT Lines to Cover", Metric.ValueType.INT) 717 .setDescription("Lines to cover by Integration Tests") 718 .setDirection(Metric.DIRECTION_BETTER) 719 .setDomain(DOMAIN_INTEGRATION_TESTS) 720 .setQualitative(false) 721 .setFormula(new SumChildValuesFormula(false)) 722 .setHidden(true) 723 .setDeleteHistoricalData(true) 724 .create(); 725 726 /** 727 * @since 2.12 728 */ 729 public static final String NEW_IT_LINES_TO_COVER_KEY = "new_it_lines_to_cover"; 730 731 /** 732 * @since 2.12 733 */ 734 public static final Metric NEW_IT_LINES_TO_COVER = new Metric.Builder(NEW_IT_LINES_TO_COVER_KEY, "New Lines to Cover by IT", Metric.ValueType.INT) 735 .setDescription("New lines to cover by Integration Tests") 736 .setDirection(Metric.DIRECTION_WORST) 737 .setQualitative(false) 738 .setDomain(DOMAIN_INTEGRATION_TESTS) 739 .setFormula(new SumChildValuesFormula(false)) 740 .setDeleteHistoricalData(true) 741 .create(); 742 743 /** 744 * @since 2.12 745 */ 746 public static final String IT_UNCOVERED_LINES_KEY = "it_uncovered_lines"; 747 748 /** 749 * @since 2.12 750 */ 751 public static final Metric IT_UNCOVERED_LINES = new Metric.Builder(IT_UNCOVERED_LINES_KEY, "IT Uncovered Lines", Metric.ValueType.INT) 752 .setDescription("IT uncovered lines") 753 .setDirection(Metric.DIRECTION_WORST) 754 .setQualitative(false) 755 .setDomain(DOMAIN_INTEGRATION_TESTS) 756 .setFormula(new SumChildValuesFormula(false)) 757 .create(); 758 759 /** 760 * @since 2.12 761 */ 762 public static final String NEW_IT_UNCOVERED_LINES_KEY = "new_it_uncovered_lines"; 763 764 /** 765 * @since 2.12 766 */ 767 public static final Metric NEW_IT_UNCOVERED_LINES = new Metric.Builder(NEW_IT_UNCOVERED_LINES_KEY, "New Uncovered Lines by IT", Metric.ValueType.INT) 768 .setDescription("New uncovered lines by Integration Tests") 769 .setDirection(Metric.DIRECTION_WORST) 770 .setDomain(DOMAIN_INTEGRATION_TESTS) 771 .setFormula(new SumChildValuesFormula(false)) 772 .setBestValue(0.0) 773 .setDeleteHistoricalData(true) 774 .create(); 775 776 /** 777 * @since 2.12 778 */ 779 public static final String IT_LINE_COVERAGE_KEY = "it_line_coverage"; 780 781 /** 782 * @since 2.12 783 */ 784 public static final Metric IT_LINE_COVERAGE = new Metric.Builder(IT_LINE_COVERAGE_KEY, "IT Line coverage", Metric.ValueType.PERCENT) 785 .setDescription("IT line coverage") 786 .setDirection(Metric.DIRECTION_BETTER) 787 .setQualitative(true) 788 .setDomain(DOMAIN_INTEGRATION_TESTS) 789 .create(); 790 791 /** 792 * @since 2.12 793 */ 794 public static final String NEW_IT_LINE_COVERAGE_KEY = "new_it_line_coverage"; 795 796 /** 797 * @since 2.12 798 */ 799 public static final Metric NEW_IT_LINE_COVERAGE = new Metric.Builder(NEW_IT_LINE_COVERAGE_KEY, "New Line Coverage by IT", Metric.ValueType.PERCENT) 800 .setDescription("Line Coverage by Integration Tests of added/changed code") 801 .setDirection(Metric.DIRECTION_BETTER) 802 .setQualitative(true) 803 .setWorstValue(0.0) 804 .setBestValue(100.0) 805 .setDomain(DOMAIN_INTEGRATION_TESTS) 806 .setDeleteHistoricalData(true) 807 .create(); 808 809 /** 810 * @since 2.12 811 */ 812 public static final String IT_COVERAGE_LINE_HITS_DATA_KEY = "it_coverage_line_hits_data"; 813 814 /** 815 * @since 2.12 816 */ 817 public static final Metric IT_COVERAGE_LINE_HITS_DATA = new Metric.Builder(IT_COVERAGE_LINE_HITS_DATA_KEY, "IT Coverage Hits Data", Metric.ValueType.DATA) 818 .setDescription("IT Code coverage line hits data") 819 .setDirection(Metric.DIRECTION_NONE) 820 .setQualitative(false) 821 .setDomain(DOMAIN_INTEGRATION_TESTS) 822 .setDeleteHistoricalData(true) 823 .create(); 824 825 /** 826 * @since 2.12 827 */ 828 public static final String IT_CONDITIONS_TO_COVER_KEY = "it_conditions_to_cover"; 829 830 /** 831 * @since 2.12 832 */ 833 public static final Metric IT_CONDITIONS_TO_COVER = new Metric.Builder(IT_CONDITIONS_TO_COVER_KEY, "IT Branches to Cover", Metric.ValueType.INT) 834 .setDescription("IT Conditions to cover") 835 .setDirection(Metric.DIRECTION_BETTER) 836 .setQualitative(false) 837 .setDomain(DOMAIN_INTEGRATION_TESTS) 838 .setFormula(new SumChildValuesFormula(false)) 839 .setHidden(true) 840 .setDeleteHistoricalData(true) 841 .create(); 842 843 /** 844 * @since 2.12 845 */ 846 public static final String NEW_IT_CONDITIONS_TO_COVER_KEY = "new_it_conditions_to_cover"; 847 848 /** 849 * @since 2.12 850 */ 851 public static final Metric NEW_IT_CONDITIONS_TO_COVER = new Metric.Builder(NEW_IT_CONDITIONS_TO_COVER_KEY, "New Conditions to Cover by IT", Metric.ValueType.INT) 852 .setDescription("New conditions to cover by Integration Tests") 853 .setDomain(DOMAIN_INTEGRATION_TESTS) 854 .setFormula(new SumChildValuesFormula(false)) 855 .setDeleteHistoricalData(true) 856 .create(); 857 858 /** 859 * @since 2.12 860 */ 861 public static final String IT_UNCOVERED_CONDITIONS_KEY = "it_uncovered_conditions"; 862 863 /** 864 * @since 2.12 865 */ 866 public static final Metric IT_UNCOVERED_CONDITIONS = new Metric.Builder(IT_UNCOVERED_CONDITIONS_KEY, "IT Uncovered Branches", Metric.ValueType.INT) 867 .setDescription("IT Uncovered conditions") 868 .setDirection(Metric.DIRECTION_WORST) 869 .setDomain(DOMAIN_INTEGRATION_TESTS) 870 .setFormula(new SumChildValuesFormula(false)) 871 .create(); 872 873 /** 874 * @since 2.12 875 */ 876 public static final String NEW_IT_UNCOVERED_CONDITIONS_KEY = "new_it_uncovered_conditions"; 877 878 /** 879 * @since 2.12 880 */ 881 public static final Metric NEW_IT_UNCOVERED_CONDITIONS = new Metric.Builder(NEW_IT_UNCOVERED_CONDITIONS_KEY, "New Uncovered Conditions by IT", Metric.ValueType.INT) 882 .setDescription("New uncovered conditions by Integration Tests") 883 .setDirection(Metric.DIRECTION_WORST) 884 .setDomain(DOMAIN_INTEGRATION_TESTS) 885 .setFormula(new SumChildValuesFormula(false)) 886 .setBestValue(0.0) 887 .setDeleteHistoricalData(true) 888 .create(); 889 890 /** 891 * @since 2.12 892 */ 893 public static final String IT_BRANCH_COVERAGE_KEY = "it_branch_coverage"; 894 895 /** 896 * @since 2.12 897 */ 898 public static final Metric IT_BRANCH_COVERAGE = new Metric.Builder(IT_BRANCH_COVERAGE_KEY, "IT Branch Coverage", Metric.ValueType.PERCENT) 899 .setDescription("IT Branch coverage") 900 .setDirection(Metric.DIRECTION_BETTER) 901 .setQualitative(true) 902 .setDomain(DOMAIN_INTEGRATION_TESTS) 903 .setWorstValue(0.0) 904 .setBestValue(100.0) 905 .create(); 906 907 /** 908 * @since 2.12 909 */ 910 public static final String NEW_IT_BRANCH_COVERAGE_KEY = "new_it_branch_coverage"; 911 912 /** 913 * @since 2.12 914 */ 915 public static final Metric NEW_IT_BRANCH_COVERAGE = new Metric.Builder(NEW_IT_BRANCH_COVERAGE_KEY, "New Branch Coverage by IT", Metric.ValueType.PERCENT) 916 .setDescription("Branch coverage by Integration Tests of new/changed code") 917 .setDirection(Metric.DIRECTION_BETTER) 918 .setQualitative(true) 919 .setDomain(DOMAIN_INTEGRATION_TESTS) 920 .setWorstValue(0.0) 921 .setBestValue(100.0) 922 .setDeleteHistoricalData(true) 923 .create(); 924 925 /** 926 * @since 2.12 927 */ 928 public static final String IT_CONDITIONS_BY_LINE_KEY = "it_conditions_by_line"; 929 930 /** 931 * @since 2.12 932 */ 933 public static final Metric IT_CONDITIONS_BY_LINE = new Metric.Builder(IT_CONDITIONS_BY_LINE_KEY, "IT Branches by Line", Metric.ValueType.DATA) 934 .setDomain(DOMAIN_INTEGRATION_TESTS) 935 .setDeleteHistoricalData(true) 936 .create(); 937 938 /** 939 * @since 2.12 940 */ 941 public static final String IT_COVERED_CONDITIONS_BY_LINE_KEY = "it_covered_conditions_by_line"; 942 943 /** 944 * @since 2.12 945 */ 946 public static final Metric IT_COVERED_CONDITIONS_BY_LINE = new Metric.Builder(IT_COVERED_CONDITIONS_BY_LINE_KEY, "IT Covered Branches by Line", Metric.ValueType.DATA) 947 .setDomain(DOMAIN_INTEGRATION_TESTS) 948 .setDeleteHistoricalData(true) 949 .create(); 950 951 // -------------------------------------------------------------------------------------------------------------------- 952 // 953 // DUPLICATIONS 954 // 955 // -------------------------------------------------------------------------------------------------------------------- 956 957 public static final String DUPLICATED_LINES_KEY = "duplicated_lines"; 958 public static final Metric DUPLICATED_LINES = new Metric.Builder(DUPLICATED_LINES_KEY, "Duplicated lines", Metric.ValueType.INT) 959 .setDescription("Duplicated lines") 960 .setDirection(Metric.DIRECTION_WORST) 961 .setQualitative(true) 962 .setDomain(DOMAIN_DUPLICATION) 963 .setBestValue(0.0) 964 .setOptimizedBestValue(true) 965 .create(); 966 967 public static final String DUPLICATED_BLOCKS_KEY = "duplicated_blocks"; 968 public static final Metric DUPLICATED_BLOCKS = new Metric.Builder(DUPLICATED_BLOCKS_KEY, "Duplicated blocks", Metric.ValueType.INT) 969 .setDescription("Duplicated blocks") 970 .setDirection(Metric.DIRECTION_WORST) 971 .setQualitative(true) 972 .setDomain(DOMAIN_DUPLICATION) 973 .setBestValue(0.0) 974 .setOptimizedBestValue(true) 975 .create(); 976 977 public static final String DUPLICATED_FILES_KEY = "duplicated_files"; 978 979 /** 980 * For files: if it contains duplicates, then 1, otherwise 0. 981 * For other resources: amount of files under this resource with duplicates. 982 */ 983 public static final Metric DUPLICATED_FILES = new Metric.Builder(DUPLICATED_FILES_KEY, "Duplicated files", Metric.ValueType.INT) 984 .setDescription("Duplicated files") 985 .setDirection(Metric.DIRECTION_WORST) 986 .setQualitative(true) 987 .setDomain(DOMAIN_DUPLICATION) 988 .setBestValue(0.0) 989 .setOptimizedBestValue(true) 990 .create(); 991 992 public static final String DUPLICATED_LINES_DENSITY_KEY = "duplicated_lines_density"; 993 public static final Metric DUPLICATED_LINES_DENSITY = new Metric.Builder(DUPLICATED_LINES_DENSITY_KEY, "Duplicated lines (%)", Metric.ValueType.PERCENT) 994 .setDescription("Duplicated lines balanced by statements") 995 .setDirection(Metric.DIRECTION_WORST) 996 .setQualitative(true) 997 .setDomain(DOMAIN_DUPLICATION) 998 .setWorstValue(50.0) 999 .setBestValue(0.0) 1000 .setOptimizedBestValue(true) 1001 .create(); 1002 1003 public static final String DUPLICATIONS_DATA_KEY = "duplications_data"; 1004 1005 /** 1006 * Information about duplications, which is represented as an XML string. 1007 * <br> 1008 * <br> 1009 * Here is the format (since Sonar 2.12): 1010 * <pre> {@code 1011 * <duplications> 1012 * <!-- Multiple groups: --> 1013 * <g> 1014 * <!-- Multiple blocks: --> 1015 * <b r="[resource key]" s="[first line]" l="[number of lines]" /> 1016 * ... 1017 * </g> 1018 * ... 1019 * </duplications>} 1020 * </pre> 1021 */ 1022 public static final Metric DUPLICATIONS_DATA = new Metric.Builder(DUPLICATIONS_DATA_KEY, "Duplications details", Metric.ValueType.DATA) 1023 .setDescription("Duplications details") 1024 .setDirection(Metric.DIRECTION_NONE) 1025 .setQualitative(false) 1026 .setDomain(DOMAIN_DUPLICATION) 1027 .setDeleteHistoricalData(true) 1028 .create(); 1029 1030 // -------------------------------------------------------------------------------------------------------------------- 1031 // 1032 // CODING RULES 1033 // 1034 // -------------------------------------------------------------------------------------------------------------------- 1035 1036 /** 1037 * @deprecated since 2.5 See SONAR-2007 1038 */ 1039 @Deprecated 1040 public static final String USABILITY_KEY = "usability"; 1041 1042 /** 1043 * @deprecated since 2.5 See SONAR-2007 1044 */ 1045 @Deprecated 1046 public static final Metric USABILITY = new Metric(USABILITY_KEY, "Usability", "Usability", Metric.ValueType.PERCENT, 1047 Metric.DIRECTION_BETTER, true, DOMAIN_RULE_CATEGORIES).setBestValue(100.0).setOptimizedBestValue(true); 1048 1049 /** 1050 * @deprecated since 2.5 See SONAR-2007 1051 */ 1052 @Deprecated 1053 public static final String RELIABILITY_KEY = "reliability"; 1054 1055 /** 1056 * @deprecated since 2.5 See SONAR-2007 1057 */ 1058 @Deprecated 1059 public static final Metric RELIABILITY = new Metric(RELIABILITY_KEY, "Reliability", "Reliability", Metric.ValueType.PERCENT, 1060 Metric.DIRECTION_BETTER, true, DOMAIN_RULE_CATEGORIES).setBestValue(100.0).setOptimizedBestValue(true); 1061 1062 /** 1063 * @deprecated since 2.5 See SONAR-2007 1064 */ 1065 @Deprecated 1066 public static final String EFFICIENCY_KEY = "efficiency"; 1067 1068 /** 1069 * @deprecated since 2.5 See SONAR-2007 1070 */ 1071 @Deprecated 1072 public static final Metric EFFICIENCY = new Metric(EFFICIENCY_KEY, "Efficiency", "Efficiency", Metric.ValueType.PERCENT, 1073 Metric.DIRECTION_BETTER, true, DOMAIN_RULE_CATEGORIES).setBestValue(100.0).setOptimizedBestValue(true); 1074 1075 /** 1076 * @deprecated since 2.5 See SONAR-2007 1077 */ 1078 @Deprecated 1079 public static final String PORTABILITY_KEY = "portability"; 1080 1081 /** 1082 * @deprecated since 2.5 See SONAR-2007 1083 */ 1084 @Deprecated 1085 public static final Metric PORTABILITY = new Metric(PORTABILITY_KEY, "Portability", "Portability", Metric.ValueType.PERCENT, 1086 Metric.DIRECTION_BETTER, true, DOMAIN_RULE_CATEGORIES).setBestValue(100.0).setOptimizedBestValue(true); 1087 1088 /** 1089 * @deprecated since 2.5 See SONAR-2007 1090 */ 1091 @Deprecated 1092 public static final String MAINTAINABILITY_KEY = "maintainability"; 1093 1094 /** 1095 * @deprecated since 2.5 See SONAR-2007 1096 */ 1097 @Deprecated 1098 public static final Metric MAINTAINABILITY = new Metric.Builder(MAINTAINABILITY_KEY, "Maintainability", Metric.ValueType.PERCENT) 1099 .setDescription("Maintainability") 1100 .setDirection(Metric.DIRECTION_BETTER) 1101 .setQualitative(true) 1102 .setDomain(DOMAIN_RULE_CATEGORIES) 1103 .setBestValue(100.0) 1104 .setOptimizedBestValue(true) 1105 .create(); 1106 1107 public static final String WEIGHTED_VIOLATIONS_KEY = "weighted_violations"; 1108 public static final Metric WEIGHTED_VIOLATIONS = new Metric.Builder(WEIGHTED_VIOLATIONS_KEY, "Weighted violations", Metric.ValueType.INT) 1109 .setDescription("Weighted Violations") 1110 .setDirection(Metric.DIRECTION_WORST) 1111 .setQualitative(true) 1112 .setDomain(DOMAIN_RULES) 1113 .setBestValue(0.0) 1114 .setOptimizedBestValue(true) 1115 .create(); 1116 1117 public static final String VIOLATIONS_DENSITY_KEY = "violations_density"; 1118 public static final Metric VIOLATIONS_DENSITY = new Metric.Builder(VIOLATIONS_DENSITY_KEY, "Rules compliance", Metric.ValueType.PERCENT) 1119 .setDescription("Rules compliance") 1120 .setDirection(Metric.DIRECTION_BETTER) 1121 .setQualitative(true) 1122 .setDomain(DOMAIN_RULES) 1123 .create(); 1124 1125 public static final String VIOLATIONS_KEY = "violations"; 1126 public static final Metric VIOLATIONS = new Metric.Builder(VIOLATIONS_KEY, "Violations", Metric.ValueType.INT) 1127 .setDescription("Violations") 1128 .setDirection(Metric.DIRECTION_WORST) 1129 .setQualitative(true) 1130 .setDomain(DOMAIN_RULES) 1131 .setBestValue(0.0) 1132 .setOptimizedBestValue(true) 1133 .create(); 1134 1135 public static final String BLOCKER_VIOLATIONS_KEY = "blocker_violations"; 1136 public static final Metric BLOCKER_VIOLATIONS = new Metric.Builder(BLOCKER_VIOLATIONS_KEY, "Blocker violations", Metric.ValueType.INT) 1137 .setDescription("Blocker violations") 1138 .setDirection(Metric.DIRECTION_WORST) 1139 .setQualitative(true) 1140 .setDomain(DOMAIN_RULES) 1141 .setBestValue(0.0) 1142 .setOptimizedBestValue(true) 1143 .create(); 1144 1145 public static final String CRITICAL_VIOLATIONS_KEY = "critical_violations"; 1146 public static final Metric CRITICAL_VIOLATIONS = new Metric.Builder(CRITICAL_VIOLATIONS_KEY, "Critical violations", Metric.ValueType.INT) 1147 .setDescription("Critical violations") 1148 .setDirection(Metric.DIRECTION_WORST) 1149 .setQualitative(true) 1150 .setDomain(DOMAIN_RULES) 1151 .setBestValue(0.0) 1152 .setOptimizedBestValue(true) 1153 .create(); 1154 1155 public static final String MAJOR_VIOLATIONS_KEY = "major_violations"; 1156 public static final Metric MAJOR_VIOLATIONS = new Metric.Builder(MAJOR_VIOLATIONS_KEY, "Major violations", Metric.ValueType.INT) 1157 .setDescription("Major violations") 1158 .setDirection(Metric.DIRECTION_WORST) 1159 .setQualitative(true) 1160 .setDomain(DOMAIN_RULES) 1161 .setBestValue(0.0) 1162 .setOptimizedBestValue(true) 1163 .create(); 1164 1165 public static final String MINOR_VIOLATIONS_KEY = "minor_violations"; 1166 public static final Metric MINOR_VIOLATIONS = new Metric.Builder(MINOR_VIOLATIONS_KEY, "Minor violations", Metric.ValueType.INT) 1167 .setDescription("Minor violations") 1168 .setDirection(Metric.DIRECTION_WORST) 1169 .setQualitative(true) 1170 .setDomain(DOMAIN_RULES) 1171 .setBestValue(0.0) 1172 .setOptimizedBestValue(true) 1173 .create(); 1174 1175 public static final String INFO_VIOLATIONS_KEY = "info_violations"; 1176 public static final Metric INFO_VIOLATIONS = new Metric.Builder(INFO_VIOLATIONS_KEY, "Info violations", Metric.ValueType.INT) 1177 .setDescription("Info violations") 1178 .setDirection(Metric.DIRECTION_WORST) 1179 .setQualitative(true) 1180 .setDomain(DOMAIN_RULES) 1181 .setBestValue(0.0) 1182 .setOptimizedBestValue(true) 1183 .create(); 1184 1185 public static final String NEW_VIOLATIONS_KEY = "new_violations"; 1186 public static final Metric NEW_VIOLATIONS = new Metric.Builder(NEW_VIOLATIONS_KEY, "New Violations", Metric.ValueType.INT) 1187 .setDescription("New Violations") 1188 .setDirection(Metric.DIRECTION_WORST) 1189 .setQualitative(true) 1190 .setDomain(DOMAIN_RULES) 1191 .setBestValue(0.0) 1192 .setOptimizedBestValue(true) 1193 .setDeleteHistoricalData(true) 1194 .create(); 1195 1196 public static final String NEW_BLOCKER_VIOLATIONS_KEY = "new_blocker_violations"; 1197 public static final Metric NEW_BLOCKER_VIOLATIONS = new Metric.Builder(NEW_BLOCKER_VIOLATIONS_KEY, "New Blocker violations", Metric.ValueType.INT) 1198 .setDescription("New Blocker violations") 1199 .setDirection(Metric.DIRECTION_WORST) 1200 .setQualitative(true) 1201 .setDomain(DOMAIN_RULES) 1202 .setBestValue(0.0) 1203 .setOptimizedBestValue(true) 1204 .setDeleteHistoricalData(true) 1205 .create(); 1206 1207 public static final String NEW_CRITICAL_VIOLATIONS_KEY = "new_critical_violations"; 1208 public static final Metric NEW_CRITICAL_VIOLATIONS = new Metric.Builder(NEW_CRITICAL_VIOLATIONS_KEY, "New Critical violations", Metric.ValueType.INT) 1209 .setDescription("New Critical violations") 1210 .setDirection(Metric.DIRECTION_WORST) 1211 .setQualitative(true) 1212 .setDomain(DOMAIN_RULES) 1213 .setBestValue(0.0) 1214 .setOptimizedBestValue(true) 1215 .setDeleteHistoricalData(true) 1216 .create(); 1217 1218 public static final String NEW_MAJOR_VIOLATIONS_KEY = "new_major_violations"; 1219 public static final Metric NEW_MAJOR_VIOLATIONS = new Metric.Builder(NEW_MAJOR_VIOLATIONS_KEY, "New Major violations", Metric.ValueType.INT) 1220 .setDescription("New Major violations") 1221 .setDirection(Metric.DIRECTION_WORST) 1222 .setQualitative(true) 1223 .setDomain(DOMAIN_RULES) 1224 .setBestValue(0.0) 1225 .setOptimizedBestValue(true) 1226 .setDeleteHistoricalData(true) 1227 .create(); 1228 1229 public static final String NEW_MINOR_VIOLATIONS_KEY = "new_minor_violations"; 1230 public static final Metric NEW_MINOR_VIOLATIONS = new Metric.Builder(NEW_MINOR_VIOLATIONS_KEY, "New Minor violations", Metric.ValueType.INT) 1231 .setDescription("New Minor violations") 1232 .setDirection(Metric.DIRECTION_WORST) 1233 .setQualitative(true) 1234 .setDomain(DOMAIN_RULES) 1235 .setBestValue(0.0) 1236 .setOptimizedBestValue(true) 1237 .setDeleteHistoricalData(true) 1238 .create(); 1239 1240 public static final String NEW_INFO_VIOLATIONS_KEY = "new_info_violations"; 1241 public static final Metric NEW_INFO_VIOLATIONS = new Metric.Builder(NEW_INFO_VIOLATIONS_KEY, "New Info violations", Metric.ValueType.INT) 1242 .setDescription("New Info violations") 1243 .setDirection(Metric.DIRECTION_WORST) 1244 .setQualitative(true) 1245 .setDomain(DOMAIN_RULES) 1246 .setBestValue(0.0) 1247 .setOptimizedBestValue(true) 1248 .setDeleteHistoricalData(true) 1249 .create(); 1250 1251 // -------------------------------------------------------------------------------------------------------------------- 1252 // 1253 // DESIGN 1254 // 1255 // -------------------------------------------------------------------------------------------------------------------- 1256 1257 public static final String ABSTRACTNESS_KEY = "abstractness"; 1258 public static final Metric ABSTRACTNESS = new Metric.Builder(ABSTRACTNESS_KEY, "Abstractness", Metric.ValueType.PERCENT) 1259 .setDescription("Abstractness") 1260 .setDirection(Metric.DIRECTION_NONE) 1261 .setQualitative(false) 1262 .setDomain(DOMAIN_DESIGN) 1263 .create(); 1264 1265 public static final String INSTABILITY_KEY = "instability"; 1266 public static final Metric INSTABILITY = new Metric.Builder(INSTABILITY_KEY, "Instability", Metric.ValueType.PERCENT) 1267 .setDescription("Instability") 1268 .setDirection(Metric.DIRECTION_NONE) 1269 .setQualitative(false) 1270 .setDomain(DOMAIN_DESIGN) 1271 .create(); 1272 1273 public static final String DISTANCE_KEY = "distance"; 1274 public static final Metric DISTANCE = new Metric.Builder(DISTANCE_KEY, "Distance", Metric.ValueType.FLOAT) 1275 .setDescription("Distance") 1276 .setDirection(Metric.DIRECTION_NONE) 1277 .setQualitative(false) 1278 .setDomain(DOMAIN_DESIGN) 1279 .create(); 1280 1281 public static final String DEPTH_IN_TREE_KEY = "dit"; 1282 public static final Metric DEPTH_IN_TREE = new Metric.Builder(DEPTH_IN_TREE_KEY, "Depth in Tree", Metric.ValueType.INT) 1283 .setDescription("Depth in Inheritance Tree") 1284 .setDirection(Metric.DIRECTION_NONE) 1285 .setQualitative(false) 1286 .setDomain(DOMAIN_DESIGN) 1287 .create(); 1288 1289 public static final String NUMBER_OF_CHILDREN_KEY = "noc"; 1290 public static final Metric NUMBER_OF_CHILDREN = new Metric.Builder(NUMBER_OF_CHILDREN_KEY, "Number of Children", Metric.ValueType.INT) 1291 .setDescription("Number of Children") 1292 .setDirection(Metric.DIRECTION_NONE) 1293 .setQualitative(false) 1294 .setDomain(DOMAIN_DESIGN) 1295 .create(); 1296 1297 public static final String RFC_KEY = "rfc"; 1298 public static final Metric RFC = new Metric.Builder(RFC_KEY, "RFC", Metric.ValueType.INT) 1299 .setDescription("Response for Class") 1300 .setDirection(Metric.DIRECTION_WORST) 1301 .setQualitative(false) 1302 .setDomain(DOMAIN_DESIGN) 1303 .setFormula(new WeightedMeanAggregationFormula(CoreMetrics.FILES, false)) 1304 .create(); 1305 1306 public static final String RFC_DISTRIBUTION_KEY = "rfc_distribution"; 1307 public static final Metric RFC_DISTRIBUTION = new Metric.Builder(RFC_DISTRIBUTION_KEY, "Class distribution /RFC", Metric.ValueType.DISTRIB) 1308 .setDescription("Class distribution /RFC") 1309 .setDirection(Metric.DIRECTION_NONE) 1310 .setQualitative(true) 1311 .setDomain(DOMAIN_DESIGN) 1312 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) 1313 .create(); 1314 1315 public static final String LCOM4_KEY = "lcom4"; 1316 public static final Metric LCOM4 = new Metric.Builder(LCOM4_KEY, "LCOM4", Metric.ValueType.FLOAT) 1317 .setDescription("Lack of Cohesion of Methods") 1318 .setDirection(Metric.DIRECTION_WORST) 1319 .setQualitative(true) 1320 .setDomain(DOMAIN_DESIGN) 1321 .setBestValue(1.0) 1322 .setFormula(new WeightedMeanAggregationFormula(CoreMetrics.FILES, false)) 1323 .create(); 1324 1325 public static final String LCOM4_BLOCKS_KEY = "lcom4_blocks"; 1326 public static final Metric LCOM4_BLOCKS = new Metric.Builder(LCOM4_BLOCKS_KEY, "LCOM4 blocks", Metric.ValueType.DATA) 1327 .setDescription("LCOM4 blocks") 1328 .setDirection(Metric.DIRECTION_NONE) 1329 .setQualitative(false) 1330 .setDomain(DOMAIN_DESIGN) 1331 .setHidden(true) 1332 .setDeleteHistoricalData(true) 1333 .create(); 1334 1335 public static final String LCOM4_DISTRIBUTION_KEY = "lcom4_distribution"; 1336 public static final Metric LCOM4_DISTRIBUTION = new Metric.Builder(LCOM4_DISTRIBUTION_KEY, "Class distribution /LCOM4", Metric.ValueType.DISTRIB) 1337 .setDescription("Class distribution /LCOM4") 1338 .setDirection(Metric.DIRECTION_NONE) 1339 .setQualitative(true) 1340 .setDomain(DOMAIN_DESIGN) 1341 .setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) 1342 .create(); 1343 1344 public static final String SUSPECT_LCOM4_DENSITY_KEY = "suspect_lcom4_density"; 1345 public static final Metric SUSPECT_LCOM4_DENSITY = new Metric.Builder(SUSPECT_LCOM4_DENSITY_KEY, "Suspect LCOM4 density", Metric.ValueType.PERCENT) 1346 .setDescription("Density of classes having LCOM4>1") 1347 .setDirection(Metric.DIRECTION_WORST) 1348 .setQualitative(true) 1349 .setDomain(DOMAIN_DESIGN) 1350 .create(); 1351 1352 public static final String AFFERENT_COUPLINGS_KEY = "ca"; 1353 public static final Metric AFFERENT_COUPLINGS = new Metric.Builder(AFFERENT_COUPLINGS_KEY, "Afferent couplings", Metric.ValueType.INT) 1354 .setDescription("Afferent couplings") 1355 .setDirection(Metric.DIRECTION_WORST) 1356 .setQualitative(false) 1357 .setDomain(DOMAIN_DESIGN) 1358 .create(); 1359 1360 public static final String EFFERENT_COUPLINGS_KEY = "ce"; 1361 public static final Metric EFFERENT_COUPLINGS = new Metric.Builder(EFFERENT_COUPLINGS_KEY, "Efferent couplings", Metric.ValueType.INT) 1362 .setDescription("Efferent couplings") 1363 .setDirection(Metric.DIRECTION_WORST) 1364 .setQualitative(false) 1365 .setDomain(DOMAIN_DESIGN) 1366 .create(); 1367 1368 public static final String DEPENDENCY_MATRIX_KEY = "dsm"; 1369 public static final Metric DEPENDENCY_MATRIX = new Metric.Builder(DEPENDENCY_MATRIX_KEY, "Dependency Matrix", Metric.ValueType.DATA) 1370 .setDescription("Dependency Matrix") 1371 .setDirection(Metric.DIRECTION_NONE) 1372 .setQualitative(false) 1373 .setDomain(DOMAIN_DESIGN) 1374 .setDeleteHistoricalData(true) 1375 .create(); 1376 1377 public static final String PACKAGE_CYCLES_KEY = "package_cycles"; 1378 public static final Metric PACKAGE_CYCLES = new Metric.Builder(PACKAGE_CYCLES_KEY, "Package cycles", Metric.ValueType.INT) 1379 .setDescription("Package cycles") 1380 .setDirection(Metric.DIRECTION_WORST) 1381 .setQualitative(true) 1382 .setDomain(DOMAIN_DESIGN) 1383 .setBestValue(0.0) 1384 .setFormula(new SumChildValuesFormula(false)) 1385 .create(); 1386 1387 public static final String PACKAGE_TANGLE_INDEX_KEY = "package_tangle_index"; 1388 public static final Metric PACKAGE_TANGLE_INDEX = new Metric.Builder(PACKAGE_TANGLE_INDEX_KEY, "Package tangle index", Metric.ValueType.PERCENT) 1389 .setDescription("Package tangle index") 1390 .setDirection(Metric.DIRECTION_WORST) 1391 .setQualitative(true) 1392 .setBestValue(0.0) 1393 .setDomain(DOMAIN_DESIGN) 1394 .create(); 1395 1396 public static final String PACKAGE_TANGLES_KEY = "package_tangles"; 1397 public static final Metric PACKAGE_TANGLES = new Metric.Builder(PACKAGE_TANGLES_KEY, "File dependencies to cut", Metric.ValueType.INT) 1398 .setDescription("File dependencies to cut") 1399 .setDirection(Metric.DIRECTION_WORST) 1400 .setQualitative(false) 1401 .setDomain(DOMAIN_DESIGN) 1402 .setFormula(new SumChildValuesFormula(false)) 1403 .create(); 1404 1405 public static final String PACKAGE_FEEDBACK_EDGES_KEY = "package_feedback_edges"; 1406 public static final Metric PACKAGE_FEEDBACK_EDGES = new Metric.Builder(PACKAGE_FEEDBACK_EDGES_KEY, "Package dependencies to cut", Metric.ValueType.INT) 1407 .setDescription("Package dependencies to cut") 1408 .setDirection(Metric.DIRECTION_WORST) 1409 .setQualitative(false) 1410 .setDomain(DOMAIN_DESIGN) 1411 .setFormula(new SumChildValuesFormula(false)) 1412 .setBestValue(0.0) 1413 .create(); 1414 1415 public static final String PACKAGE_EDGES_WEIGHT_KEY = "package_edges_weight"; 1416 public static final Metric PACKAGE_EDGES_WEIGHT = new Metric.Builder(PACKAGE_EDGES_WEIGHT_KEY, "Package edges weight", Metric.ValueType.INT) 1417 .setDescription("Package edges weight") 1418 .setDirection(Metric.DIRECTION_BETTER) 1419 .setQualitative(false) 1420 .setDomain(DOMAIN_DESIGN) 1421 .setFormula(new SumChildValuesFormula(false)) 1422 .setHidden(true) 1423 .setDeleteHistoricalData(true) 1424 .create(); 1425 1426 public static final String FILE_CYCLES_KEY = "file_cycles"; 1427 public static final Metric FILE_CYCLES = new Metric.Builder(FILE_CYCLES_KEY, "File cycles", Metric.ValueType.INT) 1428 .setDescription("File cycles") 1429 .setDirection(Metric.DIRECTION_WORST) 1430 .setQualitative(true) 1431 .setDomain(DOMAIN_DESIGN) 1432 .setHidden(true) 1433 .setDeleteHistoricalData(true) 1434 .setBestValue(0.0) 1435 .create(); 1436 1437 public static final String FILE_TANGLE_INDEX_KEY = "file_tangle_index"; 1438 public static final Metric FILE_TANGLE_INDEX = new Metric.Builder(FILE_TANGLE_INDEX_KEY, "File tangle index", Metric.ValueType.PERCENT) 1439 .setDescription("File tangle index") 1440 .setDirection(Metric.DIRECTION_WORST) 1441 .setQualitative(true) 1442 .setDomain(DOMAIN_DESIGN) 1443 .setHidden(true) 1444 .setDeleteHistoricalData(true) 1445 .setBestValue(0.0) 1446 .create(); 1447 1448 public static final String FILE_TANGLES_KEY = "file_tangles"; 1449 public static final Metric FILE_TANGLES = new Metric.Builder(FILE_TANGLES_KEY, "File tangles", Metric.ValueType.INT) 1450 .setDescription("Files tangles") 1451 .setDirection(Metric.DIRECTION_WORST) 1452 .setQualitative(false) 1453 .setDomain(DOMAIN_DESIGN) 1454 .setHidden(true) 1455 .setDeleteHistoricalData(true) 1456 .create(); 1457 1458 public static final String FILE_FEEDBACK_EDGES_KEY = "file_feedback_edges"; 1459 public static final Metric FILE_FEEDBACK_EDGES = new Metric.Builder(FILE_FEEDBACK_EDGES_KEY, "Suspect file dependencies", Metric.ValueType.INT) 1460 .setDescription("Suspect file dependencies") 1461 .setDirection(Metric.DIRECTION_WORST) 1462 .setQualitative(false) 1463 .setDomain(DOMAIN_DESIGN) 1464 .setHidden(true) 1465 .setDeleteHistoricalData(true) 1466 .setBestValue(0.0) 1467 .create(); 1468 1469 public static final String FILE_EDGES_WEIGHT_KEY = "file_edges_weight"; 1470 public static final Metric FILE_EDGES_WEIGHT = new Metric.Builder(FILE_EDGES_WEIGHT_KEY, "File edges weight", Metric.ValueType.INT) 1471 .setDescription("File edges weight") 1472 .setDirection(Metric.DIRECTION_BETTER) 1473 .setQualitative(false) 1474 .setDomain(DOMAIN_DESIGN) 1475 .setHidden(true) 1476 .setDeleteHistoricalData(true) 1477 .create(); 1478 1479 // -------------------------------------------------------------------------------------------------------------------- 1480 // 1481 // SCM 1482 // These metrics are computed by the SCM Activity plugin, since version 1.2 and introduced here since version 2.7. 1483 // 1484 // -------------------------------------------------------------------------------------------------------------------- 1485 1486 /** 1487 * @since 2.7 1488 */ 1489 public static final String SCM_COMMITS_KEY = "commits"; 1490 1491 /** 1492 * @since 2.7 1493 */ 1494 public static final Metric SCM_COMMITS = new Metric.Builder(SCM_COMMITS_KEY, "Commits", Metric.ValueType.INT) 1495 .setDomain(DOMAIN_SCM) 1496 .create(); 1497 1498 /** 1499 * @since 2.7 1500 */ 1501 public static final String SCM_LAST_COMMIT_DATE_KEY = "last_commit_date"; 1502 1503 /** 1504 * Date of last commit, which is represented as string in format {@link org.sonar.api.utils.DateUtils#DATE_FORMAT}. 1505 * 1506 * @since 2.7 1507 */ 1508 public static final Metric SCM_LAST_COMMIT_DATE = new Metric.Builder(SCM_LAST_COMMIT_DATE_KEY, "Last commit", Metric.ValueType.STRING /* 1509 * TODO: 1510 * move 1511 * to 1512 * date 1513 */) 1514 .setDomain(DOMAIN_SCM) 1515 .create(); 1516 1517 /** 1518 * @since 2.7 1519 */ 1520 public static final String SCM_REVISION_KEY = "revision"; 1521 1522 /** 1523 * @since 2.7 1524 */ 1525 public static final Metric SCM_REVISION = new Metric.Builder(SCM_REVISION_KEY, "Revision", Metric.ValueType.STRING) 1526 .setDomain(DOMAIN_SCM) 1527 .setHidden(true) 1528 .create(); 1529 1530 /** 1531 * @since 2.7 1532 */ 1533 public static final String SCM_AUTHORS_BY_LINE_KEY = "authors_by_line"; 1534 1535 /** 1536 * Key-value pairs, where key - is a number of line, and value - is an author for this line. 1537 * 1538 * @see org.sonar.api.utils.KeyValueFormat#formatIntString(java.util.Map) 1539 * @see org.sonar.api.utils.KeyValueFormat#parseIntString(String) 1540 * @since 2.7 1541 */ 1542 public static final Metric SCM_AUTHORS_BY_LINE = new Metric.Builder(SCM_AUTHORS_BY_LINE_KEY, "Authors by line", Metric.ValueType.DATA) 1543 .setDomain(DOMAIN_SCM) 1544 .create(); 1545 1546 /** 1547 * @since 2.7 1548 */ 1549 public static final String SCM_REVISIONS_BY_LINE_KEY = "revisions_by_line"; 1550 1551 /** 1552 * Key-value pairs, where key - is a number of line, and value - is a revision for this line. 1553 * 1554 * @see org.sonar.api.utils.KeyValueFormat#formatIntString(java.util.Map) 1555 * @see org.sonar.api.utils.KeyValueFormat#parseIntString(String) 1556 * @since 2.7 1557 */ 1558 public static final Metric SCM_REVISIONS_BY_LINE = new Metric.Builder(SCM_REVISIONS_BY_LINE_KEY, "Revisions by line", Metric.ValueType.DATA) 1559 .setDomain(DOMAIN_SCM) 1560 .create(); 1561 1562 /** 1563 * @since 2.7 1564 */ 1565 public static final String SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY = "last_commit_datetimes_by_line"; 1566 1567 /** 1568 * Key-value pairs, where key - is a number of line, and value - is a date of last commit for this line. 1569 * 1570 * @see org.sonar.api.utils.KeyValueFormat#formatIntDateTime(java.util.Map) 1571 * @see org.sonar.api.utils.KeyValueFormat#parseIntDateTime(String) 1572 * @since 2.7 1573 */ 1574 public static final Metric SCM_LAST_COMMIT_DATETIMES_BY_LINE = new Metric.Builder(SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY, "Last commit dates by line", Metric.ValueType.DATA) 1575 .setDomain(DOMAIN_SCM) 1576 .create(); 1577 1578 // -------------------------------------------------------------------------------------------------------------------- 1579 // 1580 // REVIEWS (since 2.14) 1581 // 1582 // -------------------------------------------------------------------------------------------------------------------- 1583 1584 /** 1585 * @since 2.14 1586 */ 1587 public static final String UNREVIEWED_VIOLATIONS_KEY = "unreviewed_violations"; 1588 1589 /** 1590 * @since 2.14 1591 */ 1592 public static final Metric UNREVIEWED_VIOLATIONS = new Metric.Builder(UNREVIEWED_VIOLATIONS_KEY, "Unreviewed violations", Metric.ValueType.INT) 1593 .setDescription("Violations that have not been reviewed yet") 1594 .setDirection(Metric.DIRECTION_WORST) 1595 .setDomain(DOMAIN_REVIEWS) 1596 .setBestValue(0.0) 1597 .setOptimizedBestValue(true) 1598 .create(); 1599 1600 /** 1601 * @since 2.14 1602 */ 1603 public static final String NEW_UNREVIEWED_VIOLATIONS_KEY = "new_unreviewed_violations"; 1604 1605 /** 1606 * @since 2.14 1607 */ 1608 public static final Metric NEW_UNREVIEWED_VIOLATIONS = new Metric.Builder(NEW_UNREVIEWED_VIOLATIONS_KEY, "New unreviewed violations", Metric.ValueType.INT) 1609 .setDescription("New violations that have not been reviewed yet") 1610 .setDirection(Metric.DIRECTION_WORST) 1611 .setQualitative(true) 1612 .setDomain(DOMAIN_REVIEWS) 1613 .setBestValue(0.0) 1614 .setOptimizedBestValue(true) 1615 .setDeleteHistoricalData(true) 1616 .create(); 1617 1618 /** 1619 * @since 2.14 1620 */ 1621 public static final String FALSE_POSITIVE_REVIEWS_KEY = "false_positive_reviews"; 1622 1623 /** 1624 * @since 2.14 1625 */ 1626 public static final Metric FALSE_POSITIVE_REVIEWS = new Metric.Builder(FALSE_POSITIVE_REVIEWS_KEY, "False-positive reviews", Metric.ValueType.INT) 1627 .setDescription("Active false-positive reviews") 1628 .setDirection(Metric.DIRECTION_WORST) 1629 .setDomain(DOMAIN_REVIEWS) 1630 .setBestValue(0.0) 1631 .setOptimizedBestValue(true) 1632 .create(); 1633 1634 /** 1635 * @since 2.14 1636 */ 1637 public static final String ACTIVE_REVIEWS_KEY = "active_reviews"; 1638 1639 /** 1640 * @since 2.14 1641 */ 1642 public static final Metric ACTIVE_REVIEWS = new Metric.Builder(ACTIVE_REVIEWS_KEY, "Active reviews", Metric.ValueType.INT) 1643 .setDescription("Active open and reopened reviews") 1644 .setDirection(Metric.DIRECTION_WORST) 1645 .setDomain(DOMAIN_REVIEWS) 1646 .setBestValue(0.0) 1647 .setOptimizedBestValue(true) 1648 .create(); 1649 1650 /** 1651 * @since 2.14 1652 */ 1653 public static final String UNASSIGNED_REVIEWS_KEY = "unassigned_reviews"; 1654 1655 /** 1656 * @since 2.14 1657 */ 1658 public static final Metric UNASSIGNED_REVIEWS = new Metric.Builder(UNASSIGNED_REVIEWS_KEY, "Unassigned reviews", Metric.ValueType.INT) 1659 .setDescription("Active unassigned reviews") 1660 .setDirection(Metric.DIRECTION_WORST) 1661 .setDomain(DOMAIN_REVIEWS) 1662 .setBestValue(0.0) 1663 .setOptimizedBestValue(true) 1664 .create(); 1665 1666 /** 1667 * @since 2.14 1668 */ 1669 public static final String UNPLANNED_REVIEWS_KEY = "unplanned_reviews"; 1670 1671 /** 1672 * @since 2.14 1673 */ 1674 public static final Metric UNPLANNED_REVIEWS = new Metric.Builder(UNPLANNED_REVIEWS_KEY, "Unplanned reviews", Metric.ValueType.INT) 1675 .setDescription("Active unplanned reviews") 1676 .setDirection(Metric.DIRECTION_WORST) 1677 .setDomain(DOMAIN_REVIEWS) 1678 .setBestValue(0.0) 1679 .setOptimizedBestValue(true) 1680 .create(); 1681 1682 // -------------------------------------------------------------------------------------------------------------------- 1683 // 1684 // FILE DATA 1685 // 1686 // -------------------------------------------------------------------------------------------------------------------- 1687 1688 /** 1689 * @since 2.14 1690 */ 1691 @Beta 1692 public static final String NCLOC_DATA_KEY = "ncloc_data"; 1693 1694 /** 1695 * Information about lines of code in file. 1696 * Key-value pairs, where key - is a number of line, and value - is an indicator of whether line contains code (1) or not (0). 1697 * 1698 * @see org.sonar.api.measures.FileLinesContext 1699 * @since 2.14 1700 */ 1701 @Beta 1702 public static final Metric NCLOC_DATA = new Metric.Builder(NCLOC_DATA_KEY, "ncloc_data", Metric.ValueType.DATA) 1703 .setHidden(true) 1704 .setDomain(DOMAIN_SIZE) 1705 .create(); 1706 1707 /** 1708 * @since 2.14 1709 */ 1710 @Beta 1711 public static final String COMMENT_LINES_DATA_KEY = "comment_lines_data"; 1712 1713 /** 1714 * Information about comments in file. 1715 * Key-value pairs, where key - is a number of line, and value - is an indicator of whether line contains comment (1) or not (0). 1716 * 1717 * @see org.sonar.api.measures.FileLinesContext 1718 * @since 2.14 1719 */ 1720 @Beta 1721 public static final Metric COMMENT_LINES_DATA = new Metric.Builder(COMMENT_LINES_DATA_KEY, "comment_lines_data", Metric.ValueType.DATA) 1722 .setHidden(true) 1723 .setDomain(DOMAIN_DOCUMENTATION) 1724 .create(); 1725 1726 // -------------------------------------------------------------------------------------------------------------------- 1727 // 1728 // OTHERS 1729 // 1730 // -------------------------------------------------------------------------------------------------------------------- 1731 1732 public static final String ALERT_STATUS_KEY = "alert_status"; 1733 public static final Metric ALERT_STATUS = new Metric.Builder(ALERT_STATUS_KEY, "Alert", Metric.ValueType.LEVEL) 1734 .setDescription("Alert") 1735 .setDirection(Metric.DIRECTION_BETTER) 1736 .setQualitative(true) 1737 .setDomain(DOMAIN_GENERAL) 1738 .create(); 1739 1740 public static final String PROFILE_KEY = "profile"; 1741 public static final Metric PROFILE = new Metric.Builder(PROFILE_KEY, "Profile", Metric.ValueType.DATA) 1742 .setDescription("Selected quality profile") 1743 .setDomain(DOMAIN_GENERAL) 1744 .create(); 1745 1746 /** 1747 * @since 2.9 1748 */ 1749 public static final String PROFILE_VERSION_KEY = "profile_version"; 1750 1751 /** 1752 * @since 2.9 1753 */ 1754 public static final Metric PROFILE_VERSION = new Metric.Builder(PROFILE_VERSION_KEY, "Profile version", Metric.ValueType.INT) 1755 .setDescription("Selected quality profile version") 1756 .setQualitative(false) 1757 .setDomain(DOMAIN_GENERAL) 1758 .create(); 1759 1760 private static final List<Metric> METRICS; 1761 1762 static { 1763 METRICS = Lists.newLinkedList(); 1764 for (Field field : CoreMetrics.class.getFields()) { 1765 if (Metric.class.isAssignableFrom(field.getType())) { 1766 try { 1767 Metric metric = (Metric) field.get(null); 1768 if (!StringUtils.equals(metric.getDomain(), DOMAIN_RULE_CATEGORIES)) { 1769 METRICS.add(metric); 1770 } 1771 } catch (IllegalAccessException e) { 1772 throw new SonarException("can not introspect " + CoreMetrics.class + " to get metrics", e); 1773 } 1774 } 1775 } 1776 } 1777 1778 public static List<Metric> getMetrics() { 1779 return METRICS; 1780 } 1781}