ISIS-1697: adds new domain-type/layout representation to obtain the grid for a domain object.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/e17f3740 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/e17f3740 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/e17f3740 Branch: refs/heads/master Commit: e17f374003cd2e5fd15db438298bb0983d6f4c06 Parents: a99b2e1 Author: Dan Haywood <[email protected]> Authored: Tue Aug 15 22:54:31 2017 +0100 Committer: Dan Haywood <[email protected]> Committed: Tue Aug 15 22:54:31 2017 +0100 ---------------------------------------------------------------------- .../isis/viewer/restfulobjects/applib/Rel.java | 1 + .../applib/RepresentationType.java | 10 +++++++++- .../restfulobjects/applib/RestfulMediaType.java | 1 + .../applib/domaintypes/DomainTypeResource.java | 9 ++++++++- .../restfulobjects/rendering/LinkBuilder.java | 2 +- .../restfulobjects/rendering/Responses.java | 4 ++++ .../domainobjects/DomainObjectReprRenderer.java | 8 ++++++++ .../domaintypes/DomainTypeReprRenderer.java | 11 +++++++++- .../resources/DomainTypeResourceServerside.java | 21 ++++++++++++++++++++ 9 files changed, 63 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java index 70d7699..d8c0796 100644 --- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java +++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java @@ -59,6 +59,7 @@ public enum Rel { // implementation specific CONTRIBUTED_BY(RelDefinition.IMPL, "contributed-by"), + LAYOUT(RelDefinition.IMPL, "layout"), LOGOUT(RelDefinition.IMPL, "logout"); private final RelDefinition relDef; http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java index 501e81c..1c2adc7 100644 --- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java +++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java @@ -93,6 +93,10 @@ public enum RepresentationType { RestfulMediaType.APPLICATION_JSON_DOMAIN_TYPE, null, DomainTypeRepresentation.class), + LAYOUT( + null, + RestfulMediaType.APPLICATION_XML_LAYOUT_BS3, + null), PROPERTY_DESCRIPTION( RestfulMediaType.APPLICATION_JSON_PROPERTY_DESCRIPTION, null, @@ -128,7 +132,7 @@ public enum RepresentationType { private final Class<? extends JsonRepresentation> representationClass; private RepresentationType(final String jsonMediaTypeStr, final String xmlMediaTypeStr, final Class<? extends JsonRepresentation> representationClass) { - this(MediaType.valueOf(jsonMediaTypeStr), xmlMediaTypeStr != null? MediaType.valueOf(xmlMediaTypeStr): null, representationClass); + this(jsonMediaTypeStr != null ? MediaType.valueOf(jsonMediaTypeStr) : null, xmlMediaTypeStr != null? MediaType.valueOf(xmlMediaTypeStr): null, representationClass); } private RepresentationType(final MediaType jsonMediaType, final MediaType xmlMediaType, final Class<? extends JsonRepresentation> representationClass) { @@ -156,6 +160,10 @@ public enum RepresentationType { return xmlMediaType; } + public MediaType getJsonElseXmlMediaType() { + return jsonMediaType != null ? jsonMediaType : xmlMediaType; + } + /** * Clones the (immutable) {@link #getMediaType() media type}, adding in one additional * parameter value. http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java index 1227a8f..b440b89 100644 --- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java +++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java @@ -56,6 +56,7 @@ public final class RestfulMediaType { public final static String APPLICATION_JSON_TYPE_ACTION_RESULT = JSON_BASE + "type-action-result"; private static final String XML_BASE = "application/xml" + ";profile=" + PROFILE_PARAM_PREFIX; + public final static String APPLICATION_XML_LAYOUT_BS3 = XML_BASE + "layout-bs3"; // currently only support a subset of representations in XML format http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java index 638023c..8881c25 100644 --- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java +++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java @@ -26,9 +26,10 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType; import org.jboss.resteasy.annotations.ClientResponseType; +import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType; + @Path("/domain-types") public interface DomainTypeResource { @@ -53,6 +54,12 @@ public interface DomainTypeResource { public abstract Response domainType(@PathParam("domainType") final String domainType); @GET + @Path("/{domainType}/layout") + @Produces({ MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_LAYOUT_BS3 }) + @ClientResponseType(entityType = String.class) + public abstract Response layout(@PathParam("domainType") final String domainType); + + @GET @Path("/{domainType}/properties/{propertyId}") @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_PROPERTY_DESCRIPTION }) @ClientResponseType(entityType = String.class) http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java index f6e27e7..234fd97 100644 --- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java +++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java @@ -27,7 +27,7 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod; public final class LinkBuilder { public static LinkBuilder newBuilder(final RendererContext resourceContext, final String rel, final RepresentationType representationType, final String hrefFormat, final Object... hrefArgs) { - return newBuilder(resourceContext, rel, representationType.getMediaType(), hrefFormat, hrefArgs); + return newBuilder(resourceContext, rel, representationType.getJsonElseXmlMediaType(), hrefFormat, hrefArgs); } public static LinkBuilder newBuilder(final RendererContext resourceContext, final String rel, final MediaType mediaType, final String hrefFormat, final Object... hrefArgs) { http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java index e68e250..4be7721 100644 --- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java +++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java @@ -35,6 +35,10 @@ public final class Responses { return of(RestfulResponse.HttpStatusCode.NO_CONTENT); } + public static Response.ResponseBuilder ofNotFound() { + return of(RestfulResponse.HttpStatusCode.NOT_FOUND); + } + public static Response.ResponseBuilder ofOk( final ReprRenderer<?, ?> renderer, final Caching caching) { http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java index 2f64732..883d5cd 100644 --- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java +++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java @@ -166,6 +166,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR // described by if (mode.includeDescribedBy() && !rendererContext.suppressDescribedByLinks()) { addLinkToDescribedBy(); + addLinkToLayout(); } if(isService && mode.includeUp()) { addLinkToUp(); @@ -221,6 +222,13 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR getLinks().arrayAdd(link); } + private void addLinkToLayout() { + final LinkBuilder linkBuilder = DomainTypeReprRenderer + .newLinkToLayoutBuilder(getRendererContext(), Rel.LAYOUT, objectAdapter.getSpecification()); + final JsonRepresentation link = linkBuilder.build(); + getLinks().arrayAdd(link); + } + private void addLinkToUp() { final JsonRepresentation link = LinkBuilder.newBuilder(rendererContext, Rel.UP.getName(), RepresentationType.LIST, "services").build(); getLinks().arrayAdd(link); http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java index 26baf69..9ac1e96 100644 --- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java +++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java @@ -39,10 +39,16 @@ public class DomainTypeReprRenderer extends ReprRendererAbstract<DomainTypeReprR public static LinkBuilder newLinkToBuilder(final RendererContext resourceContext, final Rel rel, final ObjectSpecification objectSpec) { final String typeFullName = objectSpec.getSpecId().asString(); - final String url = "domain-types/" + typeFullName; + final String url = String.format("domain-types/%s", typeFullName); return LinkBuilder.newBuilder(resourceContext, rel.getName(), RepresentationType.DOMAIN_TYPE, url); } + public static LinkBuilder newLinkToLayoutBuilder(final RendererContext resourceContext, final Rel rel, final ObjectSpecification objectSpec) { + final String typeFullName = objectSpec.getSpecId().asString(); + final String url = String.format("domain-types/%s/layout", typeFullName); + return LinkBuilder.newBuilder(resourceContext, rel.getName(), RepresentationType.LAYOUT, url); + } + private ObjectSpecification objectSpecification; public DomainTypeReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollower, final JsonRepresentation representation) { @@ -66,6 +72,9 @@ public class DomainTypeReprRenderer extends ReprRendererAbstract<DomainTypeReprR if (includesSelf) { final JsonRepresentation selfLink = newLinkToBuilder(getRendererContext(), Rel.SELF, objectSpecification).build(); getLinks().arrayAdd(selfLink); + + final JsonRepresentation layoutLink = newLinkToLayoutBuilder(getRendererContext(), Rel.LAYOUT, objectSpecification).build(); + getLinks().arrayAdd(layoutLink); } representation.mapPut("canonicalName", objectSpecification.getFullIdentifier()); http://git-wip-us.apache.org/repos/asf/isis/blob/e17f3740/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java ---------------------------------------------------------------------- diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java index 885bc54..02868c0 100644 --- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java +++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java @@ -31,6 +31,7 @@ import javax.ws.rs.core.Response; import com.google.common.base.Strings; import org.apache.isis.applib.annotation.Where; +import org.apache.isis.core.metamodel.facets.object.grid.GridFacet; import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; @@ -106,6 +107,26 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do @Override @GET + @Path("/{domainType}/layout") + @Produces({ MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_LAYOUT_BS3 }) + public Response layout(@PathParam("domainType") final String domainType) { + init(RepresentationType.LAYOUT, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE); + + final ObjectSpecification objectSpec = getSpecificationLoader().lookupBySpecId(ObjectSpecId.of(domainType)); + final GridFacet gridFacet = objectSpec.getFacet(GridFacet.class); + final Response.ResponseBuilder builder; + if(gridFacet == null) { + builder = Responses.ofNotFound(); + return builder.build(); + } else { + builder = Response.status(Response.Status.OK).entity(gridFacet.getGrid()).type(RepresentationType.LAYOUT.getXmlMediaType()); + } + + return builder.build(); + } + + @Override + @GET @Path("/{domainType}/properties/{propertyId}") @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_PROPERTY_DESCRIPTION }) public Response typeProperty(@PathParam("domainType") final String domainType, @PathParam("propertyId") final String propertyId) {
