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.batch.bootstrap;
021
022 import org.sonar.api.Plugins;
023 import org.sonar.api.measures.CoreMetrics;
024 import org.sonar.api.measures.Metric;
025 import org.sonar.api.resources.Project;
026 import org.sonar.api.resources.ResourceTypes;
027 import org.sonar.api.utils.ServerHttpClient;
028 import org.sonar.batch.DefaultFileLinesContextFactory;
029 import org.sonar.batch.DefaultResourceCreationLock;
030 import org.sonar.batch.ProjectConfigurator;
031 import org.sonar.batch.ProjectTree;
032 import org.sonar.batch.components.*;
033 import org.sonar.batch.index.*;
034 import org.sonar.core.metric.CacheMetricFinder;
035 import org.sonar.core.notification.DefaultNotificationManager;
036 import org.sonar.core.rule.CacheRuleFinder;
037 import org.sonar.core.user.DefaultUserFinder;
038 import org.sonar.jpa.dao.MeasuresDao;
039
040 /**
041 * Level-2 components. Connected to database.
042 */
043 public class BatchModule extends Module {
044
045 private final boolean dryRun;
046
047 public BatchModule(boolean dryRun) {
048 this.dryRun = dryRun;
049 }
050
051 @Override
052 protected void configure() {
053 addCoreSingleton(ProjectTree.class);
054 addCoreSingleton(ProjectFilter.class);
055 addCoreSingleton(ProjectConfigurator.class);
056 addCoreSingleton(DefaultResourceCreationLock.class);
057 addCoreSingleton(DefaultIndex.class);
058 addCoreSingleton(DefaultFileLinesContextFactory.class);
059
060 if (dryRun) {
061 addCoreSingleton(ReadOnlyPersistenceManager.class);
062 } else {
063 addCoreSingleton(DefaultPersistenceManager.class);
064 addCoreSingleton(DependencyPersister.class);
065 addCoreSingleton(EventPersister.class);
066 addCoreSingleton(LinkPersister.class);
067 addCoreSingleton(MeasurePersister.class);
068 addCoreSingleton(MemoryOptimizer.class);
069 addCoreSingleton(DefaultResourcePersister.class);
070 addCoreSingleton(SourcePersister.class);
071 }
072
073 addCoreSingleton(Plugins.class);
074 addCoreSingleton(ServerHttpClient.class);
075 addCoreSingleton(MeasuresDao.class);
076 addCoreSingleton(CacheRuleFinder.class);
077 addCoreSingleton(CacheMetricFinder.class);
078 addCoreSingleton(PastSnapshotFinderByDate.class);
079 addCoreSingleton(PastSnapshotFinderByDays.class);
080 addCoreSingleton(PastSnapshotFinderByPreviousAnalysis.class);
081 addCoreSingleton(PastSnapshotFinderByVersion.class);
082 addCoreSingleton(PastMeasuresLoader.class);
083 addCoreSingleton(PastSnapshotFinder.class);
084 addCoreSingleton(DefaultNotificationManager.class);
085 addCoreSingleton(DefaultUserFinder.class);
086 addCoreSingleton(ResourceTypes.class);
087 addCoreMetrics();
088 addBatchExtensions();
089 }
090
091 private void addBatchExtensions() {
092 BatchExtensionInstaller installer = getComponentByType(BatchExtensionInstaller.class);
093 installer.install(this);
094 }
095
096 void addCoreMetrics() {
097 for (Metric metric : CoreMetrics.getMetrics()) {
098 addCoreSingleton(metric);
099 }
100 }
101
102 @Override
103 protected void doStart() {
104 ProjectTree projectTree = getComponentByType(ProjectTree.class);
105 analyze(projectTree.getRootProject());
106 }
107
108 private void analyze(Project project) {
109 for (Project subProject : project.getModules()) {
110 analyze(subProject);
111 }
112
113 Module projectComponents = installChild(new ProjectModule(project, dryRun));
114 try {
115 projectComponents.start();
116 } finally {
117 projectComponents.stop();
118 uninstallChild();
119 }
120 }
121 }