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 <ahu...@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); }