diff --git a/pom.xml b/pom.xml
index 174fa07079..59d08a375c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -252,6 +252,25 @@
${resteasy.version}
+
+ javax.ws.rs
+ javax.ws.rs-api
+ ${jaxrs.version}
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
diff --git a/scm-core/pom.xml b/scm-core/pom.xml
index f19ad7453e..a25214da7e 100644
--- a/scm-core/pom.xml
+++ b/scm-core/pom.xml
@@ -85,17 +85,32 @@
javax.ws.rs
javax.ws.rs-api
- ${jaxrs.version}
+
com.fasterxml.jackson.core
jackson-core
- ${jackson.version}
+
com.fasterxml.jackson.core
jackson-databind
- ${jackson.version}
+
+
+
+ de.otto.edison
+ edison-hal
+
+
+
+ org.mapstruct
+ mapstruct-jdk8
+
+
+
+ org.mapstruct
+ mapstruct-processor
+ provided
diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BaseMapper.java b/scm-core/src/main/java/sonia/scm/api/v2/resources/BaseMapper.java
similarity index 77%
rename from scm-webapp/src/main/java/sonia/scm/api/v2/resources/BaseMapper.java
rename to scm-core/src/main/java/sonia/scm/api/v2/resources/BaseMapper.java
index 94d884c437..a3f83d21ab 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BaseMapper.java
+++ b/scm-core/src/main/java/sonia/scm/api/v2/resources/BaseMapper.java
@@ -2,11 +2,10 @@ package sonia.scm.api.v2.resources;
import de.otto.edison.hal.HalRepresentation;
import org.mapstruct.Mapping;
-import sonia.scm.ModelObject;
import java.time.Instant;
-abstract class BaseMapper {
+abstract class BaseMapper {
@Mapping(target = "attributes", ignore = true) // We do not map HAL attributes
public abstract D map(T modelObject);
diff --git a/scm-core/src/main/java/sonia/scm/api/v2/resources/CollectionToDtoMapper.java b/scm-core/src/main/java/sonia/scm/api/v2/resources/CollectionToDtoMapper.java
new file mode 100644
index 0000000000..4f8c6a6f3f
--- /dev/null
+++ b/scm-core/src/main/java/sonia/scm/api/v2/resources/CollectionToDtoMapper.java
@@ -0,0 +1,32 @@
+package sonia.scm.api.v2.resources;
+
+import de.otto.edison.hal.HalRepresentation;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static de.otto.edison.hal.Embedded.embeddedBuilder;
+import static de.otto.edison.hal.Links.linkingTo;
+
+abstract class CollectionToDtoMapper {
+
+ private final String collectionName;
+ private final BaseMapper mapper;
+
+ protected CollectionToDtoMapper(String collectionName, BaseMapper mapper) {
+ this.collectionName = collectionName;
+ this.mapper = mapper;
+ }
+
+ public HalRepresentation map(Collection collection) {
+ List dtos = collection.stream().map(mapper::map).collect(Collectors.toList());
+ return new HalRepresentation(
+ linkingTo().self(createSelfLink()).build(),
+ embeddedBuilder().with(collectionName, dtos).build()
+ );
+ }
+
+ protected abstract String createSelfLink();
+
+}
diff --git a/scm-plugins/pom.xml b/scm-plugins/pom.xml
index 70dee9676a..e82eaddb9a 100644
--- a/scm-plugins/pom.xml
+++ b/scm-plugins/pom.xml
@@ -63,23 +63,6 @@
enunciate-core-annotations
-
- org.mapstruct
- mapstruct-jdk8
-
-
-
- org.mapstruct
- mapstruct-processor
- provided
-
-
-
- de.otto.edison
- edison-hal
- compile
-
-
org.projectlombok
lombok
diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml
index 538eba4911..30944d49cc 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -150,11 +150,6 @@
resteasy-servlet-initializer
-
- de.otto.edison
- edison-hal
-
-
@@ -383,17 +378,6 @@
provided
-
- org.mapstruct
- mapstruct-jdk8
-
-
-
- org.mapstruct
- mapstruct-processor
- provided
-
-