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 2014/10/24 18:03:29 UTC

[15/15] git commit: ISIS-933: config properties to override RO defaults for simplified/suppressed representations.

ISIS-933: config properties to override RO defaults for simplified/suppressed representations.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/d8492e28
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/d8492e28
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/d8492e28

Branch: refs/heads/master
Commit: d8492e2840e7dcbf7a5e7793516f045f47ad4cd2
Parents: e0da955
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Oct 24 16:38:56 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Oct 24 17:02:15 2014 +0100

----------------------------------------------------------------------
 ...WithJdkProperties_thenRepresentation_ok.java |   4 +-
 .../rendering/RendererContext.java              |  13 ++-
 .../AbstractObjectMemberReprRenderer.java       |  22 ++--
 .../domainobjects/DomainObjectReprRenderer.java |  87 +++++++++------
 .../domainobjects/JsonValueEncoder.java         | 109 +++++++++++--------
 .../domainobjects/ObjectActionReprRenderer.java |   9 +-
 .../ObjectCollectionReprRenderer.java           |  39 ++++---
 .../ObjectPropertyReprRenderer.java             |  33 ++++--
 .../service/RepresentationService.java          |   5 +
 ...onValueEncoderTest_appendValueAndFormat.java |  50 ++++-----
 .../restfulobjects/server/ResourceContext.java  |  79 +++++++++++---
 .../server/resources/DomainResourceHelper.java  |  40 +++++++
 .../WEB-INF/viewer_restfulobjects.properties    |  45 +++++++-
 .../WEB-INF/viewer_restfulobjects.properties    |  49 ++++++++-
 14 files changed, 431 insertions(+), 153 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJdkProperties_thenRepresentation_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJdkProperties_thenRepresentation_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJdkProperties_thenRepresentation_ok.java
