diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java
index cc5291cb6b..68d52a9bd6 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java
@@ -1,7 +1,6 @@
package sonia.scm.api.v2;
import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Lists;
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
@@ -12,6 +11,11 @@ import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;
import java.util.List;
import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static java.util.Arrays.stream;
+import static java.util.Collections.emptyList;
+import static java.util.Optional.ofNullable;
/**
*
Post processor for rest requests filtering json responses when a {@value PARAMETER_FIELDS} query
@@ -51,27 +55,16 @@ public class FieldContainerResponseFilter implements ContainerResponseFilter {
}
private List extractFieldsFrom(ContainerRequestContext requestContext) {
- List fields = Lists.newArrayList();
-
- List fieldParameters = getFieldParameterFrom(requestContext);
- if (fieldParameters != null && !fieldParameters.isEmpty()) {
- for (String fieldParameter : fieldParameters) {
- appendFieldsFromParameter(fields, fieldParameter);
- }
- }
-
- return fields;
+ return getFieldParameterFrom(requestContext)
+ .orElse(emptyList())
+ .stream()
+ .flatMap(p -> stream(p.split(FIELD_SEPARATOR)))
+ .collect(Collectors.toList());
}
- private List getFieldParameterFrom(ContainerRequestContext requestContext) {
+ private Optional> getFieldParameterFrom(ContainerRequestContext requestContext) {
MultivaluedMap queryParameters = requestContext.getUriInfo().getQueryParameters();
- return queryParameters.get(PARAMETER_FIELDS);
+ List fieldParameters = queryParameters.get(PARAMETER_FIELDS);
+ return ofNullable(fieldParameters);
}
-
- private void appendFieldsFromParameter(List fields, String fieldParameter) {
- for (String field : fieldParameter.split(FIELD_SEPARATOR)) {
- fields.add(field);
- }
- }
-
}
diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/FieldContainerResponseFilterTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/FieldContainerResponseFilterTest.java
index 3855c380b2..35e7f5d4d0 100644
--- a/scm-webapp/src/test/java/sonia/scm/api/v2/FieldContainerResponseFilterTest.java
+++ b/scm-webapp/src/test/java/sonia/scm/api/v2/FieldContainerResponseFilterTest.java
@@ -15,6 +15,8 @@ import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
@@ -63,10 +65,35 @@ public class FieldContainerResponseFilterTest {
assertEquals("{\"one\":1,\"five\":5}", objectMapper.writeValueAsString(node));
}
+ @Test
+ public void testFilterEmpty() throws IOException {
+ applyFields();
+ JsonNode node = applyEntity("filter-test-002");
+
+ filter.filter(requestContext, responseContext);
+
+ assertEquals("{\"one\":1,\"two\":{\"three\":3,\"four\":4},\"five\":5}", objectMapper.writeValueAsString(node));
+ }
+
+ @Test
+ public void testFilterNotSet() throws IOException {
+ applyFields((List) null);
+ JsonNode node = applyEntity("filter-test-002");
+
+ filter.filter(requestContext, responseContext);
+
+ assertEquals("{\"one\":1,\"two\":{\"three\":3,\"four\":4},\"five\":5}", objectMapper.writeValueAsString(node));
+ }
+
private void applyFields(String... fields) {
+ ArrayList fieldList = Lists.newArrayList(fields);
+ applyFields(fieldList);
+ }
+
+ private void applyFields(List fieldList) {
UriInfo info = mock(UriInfo.class);
MultivaluedMap queryParameters = mock(MultivaluedMap.class);
- when(queryParameters.get("fields")).thenReturn(Lists.newArrayList(fields));
+ when(queryParameters.get("fields")).thenReturn(fieldList);
when(info.getQueryParameters()).thenReturn(queryParameters);
when(requestContext.getUriInfo()).thenReturn(info);
}