From 3660ac9fd2e3ff637be007d0ae3f7491c10a302f Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 11 Mar 2019 13:26:04 +0100 Subject: [PATCH] adds rest endpoint for namespace strategies --- .../main/java/sonia/scm/web/VndMediaType.java | 2 + .../api/v2/resources/IndexDtoGenerator.java | 3 + .../v2/resources/NamespaceStrategiesDto.java | 20 +++++ .../resources/NamespaceStrategyResource.java | 68 +++++++++++++++++ .../scm/api/v2/resources/ResourceLinks.java | 17 +++++ .../NamespaceStrategyResourceTest.java | 74 +++++++++++++++++++ .../api/v2/resources/ResourceLinksMock.java | 2 + 7 files changed, 186 insertions(+) create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategiesDto.java create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategyResource.java create mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/NamespaceStrategyResourceTest.java diff --git a/scm-core/src/main/java/sonia/scm/web/VndMediaType.java b/scm-core/src/main/java/sonia/scm/web/VndMediaType.java index 19859b876b..d0a64b17ec 100644 --- a/scm-core/src/main/java/sonia/scm/web/VndMediaType.java +++ b/scm-core/src/main/java/sonia/scm/web/VndMediaType.java @@ -46,6 +46,8 @@ public class VndMediaType { public static final String MERGE_RESULT = PREFIX + "mergeResult" + SUFFIX; public static final String MERGE_COMMAND = PREFIX + "mergeCommand" + SUFFIX; + public static final String NAMESPACE_STRATEGIES = PREFIX + "namespaceStrategies" + SUFFIX; + public static final String ME = PREFIX + "me" + SUFFIX; public static final String SOURCE = PREFIX + "source" + SUFFIX; public static final String ERROR_TYPE = PREFIX + "error" + SUFFIX; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java index 90445bcdc2..a3e7568957 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java @@ -59,6 +59,9 @@ public class IndexDtoGenerator extends HalAppenderMapper { builder.single(link("permissions", resourceLinks.permissions().self())); } builder.single(link("availableRepositoryPermissions", resourceLinks.availableRepositoryPermissions().self())); + + builder.single(link("repositoryTypes", resourceLinks.repositoryTypeCollection().self())); + builder.single(link("namespaceStrategies", resourceLinks.namespaceStrategies().self())); } else { builder.single(link("login", resourceLinks.authentication().jsonLogin())); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategiesDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategiesDto.java new file mode 100644 index 0000000000..47d2a59837 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategiesDto.java @@ -0,0 +1,20 @@ +package sonia.scm.api.v2.resources; + +import de.otto.edison.hal.HalRepresentation; +import de.otto.edison.hal.Links; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class NamespaceStrategiesDto extends HalRepresentation { + + private String current; + private List available; + + public NamespaceStrategiesDto(Links links) { + super(links); + } +} 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 new file mode 100644 index 0000000000..145bc7100e --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NamespaceStrategyResource.java @@ -0,0 +1,68 @@ +package sonia.scm.api.v2.resources; + +import de.otto.edison.hal.Links; +import sonia.scm.repository.NamespaceStrategy; +import sonia.scm.web.VndMediaType; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.UriInfo; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * RESTFul WebService Endpoint for namespace strategies. + */ +@Path(NamespaceStrategyResource.PATH) +public class NamespaceStrategyResource { + + static final String PATH = "v2/namespaceStrategies"; + + private Set namespaceStrategies; + private Provider namespaceStrategyProvider; + + @Inject + public NamespaceStrategyResource(Set namespaceStrategies, Provider namespaceStrategyProvider) { + this.namespaceStrategies = namespaceStrategies; + this.namespaceStrategyProvider = namespaceStrategyProvider; + } + + /** + * Returns all available namespace strategies and the current selected. + * + * @param uriInfo uri info + * + * @return available and current namespace strategies + */ + @GET + @Path("") + @Produces(VndMediaType.NAMESPACE_STRATEGIES) + public NamespaceStrategiesDto get(@Context UriInfo uriInfo) { + NamespaceStrategiesDto dto = new NamespaceStrategiesDto(createLinks(uriInfo)); + + String currentStrategy = strategyAsString(namespaceStrategyProvider.get()); + dto.setCurrent(currentStrategy); + + List availableStrategies = collectStrategyNames(); + dto.setAvailable(availableStrategies); + + return dto; + } + + private Links createLinks(@Context UriInfo uriInfo) { + return Links.linkingTo().self(uriInfo.getAbsolutePath().toASCIIString()).build(); + } + + private String strategyAsString(NamespaceStrategy namespaceStrategy) { + return namespaceStrategy.getClass().getName(); + } + + private List collectStrategyNames() { + return namespaceStrategies.stream().map(this::strategyAsString).collect(Collectors.toList()); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 644b3adc3f..1fc6b2a442 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -277,6 +277,23 @@ class ResourceLinks { } } + public NamespaceStrategiesLinks namespaceStrategies() { + return new NamespaceStrategiesLinks(scmPathInfoStore.get()); + } + + static class NamespaceStrategiesLinks { + + private final LinkBuilder namespaceStrategiesLinkBuilder; + + NamespaceStrategiesLinks(ScmPathInfo pathInfo) { + namespaceStrategiesLinkBuilder = new LinkBuilder(pathInfo, NamespaceStrategyResource.class); + } + + String self() { + return namespaceStrategiesLinkBuilder.method("get").parameters().href(); + } + } + public RepositoryTypeLinks repositoryType() { return new RepositoryTypeLinks(scmPathInfoStore.get()); } 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 new file mode 100644 index 0000000000..a122fd1908 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/NamespaceStrategyResourceTest.java @@ -0,0 +1,74 @@ +package sonia.scm.api.v2.resources; + +import com.google.common.collect.Lists; +import com.google.inject.util.Providers; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.repository.NamespaceStrategy; +import sonia.scm.repository.Repository; + +import javax.inject.Provider; +import javax.ws.rs.core.UriInfo; +import java.net.URI; +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class NamespaceStrategyResourceTest { + + @Mock + private UriInfo uriInfo; + + @Test + void shouldReturnNamespaceStrategies() { + when(uriInfo.getAbsolutePath()).thenReturn(URI.create("/namespace-strategies")); + + Set namespaceStrategies = allStrategies(); + Provider current = Providers.of(new MegaNamespaceStrategy()); + + NamespaceStrategyResource resource = new NamespaceStrategyResource(namespaceStrategies, current); + + NamespaceStrategiesDto dto = resource.get(uriInfo); + assertThat(dto.getCurrent()).isEqualTo(MegaNamespaceStrategy.class.getName()); + assertThat(dto.getAvailable()).contains( + AwesomeNamespaceStrategy.class.getName(), + SuperNamespaceStrategy.class.getName(), + MegaNamespaceStrategy.class.getName() + ); + assertThat(dto.getLinks().getLinkBy("self").get().getHref()).isEqualTo("/namespace-strategies"); + } + + private Set allStrategies() { + return strategies(new AwesomeNamespaceStrategy(), new SuperNamespaceStrategy(), new MegaNamespaceStrategy()); + } + + private Set strategies(NamespaceStrategy... strategies) { + return new LinkedHashSet<>(Lists.newArrayList(strategies)); + } + + private static class AwesomeNamespaceStrategy implements NamespaceStrategy { + @Override + public String createNamespace(Repository repository) { + return "awesome"; + } + } + + private static class SuperNamespaceStrategy implements NamespaceStrategy { + @Override + public String createNamespace(Repository repository) { + return "super"; + } + } + + private static class MegaNamespaceStrategy implements NamespaceStrategy { + @Override + public String createNamespace(Repository repository) { + return "mega"; + } + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java index 8714496e1a..073e41a65e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java @@ -43,6 +43,8 @@ public class ResourceLinksMock { when(resourceLinks.merge()).thenReturn(new ResourceLinks.MergeLinks(uriInfo)); when(resourceLinks.permissions()).thenReturn(new ResourceLinks.PermissionsLinks(uriInfo)); when(resourceLinks.availableRepositoryPermissions()).thenReturn(new ResourceLinks.AvailableRepositoryPermissionLinks(uriInfo)); + when(resourceLinks.repositoryTypeCollection()).thenReturn(new ResourceLinks.RepositoryTypeCollectionLinks(uriInfo)); + when(resourceLinks.namespaceStrategies()).thenReturn(new ResourceLinks.NamespaceStrategiesLinks(uriInfo)); return resourceLinks; }