diff --git a/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java index 3fcea05d23..3cf7f7eddc 100644 --- a/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java +++ b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java @@ -185,7 +185,7 @@ public class ScmConfiguration implements Configuration { private boolean enabledXsrfProtection = true; @XmlElement(name = "default-namespace-strategy") - private String defaultNamespaceStrategy = "sonia.scm.repository.UsernameNamespaceStrategy"; + private String defaultNamespaceStrategy = "UsernameNamespaceStrategy"; /** diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategyResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategyResource.java index 145bc7100e..8368504546 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategyResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategyResource.java @@ -59,7 +59,7 @@ public class NamespaceStrategyResource { } private String strategyAsString(NamespaceStrategy namespaceStrategy) { - return namespaceStrategy.getClass().getName(); + return namespaceStrategy.getClass().getSimpleName(); } private List collectStrategyNames() { diff --git a/scm-core/src/main/java/sonia/scm/repository/NamespaceStrategyProvider.java b/scm-webapp/src/main/java/sonia/scm/repository/NamespaceStrategyProvider.java similarity index 67% rename from scm-core/src/main/java/sonia/scm/repository/NamespaceStrategyProvider.java rename to scm-webapp/src/main/java/sonia/scm/repository/NamespaceStrategyProvider.java index 49aefe71ac..95ae25e6d1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/NamespaceStrategyProvider.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/NamespaceStrategyProvider.java @@ -1,5 +1,7 @@ package sonia.scm.repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import sonia.scm.config.ScmConfiguration; import javax.inject.Inject; @@ -8,6 +10,8 @@ import java.util.Set; public class NamespaceStrategyProvider implements Provider { + private static final Logger LOG = LoggerFactory.getLogger(NamespaceStrategyProvider.class); + private final Set strategies; private final ScmConfiguration scmConfiguration; @@ -22,11 +26,13 @@ public class NamespaceStrategyProvider implements Provider { String namespaceStrategy = scmConfiguration.getDefaultNamespaceStrategy(); for (NamespaceStrategy s : this.strategies) { - if (s.getClass().getCanonicalName().equals(namespaceStrategy)) { + if (s.getClass().getSimpleName().equals(namespaceStrategy)) { return s; } } - return null; + + LOG.warn("could not find namespace strategy {}, using default strategy", namespaceStrategy); + return new UsernameNamespaceStrategy(); } } diff --git a/scm-webapp/src/main/resources/locales/de/plugins.json b/scm-webapp/src/main/resources/locales/de/plugins.json index 0822be9cdd..adff12414a 100644 --- a/scm-webapp/src/main/resources/locales/de/plugins.json +++ b/scm-webapp/src/main/resources/locales/de/plugins.json @@ -143,5 +143,11 @@ "displayName": "Ungültige Eingabe", "description": "Die eingegebenen Daten konnten nicht validiert werden. Bitte korrigieren Sie die Eingaben und senden Sie sie erneut." } + }, + "namespaceStrategies": { + "sonia.scm.repository.UsernameNamespaceStrategy": "Benutzername", + "sonia.scm.repository.CustomNamespaceStrategy": "Benutzerdefiniert", + "sonia.scm.repository.CurrentYearNamespaceStrategy": "Aktuelles Jahr", + "sonia.scm.repository.RepositoryTypeNamespaceStrategy": "Repository Typ" } } diff --git a/scm-webapp/src/main/resources/locales/en/plugins.json b/scm-webapp/src/main/resources/locales/en/plugins.json index cc9902565b..ac7309a655 100644 --- a/scm-webapp/src/main/resources/locales/en/plugins.json +++ b/scm-webapp/src/main/resources/locales/en/plugins.json @@ -143,5 +143,11 @@ "displayName": "Illegal input", "description": "The values could not be validated. Please correct your input and try again." } + }, + "namespaceStrategies": { + "UsernameNamespaceStrategy": "Username", + "CustomNamespaceStrategy": "Custom", + "CurrentYearNamespaceStrategy": "Current year", + "RepositoryTypeNamespaceStrategy": "Repository type" } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/NamespaceStrategyResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/NamespaceStrategyResourceTest.java index a122fd1908..7ab98bb904 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/NamespaceStrategyResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/NamespaceStrategyResourceTest.java @@ -34,11 +34,11 @@ class NamespaceStrategyResourceTest { NamespaceStrategyResource resource = new NamespaceStrategyResource(namespaceStrategies, current); NamespaceStrategiesDto dto = resource.get(uriInfo); - assertThat(dto.getCurrent()).isEqualTo(MegaNamespaceStrategy.class.getName()); + assertThat(dto.getCurrent()).isEqualTo(MegaNamespaceStrategy.class.getSimpleName()); assertThat(dto.getAvailable()).contains( - AwesomeNamespaceStrategy.class.getName(), - SuperNamespaceStrategy.class.getName(), - MegaNamespaceStrategy.class.getName() + AwesomeNamespaceStrategy.class.getSimpleName(), + SuperNamespaceStrategy.class.getSimpleName(), + MegaNamespaceStrategy.class.getSimpleName() ); assertThat(dto.getLinks().getLinkBy("self").get().getHref()).isEqualTo("/namespace-strategies"); } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/NamespaceStrategyProviderTest.java b/scm-webapp/src/test/java/sonia/scm/repository/NamespaceStrategyProviderTest.java new file mode 100644 index 0000000000..607775994e --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/repository/NamespaceStrategyProviderTest.java @@ -0,0 +1,69 @@ +package sonia.scm.repository; + +import org.junit.jupiter.api.Test; +import sonia.scm.config.ScmConfiguration; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +class NamespaceStrategyProviderTest { + + @Test + void shouldReturnConfiguredStrategy() { + Set strategies = allStrategiesAsSet(); + + ScmConfiguration configuration = new ScmConfiguration(); + configuration.setDefaultNamespaceStrategy("Arthur"); + + NamespaceStrategyProvider provider = new NamespaceStrategyProvider(strategies, configuration); + NamespaceStrategy strategy = provider.get(); + + assertThat(strategy).isInstanceOf(Arthur.class); + } + + @Test + void shouldReturnUsernameStrategyForUnknown() { + Set strategies = Collections.emptySet(); + + ScmConfiguration configuration = new ScmConfiguration(); + configuration.setDefaultNamespaceStrategy("Arthur"); + + NamespaceStrategyProvider provider = new NamespaceStrategyProvider(strategies, configuration); + NamespaceStrategy strategy = provider.get(); + + assertThat(strategy).isInstanceOf(UsernameNamespaceStrategy.class); + } + + private LinkedHashSet allStrategiesAsSet() { + return new LinkedHashSet<>(Arrays.asList(new Trillian(), new Zaphod(), new Arthur())); + } + + private static class Trillian implements NamespaceStrategy{ + + @Override + public String createNamespace(Repository repository) { + return "trillian"; + } + } + + private static class Zaphod implements NamespaceStrategy { + + @Override + public String createNamespace(Repository repository) { + return "zaphod"; + } + } + + private static class Arthur implements NamespaceStrategy { + + @Override + public String createNamespace(Repository repository) { + return "arthur"; + } + } + +}