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 2013/05/28 17:13:53 UTC

[1/3] git commit: ISIS-414: ensure that sessions can close correctly.

Updated Branches:
  refs/heads/master 11f4c2e76 -> 1ba8a4b1f


ISIS-414: ensure that sessions can close correctly.

* so don't get HSQLDB locking issues after a stackoverflow failure.


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

Branch: refs/heads/master
Commit: b2a6e66a88b77c419e3890eb0ac46f8ac95f635f
Parents: 11f4c2e
Author: Dan Haywood <da...@apache.org>
Authored: Tue May 28 16:10:26 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue May 28 16:10:26 2013 +0100

----------------------------------------------------------------------
 .../jdo/datanucleus/DataNucleusObjectStore.java    |   20 +++++++++------
 .../system/persistence/PersistenceSession.java     |   19 ++++++++++++--
 2 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/b2a6e66a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
index 0928313..103bc93 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
@@ -174,17 +174,21 @@ public class DataNucleusObjectStore implements ObjectStoreSpi {
         ensureOpened();
         ensureThatState(persistenceManager, is(notNullValue()));
 
-        final IsisTransaction currentTransaction = getTransactionManager().getTransaction();
-        if (currentTransaction != null && !currentTransaction.getState().isComplete()) {
-            if(currentTransaction.getState().canCommit()) {
-                getTransactionManager().endTransaction();
-            } else if(currentTransaction.getState().canAbort()) {
-                getTransactionManager().abortTransaction();
+        try {
+            final IsisTransaction currentTransaction = getTransactionManager().getTransaction();
+            if (currentTransaction != null && !currentTransaction.getState().isComplete()) {
+                if(currentTransaction.getState().canCommit()) {
+                    getTransactionManager().endTransaction();
+                } else if(currentTransaction.getState().canAbort()) {
+                    getTransactionManager().abortTransaction();
+                }
             }
+        } finally {
+            // make sure release everything ok.
+            persistenceManager.close();
+            state = State.CLOSED;
         }
 
-        persistenceManager.close();
-        state = State.CLOSED;
     }
 
     private PersistenceManager openSession() {

http://git-wip-us.apache.org/repos/asf/isis/blob/b2a6e66a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index f946bd6..9b39e3c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -239,10 +239,23 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
             LOG.debug("closing " + this);
         }
 
-        objectStore.close();
+        try {
+            objectStore.close();
+        } catch(RuntimeException ex) {
+            // ignore
+        }
 
-        adapterManager.close();
-        objectFactory.close();
+        try {
+            adapterManager.close();
+        } catch(RuntimeException ex) {
+            // ignore
+        }
+        
+        try {
+            objectFactory.close();
+        } catch(RuntimeException ex) {
+            // ignore
+        }
 
         setState(State.CLOSED);
     }


[2/3] git commit: ISIS-413: fix for null LocalDates when rendered.

Posted by da...@apache.org.
ISIS-413: fix for null LocalDates when rendered.


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

Branch: refs/heads/master
Commit: 76d5bd62251598b6b8777353f0f0c28acf23de7d
Parents: b2a6e66
Author: Dan Haywood <da...@apache.org>
Authored: Tue May 28 16:11:31 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue May 28 16:11:31 2013 +0100

----------------------------------------------------------------------
 .../rendering/domainobjects/JsonValueEncoder.java  |   25 ++++++++++-----
 1 files changed, 17 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/76d5bd62/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index c7c85e0..dc59306 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -309,9 +309,14 @@ public final class JsonValueEncoder {
 
             @Override
             public void appendValueAndFormat(ObjectAdapter objectAdapter, JsonRepresentation repr) {
-                final LocalDate date = (LocalDate) unwrap(objectAdapter);
-                final String dateStr = yyyyMMdd.print(date.toDateTimeAtStartOfDay());
-                append(repr, dateStr, format, xIsisFormat);
+                final Object obj = unwrap(objectAdapter);
+                if(obj instanceof LocalDate) {
+                    final LocalDate date = (LocalDate) obj;
+                    final String dateStr = yyyyMMdd.print(date.toDateTimeAtStartOfDay());
+                    append(repr, dateStr, format, xIsisFormat);
+                } else {
+                    append(repr, obj, format, xIsisFormat);
+                }
             }
         });
 