index 06384cf..a658574 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJdkProperties_thenRepresentation_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJdkProperties_thenRepresentation_ok.java
@@ -86,7 +86,7 @@ public class Get_givenEntityWithJdkProperties_thenRepresentation_ok {
 
         property = domainObjectRepr.getProperty("bigIntegerProperty");
         assertThat(property.getMemberType(), is("property"));
-        assertThat(property.getFormat(), is("big-integer(18)"));
+        assertThat(property.getFormat(), is("big-integer"));
         assertThat(property.getXIsisFormat(), is("javamathbiginteger"));
         scalarRepr = property.getRepresentation("value").as(ScalarValueRepresentation.class);
         assertThat(scalarRepr.isString(), is(true));
@@ -95,7 +95,7 @@ public class Get_givenEntityWithJdkProperties_thenRepresentation_ok {
 
         property = domainObjectRepr.getProperty("bigIntegerProperty2");
         assertThat(property.getMemberType(), is("property"));
-        assertThat(property.getFormat(), is("big-integer(18)"));
+        assertThat(property.getFormat(), is("big-integer"));
         scalarRepr = property.getRepresentation("value").as(ScalarValueRepresentation.class);
         assertThat(scalarRepr.isString(), is(true));
         BigInteger bigInteger2 = scalarRepr.asBigInteger(property.getFormat());

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
index 0111c11..ecf5114 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
@@ -46,7 +46,18 @@ public interface RendererContext {
     public List<List<String>> getFollowLinks();
     
     public Localization getLocalization();
-    
+
+    boolean honorUiHints();
+
+    boolean objectPropertyValuesOnly();
+
+    boolean suppressDescribedByLinks();
+    boolean suppressUpdateLink();
+    boolean suppressMemberId();
+    boolean suppressMemberLinks();
+    boolean suppressMemberExtensions();
+    boolean suppressMemberDisabledReason();
+
     /**
      * To avoid infinite loops when {@link Render.Type#EAGERLY eagerly} rendering graphs
      * of objects as {@link DomainObjectReprRenderer#asEventSerialization() events}.

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
index d7f187c..04440bf 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
@@ -153,13 +153,16 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
      * For subclasses to call from their {@link #render()} method.
      */
     protected void renderMemberContent() {
-        representation.mapPut("id", objectMember.getId());
-        
+
+        if(!rendererContext.suppressMemberId()) {
+            representation.mapPut("id", objectMember.getId());
+        }
+
         if(!mode.isArguments()) {
             representation.mapPut("memberType", objectMemberType.getName());
         }
 
-        if (mode.isInline()) {
+        if (mode.isInline() && !rendererContext.suppressMemberLinks()) {
             addDetailsLinkIfPersistent();
         }
 
@@ -172,9 +175,11 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
         }
 
         if (mode.isFollowed() || mode.isStandalone() || mode.isMutated()) {
-            addMutatorsIfEnabled();
+            addMutatorLinksIfEnabled();
 
-            putExtensionsIsisProprietary();
+            if(!mode.isInline() || !rendererContext.suppressUpdateLink()) {
+                putExtensionsIsisProprietary();
+            }
             addLinksToFormalDomainModel();
             addLinksIsisProprietary();
         }
@@ -196,10 +201,10 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
         getLinks().arrayAdd(linkTo.builder(Rel.UP).build());
     }
 
-    protected abstract void addMutatorsIfEnabled();
+    protected abstract void addMutatorLinksIfEnabled();
 
     /**
-     * For subclasses to call back to when {@link #addMutatorsIfEnabled() adding
+     * For subclasses to call back to when {@link #addMutatorLinksIfEnabled() adding
      * mutators}.
      */
     protected void addLinkFor(final MutatorSpec mutatorSpec) {
@@ -260,6 +265,9 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
     protected abstract void followDetailsLink(JsonRepresentation detailsLink);
 
     protected final void putDisabledReasonIfDisabled() {
+        if(rendererContext.suppressMemberDisabledReason()) {
+            return;
+        }
         final String disabledReasonRep = usability().getReason();
         representation.mapPut("disabledReason", disabledReasonRep);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/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 3bc4e51..fa12f8e 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
@@ -103,7 +103,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
 
     /**
      * Override the default {@link ObjectAdapterLinkTo} (that is used for
-     * generating links in {@link #linkTo(ObjectAdapter)}).
+     * generating links.
      */
     public DomainObjectReprRenderer usingLinkToBuilder(final ObjectAdapterLinkTo objectAdapterLinkToBuilder) {
         this.linkToBuilder = objectAdapterLinkToBuilder.usingUrlBase(rendererContext);
@@ -155,14 +155,14 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         withMembers(objectAdapter);
 
         // described by
-        if (mode.includeDescribedBy()) {
+        if (mode.includeDescribedBy() && !rendererContext.suppressDescribedByLinks()) {
             addLinkToDescribedBy();
         }
         if(isService && mode.includeUp()) {
             addLinkToUp();
         }
 
-        if (!mode.isArgs()) {
+        if (!mode.isArgs() && !rendererContext.objectPropertyValuesOnly()) {
             // update/persist
             addPersistLinkIfTransientAndPersistable();
             addUpdatePropertiesLinkIfRequired();
@@ -220,12 +220,19 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
     private DomainObjectReprRenderer withMembers(final ObjectAdapter objectAdapter) {
         final JsonRepresentation appendTo = 
                 mode.isUpdatePropertiesLinkArgs() ? representation : JsonRepresentation.newMap();
-        final List<ObjectAssociation> associations = objectAdapter.getSpecification().getAssociations(Contributed.EXCLUDED);
-        addAssociations(objectAdapter, appendTo, associations);
+        final List<ObjectAssociation> associations = objectAdapter.getSpecification().getAssociations(Contributed.INCLUDED);
 
-        if (mode.isRegular()) {
-            final List<ObjectAction> actions = objectAdapter.getSpecification().getObjectActions(Contributed.INCLUDED);
-            addActions(objectAdapter, actions, appendTo);
+        addProperties(objectAdapter, appendTo, associations);
+
+        if(!rendererContext.objectPropertyValuesOnly()) {
+            if (!mode.isArgs()) {
+                addCollections(objectAdapter, appendTo, associations);
+            }
+
+            if (mode.isRegular()) {
+                final List<ObjectAction> actions = objectAdapter.getSpecification().getObjectActions(Contributed.INCLUDED);
+                addActions(objectAdapter, actions, appendTo);
+            }
         }
         if(!mode.isUpdatePropertiesLinkArgs()) {
             representation.mapPut("members", appendTo);
@@ -233,7 +240,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         return this;
     }
 
-    private void addAssociations(final ObjectAdapter objectAdapter, final JsonRepresentation members, final List<ObjectAssociation> associations) {
+    private void addProperties(final ObjectAdapter objectAdapter, final JsonRepresentation members, final List<ObjectAssociation> associations) {
         final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("members");
         for (final ObjectAssociation assoc : associations) {
 
@@ -243,38 +250,54 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
                     continue;
                 }
             }
-            if (assoc instanceof OneToOneAssociation) {
-                final OneToOneAssociation property = (OneToOneAssociation) assoc;
+            if (!(assoc instanceof OneToOneAssociation)) {
+                continue;
+            }
 
-                final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(getRendererContext(), linkFollower, property.getId(), JsonRepresentation.newMap());
+            final OneToOneAssociation property = (OneToOneAssociation) assoc;
+            final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(getRendererContext(), linkFollower, property.getId(), JsonRepresentation.newMap());
+            renderer.with(new ObjectAndProperty(objectAdapter, property)).usingLinkTo(linkToBuilder);
 
-                renderer.with(new ObjectAndProperty(objectAdapter, property)).usingLinkTo(linkToBuilder);
+            if (mode.isArgs()) {
+                renderer.asArguments();
+            }
+            if(mode.isEventSerialization()) {
+                renderer.asEventSerialization();
+            }
 
-                if (mode.isArgs()) {
-                    renderer.asArguments();
-                }
-                if(mode.isEventSerialization()) {
-                    renderer.asEventSerialization();
-                }
+            final JsonRepresentation propertyValueRepresentation = renderer.render();
+            final JsonRepresentation propertyRepr = rendererContext.objectPropertyValuesOnly()
+                    ? propertyValueRepresentation.getRepresentation("value")
+                    : propertyValueRepresentation;
+            members.mapPut(assoc.getId(), propertyRepr);
+        }
+    }
 
-                members.mapPut(assoc.getId(), renderer.render());
+    private void addCollections(final ObjectAdapter objectAdapter, final JsonRepresentation members, final List<ObjectAssociation> associations) {
+        final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("members");
+        for (final ObjectAssociation assoc : associations) {
+
+            if (mode.checkVisibility()) {
+                final Consent visibility = assoc.isVisible(getRendererContext().getAuthenticationSession(), objectAdapter, rendererContext.getWhere());
+                if (!visibility.isAllowed()) {
+                    continue;
+                }
             }
 
-            if (mode.isArgs()) {
+            if (!(assoc instanceof OneToManyAssociation)) {
                 continue;
             }
-            if (assoc instanceof OneToManyAssociation) {
-                final OneToManyAssociation collection = (OneToManyAssociation) assoc;
 
-                final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(getRendererContext(), linkFollower, collection.getId(), JsonRepresentation.newMap());
+            final OneToManyAssociation collection = (OneToManyAssociation) assoc;
 
-                renderer.with(new ObjectAndCollection(objectAdapter, collection)).usingLinkTo(linkToBuilder);
-                if(mode.isEventSerialization()) {
-                    renderer.asEventSerialization();
-                }
+            final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(getRendererContext(), linkFollower, collection.getId(), JsonRepresentation.newMap());
 
-                members.mapPut(assoc.getId(), renderer.render());
+            renderer.with(new ObjectAndCollection(objectAdapter, collection)).usingLinkTo(linkToBuilder);
+            if(mode.isEventSerialization()) {
+                renderer.asEventSerialization();
             }
+
+            members.mapPut(assoc.getId(), renderer.render());
         }
     }
 
@@ -341,8 +364,10 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(getRendererContext(), null, JsonRepresentation.newMap());
         final JsonRepresentation domainObjectRepr = renderer.with(objectAdapter).asUpdatePropertiesLinkArguments().render();
 
-        final LinkBuilder updateLinkBuilder = LinkBuilder.newBuilder(getRendererContext(), Rel.UPDATE.getName(), RepresentationType.DOMAIN_OBJECT, "objects/%s/%s", getDomainType(), getInstanceId()).withHttpMethod(RestfulHttpMethod.PUT).withArguments(domainObjectRepr);
-        getLinks().arrayAdd(updateLinkBuilder.build());
+        if(!rendererContext.suppressUpdateLink()) {
+            final LinkBuilder updateLinkBuilder = LinkBuilder.newBuilder(getRendererContext(), Rel.UPDATE.getName(), RepresentationType.DOMAIN_OBJECT, "objects/%s/%s", getDomainType(), getInstanceId()).withHttpMethod(RestfulHttpMethod.PUT).withArguments(domainObjectRepr);
+            getLinks().arrayAdd(updateLinkBuilder.build());
+        }
     }
 
     // ///////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index d5530a3..37d4025 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -82,9 +82,11 @@ public final class JsonValueEncoder {
          */
         public abstract ObjectAdapter asAdapter(JsonRepresentation repr, String format);
         
-        public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
-            repr.mapPut("value", unwrapAsObjectElseNullNode(objectAdapter));
-            appendFormats(repr, this.format, this.xIsisFormat);
+        public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
+            final Object value = unwrapAsObjectElseNullNode(objectAdapter);
+            repr.mapPut("value", value);
+            appendFormats(repr, this.format, this.xIsisFormat, suppressExtensions);
+            return value;
         }
 
         public Object asObject(ObjectAdapter objectAdapter, String format) {
@@ -111,7 +113,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof String) {
                     final String str = (String) obj;
@@ -119,7 +121,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -132,7 +135,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Boolean) {
                     final Boolean b = (Boolean) obj;
@@ -140,7 +143,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -162,7 +166,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Byte) {
                     final Byte b = (Byte) obj;
@@ -170,7 +174,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -192,7 +197,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Short) {
                     final Short s = (Short) obj;
@@ -200,7 +205,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -222,7 +228,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Integer) {
                     final Integer i = (Integer) obj;
@@ -230,7 +236,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -252,7 +259,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Long) {
                     final Long l = (Long) obj;
@@ -260,7 +267,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -285,7 +293,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Float) {
                     final Float f = (Float) obj;
@@ -293,7 +301,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -321,7 +330,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Double) {
                     final Double d = (Double) obj;
@@ -329,7 +338,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -353,7 +363,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof Character) {
                     final Character c = (Character) obj;
@@ -361,7 +371,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -386,7 +397,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof BigInteger) {
                     final BigInteger bi = (BigInteger) obj;
@@ -394,7 +405,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, format != null? format: this.format, xIsisFormat);
+                appendFormats(repr, format != null? format: this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
         
@@ -422,7 +434,7 @@ public final class JsonValueEncoder {
                 return null;
             }
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof BigDecimal) {
                     final BigDecimal bd = (BigDecimal) obj;
@@ -430,7 +442,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, format != null ? format : this.format, xIsisFormat);
+                appendFormats(repr, format != null ? format : this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -461,7 +474,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof LocalDate) {
                     final LocalDate date = (LocalDate) obj;
@@ -470,7 +483,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -501,7 +515,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof LocalDateTime) {
                     final LocalDateTime date = (LocalDateTime) obj;
@@ -510,7 +524,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -541,7 +556,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof DateTime) {
                     final DateTime date = (DateTime) obj;
@@ -550,7 +565,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -581,7 +597,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof java.util.Date) {
                     final java.util.Date date = (java.util.Date) obj;
@@ -591,7 +607,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -620,7 +637,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof java.sql.Date) {
                     final java.sql.Date date = (java.sql.Date) obj;
@@ -629,7 +646,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -659,7 +677,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof java.sql.Time) {
                     final java.sql.Time date = (java.sql.Time) obj;
@@ -668,7 +686,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
 
@@ -695,7 +714,7 @@ public final class JsonValueEncoder {
             }
 
             @Override
-            public void appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr) {
+            public Object appendValueAndFormat(ObjectAdapter objectAdapter, String format, JsonRepresentation repr, boolean suppressExtensions) {
                 final Object obj = unwrapAsObjectElseNullNode(objectAdapter);
                 if(obj instanceof java.sql.Timestamp) {
                     final java.sql.Timestamp date = (java.sql.Timestamp) obj;
@@ -704,7 +723,8 @@ public final class JsonValueEncoder {
                 } else {
                     repr.mapPut("value", obj);
                 }
-                appendFormats(repr, this.format, xIsisFormat);
+                appendFormats(repr, this.format, xIsisFormat, suppressExtensions);
+                return obj;
             }
         });
     }
@@ -757,11 +777,11 @@ public final class JsonValueEncoder {
         throw new IllegalArgumentException("Could not parse value '" + argValueRepr.asString() + "' as a " + objectSpec.getFullIdentifier());
     }
 
-    public static void appendValueAndFormat(ObjectSpecification objectSpec, ObjectAdapter objectAdapter, JsonRepresentation repr, String format) {
+    public static Object appendValueAndFormat(ObjectSpecification objectSpec, ObjectAdapter objectAdapter, JsonRepresentation repr, String format, boolean suppressExtensions) {
 
         final JsonValueConverter jvc = converterBySpec.get(objectSpec.getSpecId());
         if(jvc != null) {
-            jvc.appendValueAndFormat(objectAdapter, format, repr);
+            return jvc.appendValueAndFormat(objectAdapter, format, repr, suppressExtensions);
         } else {
             final EncodableFacet encodableFacet = objectSpec.getFacet(EncodableFacet.class);
             if (encodableFacet == null) {
@@ -769,7 +789,8 @@ public final class JsonValueEncoder {
             }
             Object value = objectAdapter != null? encodableFacet.toEncodedString(objectAdapter): NullNode.getInstance();
             repr.mapPut("value", value);
-            appendFormats(repr, "string", "string");
+            appendFormats(repr, "string", "string", suppressExtensions);
+            return value;
         }
     }
     
@@ -793,11 +814,11 @@ public final class JsonValueEncoder {
     }
 
 
-    private static void appendFormats(JsonRepresentation repr, String format, String xIsisFormat) {
+    private static void appendFormats(JsonRepresentation repr, String format, String xIsisFormat, boolean suppressExtensions) {
         if(format != null) {
             repr.mapPut("format", format);
         }
-        if(xIsisFormat != null) {
+        if(!suppressExtensions && xIsisFormat != null) {
             repr.mapPut("extensions.x-isis-format", xIsisFormat);
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
index 84d512d..864ea39 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
@@ -76,7 +76,7 @@ public class ObjectActionReprRenderer extends AbstractObjectMemberReprRenderer<O
     // ///////////////////////////////////////////////////
 
     @Override
-    protected void addMutatorsIfEnabled() {
+    protected void addMutatorLinksIfEnabled() {
         if (usability().isVetoed()) {
             return;
         }
@@ -200,11 +200,16 @@ public class ObjectActionReprRenderer extends AbstractObjectMemberReprRenderer<O
 
     @Override
     protected void addLinksToFormalDomainModel() {
-        getLinks().arrayAdd(ActionDescriptionReprRenderer.newLinkToBuilder(rendererContext, Rel.DESCRIBEDBY, objectAdapter.getSpecification(), objectMember).build());
+        if(rendererContext.suppressDescribedByLinks()) {
+            return;
+        }
+        final JsonRepresentation link = ActionDescriptionReprRenderer.newLinkToBuilder(rendererContext, Rel.DESCRIBEDBY, objectAdapter.getSpecification(), objectMember).build();
+        getLinks().arrayAdd(link);
     }
 
     @Override
     protected void addLinksIsisProprietary() {
+        // umm...
         if (false /*objectMember.isContributed() */) {
             final ObjectAdapter serviceAdapter = contributingServiceAdapter();
             final JsonRepresentation contributedByLink = DomainObjectReprRenderer.newLinkToBuilder(rendererContext, Rel.CONTRIBUTED_BY, serviceAdapter).build();

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
index 7f09c09..809fe7f 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
@@ -37,26 +37,25 @@ import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.CollectionDes
 public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRenderer<ObjectCollectionReprRenderer, OneToManyAssociation> {
 
     public ObjectCollectionReprRenderer(
-            final RendererContext resourceContext) {
-        this(resourceContext, null, null, JsonRepresentation.newMap());
+            final RendererContext rendererContext) {
+        this(rendererContext, null, null, JsonRepresentation.newMap());
     }
 
     public ObjectCollectionReprRenderer(
-            final RendererContext resourceContext,
+            final RendererContext rendererContext,
             final LinkFollowSpecs linkFollowSpecs,
             final String collectionId,
             final JsonRepresentation representation) {
-        super(resourceContext, linkFollowSpecs, collectionId, RepresentationType.OBJECT_COLLECTION, representation, Where.PARENTED_TABLES);
+        super(rendererContext, linkFollowSpecs, collectionId, RepresentationType.OBJECT_COLLECTION, representation, Where.PARENTED_TABLES);
     }
 
     @Override
     public JsonRepresentation render() {
 
         renderMemberContent();
-        
-        final RenderFacet renderFacet = objectMember.getFacet(RenderFacet.class);
-        boolean eagerlyRender = renderFacet != null && renderFacet.value() == Type.EAGERLY;
-        
+
+        boolean eagerlyRender = rendererContext.honorUiHints() && renderEagerly();
+
         if ((mode.isInline() && eagerlyRender) || mode.isStandalone() || mode.isMutated() || mode.isEventSerialization() || !objectAdapter.representsPersistent()) {
             addValue();
         }
@@ -71,6 +70,11 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         return representation;
     }
 
+    private boolean renderEagerly() {
+        final RenderFacet renderFacet = objectMember.getFacet(RenderFacet.class);
+        return renderFacet != null && renderFacet.value() == Type.EAGERLY;
+    }
+
     // ///////////////////////////////////////////////////
     // value
     // ///////////////////////////////////////////////////
@@ -80,9 +84,8 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         if (valueAdapter == null) {
             return;
         }
-        
-        final RenderFacet renderFacet = objectMember.getFacet(RenderFacet.class);
-        boolean eagerlyRender = renderFacet != null && renderFacet.value() == Type.EAGERLY && rendererContext.canEagerlyRender(valueAdapter);
+
+        boolean eagerlyRender = rendererContext.honorUiHints() && renderEagerly(valueAdapter);
 
         final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(valueAdapter);
         final List<JsonRepresentation> list = Lists.newArrayList();
@@ -105,6 +108,11 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         representation.mapPut("value", list);
     }
 
+    private boolean renderEagerly(ObjectAdapter valueAdapter) {
+        final RenderFacet renderFacet = objectMember.getFacet(RenderFacet.class);
+        return renderFacet != null && renderFacet.value() == Type.EAGERLY && rendererContext.canEagerlyRender(valueAdapter);
+    }
+
     // ///////////////////////////////////////////////////
     // details link
     // ///////////////////////////////////////////////////
@@ -124,7 +132,7 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
     // ///////////////////////////////////////////////////
 
     @Override
-    protected void addMutatorsIfEnabled() {
+    protected void addMutatorLinksIfEnabled() {
         if (usability().isVetoed()) {
             return;
         }
@@ -148,8 +156,11 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
 
     @Override
     protected void addLinksToFormalDomainModel() {
-        final LinkBuilder linkBuilder = CollectionDescriptionReprRenderer.newLinkToBuilder(rendererContext, Rel.DESCRIBEDBY, objectAdapter.getSpecification(), objectMember);
-        getLinks().arrayAdd(linkBuilder.build());
+        if(rendererContext.suppressDescribedByLinks()) {
+            return;
+        }
+        final JsonRepresentation link = CollectionDescriptionReprRenderer.newLinkToBuilder(rendererContext, Rel.DESCRIBEDBY, objectAdapter.getSpecification(), objectMember).build();
+        getLinks().arrayAdd(link);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index 09e329f..f19c312 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -28,9 +28,10 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.render.RenderFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.biginteger.BigIntegerValueFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -74,7 +75,7 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
     // value
     // ///////////////////////////////////////////////////
 
-    private void addValue() {
+    private Object addValue() {
         final ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
         
         // use the runtime type if we have a value, else the compile time type of the member otherwise
@@ -96,17 +97,25 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
                     format = String.format("big-decimal(%d,%d)", precision, scale);
                 }
             } else if(specClass == java.math.BigInteger.class) {
-                // TODO: need to extend BigIntegerValueFacet similar to BigDecimalValueFacet
+                // look for facet on member, else on the value's spec
+                final BigIntegerValueFacet bigIntegerValueFacet =
+                        getFacet(BigIntegerValueFacet.class,
+                                objectMember,
+                                valueAdapter != null? valueAdapter.getSpecification(): null);
+                if(bigIntegerValueFacet != null) {
+                    format = String.format("big-integer");
+                }
             }
-            JsonValueEncoder.appendValueAndFormat(spec, valueAdapter, representation, format);
-            return;
+            return JsonValueEncoder.appendValueAndFormat(spec, valueAdapter, representation, format, rendererContext.suppressMemberExtensions());
         }
 
         final RenderFacet renderFacet = objectMember.getFacet(RenderFacet.class);
         boolean eagerlyRender = renderFacet != null && renderFacet.value() == Type.EAGERLY && rendererContext.canEagerlyRender(valueAdapter);
 
         if(valueAdapter == null) {
-            representation.mapPut("value", NullNode.getInstance());
+            final NullNode value = NullNode.getInstance();
+            representation.mapPut("value", value);
+            return value;
         } else {
             final TitleFacet titleFacet = spec.getFacet(TitleFacet.class);
             final String title = titleFacet.title(valueAdapter, rendererContext.getLocalization());
@@ -122,7 +131,9 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
                 valueLinkBuilder.withValue(renderer.render());
             }
 
-            representation.mapPut("value", valueLinkBuilder.build());
+            final JsonRepresentation valueJsonRepr = valueLinkBuilder.build();
+            representation.mapPut("value", valueJsonRepr);
+            return valueJsonRepr;
         }
     }
 
@@ -160,7 +171,7 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
     // ///////////////////////////////////////////////////
 
     @Override
-    protected void addMutatorsIfEnabled() {
+    protected void addMutatorLinksIfEnabled() {
         if (usability().isVetoed()) {
             return;
         }
@@ -207,7 +218,11 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
 
     @Override
     protected void addLinksToFormalDomainModel() {
-        getLinks().arrayAdd(PropertyDescriptionReprRenderer.newLinkToBuilder(getRendererContext(), Rel.DESCRIBEDBY, objectAdapter.getSpecification(), objectMember).build());
+        if(rendererContext.suppressDescribedByLinks()) {
+            return;
+        }
+        final JsonRepresentation link = PropertyDescriptionReprRenderer.newLinkToBuilder(getRendererContext(), Rel.DESCRIBEDBY, objectAdapter.getSpecification(), objectMember).build();
+        getLinks().arrayAdd(link);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
index 0362160..3774254 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
@@ -23,7 +23,12 @@ import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.*;
 
 /**
+ * Configure the Restful Objects viewer to emit custom representations (rather than the
+ * standard representations defined in the RO spec).
+ *
+ * <p>
  * This interface is EXPERIMENTAL and may change in the future.
+ * </p>
  */
 public interface RepresentationService {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
index c9073ce..9ff2fef 100644
--- a/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
+++ b/core/viewer-restfulobjects-rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
@@ -75,7 +75,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(String.class);
         allowingObjectAdapterToReturn("aString");
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("aString"));
 
@@ -88,7 +88,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Boolean.class);
         allowingObjectAdapterToReturn(Boolean.TRUE);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isBoolean("value"), is(true));
         assertThat(representation.getBoolean("value"), is(Boolean.TRUE));
 
@@ -100,7 +100,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(boolean.class);
         allowingObjectAdapterToReturn(true);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isBoolean("value"), is(true));
         assertThat(representation.getBoolean("value"), is(true));
 
@@ -112,7 +112,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Byte.class);
         allowingObjectAdapterToReturn(Byte.valueOf((byte)123));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getByte("value"), is(Byte.valueOf((byte)123)));
 
@@ -125,7 +125,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(byte.class);
         allowingObjectAdapterToReturn((byte)123);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getByte("value"), is((byte)123));
 
@@ -138,7 +138,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Short.class);
         allowingObjectAdapterToReturn(Short.valueOf((short)12345));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getShort("value"), is(Short.valueOf((short)12345)));
 
@@ -151,7 +151,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(short.class);
         allowingObjectAdapterToReturn((short)12345);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getShort("value"), is((short)12345));
 
@@ -164,7 +164,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Integer.class);
         allowingObjectAdapterToReturn(Integer.valueOf(12345678));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getInt("value"), is(Integer.valueOf(12345678)));
 
@@ -177,7 +177,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(int.class);
         allowingObjectAdapterToReturn(12345678);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getInt("value"), is(12345678));
 
@@ -190,7 +190,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Long.class);
         allowingObjectAdapterToReturn(Long.valueOf(12345678901234L));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getLong("value"), is(Long.valueOf(12345678901234L)));
 
@@ -203,7 +203,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(long.class);
         allowingObjectAdapterToReturn(12345678901234L);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getLong("value"), is(12345678901234L));
 
@@ -216,7 +216,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Float.class);
         allowingObjectAdapterToReturn(Float.valueOf((float)123.45));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getFloat("value"), is(Float.valueOf((float)123.45)));
 
@@ -229,7 +229,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Float.class);
         allowingObjectAdapterToReturn((float)123.45);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getFloat("value"), is((float)123.45));
 
@@ -242,7 +242,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Double.class);
         allowingObjectAdapterToReturn(Double.valueOf(12345.6789));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getDouble("value"), is(Double.valueOf(12345.6789)));
 
@@ -255,7 +255,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(double.class);
         allowingObjectAdapterToReturn(12345.6789);
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getDouble("value"), is(12345.6789));
 
@@ -268,7 +268,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Character.class);
         allowingObjectAdapterToReturn(Character.valueOf('a'));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getChar("value"), is(Character.valueOf('a')));
 
