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:13:02 UTC

[isis] 15/18: ISIS-1976: further simplify

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 <ah...@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);