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);
}