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