From 49b1bd54c3984c91e778e99a2b05e63f41d3ef09 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 12 Oct 2020 14:54:25 +1300 Subject: [PATCH] #2075 - Refactor external mapping (i.e. named queries from ebean.xml etc) - extract api and separate module --- ebean-core/pom.xml | 10 +- ...edDtoQueryTest.java => DtoQuery2Test.java} | 41 ++++--- .../java/io/ebean/EbeanServer_eqlTest.java | 36 +----- .../basic/TestOrderTotalAmountReportBean.java | 57 ---------- .../org/tests/rawsql/TestRawSqlOrmQuery.java | 65 ----------- .../ebean-xml-mappings/DCustMapping.xml | 77 ------------- ebean-externalmapping-api/pom.xml | 14 +++ .../ebeaninternal/xmapping/api/XmapDto.java | 3 + .../ebeaninternal/xmapping/api/XmapEbean.java | 3 + .../xmapping/api/XmapEntity.java | 12 ++ .../xmapping/api/XmapNamedQuery.java | 9 ++ .../xmapping/api/XmapRawSql.java | 15 +++ .../xmapping/api/XmapService.java | 0 ebean-externalmapping-xml/pom.xml | 68 ++++++++++++ .../xmlmapping/InternalConfigXmlRead.java | 0 .../xmlmapping/JaxbXmapService.java | 0 .../ebeaninternal/xmlmapping/ToXmapEbean.java | 0 .../xmlmapping/XmlMappingReader.java | 10 +- .../xmlmapping/model/ObjectFactory.java | 0 .../xmlmapping/model/XmAliasMapping.java | 0 .../xmlmapping/model/XmColumnMapping.java | 0 .../ebeaninternal/xmlmapping/model/XmDto.java | 0 .../xmlmapping/model/XmEbean.java | 0 .../xmlmapping/model/XmEntity.java | 0 .../xmlmapping/model/XmNamedQuery.java | 0 .../xmlmapping/model/XmQuery.java | 0 .../xmlmapping/model/XmRawSql.java | 0 .../xmlmapping/model/package-info.java | 0 .../io.ebeaninternal.xmapping.api.XmapService | 0 .../src/main/resources/ebean-1.0.xsd | 0 .../model/XmlMappingReaderTest.java | 2 +- .../java/org/tests/model/basic/Address.java | 14 +++ .../org/tests/model/basic/BasicDomain.java | 60 ++++++++++ .../java/org/tests/model/basic/Contact.java | 24 ++++ .../java/org/tests/model/basic/CustDto.java | 36 ++++++ .../java/org/tests/model/basic/Customer.java | 103 ++++++++++++++++++ .../java/org/tests/model/basic/Order.java | 37 +++++++ .../org/tests/model/basic/OrderAggregate.java | 25 +++++ .../org/tests/model/basic/OrderDetail.java | 28 +++++ .../java/org/tests/model/basic/Product.java | 11 ++ .../tests/model/basic/test/BaseTestCase.java | 21 ++++ .../model/basic/test/NamedDtoQueryTest.java | 28 +++++ .../basic/test/NamedLocalAndExternalTest.java | 68 ++++++++++++ .../test/OrderAggregateNamedRawSqlTest.java | 59 ++++++++++ .../model/basic/test/RawSqlOrmQueryTest.java | 77 +++++++++++++ .../resources/application-test.properties | 17 +++ .../ebean-xml-mappings/CustomerMapping.xml | 8 ++ .../ebean-xml-mappings/OrderMapping.xml | 4 +- .../src/test/resources/ebean.xml | 4 +- .../src/test/resources/logback-test.xml | 21 ++++ .../src/test/resources/test-ebean.xml | 0 pom.xml | 9 ++ 52 files changed, 817 insertions(+), 259 deletions(-) rename ebean-core/src/test/java/io/ebean/{NamedDtoQueryTest.java => DtoQuery2Test.java} (75%) delete mode 100644 ebean-core/src/test/resources/ebean-xml-mappings/DCustMapping.xml create mode 100644 ebean-externalmapping-api/pom.xml rename {ebean-core => ebean-externalmapping-api}/src/main/java/io/ebeaninternal/xmapping/api/XmapDto.java (92%) rename {ebean-core => ebean-externalmapping-api}/src/main/java/io/ebeaninternal/xmapping/api/XmapEbean.java (86%) rename {ebean-core => ebean-externalmapping-api}/src/main/java/io/ebeaninternal/xmapping/api/XmapEntity.java (72%) rename {ebean-core => ebean-externalmapping-api}/src/main/java/io/ebeaninternal/xmapping/api/XmapNamedQuery.java (77%) rename {ebean-core => ebean-externalmapping-api}/src/main/java/io/ebeaninternal/xmapping/api/XmapRawSql.java (80%) rename {ebean-core => ebean-externalmapping-api}/src/main/java/io/ebeaninternal/xmapping/api/XmapService.java (100%) create mode 100644 ebean-externalmapping-xml/pom.xml rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/InternalConfigXmlRead.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/JaxbXmapService.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/ToXmapEbean.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java (87%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/ObjectFactory.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmAliasMapping.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmColumnMapping.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmDto.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmEbean.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmEntity.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmNamedQuery.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmQuery.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/XmRawSql.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/java/io/ebeaninternal/xmlmapping/model/package-info.java (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/resources/META-INF/services/io.ebeaninternal.xmapping.api.XmapService (100%) rename {ebean-core => ebean-externalmapping-xml}/src/main/resources/ebean-1.0.xsd (100%) rename {ebean-core => ebean-externalmapping-xml}/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java (91%) create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Address.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/BasicDomain.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Contact.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/CustDto.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Customer.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Order.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderAggregate.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderDetail.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Product.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/BaseTestCase.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedDtoQueryTest.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedLocalAndExternalTest.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/OrderAggregateNamedRawSqlTest.java create mode 100644 ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/RawSqlOrmQueryTest.java create mode 100644 ebean-externalmapping-xml/src/test/resources/application-test.properties rename {ebean-core => ebean-externalmapping-xml}/src/test/resources/ebean-xml-mappings/CustomerMapping.xml (66%) rename {ebean-core => ebean-externalmapping-xml}/src/test/resources/ebean-xml-mappings/OrderMapping.xml (91%) rename {ebean-core => ebean-externalmapping-xml}/src/test/resources/ebean.xml (95%) create mode 100644 ebean-externalmapping-xml/src/test/resources/logback-test.xml rename {ebean-core => ebean-externalmapping-xml}/src/test/resources/test-ebean.xml (100%) diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index ded637592..10cea9a28 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -47,18 +47,24 @@ + io.ebean ebean-ddlgen 12.4.1 - provided + test io.ebean ebean-api ${project.version} - provided + + + + io.ebean + ebean-externalmapping-api + ${project.version} + + io.ebean + ebean-core + 12.4.3-SNAPSHOT + test + + + + io.ebean + ebean-ddlgen + 12.4.1 + test + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.17 + true + + + + io.ebean.tile:enhancement:12.4.2 + + + + + + diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/InternalConfigXmlRead.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/InternalConfigXmlRead.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/InternalConfigXmlRead.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/InternalConfigXmlRead.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/JaxbXmapService.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/JaxbXmapService.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/JaxbXmapService.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/JaxbXmapService.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/ToXmapEbean.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/ToXmapEbean.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/ToXmapEbean.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/ToXmapEbean.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java similarity index 87% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java index eb8c27f66..2519ef8f1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java +++ b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/XmlMappingReader.java @@ -1,7 +1,6 @@ package io.ebeaninternal.xmlmapping; import io.avaje.classpath.scanner.Resource; -import io.ebeaninternal.util.UrlHelper; import io.ebeaninternal.xmlmapping.model.XmEbean; import javax.xml.bind.JAXBContext; @@ -11,6 +10,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.URLConnection; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -42,7 +42,7 @@ public class XmlMappingReader { List mappings = new ArrayList<>(); while (resources.hasMoreElements()) { URL url = resources.nextElement(); - try (InputStream is = UrlHelper.openNoCache(url)) { + try (InputStream is = openNoCache(url)) { mappings.add(XmlMappingReader.read(is)); } } @@ -68,4 +68,10 @@ public class XmlMappingReader { throw new RuntimeException("Error reading ebean xml mapping", e); } } + + private static InputStream openNoCache(URL url) throws IOException { + URLConnection urlConnection = url.openConnection(); + urlConnection.setUseCaches(false); + return urlConnection.getInputStream(); + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/ObjectFactory.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/ObjectFactory.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/ObjectFactory.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/ObjectFactory.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmAliasMapping.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmAliasMapping.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmAliasMapping.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmAliasMapping.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmColumnMapping.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmColumnMapping.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmColumnMapping.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmColumnMapping.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmDto.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmDto.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmDto.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmDto.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmEbean.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmEbean.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmEbean.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmEbean.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmEntity.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmEntity.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmEntity.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmEntity.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmNamedQuery.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmNamedQuery.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmNamedQuery.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmNamedQuery.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmQuery.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmQuery.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmQuery.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmQuery.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmRawSql.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmRawSql.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/XmRawSql.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/XmRawSql.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/package-info.java b/ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/package-info.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/xmlmapping/model/package-info.java rename to ebean-externalmapping-xml/src/main/java/io/ebeaninternal/xmlmapping/model/package-info.java diff --git a/ebean-core/src/main/resources/META-INF/services/io.ebeaninternal.xmapping.api.XmapService b/ebean-externalmapping-xml/src/main/resources/META-INF/services/io.ebeaninternal.xmapping.api.XmapService similarity index 100% rename from ebean-core/src/main/resources/META-INF/services/io.ebeaninternal.xmapping.api.XmapService rename to ebean-externalmapping-xml/src/main/resources/META-INF/services/io.ebeaninternal.xmapping.api.XmapService diff --git a/ebean-core/src/main/resources/ebean-1.0.xsd b/ebean-externalmapping-xml/src/main/resources/ebean-1.0.xsd similarity index 100% rename from ebean-core/src/main/resources/ebean-1.0.xsd rename to ebean-externalmapping-xml/src/main/resources/ebean-1.0.xsd diff --git a/ebean-core/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java b/ebean-externalmapping-xml/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java similarity index 91% rename from ebean-core/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java rename to ebean-externalmapping-xml/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java index 135304a42..b8586e3da 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java +++ b/ebean-externalmapping-xml/src/test/java/io/ebeaninternal/xmlmapping/model/XmlMappingReaderTest.java @@ -10,7 +10,7 @@ import static org.junit.Assert.assertNotNull; public class XmlMappingReaderTest { @Test - public void read() throws Exception { + public void read() { InputStream is = XmlMappingReaderTest.class.getResourceAsStream("/test-ebean.xml"); XmEbean testMapping = XmlMappingReader.read(is); diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Address.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Address.java new file mode 100644 index 000000000..79d26f71f --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Address.java @@ -0,0 +1,14 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "o_address") +public class Address extends BasicDomain { + String line1; + String line2; + String city; +// @ManyToOne +// Country country; +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/BasicDomain.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/BasicDomain.java new file mode 100644 index 000000000..d65d4f426 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/BasicDomain.java @@ -0,0 +1,60 @@ +package org.tests.model.basic; + +import io.ebean.Model; +import io.ebean.annotation.WhenCreated; +import io.ebean.annotation.WhenModified; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Version; +import java.io.Serializable; +import java.sql.Timestamp; +import java.time.Instant; + +@MappedSuperclass +public class BasicDomain extends Model { + + @Id + long id; + + @WhenCreated + Instant whenCreated; + + @WhenModified + Instant whenModified; + + @Version + long version; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Instant getWhenCreated() { + return whenCreated; + } + + public void setWhenCreated(Instant whenCreated) { + this.whenCreated = whenCreated; + } + + public Instant getWhenModified() { + return whenModified; + } + + public void setWhenModified(Instant whenModified) { + this.whenModified = whenModified; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Contact.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Contact.java new file mode 100644 index 000000000..ed9c38823 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Contact.java @@ -0,0 +1,24 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +public class Contact extends BasicDomain { + + @ManyToOne(optional = false) + Customer customer; + + String firstName; + String lastName; + String phone; + String mobile; + String email; + boolean isMember; + + public Contact(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/CustDto.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/CustDto.java new file mode 100644 index 000000000..fc7bd299e --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/CustDto.java @@ -0,0 +1,36 @@ +package org.tests.model.basic; + + public class CustDto { + + final Integer id; + + final String name; + + int totalOrders; + + public CustDto(Integer id, String name) { + this.id = id; + this.name = name; + } + + @Override + public String toString() { + return "id:" + id + " name:" + name + " totalOrders:" + totalOrders; + } + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public int getTotalOrders() { + return totalOrders; + } + + public void setTotalOrders(int totalOrders) { + this.totalOrders = totalOrders; + } + } diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Customer.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Customer.java new file mode 100644 index 000000000..bbba92752 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Customer.java @@ -0,0 +1,103 @@ +package org.tests.model.basic; + +import io.ebean.annotation.DbEnumValue; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import java.util.List; + +@NamedQuery(name = "name", query = "select(name) order by name") +@NamedQuery(name = "withStatus", query = "select(name,status) order by name") +@Entity +@Table(name = "o_customer") +public class Customer extends BasicDomain { + public enum Status { + NEW("N"), + ACTIVE("A"), + INACTIVE("I"); + + String dbValue; + Status(String dbValue) { + this.dbValue = dbValue; + } + @DbEnumValue + public String getValue() { + return dbValue; + } + } + + Status status; + String name; + String smallnote; + + @ManyToOne(cascade = CascadeType.ALL) + Address billingAddress; + @ManyToOne(cascade = CascadeType.ALL) + Address shippingAddress; + + @OneToMany(mappedBy = "customer") + List orders; + + @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL) + List contacts; + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSmallnote() { + return smallnote; + } + + public void setSmallnote(String smallnote) { + this.smallnote = smallnote; + } + + public Address getBillingAddress() { + return billingAddress; + } + + public void setBillingAddress(Address billingAddress) { + this.billingAddress = billingAddress; + } + + public Address getShippingAddress() { + return shippingAddress; + } + + public void setShippingAddress(Address shippingAddress) { + this.shippingAddress = shippingAddress; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public List getContacts() { + return contacts; + } + + public void setContacts(List contacts) { + this.contacts = contacts; + } +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Order.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Order.java new file mode 100644 index 000000000..076f5bb21 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Order.java @@ -0,0 +1,37 @@ +package org.tests.model.basic; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import javax.persistence.Table; +import java.time.LocalDate; +import java.util.List; + +@Entity +@Table(name = "o_order") +public class Order extends BasicDomain { + + public enum Status { + NEW, + APPROVED, + SHIPPED, + COMPLETE + } + + @Enumerated(value = EnumType.ORDINAL) + Status status = Status.NEW; + LocalDate orderDate; + LocalDate shipDate; + + @ManyToOne(cascade = CascadeType.PERSIST) + Customer customer; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "order") + @OrderBy("id asc, orderQty asc, cretime desc") + List details; + +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderAggregate.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderAggregate.java new file mode 100644 index 000000000..0cd8381dc --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderAggregate.java @@ -0,0 +1,25 @@ +package org.tests.model.basic; + +import io.ebean.annotation.Sql; + +import javax.persistence.Entity; +import javax.persistence.OneToOne; + +/** + * An example of an Aggregate object. + *

