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/17 10:58:24 UTC

[isis] branch master updated: ISIS-2294: fixes JPA example entities (regressiontests)

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 013df4e  ISIS-2294: fixes JPA example entities (regressiontests)
013df4e is described below

commit 013df4e16847920a90ae9398095339b7e4bae98c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 17 11:58:08 2020 +0100

    ISIS-2294: fixes JPA example entities (regressiontests)
---
 .../isis/commons/internal/primitives/_Longs.java   | 53 +++++++++++++++++++++
 .../jpa/metamodel/JpaEntityFacetFactory.java       |  5 +-
 .../isis/testdomain/jpa/JpaBootstrappingTest.java  | 54 ++++++++++------------
 .../isis/testdomain/jpa/JpaTestDomainPersona.java  |  2 +-
 .../isis/testdomain/jpa/entities/JpaBook.java      |  4 +-
 .../isis/testdomain/jpa/entities/JpaInventory.java | 31 +++++++++----
 .../isis/testdomain/jpa/entities/JpaProduct.java   | 38 +++++++++------
 .../testdomain/jpa/entities/JpaProductComment.java | 14 ++++--
 8 files changed, 137 insertions(+), 64 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/primitives/_Longs.java b/commons/src/main/java/org/apache/isis/commons/internal/primitives/_Longs.java
index 39b296f..7d20c3f 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/primitives/_Longs.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/primitives/_Longs.java
@@ -23,6 +23,8 @@ import java.util.function.Consumer;
 
 import javax.annotation.Nullable;
 
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
 import static org.apache.isis.commons.internal.base._With.requires;
 
 import lombok.NonNull;
@@ -74,6 +76,31 @@ public class _Longs {
             }
             return true;
         }
