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/05 18:49:13 UTC
[isis] branch ISIS-1976-rethink-object-adapters updated (67d3c09 ->
5a8b180)
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a change to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git.
from 67d3c09 ISIS-1976: prepare removal of OA's replacePojo
new 5fc28eb ISIS-1976: prepare removal of OA's lookup by pojo map
new f51d47a ISIS-1976: minor cleanup
new 5a8b180 ISIS-1976: improve the ObjectAdapterProvider interface (API)
The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../metamodel/adapter/ObjectAdapterProvider.java | 45 ++++++--
...ObjectFacetDeclarativeInitializingAbstract.java | 3 +-
.../adaptermanager/ObjectAdapterContext.java | 126 ++++++++++++---------
.../ObjectAdapterContext_AdapterManager.java | 30 +++++
...ObjectAdapterContext_ObjectAdapterProvider.java | 68 ++++++++++-
5 files changed, 210 insertions(+), 62 deletions(-)
[isis] 02/03: ISIS-1976: minor cleanup
Posted by ah...@apache.org.
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 f51d47a6f4ab7f15b5282abd0688c7c81fb15cb8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 5 18:54:49 2018 +0200
ISIS-1976: minor cleanup
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../adaptermanager/ObjectAdapterContext.java | 66 ++++++++++++----------
1 file changed, 36 insertions(+), 30 deletions(-)
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 cc59c62..a9535a6 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
@@ -41,7 +41,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.memento.Data;
-import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
/**
@@ -110,29 +109,39 @@ public class ObjectAdapterContext {
oidAdapterMap.close();
} catch(final Throwable ex) {
// ignore
- ObjectAdapterLegacy.LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
+ LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
}
try {
pojoAdapterMap.close();
} catch(final Throwable ex) {
// ignore
- ObjectAdapterLegacy.LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
+ LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
}
}
// -- CACHING
@Deprecated // don't expose caching
- public boolean containsAdapterForPojo(Object pojo) {
- return pojoAdapterMap.containsPojo(pojo);
+ protected ObjectAdapter lookupAdapterByPojo(Object pojo) {
+ return pojoAdapterMap.getAdapter(pojo);
+ }
+
+ private void putPojo(Object pojo, ObjectAdapter adapter) {
+ pojoAdapterMap.add(adapter.getObject(), adapter);
}
+ private void removePojo(ObjectAdapter adapter) {
+ pojoAdapterMap.remove(adapter);
+ }
+
+ // --
+
@Deprecated // don't expose caching
- protected ObjectAdapter lookupAdapterByPojo(Object pojo) {
- return pojoAdapterMap.getAdapter(pojo);
+ public boolean containsAdapterForPojo(Object pojo) {
+ return lookupAdapterByPojo(pojo)!=null;
}
-
+
@Deprecated // don't expose caching
protected ObjectAdapter lookupAdapterById(Oid oid) {
return oidAdapterMap.getAdapter(oid);
@@ -147,7 +156,7 @@ public class ObjectAdapterContext {
if (oid != null) { // eg. value objects don't have an Oid
oidAdapterMap.add(oid, adapter);
}
- pojoAdapterMap.add(adapter.getObject(), adapter);
+ putPojo(adapter.getObject(), adapter);
}
@Deprecated // don't expose caching
@@ -160,7 +169,7 @@ public class ObjectAdapterContext {
if (oid != null) { // eg. value objects don't have an Oid
oidAdapterMap.remove(oid);
}
- pojoAdapterMap.remove(adapter);
+ removePojo(adapter);
}
// -- CACHE CONSISTENCY
@@ -299,7 +308,7 @@ public class ObjectAdapterContext {
// add all aggregated collections
final ObjectSpecification objSpec = adapter.getSpecification();
if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
- pojoAdapterMap.add(pojo, adapter);
+ putPojo(pojo, adapter);
}
// order is important - add to pojo map first, then identity map
@@ -382,16 +391,16 @@ public class ObjectAdapterContext {
}
// associate root adapter with the new Oid, and remap
- if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
- ObjectAdapterLegacy.LOG.debug("replacing root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("replacing root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
}
final ObjectAdapter adapterReplacement = adapter.withOid(persistedRootOid);
replaceRootAdapter(adapterReplacement, rootAndCollectionAdapters);
- if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
- ObjectAdapterLegacy.LOG.debug("made persistent {}; was {}", adapterReplacement, transientRootOid);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("made persistent {}; was {}", adapterReplacement, transientRootOid);
}
}
@@ -403,11 +412,8 @@ public class ObjectAdapterContext {
final RootOid persistedRootOid = (RootOid) adapterReplacement.getOid();
-// oidAdapterMap.add(persistedRootOid, adapterReplacement);
-// pojoAdapterMap.add(adapterReplacement.getObject(), adapterReplacement);
-
// associate the collection adapters with new Oids, and re-map
- ObjectAdapterLegacy.LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
+ LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
@@ -417,8 +423,8 @@ public class ObjectAdapterContext {
// some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
// proxy equivalent. So, ensure that the collection adapters still wrap the correct pojos.
- if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
- ObjectAdapterLegacy.LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
}
for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
@@ -427,9 +433,9 @@ public class ObjectAdapterContext {
final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapterReplacement);
if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
- pojoAdapterMap.remove(collectionAdapter);
+ removePojo(collectionAdapter);
final ObjectAdapter newCollectionAdapter = collectionAdapter.withPojo(collectionPojoActuallyOnPojo);
- pojoAdapterMap.add(collectionPojoActuallyOnPojo, newCollectionAdapter);
+ putPojo(collectionPojoActuallyOnPojo, newCollectionAdapter);
}
}
@@ -438,17 +444,17 @@ public class ObjectAdapterContext {
private void removeFromCache(
final RootAndCollectionAdapters rootAndCollectionAdapters,
final RootOid transientRootOid) {
- ObjectAdapterLegacy.LOG.debug("remapAsPersistent: {}", transientRootOid);
- ObjectAdapterLegacy.LOG.debug("removing root adapter from oid map");
+ LOG.debug("remapAsPersistent: {}", transientRootOid);
+ LOG.debug("removing root adapter from oid map");
boolean removed = oidAdapterMap.remove(transientRootOid);
if (!removed) {
- ObjectAdapterLegacy.LOG.warn("could not remove oid: {}", transientRootOid);
+ LOG.warn("could not remove oid: {}", transientRootOid);
// should we fail here with a more serious error?
}
- if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
- ObjectAdapterLegacy.LOG.debug("removing collection adapter(s) from oid map");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("removing collection adapter(s) from oid map");
}
for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
final Oid collectionOid = collectionAdapter.getOid();
@@ -471,8 +477,8 @@ public class ObjectAdapterContext {
@Deprecated
public ObjectAdapter remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
final ObjectAdapter newAdapter = adapter.withPojo(pojo);
- pojoAdapterMap.remove(adapter);
- pojoAdapterMap.remove(newAdapter);
+ removePojo(adapter);
+ removePojo(newAdapter);
oidAdapterMap.remove(adapter.getOid());
oidAdapterMap.remove(newAdapter.getOid());
[isis] 03/03: ISIS-1976: improve the ObjectAdapterProvider
interface (API)
Posted by ah...@apache.org.
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 5a8b180a8337a1d9072f94623af1afa7888ce085
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 5 20:41:07 2018 +0200
ISIS-1976: improve the ObjectAdapterProvider interface (API)
also prepare for removal of the OA by pojo lookup map
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../metamodel/adapter/ObjectAdapterProvider.java | 28 ++++++++--
...ObjectFacetDeclarativeInitializingAbstract.java | 3 +-
.../adaptermanager/ObjectAdapterContext.java | 64 ++++++++++++++--------
.../ObjectAdapterContext_AdapterManager.java | 30 ++++++++++
...ObjectAdapterContext_ObjectAdapterProvider.java | 11 +++-
5 files changed, 103 insertions(+), 33 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 e799f5d..fef5bf7 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
@@ -25,6 +25,7 @@ import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
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;
/**
@@ -56,12 +57,19 @@ public interface ObjectAdapterProvider {
OneToManyAssociation collection);
/**
- * @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.
+ * Returns an ObjectAdapter that holds the ObjectSpecification used for
+ * interrogating the domain object's metadata.
+ * <p>
+ * Does _not_ perform dependency injection on the domain object. Also bypasses
+ * caching (if any), that is each call to this method creates a new unique instance.
+ * </p>
+ *
+ * @param viewModelPojo domain object
+ * @return
*/
- ObjectAdapter specificationForViewModel(final Object viewModelPojo);
+ ObjectAdapter disposableAdapterForViewModel(Object viewModelPojo);
+
+ ObjectSpecification specificationForViewModel(Object viewModelPojo);
ObjectAdapter adapterForViewModel(
final Object viewModelPojo,
@@ -97,7 +105,12 @@ public interface ObjectAdapterProvider {
}
@Programmatic
- default ObjectAdapter specificationForViewModel(final Object viewModelPojo) {
+ default ObjectAdapter disposableAdapterForViewModel(final Object viewModelPojo) {
+ return getObjectAdapterProvider().disposableAdapterForViewModel(viewModelPojo);
+ }
+
+ @Programmatic
+ default ObjectSpecification specificationForViewModel(Object viewModelPojo) {
return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
}
@@ -116,6 +129,9 @@ public interface ObjectAdapterProvider {
}
+
+
+
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 2b47acd..97cc65e 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
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
import java.util.List;
import java.util.Set;
+import java.util.UUID;
import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
import org.apache.isis.commons.internal.memento._Mementos;
@@ -97,7 +98,7 @@ extends RecreatableObjectFacetAbstract {
final _Mementos.Memento memento = _Mementos.create(codec, serializer);
- final ObjectAdapter ownerAdapter = adapterProvider.specificationForViewModel(viewModelPojo);
+ final ObjectAdapter ownerAdapter = adapterProvider.disposableAdapterForViewModel(viewModelPojo);
final ObjectSpecification spec = ownerAdapter.getSpecification();
final List<OneToOneAssociation> properties = spec.getProperties(Contributed.EXCLUDED);
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 a9535a6..5ebfe1f 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
@@ -19,13 +19,16 @@
package org.apache.isis.core.runtime.system.persistence.adaptermanager;
import java.util.List;
+import java.util.Objects;
import java.util.UUID;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.isis.commons.internal.functions._Predicates;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.ensure.Ensure;
import org.apache.isis.core.commons.ensure.IsisAssertException;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
@@ -66,6 +69,7 @@ public class ObjectAdapterContext {
private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
+ private final OidAdapterHashMap oidAdapterMap2 = new OidAdapterHashMap();
private final PersistenceSession persistenceSession;
private final ServicesInjector servicesInjector;
private final SpecificationLoader specificationLoader;
@@ -100,6 +104,7 @@ public class ObjectAdapterContext {
public void open() {
oidAdapterMap.open();
pojoAdapterMap.open();
+ oidAdapterMap2.open();
initServices();
}
@@ -107,6 +112,7 @@ public class ObjectAdapterContext {
try {
oidAdapterMap.close();
+ oidAdapterMap2.close();
} catch(final Throwable ex) {
// ignore
LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
@@ -120,22 +126,45 @@ public class ObjectAdapterContext {
}
}
- // -- CACHING
+ // -- CACHING DEPR.
@Deprecated // don't expose caching
protected ObjectAdapter lookupAdapterByPojo(Object pojo) {
- return pojoAdapterMap.getAdapter(pojo);
+ final ObjectAdapter adapter = pojoAdapterMap.getAdapter(pojo);
+ if(adapter!=null) {
+ Oid y = adapter.getOid();
+ Objects.requireNonNull(y);
+
+ Oid x = objectAdapterProviderMixin.oidFor(pojo);
+ Objects.requireNonNull(x);
+
+ //FIXME[ISIS-1976] oids must match
+ //Ensure.ensureThatArg(x, _Predicates.equalTo(y), ()->String.format("x: %s\ny: %s", ""+x, ""+y));
+ }
+ return adapter;
}
private void putPojo(Object pojo, ObjectAdapter adapter) {
+
+ Oid x = objectAdapterProviderMixin.oidFor(pojo);
+ Oid y = adapter.getOid();
+ Objects.requireNonNull(y);
+
+ //FIXME[ISIS-1976] oids must match
+ //Ensure.ensureThatArg(x, _Predicates.equalTo(y), ()->String.format("x: %s\ny: %s", ""+x, ""+y));
+
+ oidAdapterMap2.add(adapter.getOid(), adapter);
pojoAdapterMap.add(adapter.getObject(), adapter);
}
private void removePojo(ObjectAdapter adapter) {
+ Oid y = adapter.getOid();
+ Objects.requireNonNull(y);
+ oidAdapterMap2.remove(y);
pojoAdapterMap.remove(adapter);
}
- // --
+ // -- CACHING
@Deprecated // don't expose caching
public boolean containsAdapterForPojo(Object pojo) {
@@ -315,28 +344,15 @@ public class ObjectAdapterContext {
oidAdapterMap.add(adapter.getOid(), adapter);
}
- 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
- // we can't create an adapter without the identifier, which is what we're trying to derive
- // so... we create a temporary transient adapter, use it to wrap this adapter and interrogate this pojo,
- // then throw away that adapter (remove from the adapter map)
- final boolean[] createdTemporaryAdapter = {false};
- final ObjectAdapter viewModelAdapter = adapterForViewModel(
- viewModelPojo,
- (ObjectSpecId objectSpecId)->{
- createdTemporaryAdapter[0] = true;
- return RootOid.create(objectSpecId, UUID.randomUUID().toString()); });
-
- //final ObjectSpecification spec = viewModelAdapter.getSpecification();
-
- if(createdTemporaryAdapter[0]) {
- adapterManagerMixin.removeAdapterFromCache(viewModelAdapter);
- }
- return viewModelAdapter;
+ public ObjectAdapter disposableAdapterForViewModel(Object viewModelPojo) {
+ final ObjectSpecification objectSpecification =
+ specificationLoader.loadSpecification(viewModelPojo.getClass());
+ final ObjectSpecId objectSpecId = objectSpecification.getSpecId();
+ final RootOid newRootOid = RootOid.create(objectSpecId, UUID.randomUUID().toString());
+ final ObjectAdapter createdAdapter = adapterManagerMixin.createRootOrAggregatedAdapter(newRootOid, viewModelPojo);
+ return createdAdapter;
}
-
+
public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
ObjectAdapter viewModelAdapter = adapterManagerMixin.lookupAdapterFor(viewModelPojo);
if(viewModelAdapter == null) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java
index f88f5f8..e60d247 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_AdapterManager.java
@@ -178,6 +178,36 @@ class ObjectAdapterContext_AdapterManager {
return adapter;
}
+ ObjectAdapter injectServices(final ObjectAdapter adapter) {
+ // since the whole point of this method is to map an adapter that's just been created.
+ // so we *don't* call ensureMapsConsistent(adapter);
+
+ Assert.assertNotNull(adapter);
+ final Object pojo = adapter.getObject();
+
+ if (LOG.isDebugEnabled()) {
+ // don't interact with the underlying object because may be a ghost
+ // and would trigger a resolve
+ // don't call toString() on adapter because calls hashCode on
+ // underlying object, may also trigger a resolve.
+ LOG.debug("adding identity for adapter with oid={}", adapter.getOid());
+ }
+
+ // value adapters are not mapped (but all others - root and aggregated adapters - are)
+ if (adapter.isValue()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("not mapping value adapter");
+ }
+ servicesInjector.injectServicesInto(pojo);
+ return adapter;
+ }
+
+ // must inject after mapping, otherwise infinite loop
+ servicesInjector.injectServicesInto(pojo);
+
+ return adapter;
+ }
+
ObjectAdapter createRootOrAggregatedAdapter(final Oid oid, final Object pojo) {
final ObjectAdapter createdAdapter;
if(oid instanceof RootOid) {
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 ba820e3..77545ab 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
@@ -116,8 +116,15 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
}
@Override
- public ObjectAdapter specificationForViewModel(Object viewModelPojo) {
- return objectAdapterContext.specificationForViewModel(viewModelPojo);
+ public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
+ final ObjectSpecification objectSpecification =
+ specificationLoader.loadSpecification(viewModelPojo.getClass());
+ return objectSpecification;
+ }
+
+ @Override
+ public ObjectAdapter disposableAdapterForViewModel(Object viewModelPojo) {
+ return objectAdapterContext.disposableAdapterForViewModel(viewModelPojo);
}
@Override
[isis] 01/03: ISIS-1976: prepare removal of OA's lookup by pojo map
Posted by ah...@apache.org.
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 5fc28ebe7be5de1337813c91ed4dbcbabe594ae8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 5 18:21:35 2018 +0200
ISIS-1976: prepare removal of OA's lookup by pojo map
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../metamodel/adapter/ObjectAdapterProvider.java | 17 ++++++-
...ObjectAdapterContext_ObjectAdapterProvider.java | 57 ++++++++++++++++++++++
2 files changed, 73 insertions(+), 1 deletion(-)
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 ba81787..e799f5d 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
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.function.Function;
import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -36,6 +37,12 @@ public interface ObjectAdapterProvider {
// -- INTERFACE
/**
+ * @param pojo
+ * @return oid for the given domain object
+ */
+ Oid oidFor(Object domainObject);
+
+ /**
* @return standalone (value) or root adapter
*/
ObjectAdapter adapterFor(Object domainObject);
@@ -44,7 +51,7 @@ public interface ObjectAdapterProvider {
* @return collection adapter.
*/
ObjectAdapter adapterFor(
- final Object pojo,
+ final Object domainObject,
final ObjectAdapter parentAdapter,
OneToManyAssociation collection);
@@ -72,6 +79,11 @@ public interface ObjectAdapterProvider {
ObjectAdapterProvider getObjectAdapterProvider();
@Programmatic
+ default Oid oidFor(Object domainObject) {
+ return getObjectAdapterProvider().oidFor(domainObject);
+ }
+
+ @Programmatic
default ObjectAdapter adapterFor(Object domainObject) {
return getObjectAdapterProvider().adapterFor(domainObject);
}
@@ -102,6 +114,9 @@ public interface ObjectAdapterProvider {
}
}
+
+
+
}
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 f54643d..ba820e3 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
@@ -28,6 +28,7 @@ import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -63,6 +64,20 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
}
@Override
+ public Oid oidFor(Object pojo) {
+ if(pojo == null) {
+ return null;
+ }
+ final Oid persistentOrValueOid = persistentOrValueOid(pojo);
+ if(persistentOrValueOid != null) {
+ return persistentOrValueOid;
+ }
+ // Creates a new transient root for the supplied domain object
+ final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
+ return rootOid;
+ }
+
+ @Override
public ObjectAdapter adapterFor(Object pojo) {
if(pojo == null) {
@@ -135,6 +150,48 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
// -- HELPER
+ private Oid persistentOrValueOid(Object pojo) {
+
+ Oid oid;
+
+ // equivalent to isInstanceOfPersistable = pojo instanceof Persistable;
+ final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin.isPersistenceEnhanced(pojo.getClass());
+
+ // pojo may have been lazily loaded by object store, but we haven't yet seen it
+ if (isInstanceOfPersistable) {
+ oid = persistentOid(pojo);
+
+ // TODO: could return null if the pojo passed in !dnIsPersistent() || !dnIsDetached()
+ // in which case, we would ought to map as a transient object, rather than fall through and treat as a value?
+ } else {
+ oid = null;
+ }
+
+ if(oid != null) {
+ return oid;
+ }
+
+ // need to create (and possibly map) the adapter.
+ final ObjectSpecification objSpec = specificationLoader.loadSpecification(pojo.getClass());
+
+ // we create value facets as standalone (so not added to maps)
+ if (objSpec.containsFacet(ValueFacet.class)) {
+ //TODO[ISIS-1976] don't need an adapter, just its oid
+ oid = objectAdapterContext.getFactories().createStandaloneAdapter(pojo).getOid();
+ return oid;
+ }
+
+ return null;
+ }
+
+ protected Oid persistentOid(final Object pojo) {
+ if (persistenceSession.getPersistenceManager().getObjectId(pojo) == null) {
+ return null;
+ }
+ final RootOid oid = persistenceSession.createPersistentOrViewModelOid(pojo);
+ return oid;
+ }
+
private ObjectAdapter existingOrValueAdapter(Object pojo) {
// attempt to locate adapter for the pojo