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/20 07:41:59 UTC

[isis] branch master updated: ISIS-2033: lightweight JDO: wire up the TransactionAwarePersistenceManagerFactoryProxy

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


The following commit(s) were added to refs/heads/master by this push:
     new 0d44c4e  ISIS-2033: lightweight JDO: wire up the TransactionAwarePersistenceManagerFactoryProxy
0d44c4e is described below

commit 0d44c4e8fead7fe67b315a69041255cfa288a9a6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Dec 20 08:41:44 2020 +0100

    ISIS-2033: lightweight JDO: wire up the
    TransactionAwarePersistenceManagerFactoryProxy
    
    also disable query ranges for now (upper bound not handled properly)
---
 .../applib/PersistenceManagerFactoryProvider.java} | 10 +++--
 .../metamodel/JdoEntityFacetFactory.java           | 11 ++++--
 persistence/jdo/spring/pom.xml                     |  8 ++++
 .../jdo/spring/IsisModuleJdoSpring.java            | 46 ++++++++++++++++++++++
 ...sactionAwarePersistenceManagerFactoryProxy.java | 12 +++++-
 5 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java b/persistence/jdo/applib/src/main/java/org/apache/isis/persistence/jdo/applib/PersistenceManagerFactoryProvider.java
similarity index 79%
copy from persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java
copy to persistence/jdo/applib/src/main/java/org/apache/isis/persistence/jdo/applib/PersistenceManagerFactoryProvider.java
index c95845a..2f92baa 100644
--- a/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java
+++ b/persistence/jdo/applib/src/main/java/org/apache/isis/persistence/jdo/applib/PersistenceManagerFactoryProvider.java
@@ -16,10 +16,12 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.spring;
+package org.apache.isis.persistence.jdo.applib;
 
-import org.springframework.context.annotation.Configuration;
+import javax.jdo.PersistenceManagerFactory;
 