+ * Note the @Sql indicates to Ebean that this bean is not based on a table but + * instead uses RawSql. + *

+ */ +@Entity +@Sql +public class OrderAggregate { + + @OneToOne + Order order; + Double maxAmount; + Double totalAmount; + Long totalItems; + +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderDetail.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderDetail.java new file mode 100644 index 000000000..4404c88b8 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/OrderDetail.java @@ -0,0 +1,28 @@ +package org.tests.model.basic; + +import io.ebean.annotation.Cache; +import io.ebean.annotation.DocEmbedded; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Version; +import java.io.Serializable; +import java.sql.Timestamp; + +@Entity +@Table(name = "o_order_detail") +public class OrderDetail extends BasicDomain { + + @ManyToOne(optional = false) + Order order; + + Integer orderQty; + Integer shipQty; + Double unitPrice; + + @ManyToOne + Product product; + +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Product.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Product.java new file mode 100644 index 000000000..ac1e86380 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/Product.java @@ -0,0 +1,11 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "o_product") +public class Product extends BasicDomain { + String sku; + String name; +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/BaseTestCase.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/BaseTestCase.java new file mode 100644 index 000000000..39427f5da --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/BaseTestCase.java @@ -0,0 +1,21 @@ +package org.tests.model.basic.test; + +import io.ebean.DB; +import io.ebean.annotation.Platform; +import io.ebeaninternal.api.SpiEbeanServer; + +public class BaseTestCase { + + protected boolean isSqlServer() { + return Platform.SQLSERVER == platform(); + } + + protected Platform platform() { + return spiEbeanServer().getDatabasePlatform().getPlatform().base(); + } + + protected SpiEbeanServer spiEbeanServer() { + return (SpiEbeanServer) DB.getDefault(); + } + +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedDtoQueryTest.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedDtoQueryTest.java new file mode 100644 index 000000000..86e40ee86 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedDtoQueryTest.java @@ -0,0 +1,28 @@ +package org.tests.model.basic.test; + +import io.ebean.DB; +import org.junit.Test; +import org.tests.model.basic.CustDto; +import org.tests.model.basic.Customer; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class NamedDtoQueryTest { + + @Test + public void dto_findList_constructorMatch() { + + Customer customer = new Customer(); + customer.setName("dtoTest"); + customer.save(); + + final List list = DB.getDefault().createNamedDtoQuery(CustDto.class, "findByName") + .setParameter("dtoT%") + .findList(); + + assertThat(list).hasSize(1); + assertThat(list.get(0).getId()).isEqualTo(customer.getId()); + } +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedLocalAndExternalTest.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedLocalAndExternalTest.java new file mode 100644 index 000000000..61776857f --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/NamedLocalAndExternalTest.java @@ -0,0 +1,68 @@ +package org.tests.model.basic.test; + +import io.ebean.DB; +import io.ebean.Database; +import io.ebean.Query; +import org.junit.Test; +import org.tests.model.basic.Customer; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Named queries both local to the entity bean and via external xml source. + */ +public class NamedLocalAndExternalTest extends BaseTestCase { + + private Database server() { + return DB.getDefault(); + } + + private String sqlOf(Query query) { + return query.getGeneratedSql(); + } + + @Test + public void namedQuery() { + + Query name = server().createNamedQuery(Customer.class, "name"); + name.findList(); + + assertThat(sqlOf(name)).contains("select t0.id, t0.name from o_customer t0 order by t0.name"); + } + + @Test + public void namedQuery_withStatus() { + + Query name = server().createNamedQuery(Customer.class, "withStatus"); + name.order().clear().asc("status"); + name.findList(); + + assertThat(sqlOf(name)).contains("select t0.id, t0.name, t0.status from o_customer t0 order by t0.status"); + } + + @Test + public void namedQuery_fromXml() { + + Query query = server() + .createNamedQuery(Customer.class, "withContactsById") + .setParameter("id", 1); + + query.setUseCache(false); + query.findOne(); + + assertThat(sqlOf(query)).contains("from o_customer t0 left join contact t1 on t1.customer_id = t0.id "); + } + + @Test + public void namedQuery_fromCustomXmlLocations() { + + Query query = server() + .createNamedQuery(Customer.class, "withContactsById2") + .setParameter("id", 1); + + query.setUseCache(false); + query.findOne(); + + assertThat(sqlOf(query)).contains("from o_customer t0 left join contact t1 on t1.customer_id = t0.id "); + } +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/OrderAggregateNamedRawSqlTest.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/OrderAggregateNamedRawSqlTest.java new file mode 100644 index 000000000..578c4a6d3 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/OrderAggregateNamedRawSqlTest.java @@ -0,0 +1,59 @@ +package org.tests.model.basic.test; + +import io.ebean.DB; +import io.ebean.Query; +import org.assertj.core.api.AbstractCharSequenceAssert; +import org.junit.Test; +import org.tests.model.basic.OrderAggregate; + +public class OrderAggregateNamedRawSqlTest { + + protected AbstractCharSequenceAssert assertSql(Query query) { + return org.assertj.core.api.Assertions.assertThat(query.getGeneratedSql()); + } + + @Test + public void testDefaultNamedRawSql() { + Query query = DB.find(OrderAggregate.class); + query.findList(); + + assertSql(query).contains("count(*) as total_items, sum(order_qty*unit_price) as total_amount"); + } + + @Test + public void testNamedRawSql() { + Query query = DB.createNamedQuery(OrderAggregate.class, "withMax"); + query.findList(); + assertSql(query).contains("count(*) as total_items, sum(order_qty*unit_price) as total_amount, max(order_qty*unit_price) as maxAmount from o_order_detail"); + } + + @Test + public void testNamedRawSql_with_extraPredicates() { + + Query query = DB.createNamedQuery(OrderAggregate.class, "withMax"); + query + .where().gt("order.id", 1) + .having().gt("totalItems", 1) + .order().desc("totalAmount") + .findList(); + + assertSql(query).contains("count(*) as total_items, sum(order_qty*unit_price) as total_amount, max(order_qty*unit_price) as maxAmount from o_order_detail"); + assertSql(query).contains("from o_order_detail where order_id > ? group by order_id having count(*) > ? order by sum(order_qty*unit_price) desc"); + } + + @Test + public void testNamedRawSql_with_param() { + + Query query = DB.createNamedQuery(OrderAggregate.class, "withParam"); + query + .setParameter("minId", 2) + .where().isNotNull("order.id") + .having().lt("totalAmount", 100) + .order().desc("totalAmount") + .setMaxRows(10) + .findList(); + + assertSql(query).contains("count(*) as totalItems, sum(order_qty*unit_price) as totalAmount, max(order_qty*unit_price) as maxAmount from o_order_detail"); + assertSql(query).contains("from o_order_detail where id > ? and order_id is not null group by order_id having sum(order_qty*unit_price) < ? order by sum(order_qty*unit_price) desc"); + } +} diff --git a/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/RawSqlOrmQueryTest.java b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/RawSqlOrmQueryTest.java new file mode 100644 index 000000000..96667bb22 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/java/org/tests/model/basic/test/RawSqlOrmQueryTest.java @@ -0,0 +1,77 @@ +package org.tests.model.basic.test; + +import io.ebean.DB; +import io.ebean.Query; +import org.junit.Test; +import org.tests.model.basic.Order; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RawSqlOrmQueryTest extends BaseTestCase { + + //@IgnorePlatform(Platform.ORACLE) + @Test + public void testNamed() { + + Query query = DB.getDefault().createNamedQuery(Order.class, "myRawTest"); + query.setParameter("orderStatus", Order.Status.NEW); + query.setMaxRows(10); + List list = query.findList(); + for (Order order : list) { + order.getWhenCreated(); + } + + String sql = query.getGeneratedSql(); + if (isSqlServer()) { + assertThat(sql).contains("select top 10 o.id,"); + } else { + assertThat(sql).contains("select o.id,"); + assertThat(sql).contains("limit 10"); + } + assertThat(sql).contains("o.id, o.status, o.ship_date, c.id, c.name, a.id, a.line1, a.line2, a.city from o_order o"); + assertThat(sql).contains("join o_customer c on o.customer_id = c.id "); + assertThat(sql).contains("where o.status = ? order by c.name, c.id"); + } + + //@IgnorePlatform(Platform.ORACLE) + @Test + public void testNamed_fromCustomXmlLocations() { + + //ResetBasicData.reset(); + + Query query = DB.getDefault().createNamedQuery(Order.class, "myRawTest2"); + query.setParameter("orderStatus", Order.Status.NEW); + query.setMaxRows(10); + List list = query.findList(); + for (Order order : list) { + order.getWhenModified(); + } + + String sql = query.getGeneratedSql(); + if (isSqlServer()) { + assertThat(sql).contains("select top 10 o.id,"); + } else { + assertThat(sql).contains("select o.id,"); + assertThat(sql).contains("limit 10"); + } + assertThat(sql).contains("o.id, o.status, o.ship_date, c.id, c.name, a.id, a.line1, a.line2, a.city from o_order o"); + assertThat(sql).contains("join o_customer c on o.customer_id = c.id "); + assertThat(sql).contains("where o.status = ? order by c.name, c.id"); + } + + //@IgnorePlatform(Platform.ORACLE) + @Test + public void testNamed_fromCustomXmlLocations_withComments() { + + //ResetBasicData.reset(); + + Query query = DB.getDefault().createNamedQuery(Order.class, "myRawTest3"); + query.setMaxRows(10); + + query.findList(); + assertThat(query.getGeneratedSql()).contains("-- must be unparsed raw sql"); + } + +} diff --git a/ebean-externalmapping-xml/src/test/resources/application-test.properties b/ebean-externalmapping-xml/src/test/resources/application-test.properties new file mode 100644 index 000000000..15ecf2d07 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/resources/application-test.properties @@ -0,0 +1,17 @@ +ebean.mappingLocations=classpath:/ebean-xml-mappings + +ebean.ddl.generate=true +ebean.ddl.run=true +datasource.default=h2 + +datasource.db.username=sa +datasource.db.password= +datasource.db.url=jdbc:h2:mem:xm + +datasource.h2.username=sa +datasource.h2.password= +datasource.h2.url=jdbc:h2:mem:xm + +datasource.pg.username=sa +datasource.pg.password= +datasource.pg.url=jdbc:h2:mem:xm diff --git a/ebean-core/src/test/resources/ebean-xml-mappings/CustomerMapping.xml b/ebean-externalmapping-xml/src/test/resources/ebean-xml-mappings/CustomerMapping.xml similarity index 66% rename from ebean-core/src/test/resources/ebean-xml-mappings/CustomerMapping.xml rename to ebean-externalmapping-xml/src/test/resources/ebean-xml-mappings/CustomerMapping.xml index b55626fbf..1d26d6e5f 100644 --- a/ebean-core/src/test/resources/ebean-xml-mappings/CustomerMapping.xml +++ b/ebean-externalmapping-xml/src/test/resources/ebean-xml-mappings/CustomerMapping.xml @@ -11,4 +11,12 @@ + + + + select id, name from o_customer where name like ? + + + + diff --git a/ebean-core/src/test/resources/ebean-xml-mappings/OrderMapping.xml b/ebean-externalmapping-xml/src/test/resources/ebean-xml-mappings/OrderMapping.xml similarity index 91% rename from ebean-core/src/test/resources/ebean-xml-mappings/OrderMapping.xml rename to ebean-externalmapping-xml/src/test/resources/ebean-xml-mappings/OrderMapping.xml index 59e8ddc52..a4745ccbc 100644 --- a/ebean-core/src/test/resources/ebean-xml-mappings/OrderMapping.xml +++ b/ebean-externalmapping-xml/src/test/resources/ebean-xml-mappings/OrderMapping.xml @@ -6,9 +6,9 @@ - select o.id, o.status, o.ship_date, c.id, c.name, a.id, a.line_1, a.line_2, a.city + select o.id, o.status, o.ship_date, c.id, c.name, a.id, a.line1, a.line2, a.city from o_order o - join o_customer c on o.kcustomer_id = c.id + join o_customer c on o.customer_id = c.id join o_address a on c.billing_address_id = a.id where o.status = :orderStatus order by c.name, c.id diff --git a/ebean-core/src/test/resources/ebean.xml b/ebean-externalmapping-xml/src/test/resources/ebean.xml similarity index 95% rename from ebean-core/src/test/resources/ebean.xml rename to ebean-externalmapping-xml/src/test/resources/ebean.xml index 10cdbf265..8fe679451 100644 --- a/ebean-core/src/test/resources/ebean.xml +++ b/ebean-externalmapping-xml/src/test/resources/ebean.xml @@ -36,9 +36,9 @@ - select o.id, o.status, o.ship_date, c.id, c.name, a.id, a.line_1, a.line_2, a.city + select o.id, o.status, o.ship_date, c.id, c.name, a.id, a.line1, a.line2, a.city from o_order o - join o_customer c on o.kcustomer_id = c.id + join o_customer c on o.customer_id = c.id join o_address a on c.billing_address_id = a.id where o.status = :orderStatus order by c.name, c.id diff --git a/ebean-externalmapping-xml/src/test/resources/logback-test.xml b/ebean-externalmapping-xml/src/test/resources/logback-test.xml new file mode 100644 index 000000000..8d97efd24 --- /dev/null +++ b/ebean-externalmapping-xml/src/test/resources/logback-test.xml @@ -0,0 +1,21 @@ + + + + TRACE + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + diff --git a/ebean-core/src/test/resources/test-ebean.xml b/ebean-externalmapping-xml/src/test/resources/test-ebean.xml similarity index 100% rename from ebean-core/src/test/resources/test-ebean.xml rename to ebean-externalmapping-xml/src/test/resources/test-ebean.xml diff --git a/pom.xml b/pom.xml index 7d9511325..3a2bfb23c 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,13 @@ test + + org.avaje.composite + junit + 1.1 + test + + @@ -47,6 +54,8 @@ querybean-generator kotlin-querybean-generator ebean-querybean + ebean-externalmapping-api + ebean-externalmapping-xml