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/06 16:12:53 UTC
[isis] 06/18: ISIS-1976: prepare removal of OA's lookup by pojo map
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 b3e78b7d479aa168a89e48261ffa759a7e178e78
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