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.plugins.core; 021 022 import com.google.common.collect.Lists; 023 import org.sonar.api.CoreProperties; 024 import org.sonar.api.Properties; 025 import org.sonar.api.Property; 026 import org.sonar.api.SonarPlugin; 027 import org.sonar.api.checks.NoSonarFilter; 028 import org.sonar.api.resources.Java; 029 import org.sonar.plugins.core.batch.ExcludedResourceFilter; 030 import org.sonar.plugins.core.batch.IndexProjectPostJob; 031 import org.sonar.plugins.core.batch.MavenInitializer; 032 import org.sonar.plugins.core.batch.ProjectFileSystemLogger; 033 import org.sonar.plugins.core.charts.DistributionAreaChart; 034 import org.sonar.plugins.core.charts.DistributionBarChart; 035 import org.sonar.plugins.core.charts.XradarChart; 036 import org.sonar.plugins.core.colorizers.JavaColorizerFormat; 037 import org.sonar.plugins.core.dashboards.HotspotsDashboard; 038 import org.sonar.plugins.core.dashboards.DefaultDashboard; 039 import org.sonar.plugins.core.metrics.UserManagedMetrics; 040 import org.sonar.plugins.core.security.ApplyProjectRolesDecorator; 041 import org.sonar.plugins.core.sensors.*; 042 import org.sonar.plugins.core.testdetailsviewer.TestsViewerDefinition; 043 import org.sonar.plugins.core.timemachine.*; 044 import org.sonar.plugins.core.web.Lcom4Viewer; 045 import org.sonar.plugins.core.widgets.*; 046 import org.sonar.plugins.core.widgets.actionPlans.ActionPlansWidget; 047 import org.sonar.plugins.core.widgets.reviews.FalsePositiveReviewsWidget; 048 import org.sonar.plugins.core.widgets.reviews.MyReviewsWidget; 049 import org.sonar.plugins.core.widgets.reviews.PlannedReviewsWidget; 050 import org.sonar.plugins.core.widgets.reviews.ProjectReviewsWidget; 051 import org.sonar.plugins.core.widgets.reviews.ReviewsPerDeveloperWidget; 052 import org.sonar.plugins.core.widgets.reviews.UnplannedReviewsWidget; 053 054 import java.util.List; 055 056 @Properties({ 057 @Property( 058 key = CoreProperties.SERVER_BASE_URL, 059 defaultValue = CoreProperties.SERVER_BASE_URL_DEFAULT_VALUE, 060 name = "Server base URL", 061 description = "HTTP URL of this Sonar server, such as <i>http://yourhost.yourdomain/sonar</i>. This value is used i.e. to create links in emails.", 062 project = false, 063 global = true, 064 category = CoreProperties.CATEGORY_GENERAL), 065 @Property( 066 key = CoreProperties.CORE_COVERAGE_PLUGIN_PROPERTY, 067 defaultValue = "cobertura", 068 name = "Code coverage plugin", 069 description = "Key of the code coverage plugin to use.", 070 project = true, 071 global = true, 072 category = CoreProperties.CATEGORY_CODE_COVERAGE), 073 @Property( 074 key = CoreProperties.CORE_IMPORT_SOURCES_PROPERTY, 075 defaultValue = "" + CoreProperties.CORE_IMPORT_SOURCES_DEFAULT_VALUE, 076 name = "Import sources", 077 description = "Set to false if sources should not be displayed, e.g. for security reasons.", 078 project = true, 079 module = true, 080 global = true, 081 category = CoreProperties.CATEGORY_SECURITY), 082 @Property( 083 key = CoreProperties.CORE_TENDENCY_DEPTH_PROPERTY, 084 defaultValue = "" + CoreProperties.CORE_TENDENCY_DEPTH_DEFAULT_VALUE, 085 name = "Tendency period", 086 description = TendencyDecorator.PROP_DAYS_DESCRIPTION, 087 project = false, 088 global = true, 089 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 090 @Property( 091 key = CoreProperties.SKIP_TENDENCIES_PROPERTY, 092 defaultValue = "" + CoreProperties.SKIP_TENDENCIES_DEFAULT_VALUE, 093 name = "Skip tendencies", 094 description = "Skip calculation of measure tendencies", 095 project = true, 096 module = false, 097 global = true, 098 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 099 @Property( 100 key = CoreProperties.CORE_SKIPPED_MODULES_PROPERTY, 101 name = "Exclude modules", 102 description = "Maven artifact ids of modules to exclude (comma-separated).", 103 project = true, 104 global = false, 105 category = CoreProperties.CATEGORY_GENERAL), 106 @Property( 107 key = CoreProperties.CORE_FORCE_AUTHENTICATION_PROPERTY, 108 defaultValue = "" + CoreProperties.CORE_FORCE_AUTHENTICATION_DEFAULT_VALUE, 109 name = "Force user authentication", 110 description = "Forcing user authentication stops un-logged users to access Sonar.", 111 project = false, 112 global = true, 113 category = CoreProperties.CATEGORY_SECURITY), 114 @Property( 115 key = CoreProperties.CORE_ALLOW_USERS_TO_SIGNUP_PROPERTY, 116 defaultValue = "" + CoreProperties.CORE_ALLOW_USERS_TO_SIGNUP_DEAULT_VALUE, 117 name = "Allow users to sign up online", 118 description = "Users can sign up online.", 119 project = false, 120 global = true, 121 category = CoreProperties.CATEGORY_SECURITY), 122 @Property( 123 key = CoreProperties.CORE_DEFAULT_GROUP, 124 defaultValue = CoreProperties.CORE_DEFAULT_GROUP_DEFAULT_VALUE, 125 name = "Default user group", 126 description = "Any new users will automatically join this group.", 127 project = false, 128 global = true, 129 category = CoreProperties.CATEGORY_SECURITY), 130 @Property( 131 key = CoreProperties.CORE_VIOLATION_LOCALE_PROPERTY, 132 defaultValue = "en", 133 name = "Locale used for violation messages", 134 description = "Locale to be used when generating violation messages. It's up to each rule engine to support this global internationalization property", 135 project = true, 136 global = true, 137 category = CoreProperties.CATEGORY_L10N), 138 @Property( 139 key = "sonar.timemachine.period1", 140 name = "Period 1", 141 description = "Period used to compare measures and track new violations. Values are : <ul class='bullet'><li>Number of days before " + 142 "analysis, for example 5.</li><li>A custom date. Format is yyyy-MM-dd, for example 2010-12-25</li><li>'previous_analysis' to " + 143 "compare to previous analysis</li><li>A version, for example 1.2</li></ul>", 144 project = false, 145 global = true, 146 defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_1, 147 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 148 @Property( 149 key = "sonar.timemachine.period2", 150 name = "Period 2", 151 description = "See the property 'Period 1'", 152 project = false, 153 global = true, 154 defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_2, 155 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 156 @Property( 157 key = "sonar.timemachine.period3", 158 name = "Period 3", 159 description = "See the property 'Period 1'", 160 project = false, 161 global = true, 162 defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_3, 163 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 164 @Property( 165 key = "sonar.timemachine.period4", 166 name = "Period 4", 167 description = "Period used to compare measures and track new violations. This property is specific to the project. Values are : " + 168 "<ul class='bullet'><li>Number of days before analysis, for example 5.</li><li>A custom date. Format is yyyy-MM-dd, " + 169 "for example 2010-12-25</li><li>'previous_analysis' to compare to previous analysis</li><li>A version, for example 1.2</li></ul>", 170 project = true, 171 global = false, 172 defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_4, 173 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 174 @Property( 175 key = "sonar.timemachine.period5", 176 name = "Period 5", 177 description = "See the property 'Period 4'", 178 project = true, 179 global = false, 180 defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_5, 181 category = CoreProperties.CATEGORY_DIFFERENTIAL_VIEWS), 182 183 184 // SERVER-SIDE TECHNICAL PROPERTIES 185 186 @Property( 187 key = "sonar.authenticator.downcase", 188 name = "Downcase login", 189 description = "Downcase login during user authentication, typically for Active Directory", 190 project = false, 191 global = false, 192 defaultValue = "false"), 193 @Property( 194 key = CoreProperties.CORE_AUTHENTICATOR_CREATE_USERS, 195 name = "Create user accounts", 196 description = "Create accounts when authenticating users via an external system", 197 project = false, 198 global = false, 199 defaultValue = "false"), 200 @Property( 201 key = CoreProperties.CORE_AUTHENTICATOR_IGNORE_STARTUP_FAILURE, 202 name = "Ignore failures during authenticator startup", 203 defaultValue = "false", 204 project = false, 205 global = false) 206 }) 207 public class CorePlugin extends SonarPlugin { 208 209 @SuppressWarnings({"rawtypes", "unchecked"}) 210 public List getExtensions() { 211 List extensions = Lists.newLinkedList(); 212 213 extensions.add(ProjectFileSystemLogger.class); 214 215 // maven 216 extensions.add(MavenInitializer.class); 217 218 // languages 219 extensions.add(Java.class); 220 221 // metrics 222 extensions.add(UserManagedMetrics.class); 223 224 // pages 225 extensions.add(TestsViewerDefinition.class); 226 extensions.add(Lcom4Viewer.class); 227 228 // widgets 229 extensions.add(AlertsWidget.class); 230 extensions.add(CoverageWidget.class); 231 extensions.add(ItCoverageWidget.class); 232 extensions.add(CommentsDuplicationsWidget.class); 233 extensions.add(DescriptionWidget.class); 234 extensions.add(ComplexityWidget.class); 235 extensions.add(RulesWidget.class); 236 extensions.add(SizeWidget.class); 237 extensions.add(EventsWidget.class); 238 extensions.add(CustomMeasuresWidget.class); 239 extensions.add(TimelineWidget.class); 240 extensions.add(TimeMachineWidget.class); 241 extensions.add(HotspotMetricWidget.class); 242 extensions.add(HotspotMostViolatedResourcesWidget.class); 243 extensions.add(HotspotMostViolatedRulesWidget.class); 244 extensions.add(MyReviewsWidget.class); 245 extensions.add(ProjectReviewsWidget.class); 246 extensions.add(FalsePositiveReviewsWidget.class); 247 extensions.add(ReviewsPerDeveloperWidget.class); 248 extensions.add(PlannedReviewsWidget.class); 249 extensions.add(UnplannedReviewsWidget.class); 250 extensions.add(ActionPlansWidget.class); 251 252 // dashboards 253 extensions.add(DefaultDashboard.class); 254 extensions.add(HotspotsDashboard.class); 255 256 // chart 257 extensions.add(XradarChart.class); 258 extensions.add(DistributionBarChart.class); 259 extensions.add(DistributionAreaChart.class); 260 261 // colorizers 262 extensions.add(JavaColorizerFormat.class); 263 264 // batch 265 extensions.add(ProfileSensor.class); 266 extensions.add(ProfileEventsSensor.class); 267 extensions.add(ProjectLinksSensor.class); 268 extensions.add(UnitTestDecorator.class); 269 extensions.add(VersionEventsSensor.class); 270 extensions.add(CheckAlertThresholds.class); 271 extensions.add(GenerateAlertEvents.class); 272 extensions.add(ViolationsDecorator.class); 273 extensions.add(WeightedViolationsDecorator.class); 274 extensions.add(ViolationsDensityDecorator.class); 275 extensions.add(LineCoverageDecorator.class); 276 extensions.add(CoverageDecorator.class); 277 extensions.add(BranchCoverageDecorator.class); 278 extensions.add(ItLineCoverageDecorator.class); 279 extensions.add(ItCoverageDecorator.class); 280 extensions.add(ItBranchCoverageDecorator.class); 281 extensions.add(ApplyProjectRolesDecorator.class); 282 extensions.add(ExcludedResourceFilter.class); 283 extensions.add(CommentDensityDecorator.class); 284 extensions.add(NoSonarFilter.class); 285 extensions.add(DirectoriesDecorator.class); 286 extensions.add(FilesDecorator.class); 287 extensions.add(CloseReviewsDecorator.class); 288 extensions.add(ReferenceAnalysis.class); 289 extensions.add(ManualMeasureDecorator.class); 290 extensions.add(ManualViolationInjector.class); 291 extensions.add(UpdateReviewsDecorator.class); 292 extensions.add(ViolationSeverityUpdater.class); 293 extensions.add(IndexProjectPostJob.class); 294 295 // time machine 296 extensions.add(TendencyDecorator.class); 297 extensions.add(VariationDecorator.class); 298 extensions.add(ViolationTrackingDecorator.class); 299 extensions.add(ViolationPersisterDecorator.class); 300 extensions.add(NewViolationsDecorator.class); 301 extensions.add(TimeMachineConfigurationPersister.class); 302 extensions.add(NewCoverageFileAnalyzer.class); 303 extensions.add(NewItCoverageFileAnalyzer.class); 304 extensions.add(NewCoverageAggregator.class); 305 306 return extensions; 307 } 308 }