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 2019/10/30 15:03:20 UTC

[isis] 01/07: ISIS-2158: moving ObjectAdapterContext -> jdo-common

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

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 7cdb3f4dff83bfbe0559dc138cb787edd192af6b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Oct 30 08:37:53 2019 +0100

    ISIS-2158: moving ObjectAdapterContext -> jdo-common
---
 core/applib/pom.xml                                |  14 +--
 .../apache/isis/applib/annotation/Collection.java  |   5 +-
 .../apache/isis/applib/annotation/Property.java    |   5 +-
 .../exceprecog/ExceptionRecognizerForType.java     | 105 ++++++++++++++-------
 .../applib/services/metrics/MetricsService.java    |   1 -
 .../commons/internal/exceptions/_Exceptions.java   |  25 ++++-
 .../exceprecog/ExceptionRecognizerDocDefault.java  |   1 -
 .../specimpl/OneToManyAssociationDefault.java      |  14 +--
 .../applib/services/jdosupport/IsisJdoSupport.java |   0
 .../applib/services/jdosupport/package-info.java   |   0
 ...xceptionRecognizerForJDODataStoreException.java |   7 +-
 ...traintViolationForeignKeyNoActionException.java |   1 +
 ...yConstraintViolationUniqueOrIndexException.java |   1 +
 ...eption.java => JdoNestedExceptionResolver.java} |  29 ++++--
 .../adaptermanager/ObjectAdapterContext.java       |   0
 .../ObjectAdapterContext_DependencyInjection.java  |   0
 .../ObjectAdapterContext_Factories.java            |   0
 ...ObjectAdapterContext_LifecycleEventSupport.java |   0
 .../ObjectAdapterContext_MementoSupport.java       |   0
 .../ObjectAdapterContext_NewIdentifier.java        |   0
 ...ctAdapterContext_ObjectAdapterByIdProvider.java |   0
 ...ObjectAdapterContext_ObjectAdapterProvider.java |   0
 .../ObjectAdapterContext_ObjectCreation.java       |   0
 .../ObjectAdapterContext_ServiceLookup.java        |   0
 .../adaptermanager/ObjectAdapterLegacy.java        |   0
 .../background/CommandExecutorServiceDefault.java  |  47 +++++----
 .../isis/runtime/memento/ObjectAdapterMemento.java |   1 -
 .../ObjectAdapterMementoSupport_usingDefault.java  |   3 +-
 extensions/fixtures/pom.xml                        |   6 ++
 .../legacy/teardown/TeardownFixtureAbstract.java   |   3 +-
 .../legacy/teardown/TeardownFixtureAbstract2.java  |   3 +-
 extensions/legacy/pom.xml                          |   6 ++
 32 files changed, 172 insertions(+), 105 deletions(-)

diff --git a/core/applib/pom.xml b/core/applib/pom.xml
index 3caa879..2ae2f76 100644
--- a/core/applib/pom.xml
+++ b/core/applib/pom.xml
@@ -71,13 +71,13 @@
         </dependency>
 		
 		<!-- JDO API (non transient, provided by plugin) -->
-        <dependency>
-            <groupId>javax.jdo</groupId>
-            <artifactId>jdo-api</artifactId>
-            <version>${jdo-api.version}</version>
-            <!-- provided by plugins -->
-            <scope>provided</scope>
-        </dependency>
+<!--         <dependency> -->
+<!--             <groupId>javax.jdo</groupId> -->
+<!--             <artifactId>jdo-api</artifactId> -->
+<!--             <version>${jdo-api.version}</version> -->
+<!--             provided by plugins -->
+<!--             <scope>provided</scope> -->
+<!--         </dependency> -->
 
         <!-- HSQL-DB -->
         <dependency>
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
index 793e444..fa8944a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
@@ -25,8 +25,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import javax.jdo.annotations.NotPersistent;
-
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 
 /**
@@ -93,7 +91,8 @@ public @interface Collection {
      * Indicates whether the collecion should be included or excluded from mementos.
      *
      * <p>
-     *     To ensure that the collection is actually not persisted in the objectstore, also annotate with the JDO annotation {@link NotPersistent}.
+     *     To ensure that the collection is actually not persisted in the objectstore, 
+     *     also annotate with the JDO annotation {@link javax.jdo.annotations.NotPersistent}.
      * </p>
      */
     MementoSerialization mementoSerialization() default MementoSerialization.NOT_SPECIFIED;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index 22d3a7b..99e87fd 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -25,8 +25,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import javax.jdo.annotations.NotPersistent;