+        /**
+         * @param value
+         * @return the value or if not within range, the nearest integer to the value, that is within range   
+         */
+        public long bounded(long value) {
+            //if(empty) return value; // noop
+            if(contains(value)) {
+                return value;
+            }
+            final long nearestToLower = nearestToLower();
+            final long nearestToUpper = nearestToUpper();
+            final long distanceToLower = value - nearestToLower; 
+            final long distanceToUpper = value - nearestToUpper;
+            return (distanceToLower <= distanceToUpper)
+                    ? nearestToLower
+                    : nearestToUpper;
+        }
+        private long nearestToLower() {
+            //if(empty) throw _Exceptions.unsupportedOperation();
+            return lowerBound.isInclusive() ? lowerBound.getValue() : lowerBound.getValue()+1;  
+        }
+        private long nearestToUpper() {
+            //if(empty) throw _Exceptions.unsupportedOperation();
+            return upperBound.isInclusive() ? upperBound.getValue() : upperBound.getValue()-1;
+        }
         @Override
         public String toString() {
             return String.format("%s%d,%d%S", 
@@ -82,6 +109,32 @@ public class _Longs {
         }
     }
     
+    // -- RANGE FACTORIES
+    
+    /**
+     * Range includes a and b.
+     */
+    public static Range rangeClosed(long a, long b) {
+        if(a>b) {
+            throw _Exceptions.illegalArgument("bounds must be ordered in [%d, %d]", a, b);
+        }
+        return Range.of(Bound.inclusive(a), Bound.inclusive(b));
+    }
+    
+    /**
+     * Range includes a but not b.
+     */
+    public static Range rangeOpenEnded(long a, long b) {
+        if(a==b) {
+            throw _Exceptions.unsupportedOperation("empty range not implemented");
+            //return Range.empty();
+        }
+        if(a>=b) {
+            throw _Exceptions.illegalArgument("bounds must be ordered in [%d, %d]", a, b);
+        }
+        return Range.of(Bound.inclusive(a), Bound.exclusive(b));
+    }
+    
     // -- PARSING
 
     /**
diff --git a/persistence/jpa/model/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaEntityFacetFactory.java b/persistence/jpa/model/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaEntityFacetFactory.java
index 73e93d6..44cf794 100644
--- a/persistence/jpa/model/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaEntityFacetFactory.java
+++ b/persistence/jpa/model/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaEntityFacetFactory.java
@@ -41,6 +41,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.memento._Mementos;
 import org.apache.isis.commons.internal.memento._Mementos.SerializingAdapter;
+import org.apache.isis.commons.internal.primitives._Longs;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -84,6 +85,7 @@ public class JpaEntityFacetFactory extends FacetFactoryAbstract {
 
         private final Class<?> entityClass;
         private final ServiceRegistry serviceRegistry;
+        private final static _Longs.Range NON_NEGATIVE_INTS = _Longs.rangeClosed(0L, Integer.MAX_VALUE);
         
         protected JpaEntityFacet(
                 final FacetHolder holder,
@@ -165,7 +167,8 @@ public class JpaEntityFacetFactory extends FacetFactoryAbstract {
                     .createQuery("SELECT t FROM " + entityClass.getSimpleName() + " t", entityClass);
             
             final int startPosition = Math.toIntExact(queryFindAllInstances.getStart());
-            final int maxResult = Math.toIntExact(queryFindAllInstances.getCount());
+            final int maxResult = Math.toIntExact(
+                    NON_NEGATIVE_INTS.bounded(queryFindAllInstances.getCount()));
             typedQuery.setFirstResult(startPosition);
             typedQuery.setMaxResults(maxResult);
             
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/jpa/JpaBootstrappingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/jpa/JpaBootstrappingTest.java
index 892386c..62adda8 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/jpa/JpaBootstrappingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/jpa/JpaBootstrappingTest.java
@@ -58,7 +58,7 @@ import lombok.val;
         classes = { 
                 Configuration_usingJpa.class,
         }
-)
+        )
 @TestPropertySource(IsisPresets.UseLog4j2Test)
 @Transactional @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 //XXX JPA support is under construction
@@ -66,7 +66,6 @@ class JpaBootstrappingTest extends IsisIntegrationTestAbstract {
 
     @Inject private Optional<PlatformTransactionManager> platformTransactionManager; 
     @Inject private RepositoryService repository;
-    @Inject private InteractionFactory isisInteractionFactory;
     @Inject private SpecificationLoader specLoader;
     //@Inject private TransactionService transactionService;
 
@@ -96,59 +95,54 @@ class JpaBootstrappingTest extends IsisIntegrationTestAbstract {
         products.add(JpaBook.of("Sample Book", "A sample book for testing.", 99., "Sample Author", "Sample ISBN",
                 "Sample Publisher"));
 
-        val inventory = JpaInventory.of("Sample Inventory", products);
-        repository.persist(inventory);
+        val inventory = new JpaInventory("Sample Inventory", products);
+        repository.persistAndFlush(inventory);
 
         System.out.println("!!! SETUP DONE");
     }
-    
+
     @Test @Order(0) 
     void platformTransactionManager_shouldBeAvailable() {
         assertTrue(platformTransactionManager.isPresent());
         platformTransactionManager.ifPresent(ptm->{
-            assertEquals("JdbcTransactionManager", ptm.getClass().getSimpleName());
+            assertEquals("JpaTransactionManager", ptm.getClass().getSimpleName());
         });
     }
-    
+
     @Test @Order(1) 
     void jpaEntities_shouldBeRecognisedAsSuch() {
         val spec = specLoader.loadSpecification(JpaProduct.class);
         assertTrue(spec.isEntity());
         assertNotNull(spec.getFacet(EntityFacet.class));
     }
-    
-    
+
+
     @Test @Order(2) @Rollback(false) 
     void sampleInventoryShouldBeSetUp() {
-        
-        //isisInteractionFactory.runAnonymous(()->{
-
-            // given - expected pre condition: no inventories
 
-            cleanUp();
-            assertEquals(0, repository.allInstances(JpaInventory.class).size());
-            System.out.println("!!! VERIFY CLEANUP DONE");
 
-            // when
+        // given - expected pre condition: no inventories
 
-            setUp();
+        cleanUp();
+        assertEquals(0, repository.allInstances(JpaInventory.class).size());
+        System.out.println("!!! VERIFY CLEANUP DONE");
 
-            // then - expected post condition: ONE inventory
+        // when
 
-            val inventories = repository.allInstances(JpaInventory.class);
-            assertEquals(1, inventories.size());
+        setUp();
 
-            val inventory = inventories.get(0);
-            assertNotNull(inventory);
-            assertNotNull(inventory.getProducts());
-            assertEquals(1, inventory.getProducts().size());
+        // then - expected post condition: ONE inventory
 
-            val product = inventory.getProducts().iterator().next();
-            assertEquals("Sample Book", product.getName());
-            
-        //});
+        val inventories = repository.allInstances(JpaInventory.class);
+        assertEquals(1, inventories.size());
 
+        val inventory = inventories.get(0);
+        assertNotNull(inventory);
+        assertNotNull(inventory.getProducts());
+        assertEquals(1, inventory.getProducts().size());
 
+        val product = inventory.getProducts().iterator().next();
+        assertEquals("Sample Book", product.getName());
 
     }
 
@@ -157,7 +151,7 @@ class JpaBootstrappingTest extends IsisIntegrationTestAbstract {
         sampleInventoryShouldBeSetUp();
     }
 
-    
+
 
 
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java
index 1dc807f..51c9e8b 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java
@@ -82,7 +82,7 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<?>>  {
                             "Sample Book", "A sample book for testing.", 99.,
                             "Sample Author", "Sample ISBN", "Sample Publisher"));
 
-                    val inventory = JpaInventory.of("Sample Inventory", products);
+                    val inventory = new JpaInventory("Sample Inventory", products);
                     repository.persist(inventory);
                     
                     return inventory;
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java
index 066dda8..e1f7c75 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java
@@ -19,6 +19,7 @@
 package org.apache.isis.testdomain.jpa.entities;
 
 import javax.persistence.Column;
+import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
 
 import org.apache.isis.applib.annotation.DomainObject;
@@ -33,8 +34,7 @@ import lombok.Setter;
 import lombok.ToString;
 
 @Entity
-//@Inheritance(strategy=InheritanceStrategy.SUPERCLASS_TABLE)
-//@Discriminator(value="Book")
+@DiscriminatorValue("Book")
 @DomainObject(
         objectType = "testdomain.jpa.Book",
         nature = Nature.JPA_ENTITY, //TODO[ISIS-2332] should not be required, when using JPA quick classify SPI 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java
index 9a29074..b028f59 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java
@@ -22,6 +22,10 @@ import java.util.Set;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
@@ -30,35 +34,42 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Publishing;
 
 import lombok.AccessLevel;
-import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 import lombok.ToString;
 
 @Entity
-//@PersistenceCapable(identityType=IdentityType.DATASTORE, schema = "testdomain")
-//@DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY, column="id")
-//@Version(strategy= VersionStrategy.DATE_TIME, column="version")
 @DomainObject(
         objectType = "testdomain.jdo.Inventory",
         nature = Nature.JPA_ENTITY, //TODO[ISIS-2332] should not be required, when using JPA quick classify SPI
         entityChangePublishing = Publishing.ENABLED)
-@DomainObjectLayout()  // causes UI events to be triggered
+@DomainObjectLayout()  // causes UI events to be triggered ???
 @NoArgsConstructor(access = AccessLevel.PROTECTED) 
-@AllArgsConstructor(staticName = "of") 
 @ToString
 public class JpaInventory {
 
+    public JpaInventory(String name, Set<JpaProduct> products) {
+        super();
+        this.name = name;
+        this.products = products;
+    }
+
     public String title() {
         return toString();
     }
+    
+    @Id
+    @GeneratedValue
+    private Long id;
 
     @Property
-    @Getter @Setter @Column(nullable = true)
-    private String name;
+    @Column(nullable = true)
+    private @Getter @Setter String name;
 
+    // 1:n relation
     @Property
-    @Getter @Setter @Column(nullable = true)
-    private Set<JpaProduct> products;
+    @OneToMany @JoinColumn(nullable = true)
+    private @Getter @Setter Set<JpaProduct> products;
 }
+
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java
index ec03682..45c3ab0 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java
@@ -20,12 +20,18 @@ package org.apache.isis.testdomain.jpa.entities;
 
 import java.util.List;
 
-import javax.jdo.annotations.Persistent;
 import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -41,9 +47,11 @@ import lombok.Setter;
 import lombok.ToString;
 
 @Entity
-//@PersistenceCapable(identityType=IdentityType.DATASTORE, schema = "testdomain")
-//@Inheritance(strategy=InheritanceStrategy.NEW_TABLE)
-//@Discriminator(strategy=DiscriminatorStrategy.VALUE_MAP, value="Product")
+@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+@DiscriminatorValue("Product")
+@DiscriminatorColumn(
+        name="product_type", 
+        discriminatorType = DiscriminatorType.STRING)
 @DomainObject(
         objectType = "testdomain.jpa.Product",
         nature = Nature.JPA_ENTITY //TODO[ISIS-2332] should not be required, when using JPA quick classify SPI
@@ -59,28 +67,28 @@ public class JpaProduct {
     
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
-    @Getter @Setter @Column(name = "id")
-    private Long id;
+    @Column(name = "id")
+    private @Getter @Setter Long id;
 
     @Property(editing = Editing.DISABLED) // used for an async rule check test
-    @Getter @Setter @Column(nullable = true)
-    private String name;
+    @Column(nullable = true)
+    private @Getter @Setter String name;
 //    public void setName(String name) {
 //        System.err.println("!!! setting name " + name);
 //        this.name = name;
 //    }
 
     @Property
-    @Getter @Setter @Column(nullable = true)
-    private String description;
+    @Column(nullable = true)
+    private @Getter @Setter String description;
 
     @Property
-    @Getter @Setter @Column(nullable = false)
-    private double price;
+    @Column(nullable = false)
+    private @Getter @Setter double price;
     
+    // 1:n relation
     @Collection 
-    @Persistent(mappedBy="product") @Column(nullable = true) 
-    @Getter @Setter 
-    private List<JpaProductComment> comments;
+    @OneToMany(mappedBy = "product") @JoinColumn(nullable = true)  
+    private @Getter @Setter List<JpaProductComment> comments;
 
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
index 24634ac..34c7a5a 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
@@ -25,6 +25,8 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
@@ -45,19 +47,21 @@ public class JpaProductComment implements Timestampable {
     @Getter @Setter @Column(name = "id")
     private Long id;
     
-    @Property @Column(nullable = false)
-    @Getter @Setter private JpaProduct product;
+    // n:1 relation
+    @Property 
+    @ManyToOne @JoinColumn(nullable = false)
+    private @Getter @Setter JpaProduct product;
 
     @Property
-    @Getter @Setter private String comment;
+    private @Getter @Setter String comment;
 
     // -- TIMESTAMPABLE
     
     @Property
-    @Getter @Setter private String updatedBy;
+    private @Getter @Setter String updatedBy;
     
     @Property
-    @Getter @Setter private Timestamp updatedAt;
+    private @Getter @Setter Timestamp updatedAt;
 
     
 }