@@ -281,7 +281,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(char.class);
         allowingObjectAdapterToReturn('a');
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getChar("value"), is('a'));
 
@@ -294,7 +294,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(java.util.Date.class);
         allowingObjectAdapterToReturn(asDateTime("2014-04-25T12:34:45Z"));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z"));
 
@@ -307,7 +307,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(java.sql.Date.class);
         allowingObjectAdapterToReturn(asSqlDate("2014-04-25"));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25"));
 
@@ -320,7 +320,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(org.joda.time.DateTime.class);
         allowingObjectAdapterToReturn(new org.joda.time.DateTime(asDateTime("2014-04-25T12:34:45Z")));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z"));
 
@@ -333,7 +333,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(org.joda.time.LocalDateTime.class);
         allowingObjectAdapterToReturn(new org.joda.time.LocalDateTime(asDateTime("2014-04-25T12:34:45Z")));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z"));
 
@@ -346,7 +346,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(org.joda.time.LocalDate.class);
         allowingObjectAdapterToReturn(new org.joda.time.LocalDate(2014,4,25));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25"));
 
@@ -360,7 +360,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         final long time = asDateTime("2014-04-25T12:34:45Z").getTime();
         allowingObjectAdapterToReturn(new Timestamp(time));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null);
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false);
         assertThat(representation.isLong("value"), is(true));
         assertThat(representation.getLong("value"), is(time));
 