@@ -330,15 +335,19 @@ public final class JsonValueEncoder {
                 }
                 return null;
             }
-    
+
             @Override
             public void appendValueAndFormat(ObjectAdapter objectAdapter, JsonRepresentation repr) {
-                final LocalDateTime date = (LocalDateTime) unwrap(objectAdapter);
-                final String dateStr = yyyyMMddHHmmss.print(date.toDateTime());
-                append(repr, dateStr, format, xIsisFormat);
+                final Object obj = unwrap(objectAdapter); 
+                if(obj instanceof LocalDateTime) {
+                    final LocalDateTime date = (LocalDateTime) obj;
+                    final String dateStr = yyyyMMddHHmmss.print(date.toDateTime());
+                    append(repr, dateStr, format, xIsisFormat);
+                } else {
+                    append(repr, obj, format, xIsisFormat);
+                }
             }
         });
-        
     }
 
 


[3/3] git commit: ISIS-411: eager rendering of properties in RO.

Posted by da...@apache.org.
ISIS-411: eager rendering of properties in RO.

Also includes checking to prevent infinite loops
(eg a bidirectional relationship, both sides eagerly rendered).


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

Branch: refs/heads/master
Commit: 1ba8a4b1fece0937b5d2ed4b647607d503db9760
Parents: 76d5bd6
Author: Dan Haywood <da...@apache.org>
Authored: Tue May 28 16:13:24 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue May 28 16:13:24 2013 +0100

----------------------------------------------------------------------
 .../restfulobjects/rendering/RendererContext.java  |   13 +++++
 .../AbstractObjectMemberReprRenderer.java          |   14 ++++-
 .../domainobjects/DomainObjectReprRenderer.java    |   39 ++++++---------
 .../ObjectCollectionReprRenderer.java              |   13 ++++-
 .../domainobjects/ObjectPropertyReprRenderer.java  |   38 +++++++++++++-
 .../EventSerializerRendererContext.java            |   13 +++++
 .../restfulobjects/server/ResourceContext.java     |   11 ++++
 7 files changed, 110 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
index f9fee3a..36d6520 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
@@ -20,11 +20,14 @@ package org.apache.isis.viewer.restfulobjects.rendering;
 
 import java.util.List;
 
