mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-01-22 07:22:15 +01:00
Merged in feature/abstract_repository_enricher (pull request #134)
Add abstract base class to enrich repository json responses
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
package sonia.scm.web;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import static java.util.Collections.singletonMap;
|
||||
import static sonia.scm.web.VndMediaType.REPOSITORY;
|
||||
import static sonia.scm.web.VndMediaType.REPOSITORY_COLLECTION;
|
||||
|
||||
public abstract class AbstractRepositoryJsonEnricher extends JsonEnricherBase {
|
||||
|
||||
public AbstractRepositoryJsonEnricher(ObjectMapper objectMapper) {
|
||||
super(objectMapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enrich(JsonEnricherContext context) {
|
||||
if (resultHasMediaType(REPOSITORY, context)) {
|
||||
JsonNode repositoryNode = context.getResponseEntity();
|
||||
enrichRepositoryNode(repositoryNode);
|
||||
} else if (resultHasMediaType(REPOSITORY_COLLECTION, context)) {
|
||||
JsonNode repositoryCollectionNode = context.getResponseEntity().get("_embedded").withArray("repositories");
|
||||
repositoryCollectionNode.elements().forEachRemaining(this::enrichRepositoryNode);
|
||||
}
|
||||
}
|
||||
|
||||
private void enrichRepositoryNode(JsonNode repositoryNode) {
|
||||
String namespace = repositoryNode.get("namespace").asText();
|
||||
String name = repositoryNode.get("name").asText();
|
||||
|
||||
enrichRepositoryNode(repositoryNode, namespace, name);
|
||||
}
|
||||
|
||||
protected abstract void enrichRepositoryNode(JsonNode repositoryNode, String namespace, String name);
|
||||
|
||||
protected void addLink(JsonNode repositoryNode, String linkName, String link) {
|
||||
JsonNode hrefNode = createObject(singletonMap("href", value(link)));
|
||||
addPropertyNode(repositoryNode.get("_links"), linkName, hrefNode);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package sonia.scm.web;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.google.common.io.Resources;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import sonia.scm.api.v2.resources.ScmPathInfoStore;
|
||||
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class AbstractRepositoryJsonEnricherTest {
|
||||
|
||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||
private AbstractRepositoryJsonEnricher linkEnricher;
|
||||
private JsonNode rootNode;
|
||||
|
||||
@BeforeEach
|
||||
void globalSetUp() {
|
||||
ScmPathInfoStore pathInfoStore = new ScmPathInfoStore();
|
||||
pathInfoStore.set(() -> URI.create("/"));
|
||||
|
||||
linkEnricher = new AbstractRepositoryJsonEnricher(objectMapper) {
|
||||
@Override
|
||||
protected void enrichRepositoryNode(JsonNode repositoryNode, String namespace, String name) {
|
||||
addLink(repositoryNode, "new-link", "/somewhere");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldEnrichRepositories() throws IOException {
|
||||
URL resource = Resources.getResource("sonia/scm/repository/repository-001.json");
|
||||
rootNode = objectMapper.readTree(resource);
|
||||
|
||||
JsonEnricherContext context = new JsonEnricherContext(
|
||||
URI.create("/"),
|
||||
MediaType.valueOf(VndMediaType.REPOSITORY),
|
||||
rootNode
|
||||
);
|
||||
|
||||
linkEnricher.enrich(context);
|
||||
|
||||
String configLink = context.getResponseEntity()
|
||||
.get("_links")
|
||||
.get("new-link")
|
||||
.get("href")
|
||||
.asText();
|
||||
|
||||
assertThat(configLink).isEqualTo("/somewhere");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldEnrichAllRepositories() throws IOException {
|
||||
URL resource = Resources.getResource("sonia/scm/repository/repository-collection-001.json");
|
||||
rootNode = objectMapper.readTree(resource);
|
||||
|
||||
JsonEnricherContext context = new JsonEnricherContext(
|
||||
URI.create("/"),
|
||||
MediaType.valueOf(VndMediaType.REPOSITORY_COLLECTION),
|
||||
rootNode
|
||||
);
|
||||
|
||||
linkEnricher.enrich(context);
|
||||
|
||||
context.getResponseEntity()
|
||||
.get("_embedded")
|
||||
.withArray("repositories")
|
||||
.elements()
|
||||
.forEachRemaining(node -> {
|
||||
String configLink = node
|
||||
.get("_links")
|
||||
.get("new-link")
|
||||
.get("href")
|
||||
.asText();
|
||||
|
||||
assertThat(configLink).isEqualTo("/somewhere");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldNotModifyObjectsWithUnsupportedMediaType() throws IOException {
|
||||
URL resource = Resources.getResource("sonia/scm/repository/repository-001.json");
|
||||
rootNode = objectMapper.readTree(resource);
|
||||
JsonEnricherContext context = new JsonEnricherContext(
|
||||
URI.create("/"),
|
||||
MediaType.valueOf(VndMediaType.USER),
|
||||
rootNode
|
||||
);
|
||||
|
||||
linkEnricher.enrich(context);
|
||||
|
||||
boolean hasNewPullRequestLink = context.getResponseEntity()
|
||||
.get("_links")
|
||||
.has("new-link");
|
||||
|
||||
assertThat(hasNewPullRequestLink).isFalse();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"creationDate": "2018-11-09T09:48:32.732Z",
|
||||
"description": "Handling static webresources made easy",
|
||||
"healthCheckFailures": [],
|
||||
"lastModified": "2018-11-09T09:49:20.973Z",
|
||||
"namespace": "scmadmin",
|
||||
"name": "web-resources",
|
||||
"archived": false,
|
||||
"type": "git",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"delete": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"update": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"permissions": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/permissions/"
|
||||
},
|
||||
"protocol": [
|
||||
{
|
||||
"href": "http://localhost:8081/scm/repo/scmadmin/web-resources",
|
||||
"name": "http"
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/tags/"
|
||||
},
|
||||
"branches": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/branches/"
|
||||
},
|
||||
"changesets": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/changesets/"
|
||||
},
|
||||
"sources": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/sources/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"page": 0,
|
||||
"pageTotal": 1,
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/?page=0&pageSize=10"
|
||||
},
|
||||
"first": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/?page=0&pageSize=10"
|
||||
},
|
||||
"last": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/?page=0&pageSize=10"
|
||||
},
|
||||
"create": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/"
|
||||
}
|
||||
},
|
||||
"_embedded": {
|
||||
"repositories": [
|
||||
{
|
||||
"creationDate": "2018-11-09T09:48:32.732Z",
|
||||
"description": "Handling static webresources made easy",
|
||||
"healthCheckFailures": [],
|
||||
"lastModified": "2018-11-09T09:49:20.973Z",
|
||||
"namespace": "scmadmin",
|
||||
"name": "web-resources",
|
||||
"archived": false,
|
||||
"type": "git",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"delete": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"update": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"permissions": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/permissions/"
|
||||
},
|
||||
"protocol": [
|
||||
{
|
||||
"href": "http://localhost:8081/scm/repo/scmadmin/web-resources",
|
||||
"name": "http"
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/tags/"
|
||||
},
|
||||
"branches": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/branches/"
|
||||
},
|
||||
"changesets": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/changesets/"
|
||||
},
|
||||
"sources": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/sources/"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"creationDate": "2018-11-09T09:48:32.732Z",
|
||||
"description": "Handling static webresources made easy",
|
||||
"healthCheckFailures": [],
|
||||
"lastModified": "2018-11-09T09:49:20.973Z",
|
||||
"namespace": "scmadmin",
|
||||
"name": "web-resources",
|
||||
"archived": false,
|
||||
"type": "git",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"delete": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"update": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources"
|
||||
},
|
||||
"permissions": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/permissions/"
|
||||
},
|
||||
"protocol": [
|
||||
{
|
||||
"href": "http://localhost:8081/scm/repo/scmadmin/web-resources",
|
||||
"name": "http"
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/tags/"
|
||||
},
|
||||
"branches": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/branches/"
|
||||
},
|
||||
"changesets": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/changesets/"
|
||||
},
|
||||
"sources": {
|
||||
"href": "http://localhost:8081/scm/api/v2/repositories/scmadmin/web-resources/sources/"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user