From a7afaede85e8d53089125a8dfeea7a0d628ec7a3 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Tue, 19 Mar 2013 16:37:10 +0100 Subject: SONAR-4069 Allow to persist a project with a copy_resource_id --- .../batch/index/DefaultResourcePersister.java | 10 +++-- .../java/org/sonar/batch/index/ResourceCopy.java | 26 ++++++++++++ .../batch/index/DefaultResourcePersisterTest.java | 48 ++++++++++++++++++---- .../shouldSaveCopyProject-result.xml | 22 ++++++++++ 4 files changed, 95 insertions(+), 11 deletions(-) create mode 100644 sonar-batch/src/main/java/org/sonar/batch/index/ResourceCopy.java create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/index/DefaultResourcePersisterTest/shouldSaveCopyProject-result.xml (limited to 'sonar-batch/src') diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/DefaultResourcePersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/DefaultResourcePersister.java index 93b48113c92..2391510155c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/DefaultResourcePersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/DefaultResourcePersister.java @@ -76,6 +76,11 @@ public final class DefaultResourcePersister implements ResourcePersister { ResourceModel model = findOrCreateModel(project); model.setLanguageKey(project.getLanguageKey());// ugly, only for projects + // For views + if (project instanceof ResourceCopy) { + model.setCopyResourceId(((ResourceCopy) project).getCopyResourceId()); + } + Snapshot parentSnapshot = null; if (parent != null) { // assume that the parent project has already been saved @@ -120,7 +125,6 @@ public final class DefaultResourcePersister implements ResourcePersister { return snapshotsByResource; } - public Snapshot saveResource(Project project, Resource resource) { return saveResource(project, resource, null); } @@ -134,7 +138,6 @@ public final class DefaultResourcePersister implements ResourcePersister { return snapshot; } - private Snapshot persist(Project project, Resource resource, Resource parent) { Snapshot snapshot; if (resource instanceof Project) { @@ -151,7 +154,6 @@ public final class DefaultResourcePersister implements ResourcePersister { return snapshot; } - private Snapshot persistLibrary(Project project, Library library) { ResourceModel model = findOrCreateModel(library); model = session.save(model); @@ -224,7 +226,7 @@ public final class DefaultResourcePersister implements ResourcePersister { public void clear() { // we keep cache of projects - for (Iterator> it = snapshotsByResource.entrySet().iterator(); it.hasNext(); ) { + for (Iterator> it = snapshotsByResource.entrySet().iterator(); it.hasNext();) { Map.Entry entry = it.next(); if (!ResourceUtils.isSet(entry.getKey())) { it.remove(); diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/ResourceCopy.java b/sonar-batch/src/main/java/org/sonar/batch/index/ResourceCopy.java new file mode 100644 index 00000000000..2129ac098cc --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/index/ResourceCopy.java @@ -0,0 +1,26 @@ +/* + * 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.index; + +public interface ResourceCopy { + + int getCopyResourceId(); + +} diff --git a/sonar-batch/src/test/java/org/sonar/batch/index/DefaultResourcePersisterTest.java b/sonar-batch/src/test/java/org/sonar/batch/index/DefaultResourcePersisterTest.java index a9ea3b30b51..534a1496629 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/index/DefaultResourcePersisterTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/index/DefaultResourcePersisterTest.java @@ -44,7 +44,7 @@ import static org.mockito.Mockito.when; public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { - private Project singleProject, multiModuleProject, moduleA, moduleB, moduleB1; + private Project singleProject, singleCopyProject, multiModuleProject, moduleA, moduleB, moduleB1; @Before public void before() throws ParseException { @@ -52,6 +52,9 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { singleProject = newProject("foo", "java"); singleProject.setName("Foo").setDescription("some description").setAnalysisDate(format.parse("25/12/2010")); + singleCopyProject = newCopyProject("foo", "java", 10); + singleCopyProject.setName("Foo").setDescription("some description").setAnalysisDate(format.parse("25/12/2010")); + multiModuleProject = newProject("root", "java"); multiModuleProject.setName("Root").setAnalysisDate(format.parse("25/12/2010")); @@ -75,13 +78,23 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { ResourcePersister persister = new DefaultResourcePersister(getSession(), mock(ResourcePermissions.class)); persister.saveProject(singleProject, null); - checkTables("shouldSaveNewProject", new String[]{"build_date", "created_at"}, "projects", "snapshots"); + checkTables("shouldSaveNewProject", new String[] {"build_date", "created_at"}, "projects", "snapshots"); // SONAR-3636 : created_at must be fed when inserting a new entry in the 'projects' table ResourceModel model = getSession().getSingleResult(ResourceModel.class, "key", singleProject.getKey()); assertThat(model.getCreatedAt()).isNotNull(); } + @Test + public void shouldSaveCopyProject() { + setupData("shared"); + + ResourcePersister persister = new DefaultResourcePersister(getSession(), mock(ResourcePermissions.class)); + persister.saveProject(singleCopyProject, null); + + checkTables("shouldSaveCopyProject", new String[] {"build_date", "created_at"}, "projects", "snapshots"); + } + @Test public void shouldSaveNewMultiModulesProject() { setupData("shared"); @@ -92,7 +105,7 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { persister.saveProject(moduleB, multiModuleProject); persister.saveProject(moduleB1, moduleB); - checkTables("shouldSaveNewMultiModulesProject", new String[]{"build_date", "created_at"}, "projects", "snapshots"); + checkTables("shouldSaveNewMultiModulesProject", new String[] {"build_date", "created_at"}, "projects", "snapshots"); } @Test @@ -104,7 +117,7 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { persister.saveResource(singleProject, new JavaPackage("org.foo").setEffectiveKey("foo:org.foo")); // check that the directory is attached to the project - checkTables("shouldSaveNewDirectory", new String[]{"build_date", "created_at"}, "projects", "snapshots"); + checkTables("shouldSaveNewDirectory", new String[] {"build_date", "created_at"}, "projects", "snapshots"); } @Test @@ -117,7 +130,7 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { persister.saveResource(singleProject, new Library("junit:junit", "4.8.2").setEffectiveKey("junit:junit"));// do nothing, already saved persister.saveResource(singleProject, new Library("junit:junit", "3.2").setEffectiveKey("junit:junit")); - checkTables("shouldSaveNewLibrary", new String[]{"build_date", "created_at"}, "projects", "snapshots"); + checkTables("shouldSaveNewLibrary", new String[] {"build_date", "created_at"}, "projects", "snapshots"); } @Test @@ -145,7 +158,7 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { singleProject.setDescription("new description"); persister.saveProject(singleProject, null); - checkTables("shouldUpdateExistingResource", new String[]{"build_date", "created_at"}, "projects", "snapshots"); + checkTables("shouldUpdateExistingResource", new String[] {"build_date", "created_at"}, "projects", "snapshots"); } // SONAR-1700 @@ -156,7 +169,7 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { ResourcePersister persister = new DefaultResourcePersister(getSession(), mock(ResourcePermissions.class)); persister.saveProject(singleProject, null); - checkTables("shouldRemoveRootIndexIfResourceIsProject", new String[]{"build_date", "created_at"}, "projects", "snapshots"); + checkTables("shouldRemoveRootIndexIfResourceIsProject", new String[] {"build_date", "created_at"}, "projects", "snapshots"); } @Test @@ -191,4 +204,25 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase { return new Project(key).setConfiguration(configuration).setAnalysisType(Project.AnalysisType.DYNAMIC); } + private static Project newCopyProject(String key, String language, int copyResourceId) { + PropertiesConfiguration configuration = new PropertiesConfiguration(); + configuration.setProperty("sonar.language", language); + return new CopyProject(key, copyResourceId).setConfiguration(configuration).setAnalysisType(Project.AnalysisType.DYNAMIC); + } + + private static class CopyProject extends Project implements ResourceCopy { + + private int copyResourceId; + + public CopyProject(String key, int copyResourceId) { + super(key); + this.copyResourceId = copyResourceId; + } + + public int getCopyResourceId() { + return copyResourceId; + } + + } + } diff --git a/sonar-batch/src/test/resources/org/sonar/batch/index/DefaultResourcePersisterTest/shouldSaveCopyProject-result.xml b/sonar-batch/src/test/resources/org/sonar/batch/index/DefaultResourcePersisterTest/shouldSaveCopyProject-result.xml new file mode 100644 index 00000000000..e5169508831 --- /dev/null +++ b/sonar-batch/src/test/resources/org/sonar/batch/index/DefaultResourcePersisterTest/shouldSaveCopyProject-result.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + -- cgit v1.2.3