+import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 
 public interface RendererContext {
 
@@ -41,5 +44,15 @@ public interface RendererContext {
     public Where getWhere();
     
     public Localization getLocalization();
+    
+    /**
+     * To avoid infinite loops when {@link Render.Type#EAGERLY eagerly} rendering graphs
+     * of objects as {@link DomainObjectReprRenderer#asEventSerialization() events}.
+     * 
+     * <p>
+     * @param objectAdapter - the object proposed to be rendered eagerly 
+     * @return whether this adapter has already been rendered (implying the caller should not render the value).
+     */
+    public boolean canEagerlyRender(ObjectAdapter objectAdapter);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
index 84c8ef4..936e207 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
-import javax.ws.rs.core.MediaType;
+import org.codehaus.jackson.node.NullNode;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -30,12 +30,11 @@ import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
-import org.codehaus.jackson.node.NullNode;
 
 public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbstract<R, ObjectAndMember<T>>, T extends ObjectMember> extends ReprRendererAbstract<R, ObjectAndMember<T>> {
 
     protected enum Mode {
-        INLINE, FOLLOWED, STANDALONE, MUTATED, ARGUMENTS;
+        INLINE, FOLLOWED, STANDALONE, MUTATED, ARGUMENTS, EVENT_SERIALIZATION;
 
         public boolean isInline() {
             return this == INLINE;
@@ -56,6 +55,10 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
         public boolean isArguments() {
             return this == ARGUMENTS;
         }
+        
+        public boolean isEventSerialization() {
+            return this == EVENT_SERIALIZATION;
+        }
     }
 
     protected ObjectAdapterLinkTo linkTo;
@@ -113,6 +116,11 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
         return cast(this);
     }
 
+    public R asEventSerialization() {
+        mode = Mode.EVENT_SERIALIZATION;
+        return cast(this);
+    }
+
     /**
      * Indicate that this is a representation to include as the result of a
      * followed link.

http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index eefb967..caed176 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -89,6 +89,10 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         public boolean checkVisibility() {
             return checkVisibility;
         }
+
+        public boolean isEventSerialization() {
+            return this == EVENT_SERIALIZATION;
+        }
     }
 
     private ObjectAdapterLinkTo linkToBuilder;
@@ -164,7 +168,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         if (!mode.representsArguments()) {
             // update/persist
             addPersistLinkIfTransientAndPersistable();
-            addUpdatePropertiesLinkIfPersistentAndNotService();
+            addUpdatePropertiesLinkIfRequired();
 
             // extensions
             final boolean isService = objectAdapter.getSpecification().isService();
@@ -217,7 +221,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         final List<ObjectAssociation> associations = objectAdapter.getSpecification().getAssociations();
         addAssociations(objectAdapter, members, associations);
 
-        if (!mode.representsArguments()) {
+        if (!mode.representsArguments() && !mode.isEventSerialization()) {
             final List<ObjectAction> actions = objectAdapter.getSpecification().getObjectActions(Contributed.INCLUDED);
             addActions(objectAdapter, actions, members);
         }
@@ -245,6 +249,9 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
                 if (mode.representsArguments()) {
                     renderer.asArguments();
                 }
+                if(mode.isEventSerialization()) {
+                    renderer.asEventSerialization();
+                }
 
                 members.mapPut(assoc.getId(), renderer.render());
             }
@@ -259,6 +266,9 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
                 final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(getRendererContext(), linkFollower, collection.getId(), JsonRepresentation.newMap());
 
                 renderer.with(new ObjectAndCollection(objectAdapter, collection)).usingLinkTo(linkToBuilder);
+                if(mode.isEventSerialization()) {
+                    renderer.asEventSerialization();
+                }
 
                 members.mapPut(assoc.getId(), renderer.render());
             }
@@ -320,7 +330,10 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
     }
 
 
-    private void addUpdatePropertiesLinkIfPersistentAndNotService() {
+    private void addUpdatePropertiesLinkIfRequired() {
+        if(mode.isEventSerialization()) {
+            return;
+        }
         if (!objectAdapter.representsPersistent()) {
             return;
         }
@@ -340,26 +353,6 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
     //
     // ///////////////////////////////////////////////////////////////////
 
-    public static void appendValueAndFormatOrRef(final RendererContext resourceContext, final ObjectAdapter objectAdapter, final ObjectSpecification objectSpec, JsonRepresentation repr) {
-
-        final ValueFacet valueFacet = objectSpec.getFacet(ValueFacet.class);
-        if (valueFacet != null) {
-            JsonValueEncoder.appendValueAndFormat(objectSpec, objectAdapter, repr);
-            return;
-        }
-
-        if(objectAdapter == null) {
-            repr.mapPut("value", NullNode.getInstance());
-        } else {
-            final TitleFacet titleFacet = objectSpec.getFacet(TitleFacet.class);
-            final String title = titleFacet.title(objectAdapter, resourceContext.getLocalization());
-            JsonRepresentation ref = DomainObjectReprRenderer.newLinkToBuilder(resourceContext, Rel.VALUE, objectAdapter).withTitle(title).build();
-            
-            repr.mapPut("value", ref);
-        }
-
-    }
-
     public static Object valueOrRef(final RendererContext resourceContext, final ObjectAdapter objectAdapter, final ObjectSpecification objectSpec) {
         final ValueFacet valueFacet = objectSpec.getFacet(ValueFacet.class);
         if (valueFacet != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
index 4a7371a..ad102d2 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
@@ -48,10 +48,12 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         // id and memberType are rendered eagerly
 
         renderMemberContent();
-        if (mode.isStandalone() || mode.isMutated() || !objectAdapter.representsPersistent()) {
+        if (mode.isStandalone() || mode.isMutated() || mode.isEventSerialization() || !objectAdapter.representsPersistent()) {
             addValue();
         }
-        putDisabledReasonIfDisabled();
+        if(!mode.isEventSerialization()) {
+            putDisabledReasonIfDisabled();
+        }
 
         if (mode.isStandalone() || mode.isMutated()) {
             addExtensionsIsisProprietaryChangedObjects();
@@ -71,7 +73,7 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         }
         
         final RenderFacet renderFacet = objectMember.getFacet(RenderFacet.class);
-        boolean eagerlyRender = renderFacet != null && renderFacet.value() == Type.EAGERLY;
+        boolean eagerlyRender = renderFacet != null && renderFacet.value() == Type.EAGERLY && rendererContext.canEagerlyRender(valueAdapter);
 
         final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(valueAdapter);
         final List<JsonRepresentation> list = Lists.newArrayList();
@@ -81,6 +83,10 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
             if(eagerlyRender) {
                 final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(getRendererContext(), getLinkFollowSpecs(), JsonRepresentation.newMap());
                 renderer.with(elementAdapter);
+                if(mode.isEventSerialization()) {
+                    renderer.asEventSerialization();
+                }
+
                 valueLinkBuilder.withValue(renderer.render());
             }
 
@@ -148,4 +154,5 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         getExtensions().mapPut("collectionSemantics", semantics.name().toLowerCase());
     }
 
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index d83134c..69cb666 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -20,12 +20,17 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.annotation.Render.Type;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.members.resolve.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.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
+import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.PropertyDescriptionReprRenderer;
@@ -64,11 +69,40 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
         final ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
         
         // use the runtime type if we have a value, else the compile time type of the member otherwise
-        final ObjectSpecification specification = valueAdapter != null? valueAdapter.getSpecification(): objectMember.getSpecification();
+        final ObjectSpecification spec = valueAdapter != null? valueAdapter.getSpecification(): objectMember.getSpecification();
         
-        DomainObjectReprRenderer.appendValueAndFormatOrRef(rendererContext, valueAdapter, specification, representation);
+        final ValueFacet valueFacet = spec.getFacet(ValueFacet.class);
+        if (valueFacet != null) {
+            JsonValueEncoder.appendValueAndFormat(spec, valueAdapter, representation);
+            return;
+        }
+
+        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());
+        } else {
+            final TitleFacet titleFacet = spec.getFacet(TitleFacet.class);
+            final String title = titleFacet.title(valueAdapter, rendererContext.getLocalization());
+            
+            final LinkBuilder valueLinkBuilder = DomainObjectReprRenderer.newLinkToBuilder(rendererContext, Rel.VALUE, valueAdapter).withTitle(title);
+            if(eagerlyRender) {
+                final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(rendererContext, getLinkFollowSpecs(), JsonRepresentation.newMap());
+                renderer.with(valueAdapter);
+                if(mode.isEventSerialization()) {
+                    renderer.asEventSerialization();
+                }
+
+                valueLinkBuilder.withValue(renderer.render());
+            }
+
+            representation.mapPut("value", valueLinkBuilder.build());
+        }
     }
 
+
+    
     // ///////////////////////////////////////////////////
     // details link
     // ///////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/EventSerializerRendererContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/EventSerializerRendererContext.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/EventSerializerRendererContext.java
index a62314f..d0731ca 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/EventSerializerRendererContext.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/EventSerializerRendererContext.java
@@ -20,11 +20,17 @@ package org.apache.isis.viewer.restfulobjects.rendering.eventserializer;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
@@ -74,5 +80,12 @@ public class EventSerializerRendererContext implements RendererContext {
         return IsisContext.getLocalization();
     }
 
+    private Set<Oid> rendered = Sets.newHashSet();
+    @Override
+    public boolean canEagerlyRender(ObjectAdapter objectAdapter) {
+        final Oid oid = objectAdapter.getOid();
+        return rendered.add(oid);
+    }
+    
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1ba8a4b1/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index 16edd2c..b9204c3 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -37,6 +38,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
@@ -51,6 +53,7 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class ResourceContext implements RendererContext {
 
@@ -281,6 +284,12 @@ public class ResourceContext implements RendererContext {
         return where;
     }
 
+    private Set<Oid> rendered = Sets.newHashSet();
+    @Override
+    public boolean canEagerlyRender(ObjectAdapter objectAdapter) {
+        final Oid oid = objectAdapter.getOid();
+        return rendered.add(oid);
+    }
 
     //////////////////////////////////////////////////////////////////
     //
@@ -290,4 +299,6 @@ public class ResourceContext implements RendererContext {
         return getUriInfo().getBaseUri().toString() + url;
     }
 
+
+
 }