diff --git a/scm-core/src/main/java/sonia/scm/web/JsonEnricherBase.java b/scm-core/src/main/java/sonia/scm/web/JsonEnricherBase.java new file mode 100644 index 0000000000..b56e67bb10 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/web/JsonEnricherBase.java @@ -0,0 +1,40 @@ +package sonia.scm.web; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import java.util.Map; + +public abstract class JsonEnricherBase implements JsonEnricher { + + private final ObjectMapper objectMapper; + + protected JsonEnricherBase(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + protected boolean resultHasMediaType(String mediaType, JsonEnricherContext context) { + return mediaType.equals(context.getResponseMediaType().toString()); + } + + protected JsonNode value(Object gitConfigUrl) { + return objectMapper.convertValue(gitConfigUrl, JsonNode.class); + } + + protected ObjectNode createObject() { + return objectMapper.createObjectNode(); + } + + protected ObjectNode createObject(Map values) { + ObjectNode object = createObject(); + + values.forEach((key, value) -> object.set(key, value(value))); + + return object; + } + + protected void addPropertyNode(JsonNode parent, String newKey, JsonNode child) { + ((ObjectNode) parent).put(newKey, child); + } +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigInIndexResource.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigInIndexResource.java index 59cd79c13b..a1120adda4 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigInIndexResource.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigInIndexResource.java @@ -2,44 +2,39 @@ package sonia.scm.api.v2.resources; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import sonia.scm.config.ConfigurationPermissions; import sonia.scm.plugin.Extension; -import sonia.scm.web.JsonEnricher; +import sonia.scm.web.JsonEnricherBase; import sonia.scm.web.JsonEnricherContext; -import sonia.scm.web.VndMediaType; import javax.inject.Inject; import javax.inject.Provider; +import static java.util.Collections.singletonMap; +import static sonia.scm.web.VndMediaType.INDEX; + @Extension -public class GitConfigInIndexResource implements JsonEnricher { +public class GitConfigInIndexResource extends JsonEnricherBase { private final Provider scmPathInfoStore; - private final ObjectMapper objectMapper; @Inject public GitConfigInIndexResource(Provider scmPathInfoStore, ObjectMapper objectMapper) { + super(objectMapper); this.scmPathInfoStore = scmPathInfoStore; - this.objectMapper = objectMapper; } @Override public void enrich(JsonEnricherContext context) { - if (isIndexRequest(context) && ConfigurationPermissions.list().isPermitted()) { + if (resultHasMediaType(INDEX, context) && ConfigurationPermissions.list().isPermitted()) { String gitConfigUrl = new LinkBuilder(scmPathInfoStore.get().get(), GitConfigResource.class) .method("get") .parameters() .href(); - ObjectNode gitConfigRefNode = objectMapper.createObjectNode(); - gitConfigRefNode.set("href", objectMapper.convertValue(gitConfigUrl, JsonNode.class)); + JsonNode gitConfigRefNode = createObject(singletonMap("href", value(gitConfigUrl))); - ((ObjectNode) context.getResponseEntity().get("_links")).put("gitConfig", gitConfigRefNode); + addPropertyNode(context.getResponseEntity().get("_links"), "gitConfig", gitConfigRefNode); } } - - private boolean isIndexRequest(JsonEnricherContext context) { - return VndMediaType.INDEX.equals(context.getResponseMediaType().toString()); - } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/v2/resources/HgConfigInIndexResource.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/v2/resources/HgConfigInIndexResource.java index 131caad0c0..0507987a26 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/v2/resources/HgConfigInIndexResource.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/v2/resources/HgConfigInIndexResource.java @@ -2,44 +2,39 @@ package sonia.scm.api.v2.resources; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import sonia.scm.config.ConfigurationPermissions; import sonia.scm.plugin.Extension; -import sonia.scm.web.JsonEnricher; +import sonia.scm.web.JsonEnricherBase; import sonia.scm.web.JsonEnricherContext; -import sonia.scm.web.VndMediaType; import javax.inject.Inject; import javax.inject.Provider; +import static java.util.Collections.singletonMap; +import static sonia.scm.web.VndMediaType.INDEX; + @Extension -public class HgConfigInIndexResource implements JsonEnricher { +public class HgConfigInIndexResource extends JsonEnricherBase { private final Provider scmPathInfoStore; - private final ObjectMapper objectMapper; @Inject public HgConfigInIndexResource(Provider scmPathInfoStore, ObjectMapper objectMapper) { + super(objectMapper); this.scmPathInfoStore = scmPathInfoStore; - this.objectMapper = objectMapper; } @Override public void enrich(JsonEnricherContext context) { - if (isIndexRequest(context) && ConfigurationPermissions.list().isPermitted()) { + if (resultHasMediaType(INDEX, context) && ConfigurationPermissions.list().isPermitted()) { String gitConfigUrl = new LinkBuilder(scmPathInfoStore.get().get(), HgConfigResource.class) .method("get") .parameters() .href(); - ObjectNode gitConfigRefNode = objectMapper.createObjectNode(); - gitConfigRefNode.set("href", objectMapper.convertValue(gitConfigUrl, JsonNode.class)); + JsonNode hgConfigRefNode = createObject(singletonMap("href", value(gitConfigUrl))); - ((ObjectNode) context.getResponseEntity().get("_links")).put("hgConfig", gitConfigRefNode); + addPropertyNode(context.getResponseEntity().get("_links"), "hgConfig", hgConfigRefNode); } } - - private boolean isIndexRequest(JsonEnricherContext context) { - return VndMediaType.INDEX.equals(context.getResponseMediaType().toString()); - } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigInIndexResource.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigInIndexResource.java index 68c169834d..5f9e4837b1 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigInIndexResource.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigInIndexResource.java @@ -2,44 +2,39 @@ package sonia.scm.api.v2.resources; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import sonia.scm.config.ConfigurationPermissions; import sonia.scm.plugin.Extension; -import sonia.scm.web.JsonEnricher; +import sonia.scm.web.JsonEnricherBase; import sonia.scm.web.JsonEnricherContext; -import sonia.scm.web.VndMediaType; import javax.inject.Inject; import javax.inject.Provider; +import static java.util.Collections.singletonMap; +import static sonia.scm.web.VndMediaType.INDEX; + @Extension -public class SvnConfigInIndexResource implements JsonEnricher { +public class SvnConfigInIndexResource extends JsonEnricherBase { private final Provider scmPathInfoStore; - private final ObjectMapper objectMapper; @Inject public SvnConfigInIndexResource(Provider scmPathInfoStore, ObjectMapper objectMapper) { + super(objectMapper); this.scmPathInfoStore = scmPathInfoStore; - this.objectMapper = objectMapper; } @Override public void enrich(JsonEnricherContext context) { - if (isIndexRequest(context) && ConfigurationPermissions.list().isPermitted()) { + if (resultHasMediaType(INDEX, context) && ConfigurationPermissions.list().isPermitted()) { String gitConfigUrl = new LinkBuilder(scmPathInfoStore.get().get(), SvnConfigResource.class) .method("get") .parameters() .href(); - ObjectNode gitConfigRefNode = objectMapper.createObjectNode(); - gitConfigRefNode.set("href", objectMapper.convertValue(gitConfigUrl, JsonNode.class)); + JsonNode gitConfigRefNode = createObject(singletonMap("href", value(gitConfigUrl))); - ((ObjectNode) context.getResponseEntity().get("_links")).put("svnConfig", gitConfigRefNode); + addPropertyNode(context.getResponseEntity().get("_links"), "svnConfig", gitConfigRefNode); } } - - private boolean isIndexRequest(JsonEnricherContext context) { - return VndMediaType.INDEX.equals(context.getResponseMediaType().toString()); - } }