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 2020/12/24 15:49:02 UTC

[isis] 02/02: ISIS-2033: dn-integration: separation of concerns

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

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

commit c67d96adb83f8b60d1b1dbe04ae2c0c7738516e9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 24 16:48:43 2020 +0100

    ISIS-2033: dn-integration: separation of concerns
    
    introduces FetchResultHandler, specific to handling fetch results:
    service injection and entity change tracking
---
 .../isis/commons/internal/collections/_Maps.java   | 20 ++++++++
 .../lifecycles/IsisLifecycleListener.java          | 27 +++++-----
 .../fetching/ValueFetchResultHandler.java          | 27 ----------
 .../persistence/JdoPersistenceSession5.java        | 23 +++++----
 .../jdo/integration/persistence/_Utils.java        | 20 ++++++--
 .../queries/FetchResultHandler.java}               |  7 +--
 .../queries/PersistenceQueryContext.java           |  5 +-
 .../queries/PersistenceQueryProcessorAbstract.java |  4 +-
 .../persistence/query/PersistenceQueryFactory.java | 59 +++++++++++++---------
 ...ersistenceQueryFindUsingApplibQueryDefault.java |  8 +--
 ...andQueue.java => _PersistenceCommandQueue.java} |  2 +-
 .../jdo/integration/transaction/_Tx.java           |  4 +-
 12 files changed, 112 insertions(+), 94 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/collections/_Maps.java b/commons/src/main/java/org/apache/isis/commons/internal/collections/_Maps.java
