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