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 07:15:32 UTC

[isis] branch ISIS-1976-rethink-object-adapters updated (5a8b180 -> 67fd1ec)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 5a8b180  ISIS-1976: improve the ObjectAdapterProvider interface (API)
     new 5412e90  ISIS-1976: add layer of abstraction
     new d8341fe  ISIS-1976: make ObjectAdapter's oid immutable
     new dd69b28  ISIS-1976: improve code readability
     new 369ebf6  ISIS-1976: restore check consistency to also check adapter's object equality
     new 234421b  ISIS-1976: remove code that seems for optimization
     new 2772581  ISIS-1976: simplify
     new 67fd1ec  ISIS-1976: further simplify

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../commons/internal/exceptions/_Exceptions.java   |  20 ++
 .../isis/core/metamodel/adapter/ObjectAdapter.java |  24 +-
 .../core/metamodel/services/ServicesInjector.java  |  41 ++-
 .../runtime/persistence/adapter/PojoAdapter.java   |  11 -
 .../adaptermanager/ObjectAdapterContext.java       | 320 ++++++++++-----------
 .../ObjectAdapterContext_AdapterManager.java       |  28 +-
 .../ObjectAdapterContext_Consistency.java          |  31 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |  12 +-
 .../adaptermanager/RootAndCollectionAdapters.java  |  16 +-
 9 files changed, 258 insertions(+), 245 deletions(-)


[isis] 03/07: ISIS-1976: improve code readability

Posted by ah...@apache.org.
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 dd69b286b222c0126a7f15c2d51b3937e94cf6f2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 6 06:36:00 2018 +0200

    ISIS-1976: improve code readability
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../core/metamodel/services/ServicesInjector.java    | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
index d293abc..c345f38 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
@@ -146,15 +146,6 @@ public class ServicesInjector implements ApplicationScopedComponent {
         serviceByConcreteType.clear();
         autowire();
     }
-    
-    private Map<Class<?>, Object> initServiceByConcreteType(){
-        final Map<Class<?>, Object> map = _Maps.newHashMap();
-        for (Object service : services) {
-            final Class<?> concreteType = service.getClass();
-            map.put(concreteType, service);
-        }
-        return map;
-    }
 
     public boolean isRegisteredService(final Class<?> cls) {
         return serviceByConcreteType.get().containsKey(cls);
@@ -457,6 +448,17 @@ public class ServicesInjector implements ApplicationScopedComponent {
         .forEach(filteredServicesAndContainer::add);
     }
 
+    // -- LAZY INIT
+    
+    private Map<Class<?>, Object> initServiceByConcreteType(){
+        final Map<Class<?>, Object> map = _Maps.newHashMap();
+        for (Object service : services) {
+            final Class<?> concreteType = service.getClass();
+            map.put(concreteType, service);
+        }
+        return map;
+    }
+    
     // -- REFLECTIVE PREDICATES
 
     private static final Predicate<Object> isOfType(final Class<?> cls) {


[isis] 06/07: ISIS-1976: simplify

Posted by ah...@apache.org.
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 <ah...@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;


[isis] 07/07: ISIS-1976: further simplify

Posted by ah...@apache.org.
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 67fd1ec509e096e60182bcab251f3a4c8d8d4777
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);


[isis] 05/07: ISIS-1976: remove code that seems for optimization

Posted by ah...@apache.org.
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 234421b0ee5502a7ab491349e0b73cee1872627e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 6 07:19:28 2018 +0200

    ISIS-1976: remove code that seems for optimization
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../persistence/adaptermanager/ObjectAdapterContext.java    | 13 +------------
 .../adaptermanager/ObjectAdapterContext_AdapterManager.java |  5 ++---
 2 files changed, 3 insertions(+), 15 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 18af78f..f942f5a 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
@@ -32,6 +32,7 @@ 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;
@@ -350,18 +351,6 @@ public class ObjectAdapterContext {
         }
     }
     
