diff --git a/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java b/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java index 6f680237..ce8cdd4f 100644 --- a/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java @@ -15,10 +15,10 @@ */ package org.springframework.hateoas.core; +import net.minidev.json.JSONArray; + import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.Array; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -26,19 +26,17 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; -import net.minidev.json.JSONArray; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkDiscoverer; import org.springframework.http.MediaType; import org.springframework.util.Assert; -import org.springframework.util.ReflectionUtils; import com.jayway.jsonpath.InvalidPathException; import com.jayway.jsonpath.JsonPath; /** * {@link LinkDiscoverer} that uses {@link JsonPath} to find links inside a representation. - * + * * @author Oliver Gierke * @author Greg Turnquist */ @@ -50,7 +48,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { /** * Creates a new {@link JsonPathLinkDiscoverer} using the given path template supporting the given {@link MediaType}. * The template has to contain a single {@code %s} placeholder which will be replaced by the relation type. - * + * * @param pathTemplate must not be {@literal null} or empty and contain a single placeholder. * @param mediaTypes the {@link MediaType}s to support. */ @@ -63,7 +61,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { this.mediaTypes = Arrays.asList(mediaTypes); } - /* + /* * (non-Javadoc) * @see org.springframework.hateoas.LinkDiscoverer#findLinkWithRel(java.lang.String, java.lang.String) */ @@ -74,7 +72,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { return links.isEmpty() ? null : links.get(0); } - /* + /* * (non-Javadoc) * @see org.springframework.hateoas.LinkDiscoverer#findLinkWithRel(java.lang.String, java.io.InputStream) */ @@ -85,7 +83,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { return links.isEmpty() ? null : links.get(0); } - /* + /* * (non-Javadoc) * @see org.springframework.hateoas.LinkDiscoverer#findLinksWithRel(java.lang.String, java.lang.String) */ @@ -100,7 +98,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { } } - /* + /* * (non-Javadoc) * @see org.springframework.hateoas.LinkDiscoverer#findLinksWithRel(java.lang.String, java.io.InputStream) */ @@ -115,41 +113,15 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { } } - /** - * Returns the {@link JsonPath} to find links with the given relation type. - * - * @param rel - * @return + /* + * (non-Javadoc) + * @see org.springframework.plugin.core.Plugin#supports(java.lang.Object) */ - private JsonPath getExpression(String rel) { - return JsonPath.compile(String.format(pathTemplate, rel)); - } + @Override + public boolean supports(MediaType delimiter) { - /** - * Creates {@link Link} instances from the given parse result. - * - * @param parseResult the result originating from parsing the source content using the JSON path expression. - * @param rel the relation type that was parsed for. - * @return - */ - private List createLinksFrom(Object parseResult, String rel) { - - if (parseResult instanceof JSONArray) { - - JSONArray jsonArray = (JSONArray) parseResult; - - return jsonArray.stream() // - .flatMap(element -> (element instanceof JSONArray) - ? ((JSONArray) element).stream() - : Stream.of(element)) - .map(element -> extractLink(element, rel)) // - .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); - } else if (parseResult instanceof Map) { - - return Collections.singletonList(extractLink(parseResult, rel)); - } - - return Collections.unmodifiableList(Collections.singletonList(new Link(parseResult.toString(), rel))); + return this.mediaTypes.stream() // + .anyMatch(mediaType -> mediaType.isCompatibleWith(delimiter)); } /** @@ -161,16 +133,39 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { */ protected Link extractLink(Object element, String rel) { return new Link(element.toString(), rel); - }; + } - /* - * (non-Javadoc) - * @see org.springframework.plugin.core.Plugin#supports(java.lang.Object) + /** + * Returns the {@link JsonPath} to find links with the given relation type. + * + * @param rel + * @return */ - @Override - public boolean supports(MediaType delimiter) { + private JsonPath getExpression(String rel) { + return JsonPath.compile(String.format(pathTemplate, rel)); + } - return this.mediaTypes.stream() // - .anyMatch(mediaType -> mediaType.isCompatibleWith(delimiter)); + /** + * Creates {@link Link} instances from the given parse result. + * + * @param parseResult the result originating from parsing the source content using the JSON path expression. + * @param rel the relation type that was parsed for. + * @return + */ + private List createLinksFrom(Object parseResult, String rel) { + + if (parseResult instanceof JSONArray) { + + JSONArray jsonArray = (JSONArray) parseResult; + + return jsonArray.stream() // + .flatMap(it -> JSONArray.class.isInstance(it) ? ((JSONArray) it).stream() : Stream.of(it)) // + .map(it -> extractLink(it, rel)) // + .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); + } + + return parseResult instanceof Map // + ? Collections.singletonList(extractLink(parseResult, rel)) // + : Collections.singletonList(new Link(parseResult.toString(), rel)); } }