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 <ahu...@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