From ea17e536f10fc6918153598cb117499b4b585c9a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 1 Aug 2018 09:43:49 +0200 Subject: [PATCH] change NamespaceStrategy signature to createNamespace(Repository) This change allows us to implement NamespaceStrategies, such as by type (git, hg, svn) or manual defined. The DefaultNamespaceStrategy accepts now a predefined namespace and only if no namespace was set the username of the currently logged in user is used. --- .../sonia/scm/repository/NamespaceStrategy.java | 13 ++++++++++++- .../scm/repository/DefaultNamespaceStrategy.java | 13 ++++++++++--- .../scm/repository/DefaultRepositoryManager.java | 2 +- .../repository/DefaultNamespaceStrategyTest.java | 12 ++++++++++-- .../repository/DefaultRepositoryManagerTest.java | 7 +++---- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/NamespaceStrategy.java b/scm-core/src/main/java/sonia/scm/repository/NamespaceStrategy.java index f972956adf..d3529294ed 100644 --- a/scm-core/src/main/java/sonia/scm/repository/NamespaceStrategy.java +++ b/scm-core/src/main/java/sonia/scm/repository/NamespaceStrategy.java @@ -2,7 +2,18 @@ package sonia.scm.repository; import sonia.scm.plugin.ExtensionPoint; +/** + * Strategy to create a namespace for the new repository. Namespaces are used to order and identify repositories. + */ @ExtensionPoint public interface NamespaceStrategy { - String getNamespace(); + + /** + * Create new namespace for the given repository. + * + * @param repository repository + * + * @return namespace + */ + String createNamespace(Repository repository); } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceStrategy.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceStrategy.java index 9cf2c8ab20..35a5abea24 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultNamespaceStrategy.java @@ -1,17 +1,24 @@ package sonia.scm.repository; +import com.google.common.base.Strings; import org.apache.shiro.SecurityUtils; import sonia.scm.plugin.Extension; /** - * The DefaultNamespaceStrategy returns the username of the currently logged in user as namespace. + * The DefaultNamespaceStrategy returns the predefined namespace of the given repository, if the namespace was not set + * the username of the currently loggedin user is used. + * * @since 2.0.0 */ @Extension public class DefaultNamespaceStrategy implements NamespaceStrategy { @Override - public String getNamespace() { - return SecurityUtils.getSubject().getPrincipal().toString(); + public String createNamespace(Repository repository) { + String namespace = repository.getNamespace(); + if (Strings.isNullOrEmpty(namespace)) { + namespace = SecurityUtils.getSubject().getPrincipal().toString(); + } + return namespace; } } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index ad6de93b0a..162f825b6a 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -141,7 +141,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { public Repository create(Repository repository, boolean initRepository) throws RepositoryException { repository.setId(keyGenerator.createKey()); - repository.setNamespace(namespaceStrategy.getNamespace()); + repository.setNamespace(namespaceStrategy.createNamespace(repository)); logger.info("create repository {} of type {} in namespace {}", repository.getName(), repository.getType(), repository.getNamespace()); diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceStrategyTest.java index dc40d1c1cb..257ae5cff1 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultNamespaceStrategyTest.java @@ -17,8 +17,16 @@ public class DefaultNamespaceStrategyTest { @Test @SubjectAware(username = "trillian", password = "secret") - public void testNamespaceStrategy() { - assertEquals("trillian", namespaceStrategy.getNamespace()); + public void testNamespaceStrategyWithoutPreset() { + assertEquals("trillian", namespaceStrategy.createNamespace(new Repository())); + } + + @Test + @SubjectAware(username = "trillian", password = "secret") + public void testNamespaceStrategyWithPreset() { + Repository repository = new Repository(); + repository.setNamespace("awesome"); + assertEquals("awesome", namespaceStrategy.createNamespace(repository)); } } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java index 02b25c0735..1f361d4766 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -40,6 +40,7 @@ import org.apache.shiro.authz.UnauthorizedException; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import sonia.scm.HandlerEventType; import sonia.scm.Manager; @@ -65,9 +66,7 @@ import java.util.HashSet; import java.util.Set; import java.util.Stack; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasProperty; -import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -501,7 +500,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase mockedNamespace); + when(namespaceStrategy.createNamespace(Mockito.any(Repository.class))).thenAnswer(invocation -> mockedNamespace); return new DefaultRepositoryManager(configuration, contextProvider, keyGenerator, repositoryDAO, handlerSet, createRepositoryMatcher(), namespaceStrategy);