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