You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ServerComponents.java 44KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  1. /*
  2. * SonarQube, open source software quality management tool.
  3. * Copyright (C) 2008-2014 SonarSource
  4. * mailto:contact AT sonarsource DOT com
  5. *
  6. * SonarQube is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * SonarQube is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.server.platform;
  21. import com.google.common.collect.Lists;
  22. import org.sonar.api.config.EmailSettings;
  23. import org.sonar.api.issue.action.Actions;
  24. import org.sonar.api.profiles.AnnotationProfileParser;
  25. import org.sonar.api.profiles.XMLProfileParser;
  26. import org.sonar.api.profiles.XMLProfileSerializer;
  27. import org.sonar.api.resources.Languages;
  28. import org.sonar.api.resources.ResourceTypes;
  29. import org.sonar.api.rules.AnnotationRuleParser;
  30. import org.sonar.api.rules.XMLRuleParser;
  31. import org.sonar.api.server.rule.RulesDefinitionXmlLoader;
  32. import org.sonar.api.utils.Durations;
  33. import org.sonar.api.utils.System2;
  34. import org.sonar.api.utils.UriReader;
  35. import org.sonar.api.utils.internal.TempFolderCleaner;
  36. import org.sonar.core.component.SnapshotPerspectives;
  37. import org.sonar.core.computation.dbcleaner.DefaultPurgeTask;
  38. import org.sonar.core.computation.dbcleaner.IndexPurgeListener;
  39. import org.sonar.core.computation.dbcleaner.ProjectCleaner;
  40. import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner;
  41. import org.sonar.core.config.CorePropertyDefinitions;
  42. import org.sonar.core.config.Logback;
  43. import org.sonar.core.i18n.DefaultI18n;
  44. import org.sonar.core.i18n.RuleI18nManager;
  45. import org.sonar.core.issue.IssueFilterSerializer;
  46. import org.sonar.core.issue.IssueUpdater;
  47. import org.sonar.core.issue.workflow.FunctionExecutor;
  48. import org.sonar.core.issue.workflow.IssueWorkflow;
  49. import org.sonar.core.measure.db.MeasureFilterDao;
  50. import org.sonar.core.metric.DefaultMetricFinder;
  51. import org.sonar.core.notification.DefaultNotificationManager;
  52. import org.sonar.core.permission.PermissionFacade;
  53. import org.sonar.core.persistence.DaoUtils;
  54. import org.sonar.core.persistence.DatabaseVersion;
  55. import org.sonar.core.persistence.DefaultDatabase;
  56. import org.sonar.core.persistence.MyBatis;
  57. import org.sonar.core.persistence.SemaphoreUpdater;
  58. import org.sonar.core.persistence.SemaphoresImpl;
  59. import org.sonar.core.platform.ComponentContainer;
  60. import org.sonar.core.platform.PluginLoader;
  61. import org.sonar.core.purge.PurgeProfiler;
  62. import org.sonar.core.qualitygate.db.ProjectQgateAssociationDao;
  63. import org.sonar.core.qualitygate.db.QualityGateConditionDao;
  64. import org.sonar.core.qualitygate.db.QualityGateDao;
  65. import org.sonar.core.resource.DefaultResourcePermissions;
  66. import org.sonar.core.test.TestPlanPerspectiveLoader;
  67. import org.sonar.core.test.TestablePerspectiveLoader;
  68. import org.sonar.core.timemachine.Periods;
  69. import org.sonar.core.user.DefaultUserFinder;
  70. import org.sonar.core.user.HibernateUserFinder;
  71. import org.sonar.core.util.DefaultHttpDownloader;
  72. import org.sonar.jpa.dao.MeasuresDao;
  73. import org.sonar.jpa.session.DatabaseSessionFactory;
  74. import org.sonar.jpa.session.DatabaseSessionProvider;
  75. import org.sonar.jpa.session.DefaultDatabaseConnector;
  76. import org.sonar.jpa.session.ThreadLocalDatabaseSessionFactory;
  77. import org.sonar.server.activity.ActivityService;
  78. import org.sonar.server.activity.RubyQProfileActivityService;
  79. import org.sonar.server.activity.db.ActivityDao;
  80. import org.sonar.server.activity.index.ActivityIndex;
  81. import org.sonar.server.activity.index.ActivityIndexDefinition;
  82. import org.sonar.server.activity.index.ActivityIndexer;
  83. import org.sonar.server.activity.ws.ActivitiesWebService;
  84. import org.sonar.server.activity.ws.ActivityMapping;
  85. import org.sonar.server.authentication.ws.AuthenticationWs;
  86. import org.sonar.server.batch.BatchIndex;
  87. import org.sonar.server.batch.BatchWs;
  88. import org.sonar.server.batch.GlobalRepositoryAction;
  89. import org.sonar.server.batch.IssuesAction;
  90. import org.sonar.server.batch.ProjectRepositoryAction;
  91. import org.sonar.server.batch.ProjectRepositoryLoader;
  92. import org.sonar.server.batch.UsersAction;
  93. import org.sonar.server.charts.ChartFactory;
  94. import org.sonar.server.component.ComponentCleanerService;
  95. import org.sonar.server.component.ComponentService;
  96. import org.sonar.server.component.DefaultComponentFinder;
  97. import org.sonar.server.component.DefaultRubyComponentService;
  98. import org.sonar.server.component.db.ComponentDao;
  99. import org.sonar.server.component.db.ComponentIndexDao;
  100. import org.sonar.server.component.db.ComponentLinkDao;
  101. import org.sonar.server.component.db.SnapshotDao;
  102. import org.sonar.server.component.ws.ComponentAppAction;
  103. import org.sonar.server.component.ws.ComponentsWs;
  104. import org.sonar.server.component.ws.EventsWs;
  105. import org.sonar.server.component.ws.ProjectsWs;
  106. import org.sonar.server.component.ws.ResourcesWs;
  107. import org.sonar.server.computation.ComputationThreadLauncher;
  108. import org.sonar.server.computation.ReportQueue;
  109. import org.sonar.server.computation.ReportQueueCleaner;
  110. import org.sonar.server.computation.db.AnalysisReportDao;
  111. import org.sonar.server.computation.ws.ComputationWebService;
  112. import org.sonar.server.computation.ws.HistoryWsAction;
  113. import org.sonar.server.computation.ws.IsQueueEmptyWebService;
  114. import org.sonar.server.computation.ws.QueueWsAction;
  115. import org.sonar.server.computation.ws.SubmitReportWsAction;
  116. import org.sonar.server.config.ws.PropertiesWs;
  117. import org.sonar.server.dashboard.db.DashboardDao;
  118. import org.sonar.server.dashboard.db.WidgetDao;
  119. import org.sonar.server.dashboard.db.WidgetPropertyDao;
  120. import org.sonar.server.dashboard.ws.DashboardsShowAction;
  121. import org.sonar.server.dashboard.ws.DashboardsWebService;
  122. import org.sonar.server.db.DatabaseChecker;
  123. import org.sonar.server.db.DbClient;
  124. import org.sonar.server.db.EmbeddedDatabaseFactory;
  125. import org.sonar.server.db.migrations.DatabaseMigrator;
  126. import org.sonar.server.db.migrations.MigrationSteps;
  127. import org.sonar.server.db.migrations.PlatformDatabaseMigration;
  128. import org.sonar.server.db.migrations.PlatformDatabaseMigrationExecutorServiceImpl;
  129. import org.sonar.server.debt.DebtCharacteristicsXMLImporter;
  130. import org.sonar.server.debt.DebtModelBackup;
  131. import org.sonar.server.debt.DebtModelLookup;
  132. import org.sonar.server.debt.DebtModelOperations;
  133. import org.sonar.server.debt.DebtModelPluginRepository;
  134. import org.sonar.server.debt.DebtModelService;
  135. import org.sonar.server.debt.DebtModelXMLExporter;
  136. import org.sonar.server.debt.DebtRulesXMLImporter;
  137. import org.sonar.server.design.FileDesignWidget;
  138. import org.sonar.server.design.db.FileDependencyDao;
  139. import org.sonar.server.design.ws.DependenciesWs;
  140. import org.sonar.server.duplication.ws.DuplicationsJsonWriter;
  141. import org.sonar.server.duplication.ws.DuplicationsParser;
  142. import org.sonar.server.duplication.ws.DuplicationsWs;
  143. import org.sonar.server.es.EsClient;
  144. import org.sonar.server.es.IndexCreator;
  145. import org.sonar.server.es.IndexDefinitions;
  146. import org.sonar.server.event.db.EventDao;
  147. import org.sonar.server.issue.ActionService;
  148. import org.sonar.server.issue.AddTagsAction;
  149. import org.sonar.server.issue.AssignAction;
  150. import org.sonar.server.issue.CommentAction;
  151. import org.sonar.server.issue.InternalRubyIssueService;
  152. import org.sonar.server.issue.IssueBulkChangeService;
  153. import org.sonar.server.issue.IssueChangelogFormatter;
  154. import org.sonar.server.issue.IssueChangelogService;
  155. import org.sonar.server.issue.IssueCommentService;
  156. import org.sonar.server.issue.IssueQueryService;
  157. import org.sonar.server.issue.IssueService;
  158. import org.sonar.server.issue.PlanAction;
  159. import org.sonar.server.issue.RemoveTagsAction;
  160. import org.sonar.server.issue.ServerIssueStorage;
  161. import org.sonar.server.issue.SetSeverityAction;
  162. import org.sonar.server.issue.TransitionAction;
  163. import org.sonar.server.issue.actionplan.ActionPlanService;
  164. import org.sonar.server.issue.actionplan.ActionPlanWs;
  165. import org.sonar.server.issue.db.IssueDao;
  166. import org.sonar.server.issue.filter.IssueFilterService;
  167. import org.sonar.server.issue.filter.IssueFilterWriter;
  168. import org.sonar.server.issue.filter.IssueFilterWs;
  169. import org.sonar.server.issue.filter.RegisterIssueFilters;
  170. import org.sonar.server.issue.index.IssueAuthorizationIndexer;
  171. import org.sonar.server.issue.index.IssueIndex;
  172. import org.sonar.server.issue.index.IssueIndexDefinition;
  173. import org.sonar.server.issue.index.IssueIndexer;
  174. import org.sonar.server.issue.notification.ChangesOnMyIssueNotificationDispatcher;
  175. import org.sonar.server.issue.notification.DoNotFixNotificationDispatcher;
  176. import org.sonar.server.issue.notification.IssueChangesEmailTemplate;
  177. import org.sonar.server.issue.notification.MyNewIssuesEmailTemplate;
  178. import org.sonar.server.issue.notification.MyNewIssuesNotificationDispatcher;
  179. import org.sonar.server.issue.notification.NewIssuesEmailTemplate;
  180. import org.sonar.server.issue.notification.NewIssuesNotificationDispatcher;
  181. import org.sonar.server.issue.notification.NewIssuesNotificationFactory;
  182. import org.sonar.server.issue.ws.ComponentTagsAction;
  183. import org.sonar.server.issue.ws.IssueActionsWriter;
  184. import org.sonar.server.issue.ws.IssueShowAction;
  185. import org.sonar.server.issue.ws.IssuesWs;
  186. import org.sonar.server.issue.ws.SetTagsAction;
  187. import org.sonar.server.language.ws.LanguageWs;
  188. import org.sonar.server.language.ws.ListAction;
  189. import org.sonar.server.measure.MeasureFilterEngine;
  190. import org.sonar.server.measure.MeasureFilterExecutor;
  191. import org.sonar.server.measure.MeasureFilterFactory;
  192. import org.sonar.server.measure.persistence.MeasureDao;
  193. import org.sonar.server.measure.persistence.MetricDao;
  194. import org.sonar.server.measure.ws.ManualMeasuresWs;
  195. import org.sonar.server.measure.ws.MetricsWs;
  196. import org.sonar.server.measure.ws.TimeMachineWs;
  197. import org.sonar.server.notifications.NotificationCenter;
  198. import org.sonar.server.notifications.NotificationService;
  199. import org.sonar.server.permission.InternalPermissionService;
  200. import org.sonar.server.permission.InternalPermissionTemplateService;
  201. import org.sonar.server.permission.PermissionFinder;
  202. import org.sonar.server.permission.ws.PermissionsWs;
  203. import org.sonar.server.platform.monitoring.DatabaseMonitor;
  204. import org.sonar.server.platform.monitoring.EsMonitor;
  205. import org.sonar.server.platform.monitoring.JvmPropertiesMonitor;
  206. import org.sonar.server.platform.monitoring.PluginsMonitor;
  207. import org.sonar.server.platform.monitoring.SonarQubeMonitor;
  208. import org.sonar.server.platform.monitoring.SystemMonitor;
  209. import org.sonar.server.platform.ws.L10nWs;
  210. import org.sonar.server.platform.ws.MigrateDbSystemWsAction;
  211. import org.sonar.server.platform.ws.ServerWs;
  212. import org.sonar.server.platform.ws.SystemInfoWsAction;
  213. import org.sonar.server.platform.ws.SystemRestartWsAction;
  214. import org.sonar.server.platform.ws.SystemWs;
  215. import org.sonar.server.platform.ws.UpgradesSystemWsAction;
  216. import org.sonar.server.plugins.InstalledPluginReferentialFactory;
  217. import org.sonar.server.plugins.PluginDownloader;
  218. import org.sonar.server.plugins.ServerExtensionInstaller;
  219. import org.sonar.server.plugins.ServerPluginRepository;
  220. import org.sonar.server.plugins.ServerPluginUnzipper;
  221. import org.sonar.server.plugins.UpdateCenterClient;
  222. import org.sonar.server.plugins.UpdateCenterMatrixFactory;
  223. import org.sonar.server.plugins.ws.AvailablePluginsWsAction;
  224. import org.sonar.server.plugins.ws.CancelAllPluginsWsAction;
  225. import org.sonar.server.plugins.ws.InstallPluginsWsAction;
  226. import org.sonar.server.plugins.ws.InstalledPluginsWsAction;
  227. import org.sonar.server.plugins.ws.PendingPluginsWsAction;
  228. import org.sonar.server.plugins.ws.PluginUpdateAggregator;
  229. import org.sonar.server.plugins.ws.PluginWSCommons;
  230. import org.sonar.server.plugins.ws.PluginsWs;
  231. import org.sonar.server.plugins.ws.UninstallPluginsWsAction;
  232. import org.sonar.server.plugins.ws.UpdatePluginsWsAction;
  233. import org.sonar.server.plugins.ws.UpdatesPluginsWsAction;
  234. import org.sonar.server.properties.ProjectSettingsFactory;
  235. import org.sonar.server.qualitygate.QgateProjectFinder;
  236. import org.sonar.server.qualitygate.QualityGates;
  237. import org.sonar.server.qualitygate.RegisterQualityGates;
  238. import org.sonar.server.qualitygate.ws.QGatesAppAction;
  239. import org.sonar.server.qualitygate.ws.QGatesCopyAction;
  240. import org.sonar.server.qualitygate.ws.QGatesCreateAction;
  241. import org.sonar.server.qualitygate.ws.QGatesCreateConditionAction;
  242. import org.sonar.server.qualitygate.ws.QGatesDeleteConditionAction;
  243. import org.sonar.server.qualitygate.ws.QGatesDeselectAction;
  244. import org.sonar.server.qualitygate.ws.QGatesDestroyAction;
  245. import org.sonar.server.qualitygate.ws.QGatesListAction;
  246. import org.sonar.server.qualitygate.ws.QGatesRenameAction;
  247. import org.sonar.server.qualitygate.ws.QGatesSearchAction;
  248. import org.sonar.server.qualitygate.ws.QGatesSelectAction;
  249. import org.sonar.server.qualitygate.ws.QGatesSetAsDefaultAction;
  250. import org.sonar.server.qualitygate.ws.QGatesShowAction;
  251. import org.sonar.server.qualitygate.ws.QGatesUnsetDefaultAction;
  252. import org.sonar.server.qualitygate.ws.QGatesUpdateConditionAction;
  253. import org.sonar.server.qualitygate.ws.QGatesWs;
  254. import org.sonar.server.qualityprofile.BuiltInProfiles;
  255. import org.sonar.server.qualityprofile.QProfileBackuper;
  256. import org.sonar.server.qualityprofile.QProfileComparison;
  257. import org.sonar.server.qualityprofile.QProfileCopier;
  258. import org.sonar.server.qualityprofile.QProfileExporters;
  259. import org.sonar.server.qualityprofile.QProfileFactory;
  260. import org.sonar.server.qualityprofile.QProfileLoader;
  261. import org.sonar.server.qualityprofile.QProfileLookup;
  262. import org.sonar.server.qualityprofile.QProfileProjectLookup;
  263. import org.sonar.server.qualityprofile.QProfileProjectOperations;
  264. import org.sonar.server.qualityprofile.QProfileReset;
  265. import org.sonar.server.qualityprofile.QProfileService;
  266. import org.sonar.server.qualityprofile.QProfiles;
  267. import org.sonar.server.qualityprofile.RegisterQualityProfiles;
  268. import org.sonar.server.qualityprofile.RuleActivator;
  269. import org.sonar.server.qualityprofile.RuleActivatorContextFactory;
  270. import org.sonar.server.qualityprofile.db.ActiveRuleDao;
  271. import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
  272. import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer;
  273. import org.sonar.server.qualityprofile.ws.BulkRuleActivationActions;
  274. import org.sonar.server.qualityprofile.ws.ProfilesWs;
  275. import org.sonar.server.qualityprofile.ws.ProjectAssociationActions;
  276. import org.sonar.server.qualityprofile.ws.QProfileBackupAction;
  277. import org.sonar.server.qualityprofile.ws.QProfileChangeParentAction;
  278. import org.sonar.server.qualityprofile.ws.QProfileChangelogAction;
  279. import org.sonar.server.qualityprofile.ws.QProfileCompareAction;
  280. import org.sonar.server.qualityprofile.ws.QProfileCopyAction;
  281. import org.sonar.server.qualityprofile.ws.QProfileCreateAction;
  282. import org.sonar.server.qualityprofile.ws.QProfileDeleteAction;
  283. import org.sonar.server.qualityprofile.ws.QProfileExportAction;
  284. import org.sonar.server.qualityprofile.ws.QProfileExportersAction;
  285. import org.sonar.server.qualityprofile.ws.QProfileImportersAction;
  286. import org.sonar.server.qualityprofile.ws.QProfileInheritanceAction;
  287. import org.sonar.server.qualityprofile.ws.QProfileProjectsAction;
  288. import org.sonar.server.qualityprofile.ws.QProfileRenameAction;
  289. import org.sonar.server.qualityprofile.ws.QProfileRestoreAction;
  290. import org.sonar.server.qualityprofile.ws.QProfileRestoreBuiltInAction;
  291. import org.sonar.server.qualityprofile.ws.QProfileSearchAction;
  292. import org.sonar.server.qualityprofile.ws.QProfileSetDefaultAction;
  293. import org.sonar.server.qualityprofile.ws.QProfilesWs;
  294. import org.sonar.server.qualityprofile.ws.RuleActivationActions;
  295. import org.sonar.server.ruby.PlatformRackBridge;
  296. import org.sonar.server.ruby.PlatformRubyBridge;
  297. import org.sonar.server.rule.DefaultRuleFinder;
  298. import org.sonar.server.rule.DeprecatedRulesDefinitionLoader;
  299. import org.sonar.server.rule.RegisterRules;
  300. import org.sonar.server.rule.RubyRuleService;
  301. import org.sonar.server.rule.RuleCreator;
  302. import org.sonar.server.rule.RuleDefinitionsLoader;
  303. import org.sonar.server.rule.RuleDeleter;
  304. import org.sonar.server.rule.RuleOperations;
  305. import org.sonar.server.rule.RuleRepositories;
  306. import org.sonar.server.rule.RuleService;
  307. import org.sonar.server.rule.RuleUpdater;
  308. import org.sonar.server.rule.db.RuleDao;
  309. import org.sonar.server.rule.index.RuleIndex;
  310. import org.sonar.server.rule.index.RuleNormalizer;
  311. import org.sonar.server.rule.ws.ActiveRuleCompleter;
  312. import org.sonar.server.rule.ws.AppAction;
  313. import org.sonar.server.rule.ws.DeleteAction;
  314. import org.sonar.server.rule.ws.RepositoriesAction;
  315. import org.sonar.server.rule.ws.RuleMapping;
  316. import org.sonar.server.rule.ws.RulesWebService;
  317. import org.sonar.server.rule.ws.SearchAction;
  318. import org.sonar.server.rule.ws.TagsAction;
  319. import org.sonar.server.rule.ws.UpdateAction;
  320. import org.sonar.server.search.IndexClient;
  321. import org.sonar.server.search.IndexQueue;
  322. import org.sonar.server.search.IndexSynchronizer;
  323. import org.sonar.server.search.SearchClient;
  324. import org.sonar.server.source.HtmlSourceDecorator;
  325. import org.sonar.server.source.SourceService;
  326. import org.sonar.server.source.db.FileSourceDao;
  327. import org.sonar.server.source.index.SourceLineIndex;
  328. import org.sonar.server.source.index.SourceLineIndexDefinition;
  329. import org.sonar.server.source.index.SourceLineIndexer;
  330. import org.sonar.server.source.ws.HashAction;
  331. import org.sonar.server.source.ws.IndexAction;
  332. import org.sonar.server.source.ws.LinesAction;
  333. import org.sonar.server.source.ws.RawAction;
  334. import org.sonar.server.source.ws.ScmAction;
  335. import org.sonar.server.source.ws.ShowAction;
  336. import org.sonar.server.source.ws.SourcesWs;
  337. import org.sonar.server.startup.CopyRequirementsFromCharacteristicsToRules;
  338. import org.sonar.server.startup.GeneratePluginIndex;
  339. import org.sonar.server.startup.JdbcDriverDeployer;
  340. import org.sonar.server.startup.LogServerId;
  341. import org.sonar.server.startup.RegisterDashboards;
  342. import org.sonar.server.startup.RegisterDebtModel;
  343. import org.sonar.server.startup.RegisterMetrics;
  344. import org.sonar.server.startup.RegisterNewMeasureFilters;
  345. import org.sonar.server.startup.RegisterPermissionTemplates;
  346. import org.sonar.server.startup.RegisterServletFilters;
  347. import org.sonar.server.startup.RenameDeprecatedPropertyKeys;
  348. import org.sonar.server.startup.RenameIssueWidgets;
  349. import org.sonar.server.startup.ServerMetadataPersister;
  350. import org.sonar.server.test.CoverageService;
  351. import org.sonar.server.test.index.TestIndex;
  352. import org.sonar.server.test.index.TestIndexDefinition;
  353. import org.sonar.server.test.index.TestIndexer;
  354. import org.sonar.server.test.ws.TestsCoveredFilesAction;
  355. import org.sonar.server.test.ws.TestsListAction;
  356. import org.sonar.server.test.ws.TestsWs;
  357. import org.sonar.server.text.MacroInterpreter;
  358. import org.sonar.server.text.RubyTextService;
  359. import org.sonar.server.ui.JRubyI18n;
  360. import org.sonar.server.ui.PageDecorations;
  361. import org.sonar.server.ui.Views;
  362. import org.sonar.server.ui.ws.ComponentNavigationAction;
  363. import org.sonar.server.ui.ws.GlobalNavigationAction;
  364. import org.sonar.server.ui.ws.NavigationWs;
  365. import org.sonar.server.ui.ws.SettingsNavigationAction;
  366. import org.sonar.server.updatecenter.ws.UpdateCenterWs;
  367. import org.sonar.server.user.DefaultUserService;
  368. import org.sonar.server.user.DoPrivileged;
  369. import org.sonar.server.user.GroupMembershipFinder;
  370. import org.sonar.server.user.GroupMembershipService;
  371. import org.sonar.server.user.NewUserNotifier;
  372. import org.sonar.server.user.SecurityRealmFactory;
  373. import org.sonar.server.user.UserUpdater;
  374. import org.sonar.server.user.db.GroupDao;
  375. import org.sonar.server.user.db.UserDao;
  376. import org.sonar.server.user.db.UserGroupDao;
  377. import org.sonar.server.user.index.UserIndex;
  378. import org.sonar.server.user.index.UserIndexDefinition;
  379. import org.sonar.server.user.index.UserIndexer;
  380. import org.sonar.server.user.ws.FavoritesWs;
  381. import org.sonar.server.user.ws.UserPropertiesWs;
  382. import org.sonar.server.user.ws.UsersWs;
  383. import org.sonar.server.util.BooleanTypeValidation;
  384. import org.sonar.server.util.FloatTypeValidation;
  385. import org.sonar.server.util.IntegerTypeValidation;
  386. import org.sonar.server.util.StringListTypeValidation;
  387. import org.sonar.server.util.StringTypeValidation;
  388. import org.sonar.server.util.TextTypeValidation;
  389. import org.sonar.server.util.TypeValidations;
  390. import org.sonar.server.view.index.ViewIndex;
  391. import org.sonar.server.view.index.ViewIndexDefinition;
  392. import org.sonar.server.view.index.ViewIndexer;
  393. import org.sonar.server.ws.ListingWs;
  394. import org.sonar.server.ws.WebServiceEngine;
  395. import javax.annotation.Nullable;
  396. import java.util.Arrays;
  397. import java.util.Collection;
  398. import java.util.List;
  399. import java.util.Properties;
  400. class ServerComponents {
  401. private final Platform platform;
  402. private final Properties properties;
  403. @Nullable
  404. private final Object[] extraRootComponents;
  405. private final List<Object> level4AddedComponents = Lists.newArrayList();
  406. ServerComponents(Platform platform, Properties properties, Object... extraRootComponents) {
  407. this.platform = platform;
  408. this.properties = properties;
  409. this.extraRootComponents = extraRootComponents;
  410. }
  411. /**
  412. * All the stuff required to connect to database
  413. */
  414. Collection<Object> level1Components() {
  415. List<Object> components = Lists.newArrayList(platform, properties);
  416. addExtraRootComponents(components);
  417. components.addAll(Arrays.asList(
  418. ServerSettings.class,
  419. ServerImpl.class,
  420. Logback.class,
  421. EmbeddedDatabaseFactory.class,
  422. DefaultDatabase.class,
  423. DatabaseChecker.class,
  424. MyBatis.class,
  425. IndexQueue.class,
  426. DatabaseServerCompatibility.class,
  427. DatabaseVersion.class,
  428. PurgeProfiler.class,
  429. DefaultServerFileSystem.class,
  430. SemaphoreUpdater.class,
  431. SemaphoresImpl.class,
  432. TempFolderCleaner.class,
  433. new TempFolderProvider(),
  434. System2.INSTANCE,
  435. // rack bridges
  436. PlatformRackBridge.class,
  437. // DB
  438. DbClient.class,
  439. // Elasticsearch
  440. SearchClient.class,
  441. IndexClient.class,
  442. EsClient.class,
  443. // users
  444. GroupDao.class,
  445. UserDao.class,
  446. UserGroupDao.class,
  447. // dashboards
  448. DashboardDao.class,
  449. WidgetDao.class,
  450. WidgetPropertyDao.class,
  451. // rules/qprofiles
  452. RuleNormalizer.class,
  453. ActiveRuleNormalizer.class,
  454. RuleIndex.class,
  455. ActiveRuleIndex.class,
  456. RuleDao.class,
  457. ActiveRuleDao.class,
  458. // issues
  459. IssueIndex.class,
  460. IssueDao.class,
  461. // measures
  462. MeasureDao.class,
  463. MetricDao.class,
  464. MeasureFilterDao.class,
  465. // components
  466. ComponentDao.class,
  467. ComponentIndexDao.class,
  468. ComponentLinkDao.class,
  469. SnapshotDao.class,
  470. EventDao.class,
  471. ActivityDao.class,
  472. AnalysisReportDao.class,
  473. FileSourceDao.class,
  474. FileDependencyDao.class
  475. ));
  476. components.addAll(CorePropertyDefinitions.all());
  477. components.addAll(MigrationSteps.CLASSES);
  478. components.addAll(DaoUtils.getDaoClasses());
  479. return components;
  480. }
  481. private void addExtraRootComponents(List<Object> components) {
  482. if (this.extraRootComponents != null) {
  483. for (Object extraRootComponent : this.extraRootComponents) {
  484. if (extraRootComponent != null) {
  485. components.add(extraRootComponent);
  486. }
  487. }
  488. }
  489. }
  490. /**
  491. * The stuff required to display the db upgrade form in webapp.
  492. * Needs to be connected to db.
  493. */
  494. Collection<Object> level2Components() {
  495. return Lists.<Object>newArrayList(
  496. DefaultServerUpgradeStatus.class,
  497. DatabaseMigrator.class,
  498. // depends on Ruby
  499. PlatformRubyBridge.class,
  500. // plugins
  501. ServerPluginRepository.class,
  502. ServerPluginUnzipper.class,
  503. PluginLoader.class,
  504. InstalledPluginReferentialFactory.class,
  505. ServerExtensionInstaller.class,
  506. // depends on plugins
  507. RailsAppsDeployer.class,
  508. JRubyI18n.class,
  509. DefaultI18n.class,
  510. RuleI18nManager.class,
  511. Durations.class,
  512. // DB migration
  513. PlatformDatabaseMigrationExecutorServiceImpl.class,
  514. PlatformDatabaseMigration.class
  515. );
  516. }
  517. /**
  518. * These components allow minimum services to be provided by SonarQube when database is not up-to-date and
  519. * level3/4 components can therefore NOT be loaded. They rely on level1 and level2 components.
  520. * <p>
  521. * Available components:
  522. * <ul>
  523. * <li>WS to query status of the server and upgrade the DB and their dependencies</li>
  524. * <li>WS listing Webservice to allow user to list WebServices available in safemode</li>
  525. * </ul>
  526. * </p>
  527. */
  528. public Collection<Object> safeModeComponents() {
  529. return Lists.<Object>newArrayList(
  530. // DB access required by DatabaseSessionFilter wired into ROR
  531. DefaultDatabaseConnector.class,
  532. ThreadLocalDatabaseSessionFactory.class,
  533. // Server WS
  534. MigrateDbSystemWsAction.class,
  535. SystemWs.class,
  536. // Listing WS
  537. ListingWs.class,
  538. // WS engine
  539. WebServiceEngine.class
  540. );
  541. }
  542. /**
  543. * The core components that complete the initialization of database
  544. * when its schema is up-to-date.
  545. */
  546. Collection<Object> level3Components() {
  547. return Lists.newArrayList(
  548. PersistentSettings.class,
  549. DefaultDatabaseConnector.class,
  550. ThreadLocalDatabaseSessionFactory.class,
  551. new DatabaseSessionProvider(),
  552. ServerMetadataPersister.class,
  553. DefaultHttpDownloader.class,
  554. UriReader.class,
  555. ServerIdGenerator.class
  556. );
  557. }
  558. void startLevel4Components(ComponentContainer pico) {
  559. pico.addSingleton(PluginDownloader.class);
  560. pico.addSingleton(ChartFactory.class);
  561. pico.addSingleton(Views.class);
  562. pico.addSingleton(ResourceTypes.class);
  563. pico.addSingleton(SettingsChangeNotifier.class);
  564. pico.addSingleton(PageDecorations.class);
  565. pico.addSingleton(DefaultResourcePermissions.class);
  566. pico.addSingleton(Periods.class);
  567. pico.addSingleton(ServerWs.class);
  568. pico.addSingleton(BackendCleanup.class);
  569. pico.addSingleton(IndexDefinitions.class);
  570. pico.addSingleton(IndexCreator.class);
  571. // Activity
  572. pico.addSingleton(ActivityService.class);
  573. pico.addSingleton(ActivityIndexDefinition.class);
  574. pico.addSingleton(ActivityIndexer.class);
  575. pico.addSingleton(ActivityIndex.class);
  576. // batch
  577. pico.addSingleton(BatchIndex.class);
  578. pico.addSingleton(GlobalRepositoryAction.class);
  579. pico.addSingleton(ProjectRepositoryAction.class);
  580. pico.addSingleton(ProjectRepositoryLoader.class);
  581. pico.addSingleton(SubmitReportWsAction.class);
  582. pico.addSingleton(IssuesAction.class);
  583. pico.addSingleton(UsersAction.class);
  584. pico.addSingleton(BatchWs.class);
  585. // Dashboard
  586. pico.addSingleton(DashboardsWebService.class);
  587. pico.addSingleton(DashboardsShowAction.class);
  588. // update center
  589. pico.addSingleton(UpdateCenterClient.class);
  590. pico.addSingleton(UpdateCenterMatrixFactory.class);
  591. pico.addSingleton(UpdateCenterWs.class);
  592. // quality profile
  593. pico.addSingleton(XMLProfileParser.class);
  594. pico.addSingleton(XMLProfileSerializer.class);
  595. pico.addSingleton(AnnotationProfileParser.class);
  596. pico.addSingleton(QProfiles.class);
  597. pico.addSingleton(QProfileLookup.class);
  598. pico.addSingleton(QProfileProjectOperations.class);
  599. pico.addSingleton(QProfileProjectLookup.class);
  600. pico.addSingleton(QProfileComparison.class);
  601. pico.addSingleton(BuiltInProfiles.class);
  602. pico.addSingleton(QProfileRestoreBuiltInAction.class);
  603. pico.addSingleton(QProfileSearchAction.class);
  604. pico.addSingleton(QProfileSetDefaultAction.class);
  605. pico.addSingleton(QProfileProjectsAction.class);
  606. pico.addSingleton(QProfileDeleteAction.class);
  607. pico.addSingleton(QProfileRenameAction.class);
  608. pico.addSingleton(QProfileCopyAction.class);
  609. pico.addSingleton(QProfileBackupAction.class);
  610. pico.addSingleton(QProfileRestoreAction.class);
  611. pico.addSingleton(QProfileCreateAction.class);
  612. pico.addSingleton(QProfileImportersAction.class);
  613. pico.addSingleton(QProfileInheritanceAction.class);
  614. pico.addSingleton(QProfileChangeParentAction.class);
  615. pico.addSingleton(QProfileChangelogAction.class);
  616. pico.addSingleton(QProfileCompareAction.class);
  617. pico.addSingleton(QProfileExportAction.class);
  618. pico.addSingleton(QProfileExportersAction.class);
  619. pico.addSingleton(QProfilesWs.class);
  620. pico.addSingleton(ProfilesWs.class);
  621. pico.addSingleton(RuleActivationActions.class);
  622. pico.addSingleton(BulkRuleActivationActions.class);
  623. pico.addSingleton(ProjectAssociationActions.class);
  624. pico.addSingleton(RuleActivator.class);
  625. pico.addSingleton(QProfileLoader.class);
  626. pico.addSingleton(QProfileExporters.class);
  627. pico.addSingleton(QProfileService.class);
  628. pico.addSingleton(RuleActivatorContextFactory.class);
  629. pico.addSingleton(QProfileFactory.class);
  630. pico.addSingleton(QProfileCopier.class);
  631. pico.addSingleton(QProfileBackuper.class);
  632. pico.addSingleton(QProfileReset.class);
  633. pico.addSingleton(RubyQProfileActivityService.class);
  634. // rule
  635. pico.addSingleton(AnnotationRuleParser.class);
  636. pico.addSingleton(XMLRuleParser.class);
  637. pico.addSingleton(DefaultRuleFinder.class);
  638. pico.addSingleton(RuleOperations.class);
  639. pico.addSingleton(RubyRuleService.class);
  640. pico.addSingleton(RuleRepositories.class);
  641. pico.addSingleton(DeprecatedRulesDefinitionLoader.class);
  642. pico.addSingleton(RuleDefinitionsLoader.class);
  643. pico.addSingleton(RulesDefinitionXmlLoader.class);
  644. pico.addSingleton(RuleService.class);
  645. pico.addSingleton(RuleUpdater.class);
  646. pico.addSingleton(RuleCreator.class);
  647. pico.addSingleton(RuleDeleter.class);
  648. pico.addSingleton(UpdateAction.class);
  649. pico.addSingleton(RulesWebService.class);
  650. pico.addSingleton(SearchAction.class);
  651. pico.addSingleton(org.sonar.server.rule.ws.ShowAction.class);
  652. pico.addSingleton(org.sonar.server.rule.ws.CreateAction.class);
  653. pico.addSingleton(DeleteAction.class);
  654. pico.addSingleton(TagsAction.class);
  655. pico.addSingleton(RuleMapping.class);
  656. pico.addSingleton(ActiveRuleCompleter.class);
  657. pico.addSingleton(RepositoriesAction.class);
  658. pico.addSingleton(AppAction.class);
  659. // languages
  660. pico.addSingleton(Languages.class);
  661. pico.addSingleton(LanguageWs.class);
  662. pico.addSingleton(ListAction.class);
  663. // activity
  664. pico.addSingleton(ActivitiesWebService.class);
  665. pico.addSingleton(org.sonar.server.activity.ws.SearchAction.class);
  666. pico.addSingleton(ActivityMapping.class);
  667. // measure
  668. pico.addComponent(MeasuresDao.class, false);
  669. pico.addSingleton(MeasureFilterFactory.class);
  670. pico.addSingleton(MeasureFilterExecutor.class);
  671. pico.addSingleton(MeasureFilterEngine.class);
  672. pico.addSingleton(DefaultMetricFinder.class);
  673. pico.addSingleton(ServerLifecycleNotifier.class);
  674. pico.addSingleton(TimeMachineWs.class);
  675. pico.addSingleton(ManualMeasuresWs.class);
  676. pico.addSingleton(MetricsWs.class);
  677. // quality gates
  678. pico.addSingleton(QualityGateDao.class);
  679. pico.addSingleton(QualityGateConditionDao.class);
  680. pico.addSingleton(QualityGates.class);
  681. pico.addSingleton(ProjectQgateAssociationDao.class);
  682. pico.addSingleton(QgateProjectFinder.class);
  683. pico.addSingleton(QGatesListAction.class);
  684. pico.addSingleton(QGatesSearchAction.class);
  685. pico.addSingleton(QGatesShowAction.class);
  686. pico.addSingleton(QGatesCreateAction.class);
  687. pico.addSingleton(QGatesRenameAction.class);
  688. pico.addSingleton(QGatesCopyAction.class);
  689. pico.addSingleton(QGatesDestroyAction.class);
  690. pico.addSingleton(QGatesSetAsDefaultAction.class);
  691. pico.addSingleton(QGatesUnsetDefaultAction.class);
  692. pico.addSingleton(QGatesSelectAction.class);
  693. pico.addSingleton(QGatesDeselectAction.class);
  694. pico.addSingleton(QGatesCreateConditionAction.class);
  695. pico.addSingleton(QGatesDeleteConditionAction.class);
  696. pico.addSingleton(QGatesUpdateConditionAction.class);
  697. pico.addSingleton(QGatesAppAction.class);
  698. pico.addSingleton(QGatesWs.class);
  699. // web services
  700. pico.addSingleton(WebServiceEngine.class);
  701. pico.addSingleton(ListingWs.class);
  702. // localization
  703. pico.addSingleton(L10nWs.class);
  704. // authentication
  705. pico.addSingleton(AuthenticationWs.class);
  706. // users
  707. pico.addSingleton(SecurityRealmFactory.class);
  708. pico.addSingleton(HibernateUserFinder.class);
  709. pico.addSingleton(NewUserNotifier.class);
  710. pico.addSingleton(DefaultUserFinder.class);
  711. pico.addSingleton(DefaultUserService.class);
  712. pico.addSingleton(UsersWs.class);
  713. pico.addSingleton(org.sonar.server.user.ws.CreateAction.class);
  714. pico.addSingleton(org.sonar.server.user.ws.UpdateAction.class);
  715. pico.addSingleton(org.sonar.server.user.ws.DeactivateAction.class);
  716. pico.addSingleton(org.sonar.server.user.ws.ChangePasswordAction.class);
  717. pico.addSingleton(org.sonar.server.user.ws.CurrentUserAction.class);
  718. pico.addSingleton(org.sonar.server.user.ws.SearchAction.class);
  719. pico.addSingleton(org.sonar.server.user.ws.GroupsAction.class);
  720. pico.addSingleton(org.sonar.server.issue.ws.AuthorsAction.class);
  721. pico.addSingleton(FavoritesWs.class);
  722. pico.addSingleton(UserPropertiesWs.class);
  723. pico.addSingleton(UserIndexDefinition.class);
  724. pico.addSingleton(UserIndexer.class);
  725. pico.addSingleton(UserIndex.class);
  726. pico.addSingleton(UserUpdater.class);
  727. // groups
  728. pico.addSingleton(GroupMembershipService.class);
  729. pico.addSingleton(GroupMembershipFinder.class);
  730. // permissions
  731. pico.addSingleton(PermissionFacade.class);
  732. pico.addSingleton(InternalPermissionService.class);
  733. pico.addSingleton(InternalPermissionTemplateService.class);
  734. pico.addSingleton(PermissionFinder.class);
  735. pico.addSingleton(PermissionsWs.class);
  736. // components
  737. pico.addSingleton(DefaultComponentFinder.class);
  738. pico.addSingleton(DefaultRubyComponentService.class);
  739. pico.addSingleton(ComponentService.class);
  740. pico.addSingleton(ResourcesWs.class);
  741. pico.addSingleton(ComponentsWs.class);
  742. pico.addSingleton(ProjectsWs.class);
  743. pico.addSingleton(ComponentAppAction.class);
  744. pico.addSingleton(org.sonar.server.component.ws.SearchAction.class);
  745. pico.addSingleton(EventsWs.class);
  746. pico.addSingleton(ComponentCleanerService.class);
  747. // views
  748. pico.addSingleton(ViewIndexDefinition.class);
  749. pico.addSingleton(ViewIndexer.class);
  750. pico.addSingleton(ViewIndex.class);
  751. // issues
  752. pico.addSingleton(IssueIndexDefinition.class);
  753. pico.addSingleton(IssueIndexer.class);
  754. pico.addSingleton(IssueAuthorizationIndexer.class);
  755. pico.addSingleton(ServerIssueStorage.class);
  756. pico.addSingleton(IssueUpdater.class);
  757. pico.addSingleton(FunctionExecutor.class);
  758. pico.addSingleton(IssueWorkflow.class);
  759. pico.addSingleton(IssueCommentService.class);
  760. pico.addSingleton(InternalRubyIssueService.class);
  761. pico.addSingleton(IssueChangelogService.class);
  762. pico.addSingleton(ActionService.class);
  763. pico.addSingleton(Actions.class);
  764. pico.addSingleton(IssueBulkChangeService.class);
  765. pico.addSingleton(IssueChangelogFormatter.class);
  766. pico.addSingleton(IssuesWs.class);
  767. pico.addSingleton(IssueShowAction.class);
  768. pico.addSingleton(org.sonar.server.issue.ws.SearchAction.class);
  769. pico.addSingleton(org.sonar.server.issue.ws.TagsAction.class);
  770. pico.addSingleton(SetTagsAction.class);
  771. pico.addSingleton(ComponentTagsAction.class);
  772. pico.addSingleton(IssueService.class);
  773. pico.addSingleton(IssueActionsWriter.class);
  774. pico.addSingleton(IssueQueryService.class);
  775. pico.addSingleton(NewIssuesEmailTemplate.class);
  776. pico.addSingleton(MyNewIssuesEmailTemplate.class);
  777. pico.addSingleton(IssueChangesEmailTemplate.class);
  778. pico.addSingleton(ChangesOnMyIssueNotificationDispatcher.class);
  779. pico.addSingleton(ChangesOnMyIssueNotificationDispatcher.newMetadata());
  780. pico.addSingleton(NewIssuesNotificationDispatcher.class);
  781. pico.addSingleton(NewIssuesNotificationDispatcher.newMetadata());
  782. pico.addSingleton(MyNewIssuesNotificationDispatcher.class);
  783. pico.addSingleton(MyNewIssuesNotificationDispatcher.newMetadata());
  784. pico.addSingleton(DoNotFixNotificationDispatcher.class);
  785. pico.addSingleton(DoNotFixNotificationDispatcher.newMetadata());
  786. pico.addSingleton(NewIssuesNotificationFactory.class);
  787. // issue filters
  788. pico.addSingleton(IssueFilterService.class);
  789. pico.addSingleton(IssueFilterSerializer.class);
  790. pico.addSingleton(IssueFilterWs.class);
  791. pico.addSingleton(IssueFilterWriter.class);
  792. pico.addSingleton(org.sonar.server.issue.filter.AppAction.class);
  793. pico.addSingleton(org.sonar.server.issue.filter.ShowAction.class);
  794. pico.addSingleton(org.sonar.server.issue.filter.FavoritesAction.class);
  795. // action plan
  796. pico.addSingleton(ActionPlanWs.class);
  797. pico.addSingleton(ActionPlanService.class);
  798. // issues actions
  799. pico.addSingleton(AssignAction.class);
  800. pico.addSingleton(PlanAction.class);
  801. pico.addSingleton(SetSeverityAction.class);
  802. pico.addSingleton(CommentAction.class);
  803. pico.addSingleton(TransitionAction.class);
  804. pico.addSingleton(AddTagsAction.class);
  805. pico.addSingleton(RemoveTagsAction.class);
  806. // technical debt
  807. pico.addSingleton(DebtModelService.class);
  808. pico.addSingleton(DebtModelOperations.class);
  809. pico.addSingleton(DebtModelLookup.class);
  810. pico.addSingleton(DebtModelBackup.class);
  811. pico.addSingleton(DebtModelPluginRepository.class);
  812. pico.addSingleton(DebtModelXMLExporter.class);
  813. pico.addSingleton(DebtRulesXMLImporter.class);
  814. pico.addSingleton(DebtCharacteristicsXMLImporter.class);
  815. // source
  816. pico.addSingleton(HtmlSourceDecorator.class);
  817. pico.addSingleton(SourceService.class);
  818. pico.addSingleton(SourcesWs.class);
  819. pico.addSingleton(ShowAction.class);
  820. pico.addSingleton(LinesAction.class);
  821. pico.addSingleton(HashAction.class);
  822. pico.addSingleton(RawAction.class);
  823. pico.addSingleton(IndexAction.class);
  824. pico.addSingleton(ScmAction.class);
  825. pico.addSingleton(SourceLineIndexDefinition.class);
  826. pico.addSingleton(SourceLineIndex.class);
  827. pico.addSingleton(SourceLineIndexer.class);
  828. // Duplications
  829. pico.addSingleton(DuplicationsParser.class);
  830. pico.addSingleton(DuplicationsWs.class);
  831. pico.addSingleton(DuplicationsJsonWriter.class);
  832. pico.addSingleton(org.sonar.server.duplication.ws.ShowAction.class);
  833. // text
  834. pico.addSingleton(MacroInterpreter.class);
  835. pico.addSingleton(RubyTextService.class);
  836. // Notifications
  837. pico.addSingleton(EmailSettings.class);
  838. pico.addSingleton(NotificationService.class);
  839. pico.addSingleton(NotificationCenter.class);
  840. pico.addSingleton(DefaultNotificationManager.class);
  841. // Tests
  842. pico.addSingleton(CoverageService.class);
  843. pico.addSingleton(TestsWs.class);
  844. pico.addSingleton(TestsCoveredFilesAction.class);
  845. pico.addSingleton(TestsListAction.class);
  846. pico.addSingleton(TestIndexDefinition.class);
  847. pico.addSingleton(TestIndex.class);
  848. pico.addSingleton(TestIndexer.class);
  849. // Properties
  850. pico.addSingleton(PropertiesWs.class);
  851. // graphs and perspective related classes
  852. pico.addSingleton(TestablePerspectiveLoader.class);
  853. pico.addSingleton(TestPlanPerspectiveLoader.class);
  854. pico.addSingleton(SnapshotPerspectives.class);
  855. // Type validation
  856. pico.addSingleton(TypeValidations.class);
  857. pico.addSingleton(IntegerTypeValidation.class);
  858. pico.addSingleton(FloatTypeValidation.class);
  859. pico.addSingleton(BooleanTypeValidation.class);
  860. pico.addSingleton(TextTypeValidation.class);
  861. pico.addSingleton(StringTypeValidation.class);
  862. pico.addSingleton(StringListTypeValidation.class);
  863. // Design
  864. pico.addSingleton(FileDesignWidget.class);
  865. pico.addSingleton(DependenciesWs.class);
  866. pico.addSingleton(org.sonar.server.design.ws.ShowAction.class);
  867. // System
  868. pico.addSingletons(Arrays.asList(
  869. SystemRestartWsAction.class,
  870. SystemInfoWsAction.class,
  871. UpgradesSystemWsAction.class,
  872. MigrateDbSystemWsAction.class,
  873. SystemWs.class,
  874. SystemMonitor.class,
  875. SonarQubeMonitor.class,
  876. EsMonitor.class,
  877. PluginsMonitor.class,
  878. JvmPropertiesMonitor.class,
  879. DatabaseMonitor.class
  880. ));
  881. // Plugins WS
  882. pico.addSingleton(PluginWSCommons.class);
  883. pico.addSingleton(PluginUpdateAggregator.class);
  884. pico.addSingleton(InstalledPluginsWsAction.class);
  885. pico.addSingleton(AvailablePluginsWsAction.class);
  886. pico.addSingleton(UpdatesPluginsWsAction.class);
  887. pico.addSingleton(PendingPluginsWsAction.class);
  888. pico.addSingleton(InstallPluginsWsAction.class);
  889. pico.addSingleton(UpdatePluginsWsAction.class);
  890. pico.addSingleton(UninstallPluginsWsAction.class);
  891. pico.addSingleton(CancelAllPluginsWsAction.class);
  892. pico.addSingleton(PluginsWs.class);
  893. // Compute engine
  894. pico.addSingleton(ReportQueue.class);
  895. pico.addSingleton(ComputationThreadLauncher.class);
  896. pico.addSingleton(ComputationWebService.class);
  897. pico.addSingleton(IsQueueEmptyWebService.class);
  898. pico.addSingleton(QueueWsAction.class);
  899. pico.addSingleton(HistoryWsAction.class);
  900. pico.addSingleton(DefaultPeriodCleaner.class);
  901. pico.addSingleton(DefaultPurgeTask.class);
  902. pico.addSingleton(ProjectCleaner.class);
  903. pico.addSingleton(ProjectSettingsFactory.class);
  904. pico.addSingleton(IndexPurgeListener.class);
  905. // UI
  906. pico.addSingleton(GlobalNavigationAction.class);
  907. pico.addSingleton(SettingsNavigationAction.class);
  908. pico.addSingleton(ComponentNavigationAction.class);
  909. pico.addSingleton(NavigationWs.class);
  910. for (Object components : level4AddedComponents) {
  911. pico.addSingleton(components);
  912. }
  913. ServerExtensionInstaller extensionInstaller = pico.getComponentByType(ServerExtensionInstaller.class);
  914. extensionInstaller.installExtensions(pico);
  915. pico.startComponents();
  916. }
  917. void addComponents(Collection components) {
  918. this.level4AddedComponents.addAll(components);
  919. }
  920. public void executeStartupTasks(ComponentContainer pico) {
  921. final ComponentContainer startupContainer = pico.createChild();
  922. startupContainer.addSingleton(IndexSynchronizer.class);
  923. startupContainer.addSingleton(RegisterMetrics.class);
  924. startupContainer.addSingleton(RegisterQualityGates.class);
  925. startupContainer.addSingleton(RegisterRules.class);
  926. startupContainer.addSingleton(RegisterQualityProfiles.class);
  927. startupContainer.addSingleton(JdbcDriverDeployer.class);
  928. startupContainer.addSingleton(RegisterDebtModel.class);
  929. startupContainer.addSingleton(GeneratePluginIndex.class);
  930. startupContainer.addSingleton(RegisterNewMeasureFilters.class);
  931. startupContainer.addSingleton(RegisterDashboards.class);
  932. startupContainer.addSingleton(RegisterPermissionTemplates.class);
  933. startupContainer.addSingleton(RenameDeprecatedPropertyKeys.class);
  934. startupContainer.addSingleton(LogServerId.class);
  935. startupContainer.addSingleton(RegisterServletFilters.class);
  936. startupContainer.addSingleton(CopyRequirementsFromCharacteristicsToRules.class);
  937. startupContainer.addSingleton(ReportQueueCleaner.class);
  938. startupContainer.addSingleton(RegisterIssueFilters.class);
  939. startupContainer.addSingleton(RenameIssueWidgets.class);
  940. DoPrivileged.execute(new DoPrivileged.Task() {
  941. @Override
  942. protected void doPrivileged() {
  943. startupContainer.getComponentByType(IndexSynchronizer.class).executeDeprecated();
  944. startupContainer.startComponents();
  945. startupContainer.getComponentByType(IndexSynchronizer.class).execute();
  946. startupContainer.getComponentByType(ServerLifecycleNotifier.class).notifyStart();
  947. }
  948. });
  949. // Do not put the following statements in a finally block.
  950. // It would hide the possible exception raised during startup
  951. // See SONAR-3107
  952. startupContainer.stopComponents();
  953. pico.getComponentByType(DatabaseSessionFactory.class).clear();
  954. pico.removeChild();
  955. }
  956. }