diff options
4 files changed, 131 insertions, 5 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorReady.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorReady.java index 7519bdcbcaf..621c5556c33 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorReady.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorReady.java @@ -20,6 +20,7 @@ package org.sonar.batch.scan; import org.sonar.api.batch.bootstrap.ProjectBuilder; +import org.sonar.api.batch.bootstrap.ProjectReactor; /** * Barrier to control the project lifecycle : @@ -34,13 +35,18 @@ import org.sonar.api.batch.bootstrap.ProjectBuilder; */ public class ProjectReactorReady { - public ProjectReactorReady(ProjectExclusions exclusions, ProjectBuilder[] projectBuilders) { + private ProjectReactor reactor; + + public ProjectReactorReady(ProjectExclusions exclusions, ProjectReactor reactor, ProjectBuilder[] projectBuilders) { + this.reactor = reactor; } - public ProjectReactorReady(ProjectExclusions exclusions) { + public ProjectReactorReady(ProjectExclusions exclusions, ProjectReactor reactor) { + this.reactor = reactor; } public void start() { - + ProjectReactorValidator validator = new ProjectReactorValidator(); + validator.validate(reactor); } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java new file mode 100644 index 00000000000..4f905c2298a --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java @@ -0,0 +1,55 @@ +/* + * 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.scan; + +import com.google.common.base.Joiner; +import org.sonar.api.batch.bootstrap.ProjectDefinition; +import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.sonar.api.utils.SonarException; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class aims at validating project reactor + * @since 3.6 + */ +public class ProjectReactorValidator { + + private static final String VALID_MODULE_KEY_REGEXP = "[0-9a-zA-Z:-_\\.]+"; + + public void validate(ProjectReactor reactor) { + List<String> validationMessages = new ArrayList<String>(); + for (ProjectDefinition def : reactor.getProjects()) { + validate(def, validationMessages); + } + + if (!validationMessages.isEmpty()) { + throw new SonarException("Validation of project reactor failed:\n o " + Joiner.on("\n o ").join(validationMessages)); + } + } + + private void validate(ProjectDefinition def, List<String> validationMessages) { + if (!def.getKey().matches(VALID_MODULE_KEY_REGEXP)) { + validationMessages.add(String.format("%s is not a valid project or module key", def.getKey())); + } + } + +} diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorReadyTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorReadyTest.java index 55ddf6bd826..4903aa71986 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorReadyTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorReadyTest.java @@ -21,6 +21,7 @@ package org.sonar.batch.scan; import org.junit.Test; import org.sonar.api.batch.bootstrap.ProjectBuilder; +import org.sonar.api.batch.bootstrap.ProjectReactor; import static org.mockito.Mockito.mock; @@ -28,13 +29,13 @@ public class ProjectReactorReadyTest { @Test public void should_do_nothing() { // it's only a barrier - ProjectReactorReady barrier = new ProjectReactorReady(mock(ProjectExclusions.class), new ProjectBuilder[]{mock(ProjectBuilder.class)}); + ProjectReactorReady barrier = new ProjectReactorReady(mock(ProjectExclusions.class), mock(ProjectReactor.class), new ProjectBuilder[] {mock(ProjectBuilder.class)}); barrier.start(); } @Test public void project_builders_should_be_optional() { - ProjectReactorReady barrier = new ProjectReactorReady(mock(ProjectExclusions.class)); + ProjectReactorReady barrier = new ProjectReactorReady(mock(ProjectExclusions.class), mock(ProjectReactor.class)); barrier.start(); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java new file mode 100644 index 00000000000..f396f25a86d --- /dev/null +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java @@ -0,0 +1,64 @@ +/* + * 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.scan; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.api.CoreProperties; +import org.sonar.api.batch.bootstrap.ProjectDefinition; +import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.sonar.api.utils.SonarException; + +public class ProjectReactorValidatorTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + private ProjectReactorValidator validator; + + @Before + public void prepare() { + validator = new ProjectReactorValidator(); + } + + @Test + public void should_not_fail_with_valid_data() { + ProjectReactor reactor = createProjectReactor("foo"); + validator.validate(reactor); + } + + @Test + public void should_fail_with_invalid_key() { + String projectKey = "foo$bar"; + ProjectReactor reactor = createProjectReactor(projectKey); + + thrown.expect(SonarException.class); + thrown.expectMessage("foo$bar is not a valid project or module key"); + validator.validate(reactor); + } + + private ProjectReactor createProjectReactor(String projectKey) { + ProjectDefinition def = ProjectDefinition.create().setProperty(CoreProperties.PROJECT_KEY_PROPERTY, projectKey); + ProjectReactor reactor = new ProjectReactor(def); + return reactor; + } + +} |