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 2021/01/07 09:02:38 UTC

[isis] branch 2033-Spring_Data_Integration updated: ISIS-2033: further simplify JdoInteractionSession

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

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


The following commit(s) were added to refs/heads/2033-Spring_Data_Integration by this push:
     new 050f4a9  ISIS-2033: further simplify JdoInteractionSession
050f4a9 is described below

commit 050f4a955a18eae0eb4963b52e983ae28213189a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 7 10:02:21 2021 +0100

    ISIS-2033: further simplify JdoInteractionSession
---
 .../load/ObjectLoader_builtinHandlers.java         |  3 --
 .../command/CommandExecutorServiceDefault.java     |  6 ++++
 .../wrapper/WrapperFactoryDefault.java             | 10 +++---
 .../session/JdoEntityChangeEmitter.java            | 11 +++---
 .../integration/session/JdoInteractionSession.java | 42 +++++-----------------
 .../isis/JdoIsisEntityChangesPublishingTest.java   |  6 +++-
 .../JdoIsisEntityPropertyChangePublishingTest.java |  7 +++-
 7 files changed, 35 insertions(+), 50 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
index 471b774..4648a7e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
@@ -223,9 +223,6 @@ final class ObjectLoader_builtinHandlers {
             val identifier = objectLoadRequest.getObjectIdentifier();
             val entity = entityFacet.fetchByIdentifier(spec, identifier);
             
-            //TODO injection should have already be done by DataNucleus
-            metaModelContext.getServiceInjector().injectServicesInto(entity.getPojo());
-            
             return entity;
         }
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index d74271a..a6bf80a 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -51,6 +51,7 @@ import org.apache.isis.applib.util.schema.CommonDtoUtils;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -60,6 +61,7 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUt
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -238,6 +240,10 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
                 final Object targetObject = bookmarkService.lookup(bookmark);
 
                 val targetAdapter = adapterFor(targetObject);
+                
+                if(ManagedObjects.isNullOrUnspecifiedOrEmpty(targetAdapter)) {
+                    throw _Exceptions.unrecoverableFormatted("cannot recreate ManagedObject from bookmark %s", bookmark);
+                }
 
                 final OneToOneAssociation property = findOneToOneAssociation(targetAdapter, memberId);
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 9d5f0b1..d58064f 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -77,7 +77,6 @@ import org.apache.isis.applib.services.wrapper.events.PropertyModifyEvent;
 import org.apache.isis.applib.services.wrapper.events.PropertyUsabilityEvent;
 import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
 import org.apache.isis.applib.services.wrapper.listeners.InteractionListener;
-import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.base._Casts;
@@ -562,7 +561,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         private final ServiceInjector serviceInjector;
 
         @Inject InteractionFactory isisInteractionFactory;
-        @Inject TransactionService transactionService;
+        //@Inject TransactionService transactionService;
         @Inject CommandExecutorService commandExecutorService;
         @Inject Provider<InteractionContext> interactionContextProvider;
         @Inject BookmarkService bookmarkService;
@@ -576,8 +575,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
             return isisInteractionFactory.callAuthenticated(authentication, () -> {
                 val childCommand = interactionContextProvider.get().currentInteractionElseFail().getCommand();
                 childCommand.updater().setParent(parentCommand);
-                return transactionService
-                        .callWithinCurrentTransactionElseCreateNew(() -> {
+                //return transactionService.callWithinCurrentTransactionElseCreateNew(() -> {
                         val bookmark = commandExecutorService.executeCommand(commandDto, childCommand.updater());
                         if (bookmark == null) {
                             return null;
@@ -587,8 +585,8 @@ public class WrapperFactoryDefault implements WrapperFactory {
                             entity = repositoryService.detach(entity);
                         }
                         return entity;
-                    })
-                        .nullableOrElseFail();
+//                    })
+//                        .nullableOrElseFail();
             });
         }
     }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoEntityChangeEmitter.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoEntityChangeEmitter.java
index c4b3c4d..9baeb4b 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoEntityChangeEmitter.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoEntityChangeEmitter.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.persistence.jdo.integration.session;
 
