diff --git a/src/main/java/org/springframework/hateoas/PagedResources.java b/src/main/java/org/springframework/hateoas/PagedResources.java index 96f506c4..13ecc504 100644 --- a/src/main/java/org/springframework/hateoas/PagedResources.java +++ b/src/main/java/org/springframework/hateoas/PagedResources.java @@ -15,30 +15,117 @@ */ package org.springframework.hateoas; +import java.util.ArrayList; +import java.util.Collection; + import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import org.codehaus.jackson.annotate.JsonProperty; +import org.springframework.util.Assert; /** * DTO to implement binding response representations of pageable collections. * * @author Oliver Gierke */ +@XmlRootElement(name = "entities") @JsonAutoDetect(fieldVisibility = Visibility.ANY) -public class PagedResources> extends Resources { +public class PagedResources extends Resources { @JsonProperty("page") - private PageMetadata pageMetadata; + private PageMetadata metadata; + + /** + * Default constructor to allow instantiation by reflection. + */ + protected PagedResources() { + this(new ArrayList(), null); + } + + /** + * Creates a new {@link PagedResources} from the given content and {@link PageMetadata}. + * + * @param content must not be {@literal null}. + * @param metadata + * @param links + */ + public PagedResources(Collection content, PageMetadata metadata, Link... links) { + super(content, links); + this.metadata = metadata; + } /** * Returns the pagination metadata. * - * @return the pageMetadata + * @return the metadata */ public PageMetadata getMetadata() { - return pageMetadata; + return metadata; + } + + /** + * Factory method to easily create a {@link PagedResources} instance from a set of entities and pagination metadata. + * + * @param content must not be {@literal null}. + * @param metadata + * @return + */ + @SuppressWarnings("unchecked") + public static , S> PagedResources fromEntities(Iterable content, PageMetadata metadata) { + + Assert.notNull(content); + ArrayList resources = new ArrayList(); + + for (S element : content) { + resources.add((T) new Resource(element)); + } + + return new PagedResources(resources, metadata); + } + + /* + * (non-Javadoc) + * @see org.springframework.hateoas.ResourceSupport#toString() + */ + @Override + public String toString() { + return String.format("PagedResource { content: %s, metadata: %s }", getContent(), metadata); + } + + /* + * (non-Javadoc) + * @see org.springframework.hateoas.Resources#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + + if (obj == null || !getClass().equals(obj.getClass())) { + return false; + } + + PagedResources that = (PagedResources) obj; + boolean metadataEquals = this.metadata == null ? that.metadata == null : this.metadata.equals(that.metadata); + + return metadataEquals ? super.equals(obj) : false; + } + + /* + * (non-Javadoc) + * @see org.springframework.hateoas.Resources#hashCode() + */ + @Override + public int hashCode() { + + int result = super.hashCode(); + result += this.metadata == null ? 0 : 31 * this.metadata.hashCode(); + return result; } /** @@ -65,6 +152,24 @@ public class PagedResources> extends Resources { @JsonProperty private long number; + protected PageMetadata() { + + } + + /** + * @param size + * @param number + * @param totalElements + * @param totalPages + */ + public PageMetadata(long size, long number, long totalElements, long totalPages) { + + this.size = size; + this.number = number; + this.totalElements = totalElements; + this.totalPages = totalPages; + } + /** * Returns the requested size of the page. * @@ -107,8 +212,44 @@ public class PagedResources> extends Resources { */ @Override public String toString() { - return String.format("Page metadata [number: %d, total pages: %d, total elements: %d, size: %d]", number, + return String.format("Metadata { number: %d, total pages: %d, total elements: %d, size: %d }", number, totalPages, totalElements, size); } + + /* + * (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + + if (obj == null || !obj.getClass().equals(getClass())) { + return false; + } + + PageMetadata that = (PageMetadata) obj; + + return this.number == that.number && this.size == that.size && this.totalElements == that.totalElements + && this.totalPages == that.totalPages; + } + + /* + * (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + + int result = 17; + result += 31 * (int) (this.number ^ (this.number >>> 32)); + result += 31 * (int) (this.size ^ (this.size >>> 32)); + result += 31 * (int) (this.totalElements ^ (this.totalElements >>> 32)); + result += 31 * (int) (this.totalPages ^ (this.totalPages >>> 32)); + return result; + } } } diff --git a/src/main/java/org/springframework/hateoas/Resource.java b/src/main/java/org/springframework/hateoas/Resource.java index 46694038..7d1dbeac 100644 --- a/src/main/java/org/springframework/hateoas/Resource.java +++ b/src/main/java/org/springframework/hateoas/Resource.java @@ -17,6 +17,8 @@ package org.springframework.hateoas; import java.util.Arrays; +import javax.xml.bind.annotation.XmlRootElement; + import org.codehaus.jackson.annotate.JsonUnwrapped; import org.springframework.util.Assert; @@ -25,6 +27,7 @@ import org.springframework.util.Assert; * * @author Oliver Gierke */ +@XmlRootElement public class Resource extends ResourceSupport { @JsonUnwrapped @@ -59,6 +62,15 @@ public class Resource extends ResourceSupport { return content; } + /* + * (non-Javadoc) + * @see org.springframework.hateoas.ResourceSupport#toString() + */ + @Override + public String toString() { + return String.format("Resource { content: %s, %s }", getContent(), super.toString()); + } + /* * (non-Javadoc) * @see org.springframework.hateoas.ResourceSupport#equals(java.lang.Object) diff --git a/src/main/java/org/springframework/hateoas/ResourceSupport.java b/src/main/java/org/springframework/hateoas/ResourceSupport.java index ead2b3d1..e233a500 100755 --- a/src/main/java/org/springframework/hateoas/ResourceSupport.java +++ b/src/main/java/org/springframework/hateoas/ResourceSupport.java @@ -113,6 +113,15 @@ public class ResourceSupport implements Identifiable { return null; } + /* + * (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("links: %s", links.toString()); + } + /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) @@ -141,13 +150,4 @@ public class ResourceSupport implements Identifiable { public int hashCode() { return this.links.hashCode(); } - - /* - * (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return this.links.toString(); - } } diff --git a/src/main/java/org/springframework/hateoas/Resources.java b/src/main/java/org/springframework/hateoas/Resources.java index 17d9743f..25a7accf 100644 --- a/src/main/java/org/springframework/hateoas/Resources.java +++ b/src/main/java/org/springframework/hateoas/Resources.java @@ -33,7 +33,7 @@ import org.springframework.util.Assert; * @author Oliver Gierke */ @XmlRootElement(name = "entities") -public class Resources> extends ResourceSupport implements Iterable { +public class Resources extends ResourceSupport implements Iterable { @XmlAnyElement @XmlElementWrapper @@ -69,7 +69,7 @@ public class Resources> extends ResourceSupport implements * @return */ @SuppressWarnings("unchecked") - public static , S> Resources fromEntities(Collection content) { + public static , S> Resources fromEntities(Iterable content) { Assert.notNull(content); ArrayList resources = new ArrayList(); @@ -82,7 +82,7 @@ public class Resources> extends ResourceSupport implements } /** - * Returns the underlying {@link Resource}s. + * Returns the underlying elements. * * @return the content will never be {@literal null}. */ @@ -99,6 +99,15 @@ public class Resources> extends ResourceSupport implements return content.iterator(); } + /* + * (non-Javadoc) + * @see org.springframework.hateoas.ResourceSupport#toString() + */ + @Override + public String toString() { + return String.format("Resources { content: %s, %s }", getContent(), super.toString()); + } + /* * (non-Javadoc) * @see org.springframework.hateoas.ResourceSupport#equals(java.lang.Object) @@ -132,5 +141,4 @@ public class Resources> extends ResourceSupport implements return result; } - }