adds rest endpoint for namespace strategies

This commit is contained in:
Sebastian Sdorra
2019-03-11 13:26:04 +01:00
parent e179b00ecd
commit 3660ac9fd2
7 changed files with 186 additions and 0 deletions

View File

@@ -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()));
}

View File

@@ -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);
}
}

View File

@@ -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());
}
}

View File

@@ -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());
}