From b274952fa91703ca9f983506047ba31d8cc258aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 5 Jun 2019 14:27:35 +0200 Subject: [PATCH] Create explicit method to create new repository locations --- .../repository/RepositoryLocationResolver.java | 18 ++++++++++++++++++ .../PathBasedRepositoryLocationResolver.java | 15 ++++++++++++++- ...athBasedRepositoryLocationResolverTest.java | 12 ++++++------ .../repository/xml/XmlRepositoryDAOTest.java | 5 +++++ .../scm/TempDirRepositoryLocationResolver.java | 5 +++++ .../SimpleRepositoryHandlerTestBase.java | 8 +++++--- .../repository/CopyMigrationStrategy.java | 2 +- .../repository/MoveMigrationStrategy.java | 2 +- .../repository/CopyMigrationStrategyTest.java | 2 +- .../repository/MoveMigrationStrategyTest.java | 2 +- 10 files changed, 57 insertions(+), 14 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java index 8c76bdabaa..1b7da51c4c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java @@ -14,8 +14,26 @@ public abstract class RepositoryLocationResolver { } public interface RepositoryLocationResolverInstance { + + /** + * Get the existing location for the repository. + * @param repositoryId The id of the repository. + * @throws IllegalStateException when there is no known location for the given repository. + */ T getLocation(String repositoryId); + /** + * Create a new location for the new repository. + * @param repositoryId The id of the new repository. + * @throws IllegalStateException when there already is a location for the given repository registered. + */ + T createLocation(String repositoryId); + + /** + * Set the location of a new repository. + * @param repositoryId The id of the new repository. + * @throws IllegalStateException when there already is a location for the given repository registered. + */ void setLocation(String repositoryId, T location); } } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java index c8c462be36..96067ba7a2 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java @@ -71,6 +71,15 @@ public class PathBasedRepositoryLocationResolver extends BasicRepositoryLocation public T getLocation(String repositoryId) { if (pathById.containsKey(repositoryId)) { return (T) contextProvider.resolve(pathById.get(repositoryId)); + } else { + throw new IllegalStateException("location for repository " + repositoryId + " does not exist"); + } + } + + @Override + public T createLocation(String repositoryId) { + if (pathById.containsKey(repositoryId)) { + throw new IllegalStateException("location for repository " + repositoryId + " already exists"); } else { return (T) create(repositoryId); } @@ -78,7 +87,11 @@ public class PathBasedRepositoryLocationResolver extends BasicRepositoryLocation @Override public void setLocation(String repositoryId, T location) { - PathBasedRepositoryLocationResolver.this.setLocation(repositoryId, ((Path) location).toAbsolutePath()); + if (pathById.containsKey(repositoryId)) { + throw new IllegalStateException("location for repository " + repositoryId + " already exists"); + } else { + PathBasedRepositoryLocationResolver.this.setLocation(repositoryId, ((Path) location).toAbsolutePath()); + } } }; } diff --git a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java index 5f758f124a..754b8469d5 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java @@ -57,7 +57,7 @@ class PathBasedRepositoryLocationResolverTest { @Test void shouldCreateInitialDirectory() { - Path path = resolver.forClass(Path.class).getLocation("newId"); + Path path = resolver.forClass(Path.class).createLocation("newId"); assertThat(path).isEqualTo(basePath.resolve("newId")); assertThat(path).isDirectory(); @@ -65,7 +65,7 @@ class PathBasedRepositoryLocationResolverTest { @Test void shouldPersistInitialDirectory() { - resolver.forClass(Path.class).getLocation("newId"); + resolver.forClass(Path.class).createLocation("newId"); String content = getXmlFileContent(); @@ -78,7 +78,7 @@ class PathBasedRepositoryLocationResolverTest { long now = CREATION_TIME + 100; when(clock.millis()).thenReturn(now); - resolver.forClass(Path.class).getLocation("newId"); + resolver.forClass(Path.class).createLocation("newId"); assertThat(resolver.getCreationTime()).isEqualTo(CREATION_TIME); @@ -91,7 +91,7 @@ class PathBasedRepositoryLocationResolverTest { long now = CREATION_TIME + 100; when(clock.millis()).thenReturn(now); - resolver.forClass(Path.class).getLocation("newId"); + resolver.forClass(Path.class).createLocation("newId"); assertThat(resolver.getCreationTime()).isEqualTo(CREATION_TIME); assertThat(resolver.getLastModified()).isEqualTo(now); @@ -108,8 +108,8 @@ class PathBasedRepositoryLocationResolverTest { @BeforeEach void createExistingDatabase() { - resolver.forClass(Path.class).getLocation("existingId_1"); - resolver.forClass(Path.class).getLocation("existingId_2"); + resolver.forClass(Path.class).createLocation("existingId_1"); + resolver.forClass(Path.class).createLocation("existingId_2"); resolverWithExistingData = createResolver(); } diff --git a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java index 36c9db33e2..9ab8925fdb 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java @@ -64,6 +64,11 @@ class XmlRepositoryDAOTest { return locationResolver.create(repositoryId); } + @Override + public Path createLocation(String repositoryId) { + return locationResolver.create(repositoryId); + } + @Override public void setLocation(String repositoryId, Path location) { } diff --git a/scm-test/src/main/java/sonia/scm/TempDirRepositoryLocationResolver.java b/scm-test/src/main/java/sonia/scm/TempDirRepositoryLocationResolver.java index 77b09ff707..acffe6c769 100644 --- a/scm-test/src/main/java/sonia/scm/TempDirRepositoryLocationResolver.java +++ b/scm-test/src/main/java/sonia/scm/TempDirRepositoryLocationResolver.java @@ -21,6 +21,11 @@ public class TempDirRepositoryLocationResolver extends BasicRepositoryLocationRe return (T) tempDirectory.toPath(); } + @Override + public T createLocation(String repositoryId) { + return (T) tempDirectory.toPath(); + } + @Override public void setLocation(String repositoryId, T location) { throw new UnsupportedOperationException("not implemented for tests"); diff --git a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java index 063681bbc4..615169b58c 100644 --- a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java @@ -34,6 +34,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; +import org.mockito.stubbing.Answer; import sonia.scm.AbstractTestBase; import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory; @@ -82,11 +83,12 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.create(any())).thenReturn(instanceMock); when(locationResolver.supportsLocationType(any())).thenReturn(true); - - when(instanceMock.getLocation(anyString())).then(ic -> { + Answer pathAnswer = ic -> { String id = ic.getArgument(0); return baseDirectory.toPath().resolve(id); - }); + }; + when(instanceMock.getLocation(anyString())).then(pathAnswer); + when(instanceMock.createLocation(anyString())).then(pathAnswer); handler = createRepositoryHandler(storeFactory, locationResolver, baseDirectory); } diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java index 89394060f5..f96413d195 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java @@ -24,7 +24,7 @@ class CopyMigrationStrategy extends BaseMigrationStrategy { @Override public Path migrate(String id, String name, String type) { - Path repositoryBasePath = locationResolver.forClass(Path.class).getLocation(id); + Path repositoryBasePath = locationResolver.forClass(Path.class).createLocation(id); Path targetDataPath = repositoryBasePath .resolve(RepositoryDirectoryHandler.REPOSITORIES_NATIVE_DIRECTORY); Path sourceDataPath = getSourceDataPath(name, type); diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java index c571b8ad4c..deb8a8782b 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java @@ -28,7 +28,7 @@ class MoveMigrationStrategy extends BaseMigrationStrategy { @Override public Path migrate(String id, String name, String type) { - Path repositoryBasePath = locationResolver.forClass(Path.class).getLocation(id); + Path repositoryBasePath = locationResolver.forClass(Path.class).createLocation(id); Path targetDataPath = repositoryBasePath .resolve(RepositoryDirectoryHandler.REPOSITORIES_NATIVE_DIRECTORY); Path sourceDataPath = getSourceDataPath(name, type); diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java index b40283ae79..d718554dfe 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java @@ -43,7 +43,7 @@ class CopyMigrationStrategyTest { void mockLocationResolver(@TempDirectory.TempDir Path tempDir) { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.forClass(Path.class)).thenReturn(instanceMock); - when(instanceMock.getLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); + when(instanceMock.createLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java index b55315d85f..e248f82217 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java @@ -40,7 +40,7 @@ class MoveMigrationStrategyTest { void mockLocationResolver(@TempDirectory.TempDir Path tempDir) { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.forClass(Path.class)).thenReturn(instanceMock); - when(instanceMock.getLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); + when(instanceMock.createLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); } @Test