mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-15 17:56:17 +01:00
adds rest endpoint for namespace strategies
This commit is contained in:
@@ -46,6 +46,8 @@ public class VndMediaType {
|
|||||||
public static final String MERGE_RESULT = PREFIX + "mergeResult" + SUFFIX;
|
public static final String MERGE_RESULT = PREFIX + "mergeResult" + SUFFIX;
|
||||||
public static final String MERGE_COMMAND = PREFIX + "mergeCommand" + 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 ME = PREFIX + "me" + SUFFIX;
|
||||||
public static final String SOURCE = PREFIX + "source" + SUFFIX;
|
public static final String SOURCE = PREFIX + "source" + SUFFIX;
|
||||||
public static final String ERROR_TYPE = PREFIX + "error" + SUFFIX;
|
public static final String ERROR_TYPE = PREFIX + "error" + SUFFIX;
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ public class IndexDtoGenerator extends HalAppenderMapper {
|
|||||||
builder.single(link("permissions", resourceLinks.permissions().self()));
|
builder.single(link("permissions", resourceLinks.permissions().self()));
|
||||||
}
|
}
|
||||||
builder.single(link("availableRepositoryPermissions", resourceLinks.availableRepositoryPermissions().self()));
|
builder.single(link("availableRepositoryPermissions", resourceLinks.availableRepositoryPermissions().self()));
|
||||||
|
|
||||||
|
builder.single(link("repositoryTypes", resourceLinks.repositoryTypeCollection().self()));
|
||||||
|
builder.single(link("namespaceStrategies", resourceLinks.namespaceStrategies().self()));
|
||||||
} else {
|
} else {
|
||||||
builder.single(link("login", resourceLinks.authentication().jsonLogin()));
|
builder.single(link("login", resourceLinks.authentication().jsonLogin()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<String> available;
|
||||||
|
|
||||||
|
public NamespaceStrategiesDto(Links links) {
|
||||||
|
super(links);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<NamespaceStrategy> namespaceStrategies;
|
||||||
|
private Provider<NamespaceStrategy> namespaceStrategyProvider;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public NamespaceStrategyResource(Set<NamespaceStrategy> namespaceStrategies, Provider<NamespaceStrategy> 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<String> 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<String> collectStrategyNames() {
|
||||||
|
return namespaceStrategies.stream().map(this::strategyAsString).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() {
|
public RepositoryTypeLinks repositoryType() {
|
||||||
return new RepositoryTypeLinks(scmPathInfoStore.get());
|
return new RepositoryTypeLinks(scmPathInfoStore.get());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<NamespaceStrategy> namespaceStrategies = allStrategies();
|
||||||
|
Provider<NamespaceStrategy> 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<NamespaceStrategy> allStrategies() {
|
||||||
|
return strategies(new AwesomeNamespaceStrategy(), new SuperNamespaceStrategy(), new MegaNamespaceStrategy());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<NamespaceStrategy> 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";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,6 +43,8 @@ public class ResourceLinksMock {
|
|||||||
when(resourceLinks.merge()).thenReturn(new ResourceLinks.MergeLinks(uriInfo));
|
when(resourceLinks.merge()).thenReturn(new ResourceLinks.MergeLinks(uriInfo));
|
||||||
when(resourceLinks.permissions()).thenReturn(new ResourceLinks.PermissionsLinks(uriInfo));
|
when(resourceLinks.permissions()).thenReturn(new ResourceLinks.PermissionsLinks(uriInfo));
|
||||||
when(resourceLinks.availableRepositoryPermissions()).thenReturn(new ResourceLinks.AvailableRepositoryPermissionLinks(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;
|
return resourceLinks;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user