/** * Returns a {@code LinkExtractor} capable of extracting links in Hypermedia * Application Language (HAL) format where the links are found in a map named * {@code _links}. For example: * * <pre> * { * "_links": { * "self": { * "href": "http://example.com/foo" * } * } * } * </pre> * @return the extractor for HAL-style links */ public static LinkExtractor halLinks() { return new HalLinkExtractor(); }
private static List<Link> convertToLinks(Object object, String rel) { List<Link> links = new ArrayList<>(); if (object instanceof Collection) { @SuppressWarnings("unchecked") Collection<Object> possibleLinkObjects = (Collection<Object>) object; for (Object possibleLinkObject : possibleLinkObjects) { maybeAddLink(maybeCreateLink(rel, possibleLinkObject), links); } } else { maybeAddLink(maybeCreateLink(rel, object), links); } return links; }
@Override public Map<String, List<Link>> extractLinks(Map<String, Object> json) { Map<String, List<Link>> extractedLinks = new LinkedHashMap<>(); Object possibleLinks = json.get("_links"); if (possibleLinks instanceof Map) { @SuppressWarnings("unchecked") Map<String, Object> links = (Map<String, Object>) possibleLinks; for (Entry<String, Object> entry : links.entrySet()) { String rel = entry.getKey(); extractedLinks.put(rel, convertToLinks(entry.getValue(), rel)); } } return extractedLinks; }
ContentTypeLinkExtractor() { this.linkExtractors.put(MediaType.APPLICATION_JSON, new AtomLinkExtractor()); this.linkExtractors.put(HalLinkExtractor.HAL_MEDIA_TYPE, new HalLinkExtractor()); }
@Parameters(name = "{1}") public static Collection<Object[]> data() { return Arrays.asList(new Object[] { new HalLinkExtractor(), "hal" }, new Object[] { new AtomLinkExtractor(), "atom" }); }