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