-import javax.jdo.PersistenceManager;
-
 import org.datanucleus.enhancement.Persistable;
 
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -37,7 +35,6 @@ import lombok.val;
 public class JdoEntityChangeEmitter implements JdoLifecycleListener.EntityChangeEmitter {
 
     private final MetaModelContext metaModelContext;
-    private final PersistenceManager persistenceManager;
     private final EntityChangeTracker entityChangeTracker;
     
     @Override
@@ -93,13 +90,17 @@ public class JdoEntityChangeEmitter implements JdoLifecycleListener.EntityChange
 
     @Override
     public void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
-        val entity = _Utils.fetchEntityElseFail(metaModelContext, persistenceManager, pojo);
+        val entity = ManagedObject.of(
+                metaModelContext.getSpecificationLoader()::loadSpecification, 
+                pojo);
         entityChangeTracker.enlistUpdating(entity);
     }
 
     @Override
     public void invokeIsisUpdatedCallback(Persistable pojo) {
-        val entity = _Utils.fetchEntityElseFail(metaModelContext, persistenceManager, pojo);
+        val entity = ManagedObject.of(
+                metaModelContext.getSpecificationLoader()::loadSpecification, 
+                pojo);
         // the callback and transaction.enlist are done in the preStore callback
         // (can't be done here, as the enlist requires to capture the 'before' values)
         entityChangeTracker.recognizeUpdating(entity);
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoInteractionSession.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoInteractionSession.java
index e1040a8..b30b7e3 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoInteractionSession.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/session/JdoInteractionSession.java
@@ -18,11 +18,9 @@
  */
 package org.apache.isis.persistence.jdo.integration.session;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.enterprise.inject.Vetoed;
 import javax.jdo.PersistenceManager;
+import javax.jdo.PersistenceManagerFactory;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.commons.internal.assertions._Assert.OpenCloseState;
@@ -48,9 +46,7 @@ implements HasMetaModelContext {
     
     @Getter(onMethod_ = {@Override}) private final MetaModelContext metaModelContext;
 
-    private PersistenceManager persistenceManager;
-    private final TransactionAwarePersistenceManagerFactoryProxy pmf;
-    private final List<Runnable> onCloseTasks = new ArrayList<>();
+    private final TransactionAwarePersistenceManagerFactoryProxy pmfFactoryProxy;
     
     private OpenCloseState state = OpenCloseState.NOT_INITIALIZED;
 
@@ -63,14 +59,14 @@ implements HasMetaModelContext {
      */
     public JdoInteractionSession(
             final MetaModelContext metaModelContext, 
-            final TransactionAwarePersistenceManagerFactoryProxy pmf) {
+            final TransactionAwarePersistenceManagerFactoryProxy pmfFactoryProxy) {
 
         if (log.isDebugEnabled()) {
             log.debug("creating {}", this);
         }
 
         this.metaModelContext = metaModelContext;
-        this.pmf = pmf;
+        this.pmfFactoryProxy = pmfFactoryProxy;
     }
 
     // -- OPEN
@@ -86,7 +82,7 @@ implements HasMetaModelContext {
             log.debug("opening {}", this);
         }
         
-        this.persistenceManager = integrateWithApplicationLayer(pmf.getPersistenceManager());
+        integrateWithApplicationLayer(pmfFactoryProxy.getObject());
         
         this.state = OpenCloseState.OPEN;
     }
@@ -105,28 +101,11 @@ implements HasMetaModelContext {
         }
         
         this.state = OpenCloseState.CLOSED;
-
-        try {
-        
-            onCloseTasks.removeIf(task->{
-                if(!persistenceManager.isClosed()) {
-                    task.run();    
-                }
-                return true; 
-             });
-            
-        } catch(final Throwable ex) {
-            // ignore
-            log.error("close: failed to close JDO persistenceManager; continuing to avoid memory leakage", ex);
-        }
-        
-        persistenceManager = null; // detach
-        
     }
     
     // -- HELPER
     
-    private PersistenceManager integrateWithApplicationLayer(final PersistenceManager persistenceManager) {
+    private void integrateWithApplicationLayer(final PersistenceManagerFactory pmf) {
         
         val eventBusService = metaModelContext.getServiceRegistry()
                 .lookupServiceElseFail(EventBusService.class);
@@ -135,19 +114,14 @@ implements HasMetaModelContext {
                 .lookupServiceElseFail(EntityChangeTracker.class);
         
         val entityChangeEmitter = 
-                new JdoEntityChangeEmitter(getMetaModelContext(), persistenceManager, entityChangeTracker);
+                new JdoEntityChangeEmitter(getMetaModelContext(), entityChangeTracker);
         
         // install JDO specific entity change listeners ...
         
         val jdoLifecycleListener = new JdoLifecycleListener(
                 entityChangeEmitter, entityChangeTracker, eventBusService);
-        persistenceManager.addInstanceLifecycleListener(jdoLifecycleListener, (Class[]) null);
-        
-        onCloseTasks.add(()->{
-            persistenceManager.removeInstanceLifecycleListener(jdoLifecycleListener);
-        });
+        pmf.addInstanceLifecycleListener(jdoLifecycleListener, (Class[]) null);
         
-        return persistenceManager;
     }
 
 
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java
index 171421e..c915633 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java
@@ -27,12 +27,14 @@ import static org.apache.isis.testdomain.applayer.publishing.EntityChangesSubscr
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
+import org.junit.jupiter.api.Timeout;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
@@ -63,7 +65,9 @@ class JdoIsisEntityChangesPublishingTest extends IsisIntegrationTestAbstract {
     @Inject private ApplicationLayerTestFactory testFactory;
     @Inject private KVStoreForTesting kvStore;
 
-    @TestFactory @DisplayName("Application Layer")
+    @DisplayName("Application Layer")
+    @TestFactory
+    @Timeout(value = 1, unit = TimeUnit.DAYS)
     List<DynamicTest> generateTests() {
         return testFactory.generateTests(this::given, this::verify);
     }
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java
index 4837a3d..d791e20 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java
@@ -19,6 +19,7 @@
 package org.apache.isis.testdomain.applayer.publishing.jdo.isis;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
@@ -27,6 +28,7 @@ import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.MethodOrderer;
 import org.junit.jupiter.api.TestFactory;
 import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.Timeout;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
@@ -50,6 +52,7 @@ import lombok.val;
                 ApplicationLayerTestFactory.class
         }, 
         properties = {
+                "logging.level.org.apache.isis.applib.services.publishing.log.*=DEBUG",
                 "logging.level.org.apache.isis.testdomain.util.rest.KVStoreForTesting=DEBUG"
         })
 @TestPropertySource({
@@ -61,7 +64,9 @@ class JdoIsisEntityPropertyChangePublishingTest extends IsisIntegrationTestAbstr
     @Inject private ApplicationLayerTestFactory testFactory;
     @Inject private KVStoreForTesting kvStore;
 
-    @TestFactory @DisplayName("Application Layer")
+    @DisplayName("Application Layer")
+    @TestFactory
+    @Timeout(value = 1, unit = TimeUnit.DAYS)
     List<DynamicTest> generateTests() {
         return testFactory.generateTests(this::given, this::verify);
     }