-    @Deprecated // don't expose caching
-    public void addAdapterHonoringSpecImmutability(Object pojo, ObjectAdapter adapter) {
-        // add all aggregated collections
-        final ObjectSpecification objSpec = adapter.getSpecification();
-        if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
-            cache.putPojo(pojo, adapter);
-        }
-
-        // order is important - add to pojo map first, then identity map
-        oidAdapterMap().add(adapter.getOid(), adapter);
-    }
-    
     public ObjectAdapter disposableAdapterForViewModel(Object viewModelPojo) {
             final ObjectSpecification objectSpecification = 
                     specificationLoader.loadSpecification(viewModelPojo.getClass());
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 7936a9d..1af091f 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,9 +23,7 @@ import java.util.Objects;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.ensure.Ensure;
 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;
@@ -171,7 +169,8 @@ class ObjectAdapterContext_AdapterManager {
             return adapter;
         }
 
-        objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
+        Assert.assertTrue("expected same", Objects.equals(adapter.getObject(), pojo));
+        objectAdapterContext.addAdapter(adapter);
 
         // must inject after mapping, otherwise infinite loop
         servicesInjector.injectServicesInto(pojo);


[isis] 01/07: ISIS-1976: add layer of abstraction

Posted by ah...@apache.org.
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 5412e90eee290c44b96f35e7a3f7b1392788c2c6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 6 06:04:41 2018 +0200

    ISIS-1976: add layer of abstraction
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../core/metamodel/services/ServicesInjector.java  |  39 +++--
 .../adaptermanager/ObjectAdapterContext.java       | 194 +++++++++++----------
 .../ObjectAdapterContext_AdapterManager.java       |   3 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |  12 +-
 4 files changed, 140 insertions(+), 108 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
index f80535b..d293abc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
@@ -23,11 +23,16 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
+import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -48,8 +53,6 @@ import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authorization.AuthorizationManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * The repository of services, also able to inject into any object.
@@ -78,7 +81,7 @@ public class ServicesInjector implements ApplicationScopedComponent {
      * services that are assignable to the type.  It's possible that this is an empty list.
      */
     private final Map<Class<?>, List<Object>> servicesAssignableToType = _Maps.newHashMap();
-    private final Map<Class<?>, Object> serviceByConcreteType = _Maps.newHashMap();
+    private final _Lazy<Map<Class<?>, Object>> serviceByConcreteType = _Lazy.of(this::initServiceByConcreteType);
     private final Map<Class<?>, Method[]> methodsByClassCache = _Maps.newHashMap();
     private final Map<Class<?>, Field[]> fieldsByClassCache = _Maps.newHashMap();
 
@@ -143,18 +146,30 @@ public class ServicesInjector implements ApplicationScopedComponent {
         serviceByConcreteType.clear();
         autowire();
     }
+    
+    private Map<Class<?>, Object> initServiceByConcreteType(){
+        final Map<Class<?>, Object> map = _Maps.newHashMap();
+        for (Object service : services) {
+            final Class<?> concreteType = service.getClass();
+            map.put(concreteType, service);
+        }
+        return map;
+    }
 
     public boolean isRegisteredService(final Class<?> cls) {
-        // lazily construct cache
-        if(serviceByConcreteType.isEmpty()) {
-            for (Object service : services) {
-                final Class<?> concreteType = service.getClass();
-                serviceByConcreteType.put(concreteType, service);
-            }
-        }
-        return serviceByConcreteType.containsKey(cls);
+        return serviceByConcreteType.get().containsKey(cls);
     }
 
+    public boolean isRegisteredServiceInstance(final Object pojo) {
+        if(pojo==null) {
+            return false;
+        }
+        final Class<?> key = pojo.getClass();
+        final Object serviceInstance = serviceByConcreteType.get().get(key);
+        return Objects.equals(pojo, serviceInstance);
+    }
+    
+    
     public <T> void addFallbackIfRequired(final Class<T> serviceClass, final T serviceInstance) {
         if(!contains(services, serviceClass)) {
             // add to beginning;
@@ -206,7 +221,7 @@ public class ServicesInjector implements ApplicationScopedComponent {
     public List<Object> getRegisteredServices() {
         return Collections.unmodifiableList(services);
     }
-
+    
     // -- INJECT SERVICES INTO
 
     /**
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 5ebfe1f..06642b2 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,10 +22,14 @@ 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.Ensure;
@@ -44,7 +48,9 @@ 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.  
@@ -67,9 +73,76 @@ public class ObjectAdapterContext {
         return objectAdapterContext;
     }
     
-    private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
-    private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
-    private final OidAdapterHashMap oidAdapterMap2 = new OidAdapterHashMap();
+    private final static class Cache {
+        private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
+        private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
+        
+        public void open() {
+            oidAdapterMap.open();
+            pojoAdapterMap.open();
+        }
+        
+        public void close() {
+            
+            try {
+                oidAdapterMap.close();
+            } catch(final Throwable ex) {
+                // ignore
+                LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
+            }
+
+            try {
+                pojoAdapterMap.close();
+            } catch(final Throwable ex) {
+                // ignore
+                LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
+            }
+        }
+        
+        private ObjectAdapter lookupAdapterByPojo(Object pojo) {
+            final ObjectAdapter adapter = pojoAdapterMap.getAdapter(pojo);
+            return adapter;
+        }
+        
+        private void putPojo(Object pojo, ObjectAdapter adapter) {
+            pojoAdapterMap.add(adapter.getObject(), adapter);
+        }
+        
+        private void removePojo(ObjectAdapter adapter) {
+            pojoAdapterMap.remove(adapter);
+        }
+        
+        private ObjectAdapter lookupAdapterById(Oid oid) {
+            return oidAdapterMap.getAdapter(oid);
+        }
+        
+        private void addAdapter(ObjectAdapter adapter) {
+            if(adapter==null) {
+                return; // nothing to do
+            }
+            final Oid oid = adapter.getOid();
+            if (oid != null) { // eg. value objects don't have an Oid
+                oidAdapterMap.add(oid, adapter);
+            }
+            putPojo(adapter.getObject(), adapter);
+        }
+        
+        private void removeAdapter(ObjectAdapter adapter) {
+            LOG.debug("removing adapter: {}", adapter);
+            if(adapter==null) {
+                return; // nothing to do
+            }
+            final Oid oid = adapter.getOid();
+            if (oid != null) { // eg. value objects don't have an Oid
+                oidAdapterMap.remove(oid);
+            }
+            removePojo(adapter);
+        }
+        
+    }
+    
+    private final Cache cache = new Cache();
+    
     private final PersistenceSession persistenceSession; 
     private final ServicesInjector servicesInjector;
     private final SpecificationLoader specificationLoader;
@@ -102,103 +175,47 @@ public class ObjectAdapterContext {
     // -- LIFE-CYCLING
     
     public void open() {
-        oidAdapterMap.open();
-        pojoAdapterMap.open();
-        oidAdapterMap2.open();
+        cache.open();
         initServices();
     }
     
     public void close() {
-        
-        try {
-            oidAdapterMap.close();
-            oidAdapterMap2.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
-
-        try {
-            pojoAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
+        cache.close();
     }
     
-    // -- CACHING DEPR.
+    // -- CACHING POJO
 
     @Deprecated // don't expose caching
     protected ObjectAdapter lookupAdapterByPojo(Object pojo) {
-        final ObjectAdapter adapter = pojoAdapterMap.getAdapter(pojo);
-        if(adapter!=null) {
-            Oid y = adapter.getOid();
-            Objects.requireNonNull(y);
-            
-            Oid x = objectAdapterProviderMixin.oidFor(pojo);
-            Objects.requireNonNull(x);
-            
-            //FIXME[ISIS-1976] oids must match
-            //Ensure.ensureThatArg(x, _Predicates.equalTo(y), ()->String.format("x: %s\ny: %s", ""+x, ""+y));
-        }
-        return adapter;
-    }
-    
-    private void putPojo(Object pojo, ObjectAdapter adapter) {
-        
-        Oid x = objectAdapterProviderMixin.oidFor(pojo);
-        Oid y = adapter.getOid();
-        Objects.requireNonNull(y);
-        
-        //FIXME[ISIS-1976] oids must match
-        //Ensure.ensureThatArg(x, _Predicates.equalTo(y), ()->String.format("x: %s\ny: %s", ""+x, ""+y));
-        
-        oidAdapterMap2.add(adapter.getOid(), adapter);
-        pojoAdapterMap.add(adapter.getObject(), adapter);
+        return cache.lookupAdapterByPojo(pojo);
     }
     
-    private void removePojo(ObjectAdapter adapter) {
-        Oid y = adapter.getOid();
-        Objects.requireNonNull(y);
-        oidAdapterMap2.remove(y);
-        pojoAdapterMap.remove(adapter);
-    }
-    
-    // -- CACHING
-    
     @Deprecated // don't expose caching
     public boolean containsAdapterForPojo(Object pojo) {
         return lookupAdapterByPojo(pojo)!=null;
     }
     
+    // -- CACHING OID
+    
     @Deprecated // don't expose caching
     protected ObjectAdapter lookupAdapterById(Oid oid) {
-        return oidAdapterMap.getAdapter(oid);
+        return cache.lookupAdapterById(oid);
     }
+    
+    private OidAdapterHashMap oidAdapterMap() {
+        return cache.oidAdapterMap;
+    }
+    
+    // -- CACHING BOTH
 
     @Deprecated // don't expose caching
     public void addAdapter(ObjectAdapter adapter) {
-        if(adapter==null) {
-            return; // nothing to do
-        }
-        final Oid oid = adapter.getOid();
-        if (oid != null) { // eg. value objects don't have an Oid
-            oidAdapterMap.add(oid, adapter);
-        }
-        putPojo(adapter.getObject(), adapter);
+        cache.addAdapter(adapter);
     }
     
     @Deprecated // don't expose caching
     public void removeAdapter(ObjectAdapter adapter) {
-        LOG.debug("removing adapter: {}", adapter);
-        if(adapter==null) {
-            return; // nothing to do
-        }
-        final Oid oid = adapter.getOid();
-        if (oid != null) { // eg. value objects don't have an Oid
-            oidAdapterMap.remove(oid);
-        }
-        removePojo(adapter);
+        cache.removeAdapter(adapter);
     }
     
     // -- CACHE CONSISTENCY
@@ -327,7 +344,8 @@ public class ObjectAdapterContext {
             
             // remap as Persistent if required
             if (serviceAdapter.getOid().isTransient()) {
-                remapAsPersistent(serviceAdapter, null, persistenceSession);
+                _Exceptions.unexpectedCodeReach();
+                //remapAsPersistent(serviceAdapter, null, persistenceSession);
             }
         }
     }
@@ -337,11 +355,11 @@ public class ObjectAdapterContext {
         // add all aggregated collections
         final ObjectSpecification objSpec = adapter.getSpecification();
         if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
-            putPojo(pojo, adapter);
+            cache.putPojo(pojo, adapter);
         }
 
         // order is important - add to pojo map first, then identity map
-        oidAdapterMap.add(adapter.getOid(), adapter);
+        oidAdapterMap().add(adapter.getOid(), adapter);
     }
     
     public ObjectAdapter disposableAdapterForViewModel(Object viewModelPojo) {
@@ -367,9 +385,6 @@ public class ObjectAdapterContext {
     }
     
     /**
-     * was in PersisenceSessionX, temporarily moved here to successfully compile
-     *
-     * <p>
      * Note that there is no management of {@link Version}s here. That is
      * because the {@link PersistenceSession} is expected to manage this.
      *
@@ -434,7 +449,7 @@ public class ObjectAdapterContext {
         for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
             final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
             final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
-            oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
+            oidAdapterMap().add(persistedCollectionOid, collectionAdapter);
         }
 
         // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
@@ -449,9 +464,9 @@ public class ObjectAdapterContext {
             final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapterReplacement);
 
             if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
-                removePojo(collectionAdapter);
+                cache.removePojo(collectionAdapter);
                 final ObjectAdapter newCollectionAdapter = collectionAdapter.withPojo(collectionPojoActuallyOnPojo);
-                putPojo(collectionPojoActuallyOnPojo, newCollectionAdapter);
+                cache.putPojo(collectionPojoActuallyOnPojo, newCollectionAdapter);
             }
         }
         
@@ -460,10 +475,10 @@ public class ObjectAdapterContext {
     private void removeFromCache(
             final RootAndCollectionAdapters rootAndCollectionAdapters, 
             final RootOid transientRootOid) {
-        LOG.debug("remapAsPersistent: {}", transientRootOid);
+        
         LOG.debug("removing root adapter from oid map");
     
-        boolean removed = oidAdapterMap.remove(transientRootOid);
+        boolean removed = oidAdapterMap().remove(transientRootOid);
         if (!removed) {
             LOG.warn("could not remove oid: {}", transientRootOid);
             // should we fail here with a more serious error?
@@ -474,7 +489,7 @@ public class ObjectAdapterContext {
         }
         for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
             final Oid collectionOid = collectionAdapter.getOid();
-            removed = oidAdapterMap.remove(collectionOid);
+            removed = oidAdapterMap().remove(collectionOid);
             if (!removed) {
                 ObjectAdapterLegacy.LOG.warn("could not remove collectionOid: {}", collectionOid);
                 // should we fail here with a more serious error?
@@ -493,11 +508,8 @@ public class ObjectAdapterContext {
     @Deprecated
     public ObjectAdapter remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
         final ObjectAdapter newAdapter = adapter.withPojo(pojo);
-        removePojo(adapter);
-        removePojo(newAdapter);
-        
-        oidAdapterMap.remove(adapter.getOid());
-        oidAdapterMap.remove(newAdapter.getOid());
+        cache.removeAdapter(adapter);
+        cache.removeAdapter(newAdapter);
 
         //FIXME[ISIS-1976] can't remove yet, does have strange side-effects 
         if(true){
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 e60d247..7936a9d 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,7 +23,9 @@ import java.util.Objects;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.core.commons.ensure.Assert;
+import org.apache.isis.core.commons.ensure.Ensure;
 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;
@@ -149,7 +151,6 @@ class ObjectAdapterContext_AdapterManager {
         // since the whole point of this method is to map an adapter that's just been created.
         // so we *don't* call ensureMapsConsistent(adapter);
 
-        Assert.assertNotNull(adapter);
         final Object pojo = adapter.getObject();
         Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsAdapterForPojo(pojo));
 
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 77545ab..593ad6c 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
@@ -72,8 +72,9 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
         if(persistentOrValueOid != null) {
             return persistentOrValueOid;
         }
-        // Creates a new transient root for the supplied domain object
-        final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
+        final RootOid rootOid = servicesInjector.isRegisteredServiceInstance(pojo) 
+                ? persistenceSession.createPersistentOrViewModelOid(pojo) 
+                        : persistenceSession.createTransientOrViewModelOid(pojo);
         return rootOid;
     }
     
@@ -88,8 +89,11 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
             return existingOrValueAdapter;
         }
 
-        // Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
-        final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
+        final RootOid rootOid = servicesInjector.isRegisteredServiceInstance(pojo) 
+                ? persistenceSession.createPersistentOrViewModelOid(pojo) 
+                        : persistenceSession.createTransientOrViewModelOid(pojo);
+        
+//        final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
         final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
 
         return objectAdapterContext.mapAndInjectServices(newAdapter);


[isis] 02/07: ISIS-1976: make ObjectAdapter's oid immutable

Posted by ah...@apache.org.
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 d8341fe5f96207fc03787534d3ec710119ec4d1a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 6 06:29:22 2018 +0200

    ISIS-1976: make ObjectAdapter's oid immutable
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../isis/core/metamodel/adapter/ObjectAdapter.java | 24 +++++++++++-----------
 .../runtime/persistence/adapter/PojoAdapter.java   | 11 ----------
 .../adaptermanager/ObjectAdapterContext.java       | 12 -----------
 .../ObjectAdapterContext_Consistency.java          |  2 +-
 4 files changed, 13 insertions(+), 36 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index fc67020..86dc643 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -487,18 +487,18 @@ public interface ObjectAdapter extends Instance {
      */
     ObjectAdapter withPojo(Object newPojo);
 
-    @Deprecated
-    public static interface Friend {
-      /**
-      * Sometimes it is necessary to manage the replacement of the underlying
-      * domain object (by another component such as an object store). This method
-      * allows the adapter to be kept while the domain object is replaced.
-      */
-     void replacePojo(Object pojo);
-    }
-    
-    @Deprecated
-    Friend friend();
+//    @Deprecated
+//    public static interface Friend {
+//      /**
+//      * Sometimes it is necessary to manage the replacement of the underlying
+//      * domain object (by another component such as an object store). This method
+//      * allows the adapter to be kept while the domain object is replaced.
+//      */
+//     void replacePojo(Object pojo);
+//    }
+//    
+//    @Deprecated
+//    Friend friend();
 
 
 }
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 f80048c..c335815 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
@@ -407,15 +407,4 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         return new PojoAdapter(newPojo, oid, authenticationSession, specificationLoader, persistenceSession);
     }
 
-
-    @Override
-    public Friend friend() {
-        return new Friend() {
-            @Override
-            public void replacePojo(Object pojo) {
-                PojoAdapter.this.pojo = pojo;
-            }
-        };
-    }
-
 }
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 06642b2..18af78f 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
@@ -502,23 +502,11 @@ public class ObjectAdapterContext {
         return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
     }
 
-    /**
-     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
-     */
     @Deprecated
     public ObjectAdapter remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
         final ObjectAdapter newAdapter = adapter.withPojo(pojo);
         cache.removeAdapter(adapter);
         cache.removeAdapter(newAdapter);
-
-        //FIXME[ISIS-1976] can't remove yet, does have strange side-effects 
-        if(true){
-            adapter.friend().replacePojo(pojo);
-            mapAndInjectServices(adapter);
-            return adapter;
-        }
-        //---
-        
         mapAndInjectServices(newAdapter);
         return newAdapter;
     }
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 d078639..2d15fb0 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
@@ -113,7 +113,7 @@ class ObjectAdapterContext_Consistency {
         }
 
         ensureThatArg(
-                adapter, equalTo(adapterAccordingToMap),
+                adapterOid, equalTo(adapterAccordingToMap.getOid()),
                 ()->"mismatch in "
                         + mapName
                         + ": provided adapter's OID: " + adapterOid + ", \n"


[isis] 04/07: ISIS-1976: restore check consistency to also check adapter's object equality

Posted by ah...@apache.org.
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 369ebf6c7c20afb0147f38c8b1034a6e1b639c6f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 6 06:51:59 2018 +0200

    ISIS-1976: restore check consistency to also check adapter's object
    equality
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../ObjectAdapterContext_Consistency.java           | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

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 2d15fb0..30746a1 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
@@ -118,5 +118,26 @@ class ObjectAdapterContext_Consistency {
                         + mapName
                         + ": provided adapter's OID: " + adapterOid + ", \n"
                         + "but map's adapter's OID was: " + adapterAccordingToMap.getOid());
+        
+        ensureThatArg(
+                adapter.getObject(), equalTo(adapterAccordingToMap.getObject()),
+                ()->String.format("mismatch in %s (oid='%s')"
+                        + ": provided adapter's hash: %s (pojo='%s'), \n"
+                        + "but map's adapter's hash was: %s (pojo='%s')",
+                        mapName, adapterOid,
+                        Integer.toHexString(adapter.hashCode()), ""+adapter.getObject(),
+                        Integer.toHexString(adapterAccordingToMap.hashCode()), ""+adapterAccordingToMap.getObject()
+                        ));
+
+//      TODO[ISIS-1976] too strict, remove        
+//        ensureThatArg(
+//                adapter, equalTo(adapterAccordingToMap),
+//                ()->String.format("mismatch in %s (oid='%s')"
+//                        + ": provided adapter's hash: %s (pojo='%s'), \n"
+//                        + "but map's adapter's hash was: %s (pojo='%s')",
+//                        mapName, adapterOid,
+//                        Integer.toHexString(adapter.hashCode()), ""+adapter.getObject(),
+//                        Integer.toHexString(adapterAccordingToMap.hashCode()), ""+adapterAccordingToMap.getObject()
+//                        ));
     }
 }
\ No newline at end of file