All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sonar.ce.container.ComputeEngineContainerImpl Maven / Gradle / Ivy

There is a newer version: 7.0
Show newest version
/*
 * SonarQube
 * Copyright (C) 2009-2016 SonarSource SA
 * mailto:contact AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.sonar.ce.container;

import com.google.common.annotations.VisibleForTesting;
import java.util.List;
import javax.annotation.CheckForNull;
import org.sonar.api.config.EmailSettings;
import org.sonar.api.internal.SonarQubeVersionFactory;
import org.sonar.api.profiles.AnnotationProfileParser;
import org.sonar.api.profiles.XMLProfileParser;
import org.sonar.api.profiles.XMLProfileSerializer;
import org.sonar.api.resources.Languages;
import org.sonar.api.resources.ResourceTypes;
import org.sonar.api.rules.AnnotationRuleParser;
import org.sonar.api.rules.XMLRuleParser;
import org.sonar.api.server.rule.RulesDefinitionXmlLoader;
import org.sonar.api.utils.Durations;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.UriReader;
import org.sonar.ce.db.ReadOnlyPropertiesDao;
import org.sonar.ce.es.EsIndexerEnabler;
import org.sonar.ce.platform.ComputeEngineExtensionInstaller;
import org.sonar.ce.property.CePropertyDefinitions;
import org.sonar.ce.settings.ComputeEngineSettings;
import org.sonar.ce.user.CeUserSession;
import org.sonar.core.component.DefaultResourceTypes;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.i18n.DefaultI18n;
import org.sonar.core.i18n.RuleI18nManager;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.core.platform.Module;
import org.sonar.core.platform.PluginClassloaderFactory;
import org.sonar.core.platform.PluginLoader;
import org.sonar.core.timemachine.Periods;
import org.sonar.core.user.DefaultUserFinder;
import org.sonar.core.user.DeprecatedUserFinder;
import org.sonar.core.util.UuidFactoryImpl;
import org.sonar.db.DaoModule;
import org.sonar.db.DatabaseChecker;
import org.sonar.db.DbClient;
import org.sonar.db.DefaultDatabase;
import org.sonar.db.permission.PermissionRepository;
import org.sonar.db.purge.PurgeProfiler;
import org.sonar.db.version.DatabaseVersion;
import org.sonar.process.Props;
import org.sonar.server.activity.ActivityService;
import org.sonar.server.activity.index.ActivityIndex;
import org.sonar.server.activity.index.ActivityIndexer;
import org.sonar.server.component.ComponentCleanerService;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.component.ComponentService;
import org.sonar.server.computation.CeModule;
import org.sonar.server.computation.container.ReportProcessingModule;
import org.sonar.server.computation.queue.CeQueueModule;
import org.sonar.server.computation.queue.PurgeCeActivities;
import org.sonar.server.computation.taskprocessor.CeTaskProcessorModule;
import org.sonar.server.debt.DebtModelPluginRepository;
import org.sonar.server.debt.DebtRulesXMLImporter;
import org.sonar.server.event.NewAlerts;
import org.sonar.server.issue.IssueUpdater;
import org.sonar.server.issue.index.IssueAuthorizationIndexer;
import org.sonar.server.issue.index.IssueIndex;
import org.sonar.server.issue.index.IssueIndexer;
import org.sonar.server.issue.notification.ChangesOnMyIssueNotificationDispatcher;
import org.sonar.server.issue.notification.DoNotFixNotificationDispatcher;
import org.sonar.server.issue.notification.IssueChangesEmailTemplate;
import org.sonar.server.issue.notification.MyNewIssuesEmailTemplate;
import org.sonar.server.issue.notification.MyNewIssuesNotificationDispatcher;
import org.sonar.server.issue.notification.NewIssuesEmailTemplate;
import org.sonar.server.issue.notification.NewIssuesNotificationDispatcher;
import org.sonar.server.issue.notification.NewIssuesNotificationFactory;
import org.sonar.server.issue.workflow.FunctionExecutor;
import org.sonar.server.issue.workflow.IssueWorkflow;
import org.sonar.server.metric.CoreCustomMetrics;
import org.sonar.server.metric.DefaultMetricFinder;
import org.sonar.server.notification.DefaultNotificationManager;
import org.sonar.server.notification.NotificationCenter;
import org.sonar.server.notification.NotificationService;
import org.sonar.server.notification.email.AlertsEmailTemplate;
import org.sonar.server.notification.email.EmailNotificationChannel;
import org.sonar.server.platform.DatabaseServerCompatibility;
import org.sonar.server.platform.DefaultServerFileSystem;
import org.sonar.server.platform.DefaultServerUpgradeStatus;
import org.sonar.server.platform.PersistentSettings;
import org.sonar.server.platform.ServerImpl;
import org.sonar.server.platform.ServerLifecycleNotifier;
import org.sonar.server.platform.ServerLogging;
import org.sonar.server.platform.TempFolderProvider;
import org.sonar.server.plugins.InstalledPluginReferentialFactory;
import org.sonar.server.plugins.ServerExtensionInstaller;
import org.sonar.server.plugins.privileged.PrivilegedPluginsBootstraper;
import org.sonar.server.plugins.privileged.PrivilegedPluginsStopper;
import org.sonar.server.properties.ProjectSettingsFactory;
import org.sonar.server.qualityprofile.BuiltInProfiles;
import org.sonar.server.qualityprofile.QProfileComparison;
import org.sonar.server.qualityprofile.QProfileLookup;
import org.sonar.server.qualityprofile.QProfileProjectLookup;
import org.sonar.server.qualityprofile.QProfileProjectOperations;
import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
import org.sonar.server.rule.CommonRuleDefinitionsImpl;
import org.sonar.server.rule.DefaultRuleFinder;
import org.sonar.server.rule.DeprecatedRulesDefinitionLoader;
import org.sonar.server.rule.RuleDefinitionsLoader;
import org.sonar.server.rule.RuleRepositories;
import org.sonar.server.rule.index.RuleIndex;
import org.sonar.server.rule.index.RuleIndexer;
import org.sonar.server.search.EsSearchModule;
import org.sonar.server.startup.LogServerId;
import org.sonar.server.test.index.TestIndexer;
import org.sonar.server.user.index.UserIndex;
import org.sonar.server.user.index.UserIndexer;
import org.sonar.server.view.index.ViewIndex;
import org.sonar.server.view.index.ViewIndexer;
import org.sonarqube.ws.Rules;

public class ComputeEngineContainerImpl implements ComputeEngineContainer {
  private static final Object[] LEVEL_1_COMPONENTS = new Object[] {
    ComputeEngineSettings.class,
    SonarQubeVersionFactory.create(System2.INSTANCE),
    ServerImpl.class,
    UuidFactoryImpl.INSTANCE,
    // no EmbeddedDatabaseFactory.class, creating H2 DB if responsibility of WebServer
    DefaultDatabase.class,
    DatabaseChecker.class,
    // must instantiate deprecated class in 5.2 and only this one (and not its replacement)
    // to avoid having two SqlSessionFactory instances
    org.sonar.core.persistence.MyBatis.class,
    DatabaseServerCompatibility.class,
    DatabaseVersion.class,
    PurgeProfiler.class,
    DefaultServerFileSystem.class,
    // no TempFolderCleaner.class, responsibility of Web Server
    new TempFolderProvider(),
    System2.INSTANCE,

    // user session
    CeUserSession.class,

    // DB
    DaoModule.class,
    // DbClient.class, replaced by CeDbClient to use ReadOnlyPropertiesDao instead of PropertiesDao
    ReadOnlyPropertiesDao.class,
    DbClient.class,
    // MigrationStepModule.class, DB maintenance, responsibility of Web Server

    // Elasticsearch
    EsSearchModule.class,

    // rules/qprofiles
    RuleIndex.class,
    ActiveRuleIndex.class,

    // issues
    IssueIndex.class,

    // Classes kept for backward compatibility of plugins/libs (like sonar-license) that are directly calling classes from the core
    // org.sonar.core.properties.PropertiesDao.class, replaced by ReadOnlyPropertiesDao (declared above) which is a ReadOnly implementation
  };
  private static final Object[] LEVEL_2_COMPONENTS = new Object[] {
    // add ReadOnlyPropertiesDao at level2 again so that it shadows PropertiesDao
    ReadOnlyPropertiesDao.class,
    DefaultServerUpgradeStatus.class,
    // no DatabaseMigrator.class, responsibility of Web Server

    // plugins
    PluginClassloaderFactory.class,
    CePluginJarExploder.class,
    PluginLoader.class,
    CePluginRepository.class,
    InstalledPluginReferentialFactory.class,
    ComputeEngineExtensionInstaller.class,

    // depends on plugins
    // RailsAppsDeployer.class,
    // JRubyI18n.class,
    DefaultI18n.class, // used by RuleI18nManager
    RuleI18nManager.class, // used by DebtRulesXMLImporter
    Durations.class, // used in Web Services and DebtCalculator
  };
  private static final Object[] LEVEL_3_COMPONENTS = new Object[] {
    PersistentSettings.class,
    // ServerMetadataPersister.class, server id is the responsibility of Web Server
    // DefaultHttpDownloader.class, does not make sense to use it from Compute Engine
    UriReader.class,
    // ServerIdGenerator.class, server id is the responsibility of Web Server
  };
  private static final Object[] LEVEL_4_COMPONENTS = new Object[] {
    // PluginDownloader.class, no use in CE
    // Views.class, UI
    ResourceTypes.class,
    DefaultResourceTypes.get(),
    // SettingsChangeNotifier.class, used only by JRuby
    // PageDecorations.class, used only by JRuby
    Periods.class, // used by JRuby and EvaluationResultTextConverterImpl
    // ServerWs.class, no Web Service in CE
    // BackendCleanup.class, DB maintenance, responsibility of Web Server
    // IndexDefinitions.class, ES maintenance, responsibility of Web Server
    // IndexCreator.class, ES maintenance, responsibility of Web Server

    // Activity
    ActivityIndexer.class,
    ActivityIndex.class,
    ActivityService.class,
    // ActivityIndexDefinition.class, ES maintenance, responsibility of Web Server

    // batch
    // BatchWsModule.class, no Web Service in CE

    // Dashboard, UI
    // [...]

    // update center, no Update Center in CE

    // quality profile
    ActiveRuleIndexer.class,
    XMLProfileParser.class,
    XMLProfileSerializer.class,
    AnnotationProfileParser.class,
    Rules.QProfiles.class,
    QProfileLookup.class,
    QProfileProjectOperations.class,
    QProfileProjectLookup.class,
    QProfileComparison.class,
    BuiltInProfiles.class,
    // RestoreBuiltInAction.class, no Web Service in CE
    // org.sonar.server.qualityprofile.ws.SearchAction.class, no Web Service in CE
    // SearchDataLoader.class, no Web Service in CE
    // SetDefaultAction.class, no Web Service in CE
    // ProjectsAction.class, no Web Service in CE
    // org.sonar.server.qualityprofile.ws.DeleteAction.class, no Web Service in CE
    // RenameAction.class, no Web Service in CE
    // CopyAction.class, no Web Service in CE
    // BackupAction.class, no Web Service in CE
    // RestoreAction.class, no Web Service in CE
    // CreateAction.class, no Web Service in CE
    // ImportersAction.class, no Web Service in
    // InheritanceAction.class, no Web Service in CE
    // ChangeParentAction.class, no Web Service in CE
    // ChangelogAction.class, no Web Service in CE
    // CompareAction.class, no Web Service in CE
    // ExportAction.class, no Web Service in CE
    // ExportersAction.class, no Web Service in CE
    // QProfilesWs.class, no Web Service in CE
    // ProfilesWs.class, no Web Service in CE
    // OldRestoreAction.class, no Web Service in CE
    // RuleActivationActions.class, no Web Service in CE
    // BulkRuleActivationActions.class, no Web Service in CE
    // ProjectAssociationActions.class, no Web Service in CE
    // RuleActivator.class, indirectly only used in Web Services
    // QProfileLoader.class, only used in QProfileService
    // QProfileExporters.class, only used in Web Service and QProfileService
    // QProfileService.class, depends on UserSession
    // RuleActivatorContextFactory.class, indirectly only used in Web Services
    // QProfileFactory.class, indirectly only used in Web Services
    // QProfileCopier.class, indirectly only used in Web Services
    // QProfileBackuper.class, indirectly only used in Web Services
    // QProfileReset.class, indirectly only used in Web Services
    // RubyQProfileActivityService.class, only used by JRuby

    // rule
    // RuleIndexDefinition.class, ES maintenance, responsibility of Web Server
    RuleIndexer.class,
    AnnotationRuleParser.class,
    XMLRuleParser.class,
    DefaultRuleFinder.class,
    // RuleOperations.class, supposed to be dropped in 4.4
    // RubyRuleService.class, used by JRuby
    RuleRepositories.class,
    DeprecatedRulesDefinitionLoader.class,
    CommonRuleDefinitionsImpl.class,
    RuleDefinitionsLoader.class,
    RulesDefinitionXmlLoader.class,
    // RuleUpdater.class, only used in Web Services
    // RuleCreator.class, only used from Ruby or Web Service
    // RuleDeleter.class, only used from Ruby or Web Service
    // RuleService.class, only used from Ruby or Web Service
    // org.sonar.server.rule.ws.UpdateAction.class, no Web Service in CE
    // RulesWs.class, no Web Service in CE
    // org.sonar.server.rule.ws.SearchAction.class, no Web Service in CE
    // org.sonar.server.rule.ws.ShowAction.class, no Web Service in CE
    // org.sonar.server.rule.ws.CreateAction.class, no Web Service in CE
    // org.sonar.server.rule.ws.DeleteAction.class, no Web Service in CE
    // org.sonar.server.rule.ws.ListAction.class, no Web Service in CE
    // TagsAction.class, no Web Service in CE
    // RuleMapper.class, only used in Web Services
    // ActiveRuleCompleter.class, only used in Web Services
    // RepositoriesAction.class, no Web Service in CE
    // org.sonar.server.rule.ws.AppAction.class, no Web Service in CE

    // languages
    Languages.class, // used by CommonRuleDefinitionsImpl
    // org.sonar.server.language.ws.ListAction.class, no Web Service in CE
    // LanguageWs.class, no Web Service in CE

    // activity
    // ActivityMapping.class, no Web Service in CE
    // org.sonar.server.activity.ws.SearchAction.class, no Web Service in CE
    // ActivitiesWs.class, no Web Service in CE

    // measure
    // MeasureFilterFactory.class, used only in MeasureFilterEngine
    // MeasureFilterExecutor.class, used only in MeasureFilterEngine
    // MeasureFilterEngine.class, used only in JRubyFacade
    // MetricsWsModule.class, no Web Service in CE
    // MeasuresWsModule.class, no Web Service in CE
    // CustomMeasuresWsModule.class, no Web Service in CE
    // ProjectFilter.class, used only in GlobalDefaultDashboard
    // MyFavouritesFilter.class, used only in GlobalDefaultDashboard
    CoreCustomMetrics.class,
    DefaultMetricFinder.class,
    // TimeMachineWs.class, no Web Service in CE

    // quality gates
    // QualityGates.class, used only in Web Service and RegisterQualityGates
    // QgateProjectFinder.class, used only in Web Service
    // org.sonar.server.qualitygate.ws.ListAction.class, no Web Service in CE
    // org.sonar.server.qualitygate.ws.SearchAction.class, no Web Service in CE
    // org.sonar.server.qualitygate.ws.ShowAction.class, no Web Service in CE
    // org.sonar.server.qualitygate.ws.CreateAction.class, no Web Service in CE
    // org.sonar.server.qualitygate.ws.RenameAction.class, no Web Service in CE
    // org.sonar.server.qualitygate.ws.CopyAction.class, no Web Service in CE
    // DestroyAction.class, no Web Service in CE
    // SetAsDefaultAction.class, no Web Service in CE
    // UnsetDefaultAction.class, no Web Service in CE
    // SelectAction.class, no Web Service in CE
    // DeselectAction.class, no Web Service in CE
    // CreateConditionAction.class, no Web Service in CE
    // DeleteConditionAction.class, no Web Service in CE
    // UpdateConditionAction.class, no Web Service in CE
    // org.sonar.server.qualitygate.ws.AppAction.class, no Web Service in CE
    // ProjectStatusAction.class, no Web Service in CE
    // QGatesWs.class, no Web Service in CE

    // web services
    // WebServiceEngine.class, no Web Service in CE
    // WebServicesWs.class, no Web Service in CE

    // localization
    // L10nWs.class, no Web Service in CE

    // authentication
    // AuthenticationModule.class, only used for Web Server security

    // users
    // SecurityRealmFactory.class, only used for Web Server security
    DeprecatedUserFinder.class,
    // NewUserNotifier.class, only used in UI or UserUpdater
    DefaultUserFinder.class,
    // DefaultUserService.class, used only by Ruby
    // UserJsonWriter.class, used only in Web Service
    // UsersWs.class, no Web Service in CE
    // org.sonar.server.user.ws.CreateAction.class, no Web Service in CE
    // org.sonar.server.user.ws.UpdateAction.class, no Web Service in CE
    // org.sonar.server.user.ws.DeactivateAction.class, no Web Service in CE
    // org.sonar.server.user.ws.ChangePasswordAction.class, no Web Service in CE
    // CurrentAction.class, no Web Service in CE
    // org.sonar.server.user.ws.SearchAction.class, no Web Service in CE
    // org.sonar.server.user.ws.GroupsAction.class, no Web Service in CE
    // FavoritesWs.class, no Web Service in CE
    // UserPropertiesWs.class, no Web Service in CE
    // UserIndexDefinition.class, ES maintenance, responsibility of Web Server
    UserIndexer.class,
    UserIndex.class,
    // UserUpdater.class,
    // UserTokenModule.class,

    // groups
    // GroupMembershipFinder.class, // only used byGroupMembershipService
    // GroupMembershipService.class, // only used by Ruby
    // UserGroupsModule.class, no Web Service in CE

    // permissions
    PermissionRepository.class,
    // PermissionService.class, // depends on UserSession
    // PermissionUpdater.class, // depends on UserSession
    // PermissionFinder.class, used only in Web Service
    // PermissionsWsModule.class, no Web Service in CE

    // components
    // ProjectsWsModule.class, no Web Service in CE
    // ComponentsWsModule.class, no Web Service in CE
    // DefaultComponentFinder.class, only used in DefaultRubyComponentService
    // DefaultRubyComponentService.class, only used by Ruby
    ComponentFinder.class, // used in ComponentService
    ComponentService.class, // used in ReportSubmitter
    NewAlerts.class,
    NewAlerts.newMetadata(),
    ComponentCleanerService.class,

    // views
    // ViewIndexDefinition.class, ES maintenance, responsibility of Web Server
    ViewIndexer.class,
    ViewIndex.class,

    // issues
    // IssueIndexDefinition.class,
    IssueIndexer.class,
    IssueAuthorizationIndexer.class,
    // ServerIssueStorage.class, indirectly used only in Web Services
    IssueUpdater.class, // used in Web Services and CE's DebtCalculator
    FunctionExecutor.class, // used by IssueWorkflow
    IssueWorkflow.class, // used in Web Services and CE's DebtCalculator
    // IssueCommentService.class, indirectly used only in Web Services
    // InternalRubyIssueService.class, indirectly used only in Web Services
    // IssueChangelogService.class, indirectly used only in Web Services
    // ActionService.class, indirectly used only in Web Services
    // IssueBulkChangeService.class, indirectly used only in Web Services
    // WsResponseCommonFormat.class, indirectly used only in Web Services
    // IssueWsModule.class, no Web Service in CE
    // IssueService.class, indirectly used only in Web Services
    // IssueQueryService.class, used only in Web Services and Ruby
    NewIssuesEmailTemplate.class,
    MyNewIssuesEmailTemplate.class,
    IssueChangesEmailTemplate.class,
    AlertsEmailTemplate.class,
    ChangesOnMyIssueNotificationDispatcher.class,
    ChangesOnMyIssueNotificationDispatcher.newMetadata(),
    NewIssuesNotificationDispatcher.class,
    NewIssuesNotificationDispatcher.newMetadata(),
    MyNewIssuesNotificationDispatcher.class,
    MyNewIssuesNotificationDispatcher.newMetadata(),
    DoNotFixNotificationDispatcher.class,
    DoNotFixNotificationDispatcher.newMetadata(),
    NewIssuesNotificationFactory.class, // used by SendIssueNotificationsStep
    EmailNotificationChannel.class,

    // IssueFilterWsModule.class, no Web Service in CE

    // action plan
    // ActionPlanWs.class, no Web Service in CE
    // ActionPlanService.class, no Web Service in CE

    // issues actions
    // AssignAction.class, no Web Service in CE
    // SetTypeAction.class, no Web Service in CE
    // PlanAction.class, no Web Service in CE
    // SetSeverityAction.class, no Web Service in CE
    // CommentAction.class, no Web Service in CE
    // TransitionAction.class, no Web Service in CE
    // AddTagsAction.class, no Web Service in CE
    // RemoveTagsAction.class, no Web Service in CE

    // technical debt
    // DebtModelService.class,
    // DebtModelBackup.class,
    DebtModelPluginRepository.class,
    // DebtModelXMLExporter.class,
    DebtRulesXMLImporter.class,

    // source
    // HtmlSourceDecorator.class, indirectly used only in Web Service
    // SourceService.class, indirectly used only in Web Service
    // SourcesWs.class, no Web Service in CE
    // org.sonar.server.source.ws.ShowAction.class, no Web Service in CE
    // LinesAction.class, no Web Service in CE
    // HashAction.class, no Web Service in CE
    // RawAction.class, no Web Service in CE
    // IndexAction.class, no Web Service in CE
    // ScmAction.class, no Web Service in CE

    // // Duplications
    // DuplicationsParser.class,
    // DuplicationsWs.class, no Web Service in CE
    // DuplicationsJsonWriter.class,
    // org.sonar.server.duplication.ws.ShowAction.class, no Web Service in CE

    // text
    // MacroInterpreter.class, only used in Web Services and Ruby
    // RubyTextService.class,

    // Notifications
    EmailSettings.class,
    NotificationService.class,
    NotificationCenter.class,
    DefaultNotificationManager.class,

    // Tests
    // CoverageService.class,
    // TestsWs.class,
    // CoveredFilesAction.class,
    // org.sonar.server.test.ws.ListAction.class,
    // TestIndexDefinition.class,
    // TestIndex.class,
    TestIndexer.class,

    // Properties
    // PropertiesWs.class, no Web Service in CE

    // TypeValidationModule.class, indirectly used only in Web Service

    // System
    ServerLogging.class,
    // RestartAction.class, no Web Service in CE
    // InfoAction.class, no Web Service in CE
    // UpgradesAction.class, no Web Service in CE
    // StatusAction.class, no Web Service in CE
    // SystemWs.class, no Web Service in CE
    // SystemMonitor.class, no Monitor in CE, responsibility of Web Server
    // SonarQubeMonitor.class, no Monitor in CE, responsibility of Web Server
    // EsMonitor.class, no Monitor in CE, responsibility of Web Server
    // PluginsMonitor.class, no Monitor in CE, responsibility of Web Server
    // JvmPropsMonitor.class, no Monitor in CE, responsibility of Web Server
    // DatabaseMonitor.class, no Monitor in CE, responsibility of Web Server
    // MigrateDbAction.class, no Web Service in CE
    // LogsAction.class, no Web Service in CE
    // ChangeLogLevelAction.class, no Web Service in CE
    // DbMigrationStatusAction.class, no Web Service in CE

    // Plugins WS
    // PluginWSCommons.class, no Web Service in CE
    // PluginUpdateAggregator.class, no Web Service in CE
    // InstalledAction.class, no Web Service in CE
    // AvailableAction.class, no Web Service in CE
    // UpdatesAction.class, no Web Service in CE
    // PendingAction.class, no Web Service in CE
    // InstallAction.class, no Web Service in CE
    // org.sonar.server.plugins.ws.UpdateAction.class, no Web Service in CE
    // UninstallAction.class, no Web Service in CE
    // CancelAllAction.class, no Web Service in CE
    // PluginsWs.class, no Web Service in CE

    // Views plugin
    // ViewsBootstrap.class, Views not supported in 5.5
    // ViewsStopper.class, Views not supported in 5.5

    // privileged plugins
    PrivilegedPluginsBootstraper.class,
    PrivilegedPluginsStopper.class,

    // Compute engine (must be after Views and Developer Cockpit)
    CeModule.class,
    CeQueueModule.class,
    ReportProcessingModule.class,
    CeTaskProcessorModule.class,
    // CeWsModule.class, no Web Service in CE

    ProjectSettingsFactory.class,

    // UI
    // GlobalNavigationAction.class, no Web Service in CE
    // SettingsNavigationAction.class, no Web Service in CE
    // ComponentNavigationAction.class, no Web Service in CE
    // NavigationWs.class, no Web Service in CE
  };
  private static final Object[] STARTUP_COMPONENTS = new Object[] {
    // IndexSynchronizer.class, ES maintenance, responsibility of Web Server
    EsIndexerEnabler.class,
    // RegisterMetrics.class, DB maintenance, responsibility of Web Server
    // RegisterQualityGates.class, DB maintenance, responsibility of Web Server
    // RegisterRules.class, DB maintenance, responsibility of Web Server
    // RegisterQualityProfiles.class, DB maintenance, responsibility of Web Server
    // GeneratePluginIndex.class, ES maintenance, responsibility of Web Server
    // RegisterNewMeasureFilters.class, DB maintenance, responsibility of Web Server
    // RegisterDashboards.class, UI related, anyway, DB maintenance, responsibility of Web Server
    // RegisterPermissionTemplates.class, DB maintenance, responsibility of Web Server
    // RenameDeprecatedPropertyKeys.class, DB maintenance, responsibility of Web Server
    LogServerId.class,
    // RegisterServletFilters.class, Web Server only
    // RegisterIssueFilters.class, DB maintenance, responsibility of Web Server
    // RenameIssueWidgets.class, UI related, anyway, DB maintenance, responsibility of Web Server
    ServerLifecycleNotifier.class,
    PurgeCeActivities.class,
    // DisplayLogOnDeprecatedProjects.class, responsibility of Web Server
    // ClearRulesOverloadedDebt.class, DB maintenance, responsibility of Web Server
  };

  @CheckForNull
  private ComponentContainer level1;
  @CheckForNull
  private ComponentContainer level4;

  @Override
  public ComputeEngineContainer start(Props props) {
    this.level1 = new ComponentContainer();
    this.level1
      .add(props.rawProperties())
      .add(LEVEL_1_COMPONENTS)
      .add(toArray(CorePropertyDefinitions.all()))
      .add(toArray(CePropertyDefinitions.all()));
    configureFromModules(this.level1);
    this.level1.startComponents();

    ComponentContainer level2 = this.level1.createChild();
    level2.add(LEVEL_2_COMPONENTS);
    configureFromModules(level2);
    level2.startComponents();

    ComponentContainer level3 = level2.createChild();
    level3.add(LEVEL_3_COMPONENTS);
    configureFromModules(level3);
    level3.startComponents();

    this.level4 = level3.createChild();
    this.level4.add(LEVEL_4_COMPONENTS);
    configureFromModules(this.level4);
    ServerExtensionInstaller extensionInstaller = this.level4.getComponentByType(ServerExtensionInstaller.class);
    extensionInstaller.installExtensions(this.level4);
    this.level4.startComponents();

    startupTasks();

    return this;
  }

  private void startupTasks() {
    ComponentContainer startupLevel = this.level4.createChild();
    startupLevel.add(STARTUP_COMPONENTS);
    startupLevel.startComponents();
    // done in PlatformLevelStartup
    ServerLifecycleNotifier serverLifecycleNotifier = startupLevel.getComponentByType(ServerLifecycleNotifier.class);
    if (serverLifecycleNotifier != null) {
      serverLifecycleNotifier.notifyStart();
    }
    startupLevel.stopComponents();
  }

  @Override
  public ComputeEngineContainer stop() {
    this.level1.stopComponents();
    return this;
  }

  @VisibleForTesting
  protected ComponentContainer getComponentContainer() {
    return level4;
  }

  private static Object[] toArray(List list) {
    return list.toArray(new Object[list.size()]);
  }

  private static void configureFromModules(ComponentContainer container) {
    List modules = container.getComponentsByType(Module.class);
    for (Module module : modules) {
      module.configure(container);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy