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);
}