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}