package com.wesabe.grendel.representations; import java.util.List; import javax.ws.rs.core.UriInfo; import org.codehaus.jackson.annotate.JsonGetter; import org.codehaus.jackson.annotate.JsonIgnore; import com.google.common.collect.Lists; import com.wesabe.grendel.entities.Document; import com.wesabe.grendel.entities.User; import com.wesabe.grendel.representations.UserListRepresentation.UserListItem; import com.wesabe.grendel.resources.LinkResource; /** * A list of a {@link Document}'s links. * <p> * Example JSON: * <pre> * { * "links":[ * { * "user":{ * "id":"precipice", * "uri":"http://example.com/users/precipice" * }, * "uri":"http://example.com/users/codahale/documents/document1.txt/links/precipice" * } * ] * } * </pre> * * @author coda */ public class LinkListRepresentation { public static class LinkListItem { private final UriInfo uriInfo; private final Document document; private final User user; public LinkListItem(UriInfo uriInfo, Document document, User user) { this.uriInfo = uriInfo; this.document = document; this.user = user; } @JsonGetter("user") public UserListItem getUser() { return new UserListItem(uriInfo, user); } @JsonGetter("uri") public String getUri() { return uriInfo.getBaseUriBuilder() .path(LinkResource.class) .build(document.getOwner(), document, user) .toASCIIString(); } } private final UriInfo uriInfo; private final Document document; public LinkListRepresentation(UriInfo uriInfo, Document document) { this.uriInfo = uriInfo; this.document = document; } @JsonIgnore public Document getDocument() { return document; } @JsonIgnore public UriInfo getUriInfo() { return uriInfo; } @JsonGetter("links") public List<LinkListItem> getLinks() { final List<LinkListItem> links = Lists.newArrayList(); for (User user : document.getLinkedUsers()) { links.add(new LinkListItem(uriInfo, document, user)); } return links; } }