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