From 2fe323cd854a8aa7f39cbed73a0384f7046a77ca Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Fri, 15 Mar 2013 09:56:16 +0100 Subject: [PATCH] Allow to replace default ProjectTree component. --- .../org/sonar/batch/DefaultProjectTree.java | 97 +++++++++++++++++++ .../java/org/sonar/batch/ProjectTree.java | 78 ++------------- .../batch/scan/ProjectScanContainer.java | 57 +++++------ 3 files changed, 135 insertions(+), 97 deletions(-) create mode 100644 sonar-batch/src/main/java/org/sonar/batch/DefaultProjectTree.java diff --git a/sonar-batch/src/main/java/org/sonar/batch/DefaultProjectTree.java b/sonar-batch/src/main/java/org/sonar/batch/DefaultProjectTree.java new file mode 100644 index 00000000000..0bd84ba8e3e --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/DefaultProjectTree.java @@ -0,0 +1,97 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2012 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.batch; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.apache.commons.lang.ObjectUtils; +import org.sonar.api.batch.bootstrap.ProjectDefinition; +import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.sonar.api.resources.Project; +import org.sonar.batch.scan.ProjectReactorReady; + +import java.util.List; +import java.util.Map; + +public class DefaultProjectTree implements ProjectTree { + + private final ProjectConfigurator configurator; + private ProjectReactor projectReactor; + + private List projects; + private Map projectsByDef; + + public DefaultProjectTree(ProjectReactor projectReactor, + ProjectConfigurator projectConfigurator, + ProjectReactorReady reactorReady) { + this.projectReactor = projectReactor; + this.configurator = projectConfigurator; + } + + public void start() { + doStart(projectReactor.getProjects()); + } + + void doStart(List definitions) { + projects = Lists.newArrayList(); + projectsByDef = Maps.newHashMap(); + + for (ProjectDefinition def : definitions) { + Project project = configurator.create(def); + projectsByDef.put(def, project); + projects.add(project); + } + + for (Map.Entry entry : projectsByDef.entrySet()) { + ProjectDefinition def = entry.getKey(); + Project project = entry.getValue(); + for (ProjectDefinition module : def.getSubProjects()) { + projectsByDef.get(module).setParent(project); + } + } + + // Configure + for (Project project : projects) { + configurator.configure(project); + } + } + + public List getProjects() { + return projects; + } + + public Project getRootProject() { + for (Project project : projects) { + if (project.getParent() == null) { + return project; + } + } + throw new IllegalStateException("Can not find the root project from the list of Maven modules"); + } + + public ProjectDefinition getProjectDefinition(Project project) { + for (Map.Entry entry : projectsByDef.entrySet()) { + if (ObjectUtils.equals(entry.getValue(), project)) { + return entry.getKey(); + } + } + throw new IllegalStateException("Can not find ProjectDefinition for " + project); + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java b/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java index 38334bb54c7..90540fd31e0 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java +++ b/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java @@ -19,80 +19,18 @@ */ package org.sonar.batch; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.apache.commons.lang.ObjectUtils; import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.bootstrap.ProjectReactor; import org.sonar.api.resources.Project; -import org.sonar.batch.scan.ProjectReactorReady; - -import java.util.List; -import java.util.Map; - -public class ProjectTree { - - private final ProjectConfigurator configurator; - private ProjectReactor projectReactor; - - private List projects; - private Map projectsByDef; - - public ProjectTree(ProjectReactor projectReactor, - ProjectConfigurator projectConfigurator, - ProjectReactorReady reactorReady) { - this.projectReactor = projectReactor; - this.configurator = projectConfigurator; - } - - public void start() { - doStart(projectReactor.getProjects()); - } - - void doStart(List definitions) { - projects = Lists.newArrayList(); - projectsByDef = Maps.newHashMap(); - - for (ProjectDefinition def : definitions) { - Project project = configurator.create(def); - projectsByDef.put(def, project); - projects.add(project); - } - - for (Map.Entry entry : projectsByDef.entrySet()) { - ProjectDefinition def = entry.getKey(); - Project project = entry.getValue(); - for (ProjectDefinition module : def.getSubProjects()) { - projectsByDef.get(module).setParent(project); - } - } - - // Configure - for (Project project : projects) { - configurator.configure(project); - } - } +/** + * TODO Maybe it should be moved in Sonar API? + * @author julien + * + */ +public interface ProjectTree { - public List getProjects() { - return projects; - } + Project getRootProject(); - public Project getRootProject() { - for (Project project : projects) { - if (project.getParent() == null) { - return project; - } - } - throw new IllegalStateException("Can not find the root project from the list of Maven modules"); - } + ProjectDefinition getProjectDefinition(Project module); - public ProjectDefinition getProjectDefinition(Project project) { - for (Map.Entry entry : projectsByDef.entrySet()) { - if (ObjectUtils.equals(entry.getValue(), project)) { - return entry.getKey(); - } - } - throw new IllegalStateException("Can not find ProjectDefinition for " + project); - } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java index f57bbb2e085..406fb2d059d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java @@ -24,6 +24,7 @@ import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.platform.ComponentContainer; import org.sonar.api.resources.Project; import org.sonar.batch.DefaultFileLinesContextFactory; +import org.sonar.batch.DefaultProjectTree; import org.sonar.batch.DefaultResourceCreationLock; import org.sonar.batch.ProjectConfigurator; import org.sonar.batch.ProjectTree; @@ -57,38 +58,41 @@ public class ProjectScanContainer extends ComponentContainer { @Override protected void doBeforeStart() { addBatchComponents(); + addProjectComponents(); fixMavenExecutor(); addBatchExtensions(); } + protected void addProjectComponents() { + add(DefaultProjectTree.class); + } + private void addBatchComponents() { add( - DefaultResourceCreationLock.class, - DefaultPersistenceManager.class, - DependencyPersister.class, - EventPersister.class, - LinkPersister.class, - MeasurePersister.class, - MemoryOptimizer.class, - DefaultResourcePermissions.class, - DefaultResourcePersister.class, - SourcePersister.class, - DefaultNotificationManager.class, - MetricProvider.class, - ProjectExclusions.class, - ProjectReactorReady.class, - ProjectTree.class, - ProjectConfigurator.class, - DefaultIndex.class, - DefaultFileLinesContextFactory.class, - ProjectLock.class, - LastSnapshots.class, - ScanGraph.create(), - TestPlanBuilder.class, - TestableBuilder.class, - ScanPerspectives.class, - ScanGraphStore.class - ); + DefaultResourceCreationLock.class, + DefaultPersistenceManager.class, + DependencyPersister.class, + EventPersister.class, + LinkPersister.class, + MeasurePersister.class, + MemoryOptimizer.class, + DefaultResourcePermissions.class, + DefaultResourcePersister.class, + SourcePersister.class, + DefaultNotificationManager.class, + MetricProvider.class, + ProjectExclusions.class, + ProjectReactorReady.class, + ProjectConfigurator.class, + DefaultIndex.class, + DefaultFileLinesContextFactory.class, + ProjectLock.class, + LastSnapshots.class, + ScanGraph.create(), + TestPlanBuilder.class, + TestableBuilder.class, + ScanPerspectives.class, + ScanGraphStore.class); } private void fixMavenExecutor() { @@ -123,5 +127,4 @@ public class ProjectScanContainer extends ComponentContainer { new ModuleScanContainer(this, module).execute(); } - } -- 2.39.5