initial commit

This commit is contained in:
Rouslan Zenetl 2022-01-05 22:47:13 -05:00
commit 2393a392da
34 changed files with 1055 additions and 0 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
VERSION=1.0-SNAPSHOT

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
/**/*.iml
/**/.idea
/**/target
/**/dependency-reduced-pom.xml
/target

1
db/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

5
db/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
FROM openjdk:11
ARG version
ADD target/test-db-${version}.jar /test-db.jar
ENTRYPOINT ["java", "-jar", "/test-db.jar"]

56
db/pom.xml Normal file
View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>test</groupId>
<artifactId>parent</artifactId>
<version>${revision}${sha1}${changelist}</version>
</parent>
<artifactId>test-db</artifactId>
<packaging>jar</packaging>
<name>DB</name>
<properties>
<main.class>test.DbApp</main.class>
</properties>
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>test-model</artifactId>
</dependency>
<!--BQ deps-->
<dependency>
<groupId>io.bootique.liquibase</groupId>
<artifactId>bootique-liquibase</artifactId>
</dependency>
<dependency>
<groupId>io.bootique.logback</groupId>
<artifactId>bootique-logback</artifactId>
</dependency>
<dependency>
<groupId>io.bootique.jdbc</groupId>
<artifactId>bootique-jdbc-hikaricp-instrumented</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,24 @@
package test;
import io.bootique.BQCoreModule;
import io.bootique.BaseModule;
import io.bootique.Bootique;
import io.bootique.di.Binder;
import io.bootique.meta.application.OptionMetadata;
public class DbApp extends BaseModule {
public static void main(String[] args) {
Bootique.main(args);
}
@Override
public void configure(Binder binder) {
BQCoreModule.extend(binder)
.addConfig("classpath:test/db/default.yaml")
// --local
.addOption(OptionMetadata.builder("local", "Load configuration for local environment.").build())
.mapConfigResource("local", "classpath:test/db/local.yaml")
;
}
}

View File

@ -0,0 +1,12 @@
package test;
import io.bootique.BQModuleProvider;
public class DbAppProvider implements BQModuleProvider {
public DbAppProvider() {}
@Override
public DbApp module() {
return new DbApp();
}
}

View File

@ -0,0 +1 @@
test.DbAppProvider

View File