index cf08b26..acf1dfe 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/collections/_Maps.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/collections/_Maps.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
@@ -166,6 +167,23 @@ public final class _Maps {
     
     // -- TRANSFORMATIONS
     
+    public static <K, V0, V1> Map<K, V1> mapValues(
+            @Nullable Map<K, V0> input,
+            @NonNull Supplier<Map<K, V1>> mapFactory,
+            @NonNull Function<V0, V1> valueMapper) {
+        
+        val resultMap = mapFactory.get();
+        
+        if(input==null
+                || input.isEmpty()) {
+            return resultMap;
+        }
+        
+        input.forEach((k, v)->resultMap.put(k, valueMapper.apply(v)));
+        return resultMap;
+    }
+            
+    
     public static <K, V> Map<K, V> filterKeys(
             @Nullable Map<K, V> input,
             Predicate<K> keyFilter, 
@@ -198,6 +216,8 @@ public final class _Maps {
         return result;
     }
 
+    // -- FACTORIES ...
+    
     // -- HASH MAP
 
     public static <K, V> HashMap<K, V> newHashMap() {
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/IsisLifecycleListener.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/IsisLifecycleListener.java
index 0691e83..144474e 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/IsisLifecycleListener.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/IsisLifecycleListener.java
@@ -33,7 +33,9 @@ import javax.jdo.listener.StoreLifecycleListener;
 import org.datanucleus.enhancement.Persistable;
 
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.persistence.jdo.integration.lifecycles.fetching.EntityFetchResultHandler;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+
+import lombok.NonNull;
 
 public class IsisLifecycleListener
 implements AttachLifecycleListener, ClearLifecycleListener, CreateLifecycleListener, DeleteLifecycleListener,
@@ -42,8 +44,9 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
     /**
      * The internal contract between PersistenceSession and this class.
      */
-    public interface PersistenceSessionLifecycleManagement 
-    extends EntityFetchResultHandler {
+    public interface EntityChangeEmitter {
+        
+        ManagedObject adaptEntityAndInjectServices(Persistable pojo);
 
         void invokeIsisPersistingCallback(Persistable pojo);
         void enlistCreatedAndInvokeIsisPersistedCallback(Persistable pojo);
@@ -55,10 +58,10 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
 
     }
 
-    private final PersistenceSessionLifecycleManagement persistenceSession;
+    private final EntityChangeEmitter entityChangeEmitter;
 
-    public IsisLifecycleListener(final PersistenceSessionLifecycleManagement persistenceSession) {
-        this.persistenceSession = persistenceSession;
+    public IsisLifecycleListener(final @NonNull EntityChangeEmitter entityChangeEmitter) {
+        this.entityChangeEmitter = entityChangeEmitter;
     }
 
 
@@ -86,14 +89,14 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
     @Override
     public void postLoad(final InstanceLifecycleEvent event) {
         final Persistable pojo = _Utils.persistableFor(event);
-        persistenceSession.initializeEntity(pojo);
+        entityChangeEmitter.adaptEntityAndInjectServices(pojo);
     }
 
     @Override
     public void preStore(InstanceLifecycleEvent event) {
         final Persistable pojo = _Utils.persistableFor(event);
         if(pojo.dnGetStateManager().isNew(pojo)) {
-            persistenceSession.invokeIsisPersistingCallback(pojo);
+            entityChangeEmitter.invokeIsisPersistingCallback(pojo);
         }
     }
 
@@ -101,16 +104,16 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
     public void postStore(InstanceLifecycleEvent event) {
         final Persistable pojo = _Utils.persistableFor(event);
         if(pojo.dnGetStateManager().isNew(pojo)) {
-            persistenceSession.enlistCreatedAndInvokeIsisPersistedCallback(pojo);
+            entityChangeEmitter.enlistCreatedAndInvokeIsisPersistedCallback(pojo);
         } else {
-            persistenceSession.invokeIsisUpdatedCallback(pojo);
+            entityChangeEmitter.invokeIsisUpdatedCallback(pojo);
         }
     }
 
     @Override
     public void preDirty(InstanceLifecycleEvent event) {
         final Persistable pojo = _Utils.persistableFor(event);
-        persistenceSession.enlistUpdatingAndInvokeIsisUpdatingCallback(pojo);
+        entityChangeEmitter.enlistUpdatingAndInvokeIsisUpdatingCallback(pojo);
     }
 
     @Override
@@ -126,7 +129,7 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
     @Override
     public void preDelete(InstanceLifecycleEvent event) {
         final Persistable pojo = _Utils.persistableFor(event);
-        persistenceSession.enlistDeletingAndInvokeIsisRemovingCallbackFacet(pojo);
+        entityChangeEmitter.enlistDeletingAndInvokeIsisRemovingCallbackFacet(pojo);
 
 
     }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/fetching/ValueFetchResultHandler.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/fetching/ValueFetchResultHandler.java
deleted file mode 100644
index 2cf457c..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/fetching/ValueFetchResultHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.integration.lifecycles.fetching;
-
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public interface ValueFetchResultHandler {
-
-    ManagedObject adapterFor(Object pojo);
-    
-}
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java
index d2dd1db..6805fa2 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java
@@ -63,7 +63,7 @@ import lombok.extern.log4j.Log4j2;
 public class JdoPersistenceSession5 extends _JdoPersistenceSessionBase
 implements
     PersistenceQueryContext,
-    IsisLifecycleListener.PersistenceSessionLifecycleManagement {
+    IsisLifecycleListener.EntityChangeEmitter {
 
     private Runnable unregisterLifecycleListeners;
 
@@ -96,7 +96,7 @@ implements
 
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
-        final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
+        final IsisLifecycleListener.EntityChangeEmitter psLifecycleMgmt = this;
         final IsisLifecycleListener isisLifecycleListener = new IsisLifecycleListener(psLifecycleMgmt);
         persistenceManager.addInstanceLifecycleListener(isisLifecycleListener, (Class[]) null);
 
@@ -155,8 +155,8 @@ implements
     }
 
     @Override
-    public ManagedObject adapterFor(final @Nullable Object pojo) {
-        return _Utils.adapterFor(getMetaModelContext(), pojo);
+    public ManagedObject adaptEntityAndInjectServices(final @NonNull Persistable pojo) {
+        return _Utils.adaptEntityAndInjectServices(getMetaModelContext(), pojo);
     }
     
     @Override
@@ -206,7 +206,7 @@ implements
             final QueryCardinality cardinality) {
 
         final PersistenceQuery persistenceQuery =
-                persistenceQueryFactory.createPersistenceQueryFor(this::adapterFor, query, cardinality);
+                persistenceQueryFactory.createPersistenceQueryFor(query, cardinality);
         if (persistenceQuery == null) {
             throw new IllegalArgumentException("Unknown Query type: " + query.getDescription());
         }
@@ -288,7 +288,7 @@ implements
         // possibly redundant because also called in the post-load event
         // listener, but (with JPA impl) found it was required if we were ever to
         // get an eager left-outer-join as the result of a refresh (sounds possible).
-        initializeEntity((Persistable) domainObject);
+        initializeEntityAfterFetched((Persistable) domainObject);
     }
 
     // -- makePersistent
@@ -380,12 +380,12 @@ implements
 
     @Override
     public void enlistDeletingAndInvokeIsisRemovingCallbackFacet(final Persistable pojo) {
-        val entity = adapterFor(pojo);
+        val entity = adaptEntityAndInjectServices(pojo);
         getEntityChangeTracker().enlistDeleting(entity);
     }
 
     @Override
-    public ManagedObject initializeEntity(final Persistable pojo) {
+    public ManagedObject initializeEntityAfterFetched(final Persistable pojo) {
 
         final ManagedObject entity = _Utils
                 .identify(getMetaModelContext(), getPersistenceManager(), pojo);
@@ -394,6 +394,11 @@ implements
 
         return entity;
     }
+    
+    @Override
+    public ManagedObject initializeValueAfterFetched(final @Nullable Object pojo) {
+        return _Utils.adaptNullableAndInjectServices(getMetaModelContext(), pojo);
+    }
 
     @Override
     public String identifierFor(final Object pojo) {
@@ -436,7 +441,7 @@ implements
      */
     @Override
     public void enlistCreatedAndInvokeIsisPersistedCallback(final Persistable pojo) {
-        val entity = adapterFor(pojo);
+        val entity = adaptEntityAndInjectServices(pojo);
         getEntityChangeTracker().enlistCreated(entity);
     }
 
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/_Utils.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/_Utils.java
index 135b324..25abda4 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/_Utils.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/_Utils.java
@@ -22,6 +22,7 @@ import javax.annotation.Nullable;
 import javax.jdo.PersistenceManager;
 
 import org.apache.isis.commons.functional.Result;
+import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -36,13 +37,12 @@ import lombok.val;
 
 final class _Utils {
 
-    @Nullable
-    static ManagedObject adapterFor(
+    static ManagedObject adaptNullableAndInjectServices(
             final @NonNull MetaModelContext mmc,
             final @Nullable Object pojo) {
         
         if(pojo == null) {
-            return null;
+            return ManagedObject.unspecified();
         }
         
         val objectManager = mmc.getObjectManager();
@@ -50,10 +50,20 @@ final class _Utils {
         return injectServices(mmc, adapter);
     }
     
-    @Nullable
+    static ManagedObject adaptEntityAndInjectServices(
+            final @NonNull MetaModelContext mmc,
+            final @NonNull Object entityPojo) {
+        
+        val objectManager = mmc.getObjectManager();
+        val entity = objectManager.adapt(entityPojo);
+        _Assert.assertTrue(entity.getSpecification().isEntity());
+        return injectServices(mmc, entity);
+    }
+
+    
     static ManagedObject injectServices(
             final @NonNull MetaModelContext mmc,
-            final @Nullable ManagedObject adapter) {
+            final @NonNull ManagedObject adapter) {
         
         if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
             return adapter; 
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/fetching/EntityFetchResultHandler.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/FetchResultHandler.java
similarity index 79%
rename from persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/fetching/EntityFetchResultHandler.java
rename to persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/FetchResultHandler.java
index 9c18b34..2dc7932 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/fetching/EntityFetchResultHandler.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/FetchResultHandler.java
@@ -16,14 +16,15 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.integration.lifecycles.fetching;
+package org.apache.isis.persistence.jdo.integration.persistence.queries;
 
 import org.datanucleus.enhancement.Persistable;
 
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public interface EntityFetchResultHandler {
+public interface FetchResultHandler {
     
-    ManagedObject initializeEntity(Persistable pojo);
+    ManagedObject initializeEntityAfterFetched(Persistable pojo);
+    ManagedObject initializeValueAfterFetched(Object pojo);
 
 }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryContext.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryContext.java
index ad48b30..e4c407d 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryContext.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryContext.java
@@ -18,14 +18,11 @@
  */
 package org.apache.isis.persistence.jdo.integration.persistence.queries;
 
-import org.apache.isis.persistence.jdo.integration.lifecycles.fetching.EntityFetchResultHandler;
-import org.apache.isis.persistence.jdo.integration.lifecycles.fetching.ValueFetchResultHandler;
 import org.apache.isis.persistence.jdo.provider.persistence.HasPersistenceManager;
 
 public interface PersistenceQueryContext 
 extends
-    ValueFetchResultHandler,
-    EntityFetchResultHandler,
+    FetchResultHandler,
     HasPersistenceManager {
 
 }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java
index c12b1ac..554b439 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/queries/PersistenceQueryProcessorAbstract.java
@@ -52,11 +52,11 @@ implements PersistenceQueryProcessor<T> {
             ManagedObject adapter;
             if(pojo instanceof Persistable) {
                 // an entity
-                adapter = queryContext.initializeEntity((Persistable) pojo);
+                adapter = queryContext.initializeEntityAfterFetched((Persistable) pojo);
                 _Assert.assertNotNull(adapter);
             } else {
                 // a value type
-                adapter = queryContext.adapterFor(pojo);
+                adapter = queryContext.initializeValueAfterFetched(pojo);
                 _Assert.assertNotNull(adapter);
             }
             adapters.add(adapter);
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java
index e6fc8df..46e9f37 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFactory.java
@@ -18,8 +18,8 @@
  */
 package org.apache.isis.persistence.jdo.integration.persistence.query;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.function.Function;
 
 import org.apache.isis.applib.query.AllInstancesQuery;
 import org.apache.isis.applib.query.NamedQuery;
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @RequiredArgsConstructor(staticName = "of") @Log4j2
@@ -43,50 +44,58 @@ public class PersistenceQueryFactory implements HasMetaModelContext {
     private final MetaModelContext metaModelContext;
 
     /**
-     * Converts the {@link org.apache.isis.applib.query.Query applib representation of a query} into the
-     * {@link PersistenceQuery NOF-internal representation}.
+     * Converts the {@link org.apache.isis.applib.query.Query} applib representation of a query into the
+     * {@link PersistenceQuery} internal representation}.
      */
     public final PersistenceQuery createPersistenceQueryFor(
-            final Function<Object, ManagedObject> adapterProvider,
             final Query<?> query, 
             final QueryCardinality cardinality) {
         
         if (log.isDebugEnabled()) {
             log.debug("createPersistenceQueryFor: {}", query.getDescription());
         }
-        final ObjectSpecification noSpec = specFor(query);
+        
+        val queryResultTypeSpec = specFor(query);
+        
         if (query instanceof AllInstancesQuery) {
-            final AllInstancesQuery<?> queryFindAllInstances = (AllInstancesQuery<?>) query;
-            return new PersistenceQueryFindAllInstances(noSpec, queryFindAllInstances.getStart(), queryFindAllInstances.getCount());
+            val allInstancesQuery = (AllInstancesQuery<?>) query;
+            return new PersistenceQueryFindAllInstances(
+                    queryResultTypeSpec, 
+                    allInstancesQuery.getStart(), 
+                    allInstancesQuery.getCount());
 
         } if (query instanceof NamedQuery) {
-            final NamedQuery<?> queryDefault = (NamedQuery<?>) query;
-            final String queryName = queryDefault.getName();
-            final Map<String, ManagedObject> parametersByName = 
-                    wrap(adapterProvider, queryDefault.getParametersByName());
-            return new PersistenceQueryFindUsingApplibQueryDefault(noSpec, queryName, parametersByName, cardinality,
-                    getSpecificationLoader(), queryDefault.getStart(), queryDefault.getCount());
+            val namedQuery = (NamedQuery<?>) query;
+            val queryName = namedQuery.getName();
+            val parametersByName = wrap(namedQuery.getParametersByName());
+            
+            return new PersistenceQueryFindUsingApplibQueryDefault(
+                    queryResultTypeSpec, 
+                    queryName, 
+                    parametersByName, 
+                    cardinality,
+                    getSpecificationLoader(), 
+                    namedQuery.getStart(), 
+                    namedQuery.getCount());
         }
         throw _Exceptions.unsupportedOperation("query type %s not supported by this persistence implementation",
                 query.getClass());
     }
 
     /**
-     * Converts a map of pojos keyed by string to a map of adapters keyed by the
-     * same strings.
+     * Converts a map of param-pojos keyed by param-name to a map of adapters keyed by the
+     * same param-name. 
+     * @implNote we do this to ensure queryParameters have injection points resolved (might be redundant) 
      */
     private Map<String, ManagedObject> wrap(
-            final Function<Object, ManagedObject> adapterProvider,
-            final Map<String, Object> argumentsByParameterName) {
+            final Map<String, Object> queryParametersByName) {
         
-        final Map<String, ManagedObject> argumentsAdaptersByParameterName = _Maps.newHashMap();
-        for (final Map.Entry<String, Object> entry : argumentsByParameterName.entrySet()) {
-            final String parameterName = entry.getKey();
-            final Object argument = argumentsByParameterName.get(parameterName);
-            final ManagedObject argumentAdapter = argument != null ? adapterProvider.apply(argument) : null;
-            argumentsAdaptersByParameterName.put(parameterName, argumentAdapter);
-        }
-        return argumentsAdaptersByParameterName;
+        val objMan = getObjectManager();
+        val injector = getServiceInjector();
+        
+        return _Maps.mapValues(queryParametersByName, HashMap::new, paramPojo->
+            objMan.adapt(injector.injectServicesInto(paramPojo))
+        );
     }
 
     private ObjectSpecification specFor(final Query<?> query) {
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java
index 4ba4162..bb399c0 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/query/PersistenceQueryFindUsingApplibQueryDefault.java
@@ -39,19 +39,19 @@ public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQuer
 
     private final String queryName;
     private final QueryCardinality cardinality;
-    private final Map<String, ManagedObject> argumentsAdaptersByParameterName;
+    private final Map<String, ManagedObject> queryParametersByName;
 
     public PersistenceQueryFindUsingApplibQueryDefault(
             final ObjectSpecification specification,
             final String queryName,
-            final Map<String, ManagedObject> argumentsAdaptersByParameterName,
+            final Map<String, ManagedObject> queryParametersByName,
             final QueryCardinality cardinality,
             final SpecificationLoader specificationLoader,
             final long... range) {
         super(specification, range);
         this.queryName = queryName;
         this.cardinality = cardinality;
-        this.argumentsAdaptersByParameterName = argumentsAdaptersByParameterName;
+        this.queryParametersByName = queryParametersByName;
     }
 
     public String getQueryName() {
@@ -59,7 +59,7 @@ public class PersistenceQueryFindUsingApplibQueryDefault extends PersistenceQuer
     }
 
     public Map<String, ManagedObject> getArgumentsAdaptersByParameterName() {
-        return Collections.unmodifiableMap(argumentsAdaptersByParameterName);
+        return Collections.unmodifiableMap(queryParametersByName);
     }
 
     public QueryCardinality getCardinality() {
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_CommandQueue.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_PersistenceCommandQueue.java
similarity index 99%
rename from persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_CommandQueue.java
rename to persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_PersistenceCommandQueue.java
index 87d8378..2b2c406 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_CommandQueue.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_PersistenceCommandQueue.java
@@ -34,7 +34,7 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-final class _CommandQueue {
+final class _PersistenceCommandQueue {
 
     private final _Inbox<PersistenceCommand> persistenceCommands = new _Inbox<>();
 
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_Tx.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_Tx.java
index 0719c7f..aee2fbf 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_Tx.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/transaction/_Tx.java
@@ -155,7 +155,7 @@ class _Tx implements Transaction {
     @ToString.Exclude
     private final _TxHelper txHelper;
     
-    private final _CommandQueue commandQueue;
+    private final _PersistenceCommandQueue commandQueue;
     
     @ToString.Exclude
     private final InteractionTracker isisInteractionTracker;
@@ -174,7 +174,7 @@ class _Tx implements Transaction {
         id = TransactionId.of(interactionId, sequence);
         
         this.txHelper = txHelper;
-        this.commandQueue = new _CommandQueue();
+        this.commandQueue = new _PersistenceCommandQueue();
         this.isisInteractionTracker = mmc.getServiceRegistry().lookupServiceElseFail(InteractionTracker.class);
         this.transactionScopeListeners = mmc.getServiceRegistry().select(TransactionScopeListener.class);