-
 import org.apache.isis.applib.conmap.ContentMappingServiceForCommandDto;
 import org.apache.isis.applib.conmap.ContentMappingServiceForCommandsDto;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
@@ -200,7 +198,8 @@ public @interface Property {
      * Indicates whether the property should be included or excluded from mementos.
      *
      * <p>
-     *     To ensure that the property is actually not persisted in the objectstore, also annotate with the JDO annotation {@link NotPersistent}.
+     *     To ensure that the property is actually not persisted in the objectstore, also annotate with the JDO annotation 
+     *     {@link javax.jdo.annotations.NotPersistent}.
      * </p>
      */
     MementoSerialization mementoSerialization() default MementoSerialization.NOT_SPECIFIED;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerForType.java b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerForType.java
index a36317c..7ace8f5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerForType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerForType.java
@@ -21,13 +21,17 @@ package org.apache.isis.applib.services.exceprecog;
 import java.util.List;
 import java.util.function.Function;
 import java.util.function.Predicate;
-
-import javax.jdo.JDODataStoreException;
+import java.util.stream.Stream;
 
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 
+import static org.apache.isis.commons.internal.exceptions._Exceptions.containsAnyOfTheseMessages;
+import static org.apache.isis.commons.internal.exceptions._Exceptions.getCausalChain;
+
+import lombok.val;
+
 /**
- * An specific implementation of {@link ExceptionRecognizer} that looks for an
+ * A specific implementation of {@link ExceptionRecognizer} that looks for an
  * exception of the type provided in the constructor
  * and, if found anywhere in the causal chain,
  * then returns a non-null message indicating that the exception has been recognized.
@@ -38,15 +42,36 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
  */
 public class ExceptionRecognizerForType extends ExceptionRecognizerAbstract {
 
-    protected final static Predicate<Throwable> ofTypeExcluding(final Class<? extends Throwable> exceptionType, final String... messages) {
-        return ofType(exceptionType).and(excluding(messages));
+    /**
+     * Introduced in support of eg. {@link javax.jdo.JDODataStoreException}
+     * @since 2.0
+     */
+    @FunctionalInterface
+    public static interface NestedExceptionResolver {
+        Stream<Throwable> streamNestedExceptionsOf(Throwable throwable); 
+        
+        public static final NestedExceptionResolver NOOP = __->Stream.empty();
+    }
+    
+    protected final static Predicate<Throwable> ofTypeExcluding(
+            final Class<? extends Throwable> exceptionType, 
+            final NestedExceptionResolver nestedExceptionResolver,
+            final String... messages) {
+        
+        return ofType(exceptionType).and(excluding(nestedExceptionResolver, messages));
     }
 
-    protected final static Predicate<Throwable> ofTypeIncluding(final Class<? extends Throwable> exceptionType, final String... messages) {
-        return ofType(exceptionType).and(including(messages));
+    protected final static Predicate<Throwable> ofTypeIncluding(
+            final Class<? extends Throwable> exceptionType,
+            final NestedExceptionResolver nestedExceptionResolver,
+            final String... messages) {
+        
+        return ofType(exceptionType).and(including(nestedExceptionResolver, messages));
     }
 
-    protected final static Predicate<Throwable> ofType(final Class<? extends Throwable> exceptionType) {
+    protected final static Predicate<Throwable> ofType(
+            final Class<? extends Throwable> exceptionType) {
+        
         return input->exceptionType.isAssignableFrom(input.getClass());
     }
 
@@ -58,31 +83,33 @@ public class ExceptionRecognizerForType extends ExceptionRecognizerAbstract {
      * <p>
      * Intended to prevent too eager matching of an overly general exception type.
      */
-    protected final static Predicate<Throwable> excluding(final String... messages) {
+    protected final static Predicate<Throwable> excluding(
+            final NestedExceptionResolver nestedExceptionResolver,
+            final String... messages) {
+        
         return input->{
-            final List<Throwable> causalChain = _Exceptions.getCausalChain(input);
-            for (String message : messages) {
-                for (Throwable throwable : causalChain) {
-                    final String throwableMessage = throwable.getMessage();
-                    if(throwableMessage != null && throwableMessage.contains(message)) {
-                        return false;
-                    }
-                    if(throwable instanceof JDODataStoreException) {
-                        final JDODataStoreException jdoDataStoreException = (JDODataStoreException) throwable;
-                        final Throwable[] nestedExceptions = jdoDataStoreException.getNestedExceptions();
-                        for (Throwable nestedException : nestedExceptions) {
-                            final String nestedThrowableMessage = nestedException.getMessage();
-                            if(nestedThrowableMessage != null && nestedThrowableMessage.contains(message)) {
-                                return false;
-                            }
-                        }
-                    }
+            final List<Throwable> causalChain = getCausalChain(input);
+            
+            for (Throwable throwable : causalChain) {
+                
+                if(containsAnyOfTheseMessages(throwable, messages)) {
+                    return false; 
+                }
+                
+                val isAnyNestedRecognized = nestedExceptionResolver.streamNestedExceptionsOf(throwable)
+                .anyMatch(nested->_Exceptions.containsAnyOfTheseMessages(throwable, messages));
+                
+                if(isAnyNestedRecognized) {
+                    return false;
                 }
+
             }
+            
             return true;
         };
 
     }
+    
 
     /**
      * A {@link Predicate} that {@link Predicate#apply(Object) applies} only if at least one of the message(s)
@@ -92,17 +119,27 @@ public class ExceptionRecognizerForType extends ExceptionRecognizerAbstract {
      * <p>
      * Intended to prevent more precise matching of a specific general exception type.
      */
-    protected final static Predicate<Throwable> including(final String... messages) {
+    protected final static Predicate<Throwable> including(
+            final NestedExceptionResolver nestedExceptionResolver,
+            final String... messages) {
+        
         return input->{
-            final List<Throwable> causalChain = _Exceptions.getCausalChain(input);
-            for (String message : messages) {
-                for (Throwable throwable : causalChain) {
-                    final String throwableMessage = throwable.getMessage();
-                    if(throwableMessage != null && throwableMessage.contains(message)) {
-                        return true;
-                    }
+            final List<Throwable> causalChain = getCausalChain(input);
+           
+            for (Throwable throwable : causalChain) {
+                if(containsAnyOfTheseMessages(throwable, messages)) {
+                    return true; 
+                }
+                
+                val isAnyNestedRecognized = nestedExceptionResolver.streamNestedExceptionsOf(throwable)
+                        .anyMatch(nested->_Exceptions.containsAnyOfTheseMessages(throwable, messages));
+                        
+                if(isAnyNestedRecognized) {
+                    return true;
                 }
+                
             }
+            
             return false;
         };
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java b/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
index 4659460..d66966f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
@@ -19,7 +19,6 @@
 package org.apache.isis.applib.services.metrics;
 
 import javax.enterprise.context.RequestScoped;
-import javax.jdo.listener.InstanceLifecycleEvent;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.iactn.InteractionContext;
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 344772e..8598579 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
@@ -31,6 +31,8 @@ import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
+import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.functions._Functions;
 
@@ -263,6 +265,26 @@ public final class _Exceptions {
         }
         
     }
+    
+    // -- PREDICATES
+    
+    public static boolean containsAnyOfTheseMessages(@Nullable Throwable throwable, @Nullable String ... messages) {
+        if(throwable==null) {
+            return false;
+        }
+        val throwableMessage = throwable.getMessage();
+        if(throwableMessage == null || _NullSafe.isEmpty(messages)) {
+            return false;
+        }
+        for (String message : messages) {
+            if(_Strings.isNotEmpty(message) 
+                    && throwableMessage.contains(message)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 
     // -- FLUENT EXCEPTION
 
@@ -374,7 +396,4 @@ public final class _Exceptions {
 
 
 
-
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
index 4399def..6482c17 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.services.exceprecog;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.stereotype.Service;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
index 4877563..8bb8619 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -165,18 +165,10 @@ extends ObjectAssociationAbstract implements OneToManyAssociation {
         }
         
         val objectManager = super.getObjectManager();
-        System.err.println("#### likely won't work");
-        return objectManager.adapt(collection);
         
-//        val objectIdentifier = ManagedObject._collectionOidIfAny(ownerAdapter).getIdentifier();
-//
-//        
-//        //val spec = objectManager.loadSpec(collection); 
-//        val objectLoadRequest = ObjectLoadRequest.ofParentedCollection(ownerAdapter, this);
-//        val collectionAdapter = objectManager.loadObject(objectLoadRequest);
-//         
-//        val newAdapter = getObjectAdapterProvider().adapterForCollection(collection, parentOid, this);
-//        return newAdapter.injectServices(getServiceInjector());
+        super.getServiceInjector().injectServicesInto(collection);
+        
+        return objectManager.adapt(collection);
     }
 
     @Override
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
similarity index 100%
rename from core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupport.java
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/package-info.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/applib/services/jdosupport/package-info.java
similarity index 100%
rename from core/applib/src/main/java/org/apache/isis/applib/services/jdosupport/package-info.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/applib/services/jdosupport/package-info.java
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreException.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreException.java
index 9549f16..e3ee12d 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreException.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreException.java
@@ -24,9 +24,14 @@ public class ExceptionRecognizerForJDODataStoreException extends ExceptionRecogn
 
     public ExceptionRecognizerForJDODataStoreException() {
         super(Category.SERVER_ERROR,
-                ofTypeExcluding(javax.jdo.JDODataStoreException.class, "NOT NULL check constraint"),
+                ofTypeExcluding(
+                        javax.jdo.JDODataStoreException.class,
+                        JdoNestedExceptionResolver::streamNestedExceptionsOf,
+                        "NOT NULL check constraint"),
                 prefix("Unable to save changes.  " +
                         "Does similar data already exist, or has referenced data been deleted?"));
     }
+    
+
 
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java
index c749ca3..536bd17 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java
@@ -29,6 +29,7 @@ extends ExceptionRecognizerForType {
         super(Category.CONSTRAINT_VIOLATION,
                 ofTypeIncluding(
                         JDODataStoreException.class,
+                        JdoNestedExceptionResolver::streamNestedExceptionsOf,
                         "integrity constraint violation: foreign key no action"),
                 prefix("Related data exists"));
     }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForSQLIntegrityConstraintViolationUniqueOrIndexException.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForSQLIntegrityConstraintViolationUniqueOrIndexException.java
index cbf2af0..88750af 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForSQLIntegrityConstraintViolationUniqueOrIndexException.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForSQLIntegrityConstraintViolationUniqueOrIndexException.java
@@ -27,6 +27,7 @@ extends ExceptionRecognizerForType {
         super(Category.CONSTRAINT_VIOLATION,
                 ofTypeIncluding(
                         java.sql.SQLIntegrityConstraintViolationException.class,
+                        ExceptionRecognizerForType.NestedExceptionResolver.NOOP,
                         "unique constraint or index violation"),
                 prefix("Data already exists"));
     }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/JdoNestedExceptionResolver.java
similarity index 60%
copy from core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java
copy to core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/JdoNestedExceptionResolver.java
index c749ca3..6db40a3 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/exceprecog/JdoNestedExceptionResolver.java
@@ -18,19 +18,28 @@
  */
 package org.apache.isis.jdo.exceprecog;
 
+import java.util.stream.Stream;
+
 import javax.jdo.JDODataStoreException;
 
-import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerForType;
+import org.apache.isis.commons.internal.base._NullSafe;
 
-public class ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException
-extends ExceptionRecognizerForType {
+import lombok.val;
 
-    public ExceptionRecognizerForJDODataStoreExceptionIntegrityConstraintViolationForeignKeyNoActionException() {
-        super(Category.CONSTRAINT_VIOLATION,
-                ofTypeIncluding(
-                        JDODataStoreException.class,
-                        "integrity constraint violation: foreign key no action"),
-                prefix("Related data exists"));
-    }
+/**
+ * @since 2.0
+ */
+final class JdoNestedExceptionResolver {
 
+    static Stream<Throwable> streamNestedExceptionsOf(Throwable throwable) {
+        
+        if(throwable instanceof JDODataStoreException) {
+            val jdoDataStoreException = (JDODataStoreException) throwable;
+            return _NullSafe.stream(jdoDataStoreException.getNestedExceptions());
+            
+        }
+        return Stream.empty();
+        
+    }
+    
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_LifecycleEventSupport.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_LifecycleEventSupport.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_LifecycleEventSupport.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_LifecycleEventSupport.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ServiceLookup.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ServiceLookup.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ServiceLookup.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ServiceLookup.java
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
similarity index 100%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
rename to core/plugins/jdo/common/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
index 36b14a4..443b5bf 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
@@ -40,9 +40,8 @@ import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -54,7 +53,6 @@ import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.schema.cmd.v1.ActionDto;
 import org.apache.isis.schema.cmd.v1.CommandDto;
@@ -149,13 +147,13 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
                     for (OidDto targetOidDto : targetOidDtos) {
 
-                        final ObjectAdapter targetAdapter = adapterFor(targetOidDto);
+                        val targetAdapter = adapterFor(targetOidDto);
                         final ObjectAction objectAction = findObjectAction(targetAdapter, memberId);
 
                         // we pass 'null' for the mixedInAdapter; if this action _is_ a mixin then
                         // it will switch the targetAdapter to be the mixedInAdapter transparently
-                        final ObjectAdapter[] argAdapters = argAdaptersFor(actionDto);
-                        final ManagedObject resultAdapter = objectAction.execute(
+                        final ManagedObject[] argAdapters = argAdaptersFor(actionDto);
+                        val resultAdapter = objectAction.execute(
                                 targetAdapter, null, argAdapters, InteractionInitiatedBy.FRAMEWORK);
 
                         // flush any Isis PersistenceCommands pending
@@ -185,11 +183,11 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
                         final Bookmark bookmark = Bookmark.from(targetOidDto);
                         final Object targetObject = bookmarkService.lookup(bookmark, FieldResetPolicy.RESET);
 
-                        final ObjectAdapter targetAdapter = adapterFor(targetObject);
+                        val targetAdapter = adapterFor(targetObject);
 
                         final OneToOneAssociation property = findOneToOneAssociation(targetAdapter, memberId);
 
-                        final ObjectAdapter newValueAdapter = newValueAdapterFor(propertyDto);
+                        val newValueAdapter = newValueAdapterFor(propertyDto);
 
                         property.set(targetAdapter, newValueAdapter, InteractionInitiatedBy.FRAMEWORK);
 
@@ -232,7 +230,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
     // //////////////////////////////////////
 
     private static ObjectAction findObjectAction(
-            final ObjectAdapter targetAdapter,
+            final ManagedObject targetAdapter,
             final String actionId) throws RuntimeException {
 
         final ObjectSpecification specification = targetAdapter.getSpecification();
@@ -245,7 +243,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
     }
 
     private static OneToOneAssociation findOneToOneAssociation(
-            final ObjectAdapter targetAdapter,
+            final ManagedObject targetAdapter,
             final String propertyId) throws RuntimeException {
 
         final ObjectSpecification specification = targetAdapter.getSpecification();
@@ -257,7 +255,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
         return property;
     }
 
-    private ObjectAdapter newValueAdapterFor(final PropertyDto propertyDto) {
+    private ManagedObject newValueAdapterFor(final PropertyDto propertyDto) {
         final ValueWithTypeDto newValue = propertyDto.getNewValue();
         final Object arg = CommonDtoUtils.getValue(newValue);
         return adapterFor(arg);
@@ -291,17 +289,15 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
     }
 
-    private ObjectAdapter[] argAdaptersFor(final ActionDto actionDto) {
-        final List<ParamDto> params = paramDtosFrom(actionDto);
-        final List<ObjectAdapter> args = _Lists.newArrayList(
-                params.stream()
-                .map(paramDto -> {
-                    final Object arg = CommonDtoUtils.getValue(paramDto);
-                    return adapterFor(arg);
-                })
-                .collect(Collectors.toList())
-                );
-        return args.toArray(new ObjectAdapter[]{});
+    private ManagedObject[] argAdaptersFor(final ActionDto actionDto) {
+        
+        val paramDtos = paramDtosFrom(actionDto);
+        
+        return paramDtos
+                .stream()
+                .map(CommonDtoUtils::getValue)
+                .map(this::adapterFor)
+                .collect(_Arrays.toArray(ManagedObject.class, paramDtos.size()));
     }
 
     private static List<ParamDto> paramDtosFrom(final ActionDto actionDto) {
@@ -315,8 +311,11 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
         return Collections.emptyList();
     }
 
-    private ObjectAdapter adapterFor(final Object targetObject) {
-        return ObjectAdapterLegacy.__CommandExecutorServiceDefault.adapterFor(targetObject);
+    private ManagedObject adapterFor(final Object pojo) {
+        return ManagedObject.of(getSpecificationLoader()::loadSpecification, pojo);
+        
+        //legacy of
+        //return ObjectAdapterLegacy.__CommandExecutorServiceDefault.adapterFor(targetObject);
     }
 
     // //////////////////////////////////////
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
index 25f29b8..3786f32 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
@@ -31,7 +31,6 @@ import org.apache.isis.commons.collections.Cardinality;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.ioc.BeanSort;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
index 598a973..5b3a7bf 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.ioc.BeanSort;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
@@ -125,7 +124,7 @@ implements ObjectAdapterMementoSupport {
         }
         
         private PersistenceSession persistenceSession() {
-            return IsisContext.getPersistenceSession().get();
+            return IsisContext.getPersistenceSession().orElse(null);
         }
 
     }
diff --git a/extensions/fixtures/pom.xml b/extensions/fixtures/pom.xml
index ec1a4c4..63b88f8 100644
--- a/extensions/fixtures/pom.xml
+++ b/extensions/fixtures/pom.xml
@@ -43,6 +43,12 @@
 
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-plugins-jdo-common</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-integtestsupport</artifactId>
 			<scope>provided</scope>
 		</dependency>
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract.java
index d1b76db..8dbf320 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract.java
@@ -63,7 +63,6 @@ public abstract class TeardownFixtureAbstract extends FixtureScript {
 
     protected void postDeleteFrom(final Class<?> cls) {}
 
-    @Inject
-    private IsisJdoSupport isisJdoSupport;
+    @Inject private IsisJdoSupport isisJdoSupport;
 
 }
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract2.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract2.java
index e1db35e..33a4cec 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract2.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/teardown/TeardownFixtureAbstract2.java
@@ -148,6 +148,5 @@ public abstract class TeardownFixtureAbstract2 extends TeardownFixtureAbstract {
     protected void postDeleteFrom(Class<?> cls) {
     }
 
-    @Inject
-    protected IsisJdoSupport isisJdoSupport;
+    @Inject protected IsisJdoSupport isisJdoSupport;
 }
diff --git a/extensions/legacy/pom.xml b/extensions/legacy/pom.xml
index f836bea..3001a01 100644
--- a/extensions/legacy/pom.xml
+++ b/extensions/legacy/pom.xml
@@ -57,6 +57,12 @@
 			<artifactId>isis-applib</artifactId>
 			<scope>compile</scope>
 		</dependency>
+		
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-plugins-jdo-common</artifactId>
+			<scope>provided</scope>
+		</dependency>
 
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>