You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/09/04 20:26:06 UTC

[isis] 24/24: ISIS-1976: fixes StackOverflow with ObjectAdapterContext.specificationForViewModel()

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 2c7041016faf87443befaa80eef9a0457ac1338f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 22:21:10 2018 +0200

    ISIS-1976: fixes StackOverflow with
    ObjectAdapterContext.specificationForViewModel()
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../isis/core/metamodel/adapter/ObjectAdapterProvider.java    | 11 ++++++++---
 ...RecreatableObjectFacetDeclarativeInitializingAbstract.java |  5 ++---
 .../persistence/adaptermanager/ObjectAdapterContext.java      |  6 +++---
 .../ObjectAdapterContext_ObjectAdapterProvider.java           |  2 +-
 4 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
index 92776da..ba81787 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
@@ -24,7 +24,6 @@ import java.util.function.Function;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
 /**
@@ -49,7 +48,13 @@ public interface ObjectAdapterProvider {
             final ObjectAdapter parentAdapter,
             OneToManyAssociation collection);
 
-    ObjectSpecification specificationForViewModel(final Object viewModelPojo);
+    /**
+     * @param viewModelPojo
+     * @return an ObjectAdapter 'bypassing mapping', that holds the ObjectSpecification
+     * FIXME[ISIS-1976] Note: whether or not 'bypassing mapping' should not be exposed by the API.
+     * So this further needs refactoring. 
+     */
+    ObjectAdapter specificationForViewModel(final Object viewModelPojo);
 
     ObjectAdapter adapterForViewModel(
             final Object viewModelPojo, 
@@ -80,7 +85,7 @@ public interface ObjectAdapterProvider {
         }
 
         @Programmatic
-        default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
+        default ObjectAdapter specificationForViewModel(final Object viewModelPojo) {
             return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
index 7bd3528..2b47acd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
@@ -97,7 +97,8 @@ extends RecreatableObjectFacetAbstract {
 
         final _Mementos.Memento memento = _Mementos.create(codec, serializer);
 
-        final ObjectSpecification spec = adapterProvider.specificationForViewModel(viewModelPojo);
+        final ObjectAdapter ownerAdapter = adapterProvider.specificationForViewModel(viewModelPojo);
+        final ObjectSpecification spec = ownerAdapter.getSpecification();
         
         final List<OneToOneAssociation> properties = spec.getProperties(Contributed.EXCLUDED);
         for (OneToOneAssociation property : properties) {
@@ -112,8 +113,6 @@ extends RecreatableObjectFacetAbstract {
 
             // otherwise, include
 
-            final ObjectAdapter ownerAdapter = adapterProvider.adapterFor(viewModelPojo);
-
             final ObjectAdapter propertyValueAdapter = property.get(ownerAdapter,
                     InteractionInitiatedBy.FRAMEWORK);
             if(propertyValueAdapter != null) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index 1c57ebf..e01b0df 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -297,7 +297,7 @@ public class ObjectAdapterContext {
         oidAdapterMap.add(adapter.getOid(), adapter);
     }
     
-    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+    public ObjectAdapter specificationForViewModel(Object viewModelPojo) {
         //FIXME[ISIS-1976]
         // this is horrible, but there's a catch-22 here...
         // we need an adapter in order to query the state of the object via the metamodel, on the other hand
@@ -311,12 +311,12 @@ public class ObjectAdapterContext {
                     createdTemporaryAdapter[0] = true;
                     return RootOid.create(objectSpecId, UUID.randomUUID().toString()); });
     
-        final ObjectSpecification spec = viewModelAdapter.getSpecification();
+        //final ObjectSpecification spec = viewModelAdapter.getSpecification();
         
         if(createdTemporaryAdapter[0]) {
             adapterManagerMixin.removeAdapterFromCache(viewModelAdapter);
         }
-        return spec;
+        return viewModelAdapter;
     }
 
     public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 7867db6..f54643d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -101,7 +101,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
     }
 
     @Override
-    public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+    public ObjectAdapter specificationForViewModel(Object viewModelPojo) {
         return objectAdapterContext.specificationForViewModel(viewModelPojo);
     }