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 2ce76eb32b2e1d363b8957d3e28cd4086dd499af Author: Andi Huber <ahu...@apache.org> AuthorDate: Sun Sep 9 01:10:04 2018 +0200 ISIS-1976: let OAs for values also have an Oid Task-Url: https://issues.apache.org/jira/browse/ISIS-1976 --- .../isis/core/metamodel/adapter/oid/Oid.java | 19 ++- .../isis/core/metamodel/adapter/oid/RootOid.java | 4 - .../runtime/persistence/adapter/PojoAdapter.java | 12 +- .../PersistenceSessionServiceInternalDefault.java | 4 +- .../adaptermanager/ObjectAdapterContext.java | 2 +- ...ObjectAdapterContext_ObjectAdapterProvider.java | 132 ++------------------- .../persistence/adaptermanager/OidProviders.java | 21 +--- .../model/mementos/ObjectAdapterMemento.java | 5 - 8 files changed, 27 insertions(+), 172 deletions(-) diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java index 0b9a201..e087e12 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java @@ -59,16 +59,15 @@ public interface Oid extends Encodable { boolean isViewModel(); boolean isPersistent(); + + default boolean isValue() { + return false; + } public static enum State { - PERSISTENT("P"), - TRANSIENT("T"), - VIEWMODEL("V"); - - private final String code; - private State(final String code) { - this.code = code; - } + PERSISTENT, + TRANSIENT, + VIEWMODEL; public boolean isTransient() { return this == TRANSIENT; @@ -80,10 +79,6 @@ public interface Oid extends Encodable { return this == PERSISTENT; } - public String getCode() { - return code; - } - public static State from(final Bookmark bookmark) { final Bookmark.ObjectState objectState = bookmark.getObjectState(); return from(objectState); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java index 2f67f7e..7cbb26d 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java @@ -284,10 +284,6 @@ public class RootOid implements TypedOid, Serializable { // -- ROOT-ID SUPPORT FOR VALUE - public boolean isValue() { - return false; - } - private RootOid() { identifier=null; objectSpecId=null; state=null; }; private static final RootOid VALUE_OID = new RootOid() { diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java index a83c9a8..da29ebe 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java @@ -19,6 +19,8 @@ package org.apache.isis.core.runtime.persistence.adapter; +import static org.apache.isis.commons.internal.base._With.requires; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,13 +54,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter { private final SpecificationLoader specificationLoader; private final PersistenceSession persistenceSession; - /** - * can be {@link #replacePojo(Object) replace}d. - */ private final Object pojo; - /** - * can be {@link #replaceOid(Oid) replace}d. - */ private final Oid oid; /** @@ -81,7 +77,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter { throw new IsisException("Adapter can't be used to adapt an adapter: " + pojo); } this.pojo = pojo; - this.oid = oid; + this.oid = requires(oid, "oid"); } // -- getSpecification @@ -122,7 +118,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter { @Override public boolean isValue() { - return oid == null; + return oid.isValue(); } // -- isTransient, representsPersistent, isDestroyed diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java index f7d944c..5ee3b82 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java @@ -89,11 +89,11 @@ public class PersistenceSessionServiceInternalDefault implements PersistenceSess @Override public Bookmark bookmarkFor(Object domainObject) { final ObjectAdapter adapter = getPersistenceSession().adapterFor(domainObject); - final Oid oid = adapter.getOid(); - if(oid == null) { + if(adapter.isValue()) { // values cannot be bookmarked return null; } + final Oid oid = adapter.getOid(); if(!(oid instanceof RootOid)) { // must be root return 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 fa273bc..c43ec56 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 @@ -139,7 +139,7 @@ public class ObjectAdapterContext { PersistenceSession persistenceSession) { this.consistencyMixin = new ObjectAdapterContext_Consistency(this); - this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, persistenceSession, authenticationSession); + this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, persistenceSession); this.adapterManagerMixin = new ObjectAdapterContext_AdapterManager(this, persistenceSession); this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession); this.serviceLookupMixin = new ObjectAdapterContext_ServiceLookup(this, servicesInjector); 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 3e1041f..e3c4cd9 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 @@ -18,8 +18,9 @@ */ package org.apache.isis.core.runtime.system.persistence.adaptermanager; +import static org.apache.isis.commons.internal.base._With.requires; + import java.util.List; -import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @@ -27,21 +28,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.isis.commons.internal.base._Lazy; -import org.apache.isis.commons.internal.exceptions._Exceptions; -import org.apache.isis.core.commons.authentication.AuthenticationSession; import org.apache.isis.core.commons.ensure.Assert; -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; 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; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; -import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter; import org.apache.isis.core.runtime.system.persistence.PersistenceSession; import org.apache.isis.core.runtime.system.persistence.adaptermanager.factories.OidFactory; @@ -58,64 +53,40 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectAdapterProvider.class); private final ObjectAdapterContext objectAdapterContext; private final PersistenceSession persistenceSession; - private final AuthenticationSession authenticationSession; private final ServicesInjector servicesInjector; private final SpecificationLoader specificationLoader; - private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin; private final OidFactory oidFactory; ObjectAdapterContext_ObjectAdapterProvider(ObjectAdapterContext objectAdapterContext, - PersistenceSession persistenceSession, AuthenticationSession authenticationSession) { + PersistenceSession persistenceSession) { this.objectAdapterContext = objectAdapterContext; this.persistenceSession = persistenceSession; - this.authenticationSession = authenticationSession; this.servicesInjector = persistenceSession.getServicesInjector(); this.specificationLoader = servicesInjector.getSpecificationLoader(); - this.isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get(); this.oidFactory = OidFactory.builder(pojo->specificationLoader.loadSpecification(pojo.getClass())) .add(new OidProviders.OidForServices()) .add(new OidProviders.OidForValues()) .add(new OidProviders.OidForViewModels()) .add(new OidProviders.OidForPersistables()) - .add(new OidProviders.OidForMixins()) - .add(new OidProviders.OidForStandaloneCollections()) + .add(new OidProviders.OidForOthers()) .build(); } -// @Override -// public Oid oidFor(Object pojo) { -// if(pojo == null) { -// return null; -// } -// final Oid persistentOrValueOid = persistentOrValueOid(pojo); -// if(persistentOrValueOid != null) { -// return persistentOrValueOid; -// } -// final RootOid rootOid = objectAdapterContext.rootOidFor(pojo); -// -// return rootOid; -// } - @Override public ObjectAdapter adapterFor(Object pojo) { - + if(pojo == null) { return null; } - + final ObjectAdapter existing = objectAdapterContext.lookupAdapterByPojo(pojo); if (existing != null) { return existing; } final RootOid rootOid = oidFactory.oidFor(pojo); - if(rootOid.isValue()) { - return objectAdapterContext.getFactories().createRootAdapter(pojo, null); - } - final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid); - return objectAdapterContext.mapAndInjectServices(newAdapter); } @@ -123,12 +94,12 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide @Override public ObjectAdapter adapterFor(Object pojo, ObjectAdapter parentAdapter, OneToManyAssociation collection) { - assert parentAdapter != null; - assert collection != null; + requires(parentAdapter, "parentAdapter"); + requires(collection, "collection"); - final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo); - if(existingOrValueAdapter != null) { - return existingOrValueAdapter; + final ObjectAdapter existing = objectAdapterContext.lookupAdapterByPojo(pojo); + if (existing != null) { + return existing; } objectAdapterContext.ensureMapsConsistent(parentAdapter); @@ -184,86 +155,5 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide .collect(Collectors.toList()); } -// 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; -// } - -// private Oid persistentOid(final Object pojo) { -// if (persistenceSession.getPersistenceManager().getObjectId(pojo) == null) { -// return null; -// } -// final RootOid oid = objectAdapterContext.createPersistentOrViewModelOid(pojo); -// return oid; -// } - - private ObjectAdapter existingOrValueAdapter(Object pojo) { - - // attempt to locate adapter for the pojo - ObjectAdapter adapter = objectAdapterContext.lookupAdapterByPojo(pojo); - if (adapter != null) { - return adapter; - } - - // 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) { - adapter = addPersistentToCache(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 { - adapter = null; - } - - if(adapter != null) { - return adapter; - } - - // 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)) { - adapter = objectAdapterContext.getFactories().createStandaloneAdapter(pojo); - return adapter; - } - - return null; - } - - - } \ No newline at end of file diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java index e01e83e..afcd193 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java @@ -79,11 +79,11 @@ public class OidProviders { } - public static class OidForMixins implements OidProvider { + public static class OidForOthers implements OidProvider { @Override public boolean isHandling(Object pojo, ObjectSpecification spec) { - return spec.isMixin(); + return true; // try to handle anything } @Override @@ -95,22 +95,5 @@ public class OidProviders { } - public static class OidForStandaloneCollections implements OidProvider { - - @Override - public boolean isHandling(Object pojo, ObjectSpecification spec) { - return true; //FIXME spec.isParentedOrFreeCollection() && !spec.isParented(); - } - - @Override - public RootOid oidFor(Object pojo, ObjectSpecification spec) { - final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get(); - final String identifier = persistenceSession.identifierFor(pojo, Oid.State.TRANSIENT); - return new RootOid(spec.getSpecId(), identifier, Oid.State.TRANSIENT); - } - - } - - } diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java index f422f28..243cbac 100644 --- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java +++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java @@ -432,11 +432,6 @@ public class ObjectAdapterMemento implements Serializable { } final RootOid oid = (RootOid) adapter.getOid(); - - if(oid==null) { - System.out.println("!!! "+adapter.getSpecification()); - } - if (oid.isTransient()) { transientMemento = new Memento(adapter); type = Type.TRANSIENT;