diff --git a/pom.xml b/pom.xml index 42483716..69cd36c2 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,7 @@ 3.1.2.RELEASE + 1.9.7 true @@ -73,12 +74,20 @@ spring-webmvc ${spring.version} + javax.servlet servlet-api 2.5 provided + + + org.codehaus.jackson + jackson-core-asl + ${jackson.version} + true + org.hamcrest diff --git a/src/main/java/org/springframework/hateoas/Resource.java b/src/main/java/org/springframework/hateoas/Resource.java new file mode 100644 index 00000000..773b54b7 --- /dev/null +++ b/src/main/java/org/springframework/hateoas/Resource.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.hateoas; + +import org.codehaus.jackson.annotate.JsonUnwrapped; +import org.springframework.util.Assert; + +/** + * A simple {@link Resource} wrapping a domain object and adding links to it. + * + * @author Oliver Gierke + */ +public class Resource extends ResourceSupport { + + @JsonUnwrapped + private final T content; + + /** + * Creates an empty {@link Resource}. + */ + protected Resource() { + this.content = null; + } + + /** + * Creates a new {@link Resource} with the given content. + * + * @param content must not be {@literal null}. + */ + public Resource(T content) { + + Assert.notNull(content, "Content must not be null!"); + this.content = content; + } + + /** + * Returns the underlying entity. + * + * @return the content + */ + public T getContent() { + return content; + } +} diff --git a/src/main/java/org/springframework/hateoas/ResourceProcessor.java b/src/main/java/org/springframework/hateoas/ResourceProcessor.java new file mode 100644 index 00000000..9c5c4fde --- /dev/null +++ b/src/main/java/org/springframework/hateoas/ResourceProcessor.java @@ -0,0 +1,35 @@ +/* + * Copyright 2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.hateoas; + + +/** + * SPI to let user code manipulate a {@link Resource} by the framework. + * + * @param T the concrete Resource extension + * @author Oliver Gierke + */ +public interface ResourceProcessor> { + + /** + * Callback to allow the manipulation of the given {@link Resource} before rendering. + * + * @param resource the standard resource prepared by the framework. + * @param entity the entity backing the resource + * @return a {@link Resource} object (could be a completely different one) + */ + Resource process(T resource); +} diff --git a/src/main/java/org/springframework/hateoas/ResourceSupport.java b/src/main/java/org/springframework/hateoas/ResourceSupport.java index e3c34e5e..ead2b3d1 100755 --- a/src/main/java/org/springframework/hateoas/ResourceSupport.java +++ b/src/main/java/org/springframework/hateoas/ResourceSupport.java @@ -21,6 +21,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlElement; +import org.codehaus.jackson.annotate.JsonProperty; import org.springframework.util.Assert; /** @@ -31,6 +32,7 @@ import org.springframework.util.Assert; public class ResourceSupport implements Identifiable { @XmlElement(name = "link", namespace = Link.ATOM_NAMESPACE) + @JsonProperty("links") private final List links; public ResourceSupport() { diff --git a/src/main/java/org/springframework/hateoas/Resources.java b/src/main/java/org/springframework/hateoas/Resources.java new file mode 100644 index 00000000..68bb4b8f --- /dev/null +++ b/src/main/java/org/springframework/hateoas/Resources.java @@ -0,0 +1,98 @@ +/* + * Copyright 2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.hateoas; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.springframework.util.Assert; + +/** + * General helper to easily create a wrapper for a collection of entities. + * + * @author Oliver Gierke + */ +@XmlRootElement(name = "entities") +public class Resources> extends ResourceSupport implements Iterable { + + @XmlAnyElement + @XmlElementWrapper + @JsonProperty("content") + private final Collection content; + + /** + * Creates an empty {@link Resources} instance. + */ + protected Resources() { + this(new ArrayList()); + } + + /** + * Creates a {@link Resources} instance with the given content. + * + * @param content must not be {@literal null}. + */ + public Resources(Collection content) { + + Assert.notNull(content); + + this.content = new ArrayList(); + this.content.addAll(content); + } + + /** + * Creates a new {@link Resources} instance by wrapping the given domain class instances into a {@link Resource}. + * + * @param content must not be {@literal null}. + * @return + */ + @SuppressWarnings("unchecked") + public static , S> Resources fromEntities(Collection content) { + + Assert.notNull(content); + ArrayList resources = new ArrayList(); + + for (S element : content) { + resources.add((T) new Resource(element)); + } + + return new Resources(resources); + } + + /** + * Returns the underlying {@link Resource}s. + * + * @return the content will never be {@literal null}. + */ + public Collection getContent() { + return content; + } + + /* + * (non-Javadoc) + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return content.iterator(); + } +} diff --git a/src/main/java/org/springframework/hateoas/ResourcesProcessor.java b/src/main/java/org/springframework/hateoas/ResourcesProcessor.java new file mode 100644 index 00000000..e8f98ec7 --- /dev/null +++ b/src/main/java/org/springframework/hateoas/ResourcesProcessor.java @@ -0,0 +1,35 @@ +/* + * Copyright 2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.hateoas; + + +/** + * SPI to let user code manipulate the {@link Resources} returned by the framework. + * + * @param T the concrete Resource extension + * @author Oliver Gierke + */ +public interface ResourcesProcessor> { + + /** + * Callback to allow the manipulation of the given {@link Resources} before rendering. + * + * @param resources the standard {@link Resources} provided by the framework + * @param entities the entities backing the {@link Resources} instance. + * @return + */ + Resources process(T resources); +} diff --git a/template.mf b/template.mf index b9e5e557..96ded0c6 100644 --- a/template.mf +++ b/template.mf @@ -4,4 +4,5 @@ Bundle-Vendor: SpringSource Bundle-ManifestVersion: 2 Import-Template: javax.xml.bind.*;version="0", - org.springframework.*;version="${spring.version:[=.=.=,+1.0.0)}";resolution:=optional + org.springframework.*;version="${spring.version:[=.=.=,+1.0.0)}";resolution:=optional, + org.codehaus.jackson.*;version="${jackson.version:[=.=.=,+1.0.0)}";resolution:=optional