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.plugins.core.dashboards;
021
022import org.sonar.api.web.Dashboard;
023import org.sonar.api.web.Dashboard.Widget;
024import org.sonar.api.web.DashboardLayout;
025import org.sonar.api.web.DashboardTemplate;
026
027/**
028 * Time Machine dashboard for Sonar
029 *
030 * @since 3.0
031 */
032public final class TimeMachineDashboard extends DashboardTemplate {
033
034  private static final String METRIC1 = "metric1";
035  private static final String METRIC2 = "metric2";
036  private static final String METRIC3 = "metric3";
037  private static final String METRIC4 = "metric4";
038  private static final String METRIC5 = "metric5";
039  private static final String METRIC6 = "metric6";
040  private static final String METRIC7 = "metric7";
041
042  @Override
043  public String getName() {
044    return "TimeMachine";
045  }
046
047  @Override
048  public Dashboard createDashboard() {
049    Dashboard dashboard = Dashboard.create();
050    dashboard.setLayout(DashboardLayout.TWO_COLUMNS);
051    addFirstColumn(dashboard);
052    addSecondColumn(dashboard);
053    return dashboard;
054  }
055
056  private void addFirstColumn(Dashboard dashboard) {
057    Widget timelineWidget = dashboard.addWidget("timeline", 1);
058    timelineWidget.setProperty(METRIC1, "complexity");
059    timelineWidget.setProperty(METRIC2, "violations_density");
060    timelineWidget.setProperty(METRIC3, "coverage");
061
062    Widget sizeTimeMachineWidget = addTimeMachineWidgetOnFirstColumn(dashboard);
063    sizeTimeMachineWidget.setProperty(METRIC1, "ncloc");
064    sizeTimeMachineWidget.setProperty(METRIC2, "lines");
065    sizeTimeMachineWidget.setProperty(METRIC3, "statements");
066    sizeTimeMachineWidget.setProperty(METRIC4, "files");
067    sizeTimeMachineWidget.setProperty(METRIC5, "classes");
068    sizeTimeMachineWidget.setProperty(METRIC6, "functions");
069    sizeTimeMachineWidget.setProperty(METRIC7, "accessors");
070
071    Widget commentsTimeMachineWidget = addTimeMachineWidgetOnFirstColumn(dashboard);
072    commentsTimeMachineWidget.setProperty(METRIC1, "comment_lines_density");
073    commentsTimeMachineWidget.setProperty(METRIC2, "comment_lines");
074    commentsTimeMachineWidget.setProperty(METRIC3, "public_documented_api_density");
075    commentsTimeMachineWidget.setProperty(METRIC4, "public_undocumented_api");
076
077    Widget duplicationTimeMachineWidget = addTimeMachineWidgetOnFirstColumn(dashboard);
078    duplicationTimeMachineWidget.setProperty(METRIC1, "duplicated_lines_density");
079    duplicationTimeMachineWidget.setProperty(METRIC2, "duplicated_lines");
080    duplicationTimeMachineWidget.setProperty(METRIC3, "duplicated_blocks");
081    duplicationTimeMachineWidget.setProperty(METRIC4, "duplicated_files");
082  }
083
084  private void addSecondColumn(Dashboard dashboard) {
085    Widget rulesTimeMachineWidget = addTimeMachineWidgetOnSecondColumn(dashboard);
086    rulesTimeMachineWidget.setProperty(METRIC1, "violations");
087    rulesTimeMachineWidget.setProperty(METRIC2, "violation_density");
088    rulesTimeMachineWidget.setProperty(METRIC3, "blocker_violations");
089    rulesTimeMachineWidget.setProperty(METRIC4, "critical_violations");
090    rulesTimeMachineWidget.setProperty(METRIC5, "major_violations");
091    rulesTimeMachineWidget.setProperty(METRIC6, "minor_violations");
092    rulesTimeMachineWidget.setProperty(METRIC7, "info_violations");
093    rulesTimeMachineWidget.setProperty(METRIC7, "weighted_violations");
094
095    Widget complexityTimeMachineWidget = addTimeMachineWidgetOnSecondColumn(dashboard);
096    complexityTimeMachineWidget.setProperty(METRIC1, "complexity");
097    complexityTimeMachineWidget.setProperty(METRIC2, "function_complexity");
098    complexityTimeMachineWidget.setProperty(METRIC3, "class_complexity");
099    complexityTimeMachineWidget.setProperty(METRIC4, "file_complexity");
100
101    Widget testsTimeMachineWidget = addTimeMachineWidgetOnSecondColumn(dashboard);
102    testsTimeMachineWidget.setProperty(METRIC1, "coverage");
103    testsTimeMachineWidget.setProperty(METRIC2, "line_coverage");
104    testsTimeMachineWidget.setProperty(METRIC3, "branch_coverage");
105    testsTimeMachineWidget.setProperty(METRIC4, "test_success_density");
106    testsTimeMachineWidget.setProperty(METRIC5, "test_failures");
107    testsTimeMachineWidget.setProperty(METRIC6, "test_errors");
108    testsTimeMachineWidget.setProperty(METRIC7, "tests");
109    testsTimeMachineWidget.setProperty(METRIC7, "test_execution_time");
110  }
111
112  private Widget addTimeMachineWidgetOnFirstColumn(Dashboard dashboard) {
113    return addTimeMachineWidget(dashboard, 1);
114  }
115
116  private Widget addTimeMachineWidgetOnSecondColumn(Dashboard dashboard) {
117    return addTimeMachineWidget(dashboard, 2);
118  }
119
120  private Widget addTimeMachineWidget(Dashboard dashboard, int columnIndex) {
121    Widget widget = dashboard.addWidget("time_machine", columnIndex);
122    widget.setProperty("displaySparkLine", "true");
123    return widget;
124  }
125
126}