-@Configuration
-public class IsisModuleJdoSpring {
+public interface PersistenceManagerFactoryProvider {
+
+    PersistenceManagerFactory getPersistenceManagerFactory();
+    
 }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoEntityFacetFactory.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoEntityFacetFactory.java
index fbe9e42..e6f36d2 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoEntityFacetFactory.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoEntityFacetFactory.java
@@ -50,6 +50,7 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.persistence.jdo.applib.PersistenceManagerFactoryProvider;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -167,7 +168,8 @@ public class JdoEntityFacetFactory extends FacetFactoryAbstract {
                             .longValueExact();
                 
                 val typedQuery = persistenceManager.newJDOQLTypedQuery(entityClass)
-                        .range(rangeLower, rangeUpper);
+                        //.range(rangeLower, rangeUpper)
+                        ;
                 
                 return _NullSafe.stream(typedQuery.executeList())
                     .map(entity->ManagedObject.of(spec, entity))
@@ -188,7 +190,8 @@ public class JdoEntityFacetFactory extends FacetFactoryAbstract {
                             .longValueExact();
                 
                 val namedQuery = persistenceManager.newJDOQLTypedQuery(entityClass)
-                        .range(rangeLower, rangeUpper);
+                        //.range(rangeLower, rangeUpper)
+                        ;
                 
                 applibNamedQuery
                     .getParametersByName()
@@ -306,7 +309,9 @@ public class JdoEntityFacetFactory extends FacetFactoryAbstract {
         // -- DEPENDENCIES
         
         protected PersistenceManagerFactory getPersistenceManagerFactory() {
-            return serviceRegistry.lookupServiceElseFail(PersistenceManagerFactory.class);
+            return serviceRegistry
+                    .lookupServiceElseFail(PersistenceManagerFactoryProvider.class)
+                    .getPersistenceManagerFactory();
         }
         
         protected PersistenceManager getPersistenceManager() {
diff --git a/persistence/jdo/spring/pom.xml b/persistence/jdo/spring/pom.xml
index bf92501..b893f16 100644
--- a/persistence/jdo/spring/pom.xml
+++ b/persistence/jdo/spring/pom.xml
@@ -69,9 +69,17 @@
 	<dependencies>
 
 		<dependency>
+			<groupId>org.apache.isis.commons</groupId>
+			<artifactId>isis-commons</artifactId>
+		</dependency>
+		<dependency>
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-applib</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.isis.persistence</groupId>
+			<artifactId>isis-persistence-jdo-applib</artifactId>
+		</dependency>
 		
 		<dependency>
 		    <groupId>org.springframework</groupId>
diff --git a/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java b/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java
index c95845a..7c0145c 100644
--- a/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java
+++ b/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/IsisModuleJdoSpring.java
@@ -18,8 +18,54 @@
  */
 package org.apache.isis.persistence.jdo.spring;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Named;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import lombok.val;
+
 @Configuration
 public class IsisModuleJdoSpring {
+
+    //TODO[2033] prefix 'isis.persistence.jdo-datanucleus.impl' is (for) legacy
+    @ConfigurationProperties(prefix = "isis.persistence.jdo-datanucleus.impl")
+    @Bean("dn-settings")
+    public Map<String, String> dnSettings() {
+        return new HashMap<>();
+    }
+    
+    /**
+     * {@link TransactionAwarePersistenceManagerFactoryProxy} was retired by the Spring Framework, recommended usage is still online [1].
+     * Sources have been recovered from [2].
+     * @see [1] https://docs.spring.io/spring-framework/docs/3.0.0.RC2/reference/html/ch13s04.html
+     * @see [2] https://github.com/spring-projects/spring-framework/tree/2b3445df8134e2b0c4e4a4c4136cbaf9d58b7fc4/spring-orm/src/main/java/org/springframework/orm/jdo
+     */
+    @Bean @Named("transaction-aware-pmf-proxy")
+    public TransactionAwarePersistenceManagerFactoryProxy getTransactionAwarePersistenceManagerFactoryProxy(
+            final LocalPersistenceManagerFactoryBean lpmfBean) {
+        
+        val tapmfProxy = new TransactionAwarePersistenceManagerFactoryProxy();
+        tapmfProxy.setTargetPersistenceManagerFactory(lpmfBean.getObject());
+        tapmfProxy.setAllowCreate(false);
+        return tapmfProxy;
+    }
+    
+    @Bean 
+    public LocalPersistenceManagerFactoryBean getLocalPersistenceManagerFactoryBean(
+            final @Named("dn-settings") Map<String, String> dnSettings) {
+        
+        val jdoPropertyMap = new HashMap<String, Object>();
+        dnSettings.forEach(jdoPropertyMap::put);
+        
+        val lpmfBean = new LocalPersistenceManagerFactoryBean();
+        lpmfBean.setJdoPropertyMap(jdoPropertyMap);
+        return lpmfBean; 
+    }
+    
+    
 }
diff --git a/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/TransactionAwarePersistenceManagerFactoryProxy.java b/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/TransactionAwarePersistenceManagerFactoryProxy.java
index 90942bb..ea00c90 100644
--- a/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/TransactionAwarePersistenceManagerFactoryProxy.java
+++ b/persistence/jdo/spring/src/main/java/org/apache/isis/persistence/jdo/spring/TransactionAwarePersistenceManagerFactoryProxy.java
@@ -22,6 +22,7 @@ import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+
 import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 
@@ -29,6 +30,8 @@ import org.springframework.beans.factory.FactoryBean;
 import org.springframework.util.Assert;
 import org.springframework.util.ClassUtils;
 
+import org.apache.isis.persistence.jdo.applib.PersistenceManagerFactoryProvider;
+
 /**
  * Proxy for a target JDO {@link javax.jdo.PersistenceManagerFactory},
  * returning the current thread-bound PersistenceManager (the Spring-managed
@@ -62,7 +65,9 @@ import org.springframework.util.ClassUtils;
  * @see PersistenceManagerFactoryUtils#releasePersistenceManager
  */
 public class TransactionAwarePersistenceManagerFactoryProxy 
-implements FactoryBean<PersistenceManagerFactory> {
+implements 
+    FactoryBean<PersistenceManagerFactory>, 
+    PersistenceManagerFactoryProvider {
 
 	private PersistenceManagerFactory target;
 
@@ -216,4 +221,9 @@ implements FactoryBean<PersistenceManagerFactory> {
 		}
 	}
 
+    @Override
+    public PersistenceManagerFactory getPersistenceManagerFactory() {
+        return getObject();
+    }
+
 }