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 9e286dcfc3555f66d4f3283fc891dc17307f9bff Author: Andi Huber <ahu...@apache.org> AuthorDate: Thu Sep 6 09:13:00 2018 +0200 ISIS-1976: further simplify Task-Url: https://issues.apache.org/jira/browse/ISIS-1976 --- .../commons/internal/exceptions/_Exceptions.java | 20 ++++++ .../adaptermanager/ObjectAdapterContext.java | 78 ++++++++++++---------- .../ObjectAdapterContext_AdapterManager.java | 24 ++----- .../ObjectAdapterContext_Consistency.java | 8 +-- .../adaptermanager/RootAndCollectionAdapters.java | 13 ++-- 5 files changed, 76 insertions(+), 67 deletions(-) diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java b/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java index 968f0f9..214936a 100644 --- a/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java +++ b/core/commons/src/main/java/org/apache/isis/commons/internal/exceptions/_Exceptions.java @@ -81,6 +81,26 @@ public final class _Exceptions { public static IllegalStateException notImplemented() { return new IllegalStateException("internal error: code was reached, that is not implemented yet"); } + + /** + * Used to hide from the compiler the fact, that this call always throws. + * + * <pre>{ + * throw unexpectedCodeReach(); + * return 0; // won't compile: unreachable code + *}</pre> + * + * hence ... + * + * <pre>{ + * throwUnexpectedCodeReach(); + * return 0; + *}</pre> + * + */ + public static void throwUnexpectedCodeReach() { + throw unexpectedCodeReach(); + } /** * Used to hide from the compiler the fact, that this call always throws. 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 477c873..a665d20 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 @@ -26,7 +26,6 @@ import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -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.commons.ensure.IsisAssertException; @@ -137,6 +136,7 @@ public class ObjectAdapterContext { private final Cache cache = new Cache(); + @SuppressWarnings("unused") private final PersistenceSession persistenceSession; private final ServicesInjector servicesInjector; private final SpecificationLoader specificationLoader; @@ -179,50 +179,51 @@ public class ObjectAdapterContext { // -- CACHING POJO - @Deprecated // don't expose caching - protected ObjectAdapter lookupAdapterByPojo(Object pojo) { + // package private // don't expose caching + ObjectAdapter lookupAdapterByPojo(Object pojo) { return cache.lookupAdapterByPojo(pojo); } - @Deprecated // don't expose caching - public boolean containsAdapterForPojo(Object pojo) { + // package private // don't expose caching + boolean containsAdapterForPojo(Object pojo) { return lookupAdapterByPojo(pojo)!=null; } // -- CACHING OID - @Deprecated // don't expose caching - protected ObjectAdapter lookupAdapterById(Oid oid) { + // package private // don't expose caching + ObjectAdapter lookupAdapterById(Oid oid) { return cache.lookupAdapterById(oid); } // -- CACHING BOTH - @Deprecated // don't expose caching - public void addAdapter(ObjectAdapter adapter) { + // package private // don't expose caching + void addAdapter(ObjectAdapter adapter) { cache.addAdapter(adapter); } - @Deprecated // don't expose caching - public void removeAdapter(ObjectAdapter adapter) { + // package private // don't expose caching + void removeAdapter(ObjectAdapter adapter) { cache.removeAdapter(adapter); } // -- CACHE CONSISTENCY - @Deprecated // don't expose caching - public void ensureMapsConsistent(final ObjectAdapter adapter) { + // package private // don't expose caching + void ensureMapsConsistent(final ObjectAdapter adapter) { consistencyMixin.ensureMapsConsistent(adapter); } - @Deprecated // don't expose caching - public void ensureMapsConsistent(final Oid oid) { + // package private // don't expose caching + void ensureMapsConsistent(final Oid oid) { consistencyMixin.ensureMapsConsistent(oid); } // -- FACTORIES - public static interface ObjectAdapterFactories { + // package private + static interface ObjectAdapterFactories { /** * Creates (but does not {@link #mapAndInjectServices(ObjectAdapter) map}) a new @@ -266,7 +267,8 @@ public class ObjectAdapterContext { private final ObjectAdapterFactories objectAdapterFactories; - public ObjectAdapterFactories getFactories() { + // package private + ObjectAdapterFactories getFactories() { return objectAdapterFactories; } @@ -289,11 +291,20 @@ public class ObjectAdapterContext { @Deprecated // don't expose caching public ObjectAdapter lookupAdapterFor(final Oid oid) { - return adapterManagerMixin.lookupAdapterFor(oid); + Objects.requireNonNull(oid); + consistencyMixin.ensureMapsConsistent(oid); + return cache.lookupAdapterById(oid); } - @Deprecated // don't expose caching - public void removeAdapterFromCache(final ObjectAdapter adapter) { + // package private + ObjectAdapter lookupParentedCollectionAdapter(ParentedCollectionOid collectionOid) { + Objects.requireNonNull(collectionOid); + consistencyMixin.ensureMapsConsistent(collectionOid); + return cache.lookupAdapterById(collectionOid); + } + + // package private // don't expose caching + void removeAdapterFromCache(final ObjectAdapter adapter) { adapterManagerMixin.removeAdapterFromCache(adapter); } @@ -331,12 +342,7 @@ public class ObjectAdapterContext { final List<Object> registeredServices = servicesInjector.getRegisteredServices(); for (final Object service : registeredServices) { final ObjectAdapter serviceAdapter = objectAdapterProviderMixin.adapterFor(service); - - // remap as Persistent if required - if (serviceAdapter.getOid().isTransient()) { - _Exceptions.unexpectedCodeReach(); - //remapAsPersistent(serviceAdapter, null, persistenceSession); - } + Assert.assertFalse("expected to not be 'transient'", serviceAdapter.getOid().isTransient()); } } @@ -349,7 +355,8 @@ public class ObjectAdapterContext { return createdAdapter; } - public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) { + // package private + ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) { ObjectAdapter viewModelAdapter = adapterManagerMixin.lookupAdapterFor(viewModelPojo); if(viewModelAdapter == null) { final ObjectSpecification objectSpecification = @@ -370,20 +377,16 @@ public class ObjectAdapterContext { * @param session */ @Deprecated // expected to be moved - public void remapAsPersistent(final ObjectAdapter adapter, RootOid newRootOid, PersistenceSession session) { + public void remapAsPersistent(final ObjectAdapter rootAdapter, RootOid newRootOid, PersistenceSession session) { Objects.requireNonNull(newRootOid); + Assert.assertFalse("expected to not be a parented collection", rootAdapter.isParentedCollection()); - // 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); + new RootAndCollectionAdapters(rootAdapter, this); - Assert.assertTrue("expected same", Objects.equals(rootAndCollectionAdapters.getRootAdapter().getOid(), transientRootOid)); removeFromCache(rootAndCollectionAdapters); final RootOid persistedRootOid; @@ -392,7 +395,7 @@ public class ObjectAdapterContext { throw new IsisAssertException("hintRootOid must be persistent"); } final ObjectSpecId hintRootOidObjectSpecId = newRootOid.getObjectSpecId(); - final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId(); + final ObjectSpecId adapterObjectSpecId = rootAdapter.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 + "'"); @@ -406,8 +409,7 @@ public class ObjectAdapterContext { LOG.debug("replacing root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString()); } - final ObjectAdapter adapterReplacement = adapter.withOid(persistedRootOid); - + final ObjectAdapter adapterReplacement = rootAdapter.withOid(persistedRootOid); replaceRootAdapter(adapterReplacement, rootAndCollectionAdapters); if (LOG.isDebugEnabled()) { @@ -477,5 +479,7 @@ public class ObjectAdapterContext { return newAdapter; } + + } \ No newline at end of file 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 1af091f..fc50a81 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 @@ -23,6 +23,7 @@ import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.isis.commons.internal.exceptions._Exceptions; 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; @@ -43,6 +44,7 @@ class ObjectAdapterContext_AdapterManager { private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_AdapterManager.class); private final ObjectAdapterContext objectAdapterContext; + @SuppressWarnings("unused") private final PersistenceSession persistenceSession; private final ServicesInjector servicesInjector; @@ -68,10 +70,8 @@ class ObjectAdapterContext_AdapterManager { * @param recreatedPojo - already known to the object store impl, or a service */ //@Override - public ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo) { + ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo) { // attempt to locate adapter for the pojo - // REVIEW: this check is possibly redundant because the pojo will most likely - // have just been instantiated, so won't yet be in any maps final ObjectAdapter adapterLookedUpByPojo = lookupAdapterFor(recreatedPojo); if (adapterLookedUpByPojo != null) { return adapterLookedUpByPojo; @@ -80,6 +80,7 @@ class ObjectAdapterContext_AdapterManager { // attempt to locate adapter for the Oid final ObjectAdapter adapterLookedUpByOid = lookupAdapterFor(oid); if (adapterLookedUpByOid != null) { + _Exceptions.throwUnexpectedCodeReach(); return adapterLookedUpByOid; } @@ -128,23 +129,6 @@ class ObjectAdapterContext_AdapterManager { return objectAdapterContext.lookupAdapterByPojo(pojo); } - /** - * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists - * in the identity map. - * - * @param oid - * - must not be <tt>null</tt> - * @return adapter, or <tt>null</tt> if doesn't exist. - * @deprecated don't expose caching - */ - //@Override - ObjectAdapter lookupAdapterFor(final Oid oid) { - Objects.requireNonNull(oid); - objectAdapterContext.ensureMapsConsistent(oid); - - return objectAdapterContext.lookupAdapterById(oid); - } - ObjectAdapter mapAndInjectServices(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); diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java index 30746a1..2f26bff 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Consistency.java @@ -35,9 +35,11 @@ import org.apache.isis.core.metamodel.adapter.oid.Oid; * Responsibility: ObjectAdapter Cache/Map consistency * </p> * @since 2.0.0-M2 + * @deprecated expected to be made obsolete */ class ObjectAdapterContext_Consistency { + @SuppressWarnings("unused") private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_Consistency.class); private final ObjectAdapterContext objectAdapterContext; @@ -47,9 +49,8 @@ class ObjectAdapterContext_Consistency { /** * Fail early if any problems. - * @deprecated https://issues.apache.org/jira/browse/ISIS-1976 */ - protected void ensureMapsConsistent(final ObjectAdapter adapter) { + void ensureMapsConsistent(final ObjectAdapter adapter) { if (adapter.isValue()) { return; } @@ -62,9 +63,8 @@ class ObjectAdapterContext_Consistency { /** * Fail early if any problems. - * @deprecated https://issues.apache.org/jira/browse/ISIS-1976 */ - protected void ensureMapsConsistent(final Oid oid) { + void ensureMapsConsistent(final Oid oid) { Objects.requireNonNull(oid); final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid); 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 19d0e0e..fed267d 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,7 +22,6 @@ 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; @@ -32,7 +31,6 @@ 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; @@ -49,8 +47,10 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; */ class RootAndCollectionAdapters implements Iterable<ObjectAdapter> { + @SuppressWarnings("unused") private static final Logger LOG = LoggerFactory.getLogger(RootAndCollectionAdapters.class); + private final ObjectAdapterContext context; private final ObjectAdapter parentAdapter; private final RootOid rootAdapterOid; @@ -58,11 +58,12 @@ class RootAndCollectionAdapters implements Iterable<ObjectAdapter> { public RootAndCollectionAdapters( final ObjectAdapter parentAdapter, - final ObjectAdapterContext_AdapterManager adapterManagerMixin) { + final ObjectAdapterContext context) { Assert.assertNotNull(parentAdapter); this.rootAdapterOid = (RootOid) parentAdapter.getOid(); this.parentAdapter = parentAdapter; - addCollectionAdapters(adapterManagerMixin); + this.context = context; + addCollectionAdapters(); } public ObjectAdapter getRootAdapter() { @@ -102,10 +103,10 @@ class RootAndCollectionAdapters implements Iterable<ObjectAdapter> { // Helpers //////////////////////////////////////////////////////////////////////// - private void addCollectionAdapters(ObjectAdapterContext_AdapterManager adapterManagerMixin) { + private void addCollectionAdapters() { for (final OneToManyAssociation otma : parentAdapter.getSpecification().getCollections(Contributed.EXCLUDED)) { final ParentedCollectionOid collectionOid = new ParentedCollectionOid((RootOid) rootAdapterOid, otma); - final ObjectAdapter collectionAdapter = adapterManagerMixin.lookupAdapterFor(collectionOid); + final ObjectAdapter collectionAdapter = context.lookupParentedCollectionAdapter(collectionOid); if (collectionAdapter != null) { // collection adapters are lazily created and so there may not be one. addCollectionAdapter(otma, collectionAdapter);