@ -0,0 +1,38 @@
-- liquibase formatted sql
-- changeset rzen:1
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
CREATE TABLE IF NOT EXISTS `test`.`e1` (
`id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`text` TEXT NULL DEFAULT NULL,
`e2_id` INT(5) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `fk_e2_idx` (`e2_id` ASC) VISIBLE,
CONSTRAINT `fk_e2`
FOREIGN KEY (`e2_id`)
REFERENCES `test`.`e2` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `test`.`e2` (
`id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`text` TEXT NULL DEFAULT NULL,
`e1_id` INT(5) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `fk_e1_idx` (`e1_id` ASC) VISIBLE,
CONSTRAINT `fk_e1`
FOREIGN KEY (`e1_id`)
REFERENCES `test`.`e1` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

View File

@ -0,0 +1,3 @@
databaseChangeLog:
- include:
file: classpath:init.sql

View File

@ -0,0 +1,23 @@
jdbc:
test:
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: "jdbc:mysql://db:3306/test?connectTimeout=0&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
username: root
password: test
minimumIdle: 1
maximumPoolSize: 20
connectionTestQuery: "select 1"
autoCommit: false
# Liquibase Migrations Config
liquibase:
datasource: test
changeLogs:
- classpath:master.yaml
# Logging
log:
level: info
appenders:
- type: console
logFormat: '[%d{"dd/MMM/yyyy:HH:mm:ss,SSS"}] %t %X %-5p %c{1}: %m%n%ex'

View File

@ -0,0 +1,3 @@
jdbc:
test:
jdbcUrl: "jdbc:mysql://192.168.10.64:33006/test?connectTimeout=0&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"

101
docker-compose.yaml Normal file
View File

@ -0,0 +1,101 @@
version: '3.4'
volumes:
test-m2:
external: true
networks:
backend:
x-jdbc-env:
&jdbc-env
JDBC_TEST_JDBCURL: jdbc:mysql://db:3306/test?connectTimeout=0&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
JDBC_TEST_USERNAME: root
JDBC_TEST_PASSWORD: test
services:
mvn-build:
image: maven:3-openjdk-11
working_dir: /usr/src/maven
volumes:
- .:/usr/src/maven
- test-m2:/root/.m2
entrypoint: mvn clean package
db:
image: mariadb:10
networks:
- backend
ports:
- "33006:3306"
environment:
MYSQL_ROOT_PASSWORD: test
labels:
traefik.enable: 'false'
liquibase:
image: test-db:1.0-SNAPSHOT
build:
context: db
args:
version: ${VERSION}
networks:
- backend
command: --lb-update
# cayenne helpers
cdbimport:
image: maven:3-openjdk-11
networks:
- backend
volumes:
- test-m2:/root/.m2
- .:/usr/src/maven
working_dir: /usr/src/maven
environment:
<<: *jdbc-env
command: mvn -f model cayenne:cdbimport
cgen:
image: maven:3-openjdk-11
volumes:
- test-m2:/root/.m2
- .:/usr/src/maven
working_dir: /usr/src/maven
environment:
<<: *jdbc-env
command: mvn -f model cayenne:cgen
# app services
# this shows a fail scenario
fail:
image: test-test:${VERSION}
build:
context: test
args:
version: ${VERSION}
networks:
- backend
depends_on:
- db
- liquibase
command: --fail
# this shows off a workaround
happy:
image: test-test:${VERSION}
build:
context: test
args:
version: ${VERSION}
networks:
- backend
depends_on:
- db
- liquibase
command: --happy

1
model/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

72
model/pom.xml Normal file
View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>test</groupId>
<artifactId>parent</artifactId>
<version>${revision}${sha1}${changelist}</version>
</parent>
<artifactId>test-model</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.cayenne</groupId>
<artifactId>cayenne-lifecycle</artifactId>
<version>${cayenne.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.cayenne.plugins</groupId>
<artifactId>cayenne-maven-plugin</artifactId>
<version>${cayenne.version}</version>
<configuration>
<map>${project.basedir}/src/main/resources/test/test.map.xml</map>
<superPkg>test.cayenne.auto</superPkg>
<dataSource>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>${env.JDBC_TEST_JDBCURL}</url>
<username>root</username>
<password>test</password>
</dataSource>
<dbImport>
<defaultPackage>test.cayenne</defaultPackage>
<catalog>
<name>test</name>
<excludeTable>databasechangelog.*</excludeTable>
</catalog>
</dbImport>
<overwriteExisting>true</overwriteExisting>
<meaningfulPk>true</meaningfulPk>
</configuration>
<executions>
<execution>
<id>default-cli</id>
<goals>
<!-- To perform reverse engineering, explicitly run 'mvn cayenne:cdbimport' -->
<!-- To perform class generation, explicitly run 'mvn cayenne:cgen' -->
<!-- Start up the modeler from the command-line 'mvn cayenne-modeler:run' -->
<goal>cgen</goal>
</goals>
</execution>
</executions>
<dependencies>
<!-- 3rdParty deps-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,9 @@
package test.cayenne;
import test.cayenne.auto._E1;
public class E1 extends _E1 {
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,9 @@
package test.cayenne;
import test.cayenne.auto._E2;
public class E2 extends _E2 {
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,131 @@
package test.cayenne.auto;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.cayenne.BaseDataObject;
import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.ListProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import test.cayenne.E2;
/**
* Class _E1 was generated by Cayenne.
* It is probably a good idea to avoid changing this class manually,
* since it may be overwritten next time code is regenerated.
* If you need to make any customizations, please use subclass.
*/
public abstract class _E1 extends BaseDataObject {
private static final long serialVersionUID = 1L;
public static final String ID_PK_COLUMN = "id";
public static final StringProperty<String> TEXT = PropertyFactory.createString("text", String.class);
public static final EntityProperty<E2> E2 = PropertyFactory.createEntity("e2", E2.class);
public static final ListProperty<E2> E2S = PropertyFactory.createList("e2s", E2.class);
protected String text;
protected Object e2;
protected Object e2s;
public void setText(String text) {
beforePropertyWrite("text", this.text, text);
this.text = text;
}
public String getText() {
beforePropertyRead("text");
return this.text;
}
public void setE2(E2 e2) {
setToOneTarget("e2", e2, true);
}
public E2 getE2() {
return (E2)readProperty("e2");
}
public void addToE2s(E2 obj) {
addToManyTarget("e2s", obj, true);
}
public void removeFromE2s(E2 obj) {
removeToManyTarget("e2s", obj, true);
}
@SuppressWarnings("unchecked")
public List<E2> getE2s() {
return (List<E2>)readProperty("e2s");
}
@Override
public Object readPropertyDirectly(String propName) {
if(propName == null) {
throw new IllegalArgumentException();
}
switch(propName) {
case "text":
return this.text;
case "e2":
return this.e2;
case "e2s":
return this.e2s;
default:
return super.readPropertyDirectly(propName);
}
}
@Override
public void writePropertyDirectly(String propName, Object val) {
if(propName == null) {
throw new IllegalArgumentException();
}
switch (propName) {
case "text":
this.text = (String)val;
break;
case "e2":
this.e2 = val;
break;
case "e2s":
this.e2s = val;
break;
default:
super.writePropertyDirectly(propName, val);
}
}
private void writeObject(ObjectOutputStream out) throws IOException {
writeSerialized(out);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
readSerialized(in);
}
@Override
protected void writeState(ObjectOutputStream out) throws IOException {
super.writeState(out);
out.writeObject(this.text);
out.writeObject(this.e2);
out.writeObject(this.e2s);
}
@Override
protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
super.readState(in);
this.text = (String)in.readObject();
this.e2 = in.readObject();
this.e2s = in.readObject();
}
}

View File

@ -0,0 +1,131 @@
package test.cayenne.auto;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.cayenne.BaseDataObject;
import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.ListProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import test.cayenne.E1;
/**
* Class _E2 was generated by Cayenne.
* It is probably a good idea to avoid changing this class manually,
* since it may be overwritten next time code is regenerated.
* If you need to make any customizations, please use subclass.
*/
public abstract class _E2 extends BaseDataObject {
private static final long serialVersionUID = 1L;
public static final String ID_PK_COLUMN = "id";
public static final StringProperty<String> TEXT = PropertyFactory.createString("text", String.class);
public static final EntityProperty<E1> E1 = PropertyFactory.createEntity("e1", E1.class);
public static final ListProperty<E1> E1S = PropertyFactory.createList("e1s", E1.class);
protected String text;
protected Object e1;
protected Object e1s;
public void setText(String text) {
beforePropertyWrite("text", this.text, text);
this.text = text;
}
public String getText() {
beforePropertyRead("text");
return this.text;
}
public void setE1(E1 e1) {
setToOneTarget("e1", e1, true);
}
public E1 getE1() {
return (E1)readProperty("e1");
}
public void addToE1s(E1 obj) {
addToManyTarget("e1s", obj, true);
}
public void removeFromE1s(E1 obj) {
removeToManyTarget("e1s", obj, true);
}
@SuppressWarnings("unchecked")
public List<E1> getE1s() {
return (List<E1>)readProperty("e1s");
}
@Override
public Object readPropertyDirectly(String propName) {
if(propName == null) {
throw new IllegalArgumentException();
}
switch(propName) {
case "text":
return this.text;
case "e1":
return this.e1;
case "e1s":
return this.e1s;
default:
return super.readPropertyDirectly(propName);
}
}
@Override
public void writePropertyDirectly(String propName, Object val) {
if(propName == null) {
throw new IllegalArgumentException();
}
switch (propName) {
case "text":
this.text = (String)val;
break;
case "e1":
this.e1 = val;
break;
case "e1s":
this.e1s = val;
break;
default:
super.writePropertyDirectly(propName, val);
}
}
private void writeObject(ObjectOutputStream out) throws IOException {
writeSerialized(out);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
readSerialized(in);
}
@Override
protected void writeState(ObjectOutputStream out) throws IOException {
super.writeState(out);
out.writeObject(this.text);
out.writeObject(this.e1);
out.writeObject(this.e1s);
}
@Override
protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
super.readState(in);
this.text = (String)in.readObject();
this.e1 = in.readObject();
this.e1s = in.readObject();
}
}

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<domain xmlns="http://cayenne.apache.org/schema/10/domain"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain https://cayenne.apache.org/schema/10/domain.xsd"
project-version="10">
<map name="test"/>
<node name="test-node"
factory="org.apache.cayenne.configuration.server.JNDIDataSourceFactory" parameters="jdbc/mysql/test">
<map-ref name="test"/>
</node>
</domain>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap https://cayenne.apache.org/schema/10/modelMap.xsd"
project-version="10">
<property name="defaultPackage" value="test.cayenne"/>
<property name="defaultCatalog" value="test"/>
<db-entity name="e1" catalog="test">
<db-attribute name="e2_id" type="BIGINT" length="10"/>
<db-attribute name="id" type="BIGINT" isPrimaryKey="true" isGenerated="true" isMandatory="true" length="10"/>
<db-attribute name="text" type="LONGVARCHAR" length="65535"/>
</db-entity>
<db-entity name="e2" catalog="test">
<db-attribute name="e1_id" type="BIGINT" length="10"/>
<db-attribute name="id" type="BIGINT" isPrimaryKey="true" isGenerated="true" isMandatory="true" length="10"/>
<db-attribute name="text" type="LONGVARCHAR" length="65535"/>
</db-entity>
<obj-entity name="E1" className="test.cayenne.E1" dbEntityName="e1">
<obj-attribute name="text" type="java.lang.String" db-attribute-path="text"/>
</obj-entity>
<obj-entity name="E2" className="test.cayenne.E2" dbEntityName="e2">
<obj-attribute name="text" type="java.lang.String" db-attribute-path="text"/>
</obj-entity>
<db-relationship name="e2" source="e1" target="e2">
<db-attribute-pair source="e2_id" target="id"/>
</db-relationship>
<db-relationship name="e2s" source="e1" target="e2" toMany="true">
<db-attribute-pair source="id" target="e1_id"/>
</db-relationship>
<db-relationship name="e1" source="e2" target="e1">
<db-attribute-pair source="e1_id" target="id"/>
</db-relationship>
<db-relationship name="e1s" source="e2" target="e1" toMany="true">
<db-attribute-pair source="id" target="e2_id"/>
</db-relationship>
<obj-relationship name="e2" source="E1" target="E2" deleteRule="Nullify" db-relationship-path="e2"/>
<obj-relationship name="e2s" source="E1" target="E2" deleteRule="Deny" db-relationship-path="e2s"/>
<obj-relationship name="e1" source="E2" target="E1" deleteRule="Nullify" db-relationship-path="e1"/>
<obj-relationship name="e1s" source="E2" target="E1" deleteRule="Deny" db-relationship-path="e1s"/>
</data-map>

131
pom.xml Normal file
View File

@ -0,0 +1,131 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>parent</artifactId>
<groupId>test</groupId>
<version>${revision}${sha1}${changelist}</version>
<name>Parent</name>
<packaging>pom</packaging>
<properties>
<revision>1.0</revision>
<sha1/>
<changelist>-SNAPSHOT</changelist>
<bootique.version>2.0.M1</bootique.version>
<!-- must stay at 8.0.22 until bootique upgrades to liquibase 4.x -->
<!-- see https://bugs.mysql.com/bug.php?id=102302 and https://github.com/liquibase/liquibase/blob/4.4.x/liquibase-core/src/main/java/liquibase/changelog/StandardChangeLogHistoryService.java#L324 -->
<mysql.version>8.0.22</mysql.version>
<mariadb.version>3.0.2-rc</mariadb.version>
<cayenne.version>4.2.B1</cayenne.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<main.class>Dummy</main.class>
</properties>
<modules>
<module>db</module>
<module>model</module>
<module>test</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>test-model</artifactId>
<version>${project.version}</version>
</dependency>
<!-- bootique -->
<dependency>
<groupId>io.bootique.bom</groupId>
<artifactId>bootique-bom</artifactId>
<version>${bootique.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- cayenne -->
<dependency>
<groupId>org.apache.cayenne</groupId>
<artifactId>cayenne-server</artifactId>
<version>${cayenne.version}</version>
</dependency>
<!-- mysql driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${main.class}</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

10
run-test.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
if [ -z `docker volume ls -q | grep -i test-m2` ]; then docker volume create test-m2; fi
docker-compose up -d db
sleep 30s
docker-compose run --rm mvn-build
docker-compose build
docker-compose run --rm fail
docker-compose run --rm happy
docker-compose down

1
test/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

5
test/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
FROM openjdk:11
ARG version
ADD target/test-test-${version}.jar /test-test.jar
ENTRYPOINT ["java", "-jar", "/test-test.jar"]

66
test/pom.xml Normal file
View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>test</groupId>
<artifactId>parent</artifactId>
<version>${revision}${sha1}${changelist}</version>
</parent>
<artifactId>test-test</artifactId>
<properties>
<main.class>test.TestApp</main.class>
</properties>
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>test-model</artifactId>
</dependency>
<dependency>
<groupId>io.bootique.cayenne</groupId>
<artifactId>bootique-cayenne</artifactId>
</dependency>
<dependency>
<groupId>io.bootique.agrest</groupId>
<artifactId>bootique-agrest</artifactId>
</dependency>
<dependency>
<groupId>io.agrest</groupId>
<artifactId>agrest-engine</artifactId>
<version>4.7</version>
</dependency>
<dependency>
<groupId>io.bootique.jdbc</groupId>
<artifactId>bootique-jdbc-hikaricp</artifactId>
</dependency>
<dependency>
<groupId>io.bootique.logback</groupId>
<artifactId>bootique-logback</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,33 @@
package test;
import io.bootique.cli.Cli;
import io.bootique.command.CommandOutcome;
import io.bootique.command.CommandWithMetadata;
import io.bootique.meta.application.CommandMetadata;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.configuration.server.ServerRuntime;
import javax.inject.Inject;
import javax.inject.Provider;
public class FailCommand extends CommandWithMetadata {
@Inject
private Provider<ServerRuntime> cayenneRuntimeProvider;
@Inject
public FailCommand(CommandMetadata.Builder metadataBuilder) {
super(metadataBuilder
.name("fail")
.description("Demo of a possible issue with Cayenne.")
.build()
);
}
@Override
public CommandOutcome run(Cli cli) {
ObjectContext context = cayenneRuntimeProvider.get().newContext();
TestCase.runTest(context, true);
return CommandOutcome.succeeded();
}
}

View File

@ -0,0 +1,32 @@
package test;
import io.bootique.cli.Cli;
import io.bootique.command.CommandOutcome;
import io.bootique.command.CommandWithMetadata;
import io.bootique.meta.application.CommandMetadata;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.configuration.server.ServerRuntime;
import javax.inject.Inject;
import javax.inject.Provider;
public class HappyCommand extends CommandWithMetadata {
@Inject
private Provider<ServerRuntime> cayenneRuntimeProvider;
@Inject
public HappyCommand(CommandMetadata.Builder metadataBuilder) {
super(metadataBuilder
.name("happy")
.description("Demo of a possible issue with Cayenne. This command shows a workaround.")
.build()
);
}
@Override
public CommandOutcome run(Cli cli) {
ObjectContext context = cayenneRuntimeProvider.get().newContext();
TestCase.runTest(context, false);
return CommandOutcome.succeeded();
}
}

View File

@ -0,0 +1,31 @@
package test;
import io.bootique.BQCoreModule;
import io.bootique.BaseModule;
import io.bootique.Bootique;
import io.bootique.di.Binder;
import io.bootique.meta.application.OptionMetadata;
public class TestApp extends BaseModule {
public static void main(String[] args) {
Bootique.app(args)
.autoLoadModules()
.exec()
.exit();
}
@Override
public void configure(Binder binder) {
BQCoreModule.extend(binder)
.addConfig("classpath:test/default.yaml")
.addCommand(FailCommand.class)
.addCommand(HappyCommand.class)
// --local
.addOption(OptionMetadata.builder("local", "Load configuration for local environment.").build())
.mapConfigResource("local", "classpath:test/local.yaml")
;
}
}

View File

@ -0,0 +1,13 @@
package test;
import io.bootique.BQModuleProvider;
public class TestAppProvider implements BQModuleProvider {
public TestAppProvider() {}
@Override
public TestApp module() {
return new TestApp();
}
}

View File

@ -0,0 +1,30 @@
package test;
import org.apache.cayenne.ObjectContext;
import test.cayenne.E1;
import test.cayenne.E2;
public class TestCase {
public static void runTest (ObjectContext context, boolean doFail) {
for (int i=100; i<110; ++i) {
E1 e1 = context.newObject(E1.class);
E2 e2 = context.newObject(E2.class);
e1.setText("e1 #" + i);
e2.setText("e2 #" + i);
// executing this commit seems to
// mitigate the issue
if (!doFail) {
context.commitChanges();
}
e1.setE2(e2);
e2.setE1(e1);
context.commitChanges();
}
}
}

View File

@ -0,0 +1 @@
test.TestAppProvider

View File

@ -0,0 +1,22 @@
# JDBC config
jdbc:
test:
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: "jdbc:mysql://db:3306/test?connectTimeout=0&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
username: root
password: test
minimumIdle: 1
maximumPoolSize: 20
connectionTestQuery: "select 1"
autoCommit: false
cayenne:
configs:
- test/cayenne-test.xml
datasource: test
log:
level: debug
appenders:
- type: console
logFormat: '[%d{"dd/MMM/yyyy:HH:mm:ss,SSS"}] %t %X %-5p %c{1}: %m%n%ex'

View File

@ -0,0 +1,3 @@
jdbc:
test:
jdbcUrl: "jdbc:mysql://localhost:33006/test?connectTimeout=0&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"