You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/03/13 07:08:08 UTC
[isis] 02/02: ISIS-1913: adds support for object-icon link in REST
API
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch maint-1.16.2
in repository https://gitbox.apache.org/repos/asf/isis.git
commit b9175ae6d95485561d48e7f12f6f879b75908345
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Mar 13 07:05:00 2018 +0000
ISIS-1913: adds support for object-icon link in REST API
---
.../guides/ugvro/_ugvro_layout-resources.adoc | 27 ++++++-
.../isis/viewer/restfulobjects/applib/Rel.java | 1 +
.../restfulobjects/applib/RepresentationType.java | 4 ++
.../restfulobjects/applib/RestfulMediaType.java | 2 +
.../applib/domainobjects/DomainObjectResource.java | 17 +++++
.../domainobjects/DomainObjectReprRenderer.java | 18 ++++-
.../server/RestfulObjectsApplication.java | 2 +
.../resources/DomainObjectResourceServerside.java | 82 ++++++++++++++++++++++
.../server/resources/ImageResourceServerside.java | 50 +++++++++++++
9 files changed, 200 insertions(+), 3 deletions(-)
diff --git a/adocs/documentation/src/main/asciidoc/guides/ugvro/_ugvro_layout-resources.adoc b/adocs/documentation/src/main/asciidoc/guides/ugvro/_ugvro_layout-resources.adoc
index 8bc924a..75025c3 100644
--- a/adocs/documentation/src/main/asciidoc/guides/ugvro/_ugvro_layout-resources.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/ugvro/_ugvro_layout-resources.adoc
@@ -110,6 +110,30 @@ This can also be obtained in JSON format in the usual way (by specifying an HTTP
+[[_ugvro_layout-resources_domain-object-icon]]
+== Domain Object Icon
+
+The representation returned by the domain object resource (section 14.4 of the RO spec v1.0) has been extended to provide a link to the icon image (`.png`) to use:
+
+[source,javascript]
+----
+{
+ "links": [
+ ...
+ {
+ "rel": "urn:org.apache.isis.restfulobjects:rels/object-layout",
+ "href": "http://localhost:8080/restful/objects/helloworld.HelloWorldObject/0/object-icon",
+ "method": "GET",
+ "type": "image/png",
+ },
+ ],
+ ...
+}
+----
+
+Note that because of dynamic icons (the xref:../../guides/rgcms/rgcms.adoc#_rgcms_methods_reserved_iconName[`iconName()`] supporting method) the image returned can vary on an instance-by-instance basis.
+
+
[[_ugvro_layout-resources_domain-object-layout]]
== Domain Object Layout
@@ -129,8 +153,7 @@ The representation returned by the domain object resource (section 14.4 of the R
"rel": "urn:org.apache.isis.restfulobjects:rels/object-layout",
"href": "http://localhost:8080/restful/objects/helloworld.HelloWorldObject/0/object-layout",
"method": "GET",
- "type": "application/json;profile='urn:org.restfulobjects:repr-types/object'",
- "title": "Object: a"
+ "type": "application/json;profile='urn:org.restfulobjects:repr-types/object-layout-bs3'",
},
],
...
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 b2d123e..b0794d2 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
@@ -60,6 +60,7 @@ public enum Rel {
// implementation specific
CONTRIBUTED_BY(RelDefinition.IMPL, "contributed-by"),
OBJECT_LAYOUT(RelDefinition.IMPL, "object-layout"),
+ OBJECT_ICON(RelDefinition.IMPL, "object-icon"),
LAYOUT(RelDefinition.IMPL, "layout"),
MENUBARS(RelDefinition.IMPL, "menuBars"),
LOGOUT(RelDefinition.IMPL, "logout");
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 1a6cf5d..b1fea7b 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
@@ -101,6 +101,10 @@ public enum RepresentationType {
RestfulMediaType.APPLICATION_JSON_OBJECT_LAYOUT_BS3,
RestfulMediaType.APPLICATION_XML_OBJECT_LAYOUT_BS3,
null),
+ OBJECT_IMAGE(
+ "image/png",
+ "image/png",
+ null),
MENUBARS(
RestfulMediaType.APPLICATION_JSON_LAYOUT_MENUBARS,
RestfulMediaType.APPLICATION_XML_LAYOUT_MENUBARS,
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 7199e32..99d5a17 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
@@ -86,4 +86,6 @@ public final class RestfulMediaType {
public final static String APPLICATION_XML_ERROR = XML_BASE + "error";
// public final static String APPLICATION_XML_TYPE_ACTION_RESULT = XML_BASE + "type-action-result";
+ public final static String IMAGE_PNG = "image/png";
+
}
diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
index aa29ef7..e15f465 100644
--- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
+++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
@@ -83,6 +83,23 @@ public interface DomainObjectResource {
// //////////////////////////////////////////////////////////
+ // domain object image
+ // //////////////////////////////////////////////////////////
+
+ @GET
+ @Path("/{domainType}/{instanceId}/image")
+ @Consumes({ MediaType.WILDCARD })
+ @Produces({
+ "image/png"
+ })
+ public Response image(
+ @PathParam("domainType")
+ final String domainType,
+ @PathParam("instanceId")
+ final String instanceId);
+
+
+ // //////////////////////////////////////////////////////////
// domain object layout
// //////////////////////////////////////////////////////////
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 c3161b9..0e50982 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
@@ -58,7 +58,15 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
String domainType = OidUtils.getDomainType(objectAdapter);
String instanceId = OidUtils.getInstanceId(objectAdapter);
final String url = "objects/" + domainType + "/" + instanceId + "/object-layout";
- return LinkBuilder.newBuilder(rendererContext, rel.getName(), RepresentationType.DOMAIN_OBJECT, url).withTitle(objectAdapter.titleString(null));
+ return LinkBuilder.newBuilder(rendererContext, rel.getName(), RepresentationType.OBJECT_LAYOUT, url);
+ }
+
+ public static LinkBuilder newLinkToObjectIconBuilder(final RendererContext rendererContext, final ObjectAdapter objectAdapter) {
+ final Rel rel = Rel.OBJECT_ICON;
+ String domainType = OidUtils.getDomainType(objectAdapter);
+ String instanceId = OidUtils.getInstanceId(objectAdapter);
+ final String url = "objects/" + domainType + "/" + instanceId + "/image";
+ return LinkBuilder.newBuilder(rendererContext, rel.getName(), RepresentationType.OBJECT_IMAGE, url);
}
private static enum Mode {
@@ -175,6 +183,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
if (mode.includeDescribedBy() && !rendererContext.suppressDescribedByLinks()) {
addLinkToDescribedBy();
addLinkToObjectLayout();
+ addLinkToObjectIcon();
}
if(isService && mode.includeUp()) {
addLinkToUp();
@@ -237,6 +246,13 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
getLinks().arrayAdd(link);
}
+ private void addLinkToObjectIcon() {
+ final LinkBuilder linkBuilder = DomainObjectReprRenderer
+ .newLinkToObjectIconBuilder(getRendererContext(), objectAdapter);
+ 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);
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplication.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplication.java
index 7c33c52..1e13b32 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplication.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplication.java
@@ -27,6 +27,7 @@ import org.apache.isis.viewer.restfulobjects.server.resources.DomainObjectResour
import org.apache.isis.viewer.restfulobjects.server.resources.DomainServiceResourceServerside;
import org.apache.isis.viewer.restfulobjects.server.resources.DomainTypeResourceServerside;
import org.apache.isis.viewer.restfulobjects.server.resources.HomePageResourceServerside;
+import org.apache.isis.viewer.restfulobjects.server.resources.ImageResourceServerside;
import org.apache.isis.viewer.restfulobjects.server.resources.MenuBarsResourceServerside;
import org.apache.isis.viewer.restfulobjects.server.resources.SwaggerSpecResource;
import org.apache.isis.viewer.restfulobjects.server.resources.UserResourceServerside;
@@ -41,6 +42,7 @@ public class RestfulObjectsApplication extends AbstractJaxRsApplication {
addClass(DomainTypeResourceServerside.class);
addClass(UserResourceServerside.class);
addClass(MenuBarsResourceServerside.class);
+ addClass(ImageResourceServerside.class);
addClass(DomainObjectResourceServerside.class);
addClass(DomainServiceResourceServerside.class);
addClass(VersionResourceServerside.class);
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
index 938dfa5..853fcc9 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
@@ -16,7 +16,9 @@
*/
package org.apache.isis.viewer.restfulobjects.server.resources;
+import java.io.IOException;
import java.io.InputStream;
+import java.net.URL;
import java.util.List;
import javax.ws.rs.Consumes;
@@ -31,6 +33,9 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import com.google.common.base.Strings;
+import com.google.common.io.Resources;
+
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.layout.component.ActionLayoutData;
import org.apache.isis.applib.layout.component.CollectionLayoutData;
@@ -188,6 +193,83 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
// domain object layout
// //////////////////////////////////////////////////////////
+ static class IconKey {
+ private final Class<?> domainClass;
+ private final String modifier;
+
+ IconKey(final Class<?> domainClass, final String modifier) {
+ this.domainClass = domainClass;
+ this.modifier = modifier;
+ }
+
+ String getImageName() {
+ final StringBuilder buf = new StringBuilder(domainClass.getSimpleName());
+ if(!Strings.isNullOrEmpty(modifier)) {
+ buf.append("-").append(modifier);
+ }
+ buf.append(".png");
+ return buf.toString();
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ final IconKey iconKey = (IconKey) o;
+
+ if (domainClass != null ? !domainClass.equals(iconKey.domainClass) : iconKey.domainClass != null) {
+ return false;
+ }
+ return modifier != null ? modifier.equals(iconKey.modifier) : iconKey.modifier == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = domainClass != null ? domainClass.hashCode() : 0;
+ result = 31 * result + (modifier != null ? modifier.hashCode() : 0);
+ return result;
+ }
+
+ byte[] toBytes() {
+ String imageName = getImageName();
+ URL resource = Resources.getResource(domainClass, imageName);
+ try {
+ return Resources.toByteArray(resource);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+ }
+
+ @Override
+ @GET
+ @Path("/{domainType}/{instanceId}/image")
+ @Consumes({ MediaType.WILDCARD })
+ @Produces({
+ "image/png"
+ })
+ @PrettyPrinting
+ public Response image(
+ @PathParam("domainType")
+ final String domainType,
+ @PathParam("instanceId")
+ final String instanceId) {
+
+ init(RepresentationType.OBJECT_LAYOUT, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
+
+ final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
+ final ObjectSpecification objectSpec = objectAdapter.getSpecification();
+ final String iconName = objectSpec.getIconName(objectAdapter);
+ final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
+ final IconKey iconKey = new IconKey(correspondingClass, iconName);
+ final byte[] bytes = iconKey.toBytes();
+ return bytes != null
+ ? Response.ok(bytes).build()
+ : Response.status(Response.Status.NOT_FOUND).build();
+ }
@Override
@GET
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ImageResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ImageResourceServerside.java
new file mode 100644
index 0000000..04712f1
--- /dev/null
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ImageResourceServerside.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.viewer.restfulobjects.server.resources;
+
+import java.io.IOException;
+import java.net.URL;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+import com.google.common.io.Resources;
+
+@Path("/image")
+public class ImageResourceServerside extends ResourceAbstract {
+
+ @GET
+ @Path("/")
+ @Produces("image/png")
+ public Response image() throws IOException {
+
+ URL resource = Resources.getResource(getClass(), "SimpleObject.png");
+ byte[] bytes = Resources.toByteArray(resource);
+
+// Response.ResponseBuilder response = Response.ok(file);
+// response.header("Content-Disposition",
+// "attachment; filename=SimpleObject.png");
+// return response.build();
+
+ return Response.ok(bytes).build();
+
+ }
+}
--
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.