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