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 2772581ba9f51756105f8f76c30d4b219272f3f4 Author: Andi Huber <ahu...@apache.org> AuthorDate: Thu Sep 6 08:06:21 2018 +0200 ISIS-1976: simplify Task-Url: https://issues.apache.org/jira/browse/ISIS-1976 --- .../adaptermanager/ObjectAdapterContext.java | 69 ++++++++-------------- .../adaptermanager/RootAndCollectionAdapters.java | 7 +++ 2 files changed, 30 insertions(+), 46 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 f942f5a..477c873 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 @@ -22,18 +22,13 @@ import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.function.Function; -import java.util.function.Supplier; - -import com.google.common.cache.Cache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.isis.commons.internal.exceptions._Exceptions; -import org.apache.isis.commons.internal.functions._Predicates; import org.apache.isis.core.commons.authentication.AuthenticationSession; import org.apache.isis.core.commons.ensure.Assert; -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; @@ -49,9 +44,7 @@ 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; -import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport; /** * Encapsulate ObjectAdpater life-cycling. @@ -203,10 +196,6 @@ public class ObjectAdapterContext { return cache.lookupAdapterById(oid); } - private OidAdapterHashMap oidAdapterMap() { - return cache.oidAdapterMap; - } - // -- CACHING BOTH @Deprecated // don't expose caching @@ -377,38 +366,40 @@ public class ObjectAdapterContext { * Note that there is no management of {@link Version}s here. That is * because the {@link PersistenceSession} is expected to manage this. * - * @param hintRootOid - allow a different persistent root oid to be provided. + * @param newRootOid - allow a different persistent root oid to be provided. * @param session */ @Deprecated // expected to be moved - public void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid, PersistenceSession session) { + public void remapAsPersistent(final ObjectAdapter adapter, RootOid newRootOid, PersistenceSession session) { - final ObjectAdapter rootAdapter = adapter.getAggregateRoot(); // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway. + Objects.requireNonNull(newRootOid); + + // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway. + final ObjectAdapter rootAdapter = adapter.getAggregateRoot(); final RootOid transientRootOid = (RootOid) rootAdapter.getOid(); + + Assert.assertTrue("expected same", Objects.equals(adapter, rootAdapter)); final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, adapterManagerMixin); - removeFromCache(rootAndCollectionAdapters, transientRootOid); + Assert.assertTrue("expected same", Objects.equals(rootAndCollectionAdapters.getRootAdapter().getOid(), transientRootOid)); + removeFromCache(rootAndCollectionAdapters); - // intended for testing (bit nasty) final RootOid persistedRootOid; - if(hintRootOid != null) { - if(hintRootOid.isTransient()) { + { + if(newRootOid.isTransient()) { throw new IsisAssertException("hintRootOid must be persistent"); } - final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId(); + final ObjectSpecId hintRootOidObjectSpecId = newRootOid.getObjectSpecId(); final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId(); if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) { throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " + "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'"); } // ok - persistedRootOid = hintRootOid; - } else { - // normal flow - delegate to OidGenerator to obtain a persistent root oid - persistedRootOid = session.createPersistentOrViewModelOid(adapter.getObject()); - } + persistedRootOid = newRootOid; + } // associate root adapter with the new Oid, and remap if (LOG.isDebugEnabled()) { @@ -438,14 +429,13 @@ public class ObjectAdapterContext { for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) { final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid(); final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid); - oidAdapterMap().add(persistedCollectionOid, collectionAdapter); + Assert.assertTrue("expected equal", Objects.equals(collectionAdapter.getOid(), persistedCollectionOid)); + addAdapter(collectionAdapter); } // 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 (LOG.isDebugEnabled()) { - LOG.debug("synchronizing collection pojos, remapping in pojo map if required"); - } + LOG.debug("synchronizing collection pojos, remapping in pojo map if required"); for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) { final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma); @@ -461,28 +451,15 @@ public class ObjectAdapterContext { } - private void removeFromCache( - final RootAndCollectionAdapters rootAndCollectionAdapters, - final RootOid transientRootOid) { + private void removeFromCache(final RootAndCollectionAdapters rootAndCollectionAdapters) { + final ObjectAdapter rootAdapter = rootAndCollectionAdapters.getRootAdapter(); LOG.debug("removing root adapter from oid map"); + cache.removeAdapter(rootAdapter); - boolean removed = oidAdapterMap().remove(transientRootOid); - if (!removed) { - LOG.warn("could not remove oid: {}", transientRootOid); - // should we fail here with a more serious error? - } - - if (LOG.isDebugEnabled()) { - LOG.debug("removing collection adapter(s) from oid map"); - } + LOG.debug("removing collection adapter(s) from oid map"); for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) { - final Oid collectionOid = collectionAdapter.getOid(); - removed = oidAdapterMap().remove(collectionOid); - if (!removed) { - ObjectAdapterLegacy.LOG.warn("could not remove collectionOid: {}", collectionOid); - // should we fail here with a more serious error? - } + cache.removeAdapter(collectionAdapter); } } diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java index 9577ef1..19d0e0e 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java @@ -22,12 +22,17 @@ package org.apache.isis.core.runtime.system.persistence.adaptermanager; import java.util.Collections; import java.util.Iterator; import java.util.Map; +import java.util.Objects; import java.util.Set; import com.google.common.collect.Maps; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.apache.isis.core.commons.ensure.Assert; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.adapter.oid.Oid; import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid; import org.apache.isis.core.metamodel.adapter.oid.RootOid; import org.apache.isis.core.metamodel.spec.feature.Contributed; @@ -43,6 +48,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; * must also be persisted. */ class RootAndCollectionAdapters implements Iterable<ObjectAdapter> { + + private static final Logger LOG = LoggerFactory.getLogger(RootAndCollectionAdapters.class); private final ObjectAdapter parentAdapter; private final RootOid rootAdapterOid;