@@ -373,7 +373,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(BigInteger.class);
         allowingObjectAdapterToReturn(new BigInteger("12345678901234567890"));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, "big-integer(22)");
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, "big-integer(22)", false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.isBigInteger("value"), is(true));
         assertThat(representation.getBigInteger("value"), is(new BigInteger("12345678901234567890")));
@@ -387,7 +387,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(BigDecimal.class);
         allowingObjectAdapterToReturn(new BigDecimal("12345678901234567890.1234"));
 
-        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, "big-decimal(27,4)");
+        JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, "big-decimal(27,4)", false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.isBigDecimal("value"), is(true));
         assertThat(representation.getBigDecimal("value"), is(new BigDecimal("12345678901234567890.1234")));

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index 46b602a..09aa0a1 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -54,7 +54,6 @@ public class ResourceContext implements RendererContext {
     private final SecurityContext securityContext;
     private final Localization localization;
 
-    @SuppressWarnings("unused")
     private final IsisConfiguration configuration;
     private final AuthenticationSession authenticationSession;
     private final PersistenceSession persistenceSession;
@@ -67,9 +66,7 @@ public class ResourceContext implements RendererContext {
     private final String urlUnencodedQueryString;
     private JsonRepresentation readQueryStringAsMap;
 
-    //////////////////////////////////////////////////////////////////
-    // constructor and init
-    //////////////////////////////////////////////////////////////////
+    //region > constructor and init
 
     public ResourceContext(
             final RepresentationType representationType, 
@@ -145,13 +142,10 @@ public class ResourceContext implements RendererContext {
         }
     }
 
+    //endregion
 
     
-    //////////////////////////////////////////////////////////////////
-    //
-    //////////////////////////////////////////////////////////////////
-    
-    
+
     public HttpHeaders getHttpHeaders() {
         return httpHeaders;
     }
@@ -233,12 +227,10 @@ public class ResourceContext implements RendererContext {
         return securityContext;
     }
 
-
     public List<List<String>> getFollowLinks() {
         return followLinks;
     }
 
-
     public Localization getLocalization() {
         return localization;
     }
@@ -267,26 +259,81 @@ public class ResourceContext implements RendererContext {
     public IsisConfiguration getConfiguration() {
         return configuration;
     }
-    
+
+
     public Where getWhere() {
         return where;
     }
 
+
+    //region > canEagerlyRender
     private Set<Oid> rendered = Sets.newHashSet();
     @Override
     public boolean canEagerlyRender(ObjectAdapter objectAdapter) {
         final Oid oid = objectAdapter.getOid();
         return rendered.add(oid);
     }
+    //endregion
+
+    //region > configuration settings
+
+    private static final boolean HONOR_UI_HINTS_DEFAULT = false;
+
+    private static final boolean OBJECT_PROPERTY_VALUES_ONLY_DEFAULT = false;
+
+    private static final boolean SUPPRESS_DESCRIBED_BY_LINKS_DEFAULT = false;
+    private static final boolean SUPPRESS_UPDATE_LINK_DEFAULT = false;
+    private static final boolean SUPPRESS_MEMBER_ID_DEFAULT = false;
+    private static final boolean SUPPRESS_MEMBER_LINKS_DEFAULT = false;
+    private static final boolean SUPPRESS_MEMBER_EXTENSIONS_DEFAULT = false;
+    private static final boolean SUPPRESS_MEMBER_DISABLED_REASON_DEFAULT = false;
+
+    @Override
+    public boolean honorUiHints() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.honorUiHints", HONOR_UI_HINTS_DEFAULT);
+    }
 
-    //////////////////////////////////////////////////////////////////
-    //
-    //////////////////////////////////////////////////////////////////
+    @Override
+    public boolean objectPropertyValuesOnly() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.objectPropertyValuesOnly", OBJECT_PROPERTY_VALUES_ONLY_DEFAULT);
+    }
 
+    @Override
+    public boolean suppressDescribedByLinks() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.suppressDescribedByLinks", SUPPRESS_DESCRIBED_BY_LINKS_DEFAULT);
+    }
+
+    @Override
+    public boolean suppressUpdateLink() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.suppressUpdateLink", SUPPRESS_UPDATE_LINK_DEFAULT);
+    }
+
+    @Override
+    public boolean suppressMemberId() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.suppressMemberId", SUPPRESS_MEMBER_ID_DEFAULT);
+    }
+
+    @Override
+    public boolean suppressMemberLinks() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.suppressMemberLinks", SUPPRESS_MEMBER_LINKS_DEFAULT);
+    }
+
+    @Override
+    public boolean suppressMemberExtensions() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.suppressMemberExtensions", SUPPRESS_MEMBER_EXTENSIONS_DEFAULT);
+    }
+
+    @Override
+    public boolean suppressMemberDisabledReason() {
+        return getConfiguration().getBoolean("isis.viewer.restfulobjects.suppressMemberDisabledReason", SUPPRESS_MEMBER_DISABLED_REASON_DEFAULT);
+    }
+    //endregion
+
+
+    @Override
     public String urlFor(final String url) {
         return getUriInfo().getBaseUri().toString() + url;
     }
 
 
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index 44f30e6..7cdbd8c 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -99,6 +99,46 @@ public class DomainResourceHelper {
         public boolean canEagerlyRender(ObjectAdapter objectAdapter) {
             return rendererContext.canEagerlyRender(objectAdapter);
         }
+
+        @Override
+        public boolean honorUiHints() {
+            return rendererContext.honorUiHints();
+        }
+
+        @Override
+        public boolean objectPropertyValuesOnly() {
+            return rendererContext.objectPropertyValuesOnly();
+        }
+
+        @Override
+        public boolean suppressDescribedByLinks() {
+            return rendererContext.suppressDescribedByLinks();
+        }
+
+        @Override
+        public boolean suppressUpdateLink() {
+            return rendererContext.suppressUpdateLink();
+        }
+
+        @Override
+        public boolean suppressMemberId() {
+            return rendererContext.suppressMemberId();
+        }
+
+        @Override
+        public boolean suppressMemberLinks() {
+            return rendererContext.suppressMemberLinks();
+        }
+
+        @Override
+        public boolean suppressMemberExtensions() {
+            return rendererContext.suppressMemberExtensions();
+        }
+
+        @Override
+        public boolean suppressMemberDisabledReason() {
+            return rendererContext.suppressMemberDisabledReason();
+        }
     }
 
     private final RepresentationService representationService;

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
index bda9809..0a85fb6 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
@@ -20,4 +20,47 @@
 #
 
 # the baseUrl for hrefs in the events generated by the RO EventSerializer 
-isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/
\ No newline at end of file
+isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/
+
+# renders param details in the (incorrect) form that they were for GSOC2013 viewers
+# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true
+
+# whether to honor UI hints, in particular Render(EAGERLY).  Defaults to false.
+#isis.viewer.restfulobjects.honorUiHints=false
+
+
+
+###############################################################################
+# Non-standard configuration settings.
+#
+# If enabled of the following are enabled then the viewer is deviating from the
+# RO spec standard; compatibility may be compromised with RO clients.
+###############################################################################
+
+# whether to show only object properties for object members
+# (on the object representation only)
+# Takes precedence over the other 'suppress' below.
+#isis.viewer.restfulobjects.objectPropertyValuesOnly=true
+
+# whether to suppress "describedby" links.  Defaults to false.
+#isis.viewer.restfulobjects.suppressDescribedByLinks=true
+
+# whether to suppress "update" links.  Defaults to false.
+#isis.viewer.restfulobjects.suppressUpdateLink=true
+
+# whether to suppress "id" json-prop for object members.  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberId=true
+
+# whether to suppress "links" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberLinks=true
+
+# whether to suppress "extensions" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberExtensions=true
+
+# whether to suppress "disabledReason" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberDisabledReason=true
+
+###############################################################################

http://git-wip-us.apache.org/repos/asf/isis/blob/d8492e28/example/application/todoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
index 4b0a2c7..6fc3d72 100644
--- a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
+++ b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
@@ -23,4 +23,51 @@
 isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/
 
 # renders param details in the (incorrect) form that they were for GSOC2013 viewers
-# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true
\ No newline at end of file
+# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true
+
+# whether to honor UI hints, in particular Render(EAGERLY).  Defaults to false.
+#isis.viewer.restfulobjects.honorUiHints=false
+
+
+
+###############################################################################
+# Non-standard configuration settings.
+#
+# If enabled of the following are enabled then the viewer is deviating from the
+# RO spec standard; compatibility may be compromised with RO clients.
+###############################################################################
+
+# whether to show only object properties for object members
+# (on the object representation only)
+# Takes precedence over the other 'suppress' below.
+#isis.viewer.restfulobjects.objectPropertyValuesOnly=true
+isis.viewer.restfulobjects.objectPropertyValuesOnly=true
+
+# whether to suppress "describedby" links.  Defaults to false.
+#isis.viewer.restfulobjects.suppressDescribedByLinks=true
+isis.viewer.restfulobjects.suppressDescribedByLinks=true
+
+# whether to suppress "update" links.  Defaults to false.
+#isis.viewer.restfulobjects.suppressUpdateLink=true
+isis.viewer.restfulobjects.suppressUpdateLink=true
+
+# whether to suppress "id" json-prop for object members.  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberId=true
+isis.viewer.restfulobjects.suppressMemberId=true
+
+# whether to suppress "links" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberLinks=true
+isis.viewer.restfulobjects.suppressMemberLinks=true
+
+# whether to suppress "extensions" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberExtensions=true
+isis.viewer.restfulobjects.suppressMemberExtensions=true
+
+# whether to suppress "disabledReason" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberDisabledReason=true
+isis.viewer.restfulobjects.suppressMemberDisabledReason=true
+
+###############################################################################