diff --git a/.gitignore b/.gitignore
index 01d903295..de7de41c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -365,6 +365,9 @@ jdk_8_maven/em/external/rest/spring-batch-rest/target
/jdk_17_maven/em/external/rest/ohsome-api/target/
/jdk_17_maven/cs/rest/spring-rest-example/target/
+/jdk_17_maven/cs/rest/digitalbanking/target/
+/jdk_17_maven/em/embedded/rest/digitalbanking/target/
+/jdk_17_maven/em/external/rest/digitalbanking/target/
/jdk_17_maven/em/embedded/rest/spring-rest-example/target/
/jdk_17_maven/em/external/rest/spring-rest-example/target/
diff --git a/README.md b/README.md
index 1eee0d7a7..52e1aa233 100644
--- a/README.md
+++ b/README.md
@@ -85,7 +85,7 @@ How to setup authentication information, based on the current content of the ini
Auth configuration files can found in the [auth](auth) folder.
-### REST: Java/Kotlin (43)
+### REST: Java/Kotlin (44)
* **AdoptMe** (not-known license), [jdk_21_maven/cs/rest/adoptme](jdk_21_maven/cs/rest/adoptme), from [https://github.com/daanimelian/Programacion3-TPO](https://github.com/daanimelian/Programacion3-TPO)
@@ -101,6 +101,8 @@ Auth configuration files can found in the [auth](auth) folder.
* **CWA-Verification-Server** (Apache), [jdk_11_maven/cs/rest/cwa-verification-server](jdk_11_maven/cs/rest/cwa-verification-server), from [https://github.com/corona-warn-app/cwa-verification-server](https://github.com/corona-warn-app/cwa-verification-server)
+* **Digital Banking** (not-known license), [jdk_17_maven/cs/rest/digitalbanking](jdk_17_maven/cs/rest/digitalbanking), from [https://github.com/jphaugla/Redisearch-Digital-Banking-redisTemplate](https://github.com/jphaugla/Redisearch-Digital-Banking-redisTemplate)
+
* **ERC20 Rest Service** (not-known license), [jdk_8_gradle/cs/rest/erc20-rest-service](jdk_8_gradle/cs/rest/erc20-rest-service), from [https://github.com/web3labs/erc20-rest-service](https://github.com/web3labs/erc20-rest-service)
* **Familie Ba Sak** (MIT), [jdk_17_maven/cs/rest/familie-ba-sak](jdk_17_maven/cs/rest/familie-ba-sak), from [https://github.com/navikt/familie-ba-sak](https://github.com/navikt/familie-ba-sak)
diff --git a/dockerfiles/digitalbanking.dockerfile b/dockerfiles/digitalbanking.dockerfile
new file mode 100644
index 000000000..5e11d1fdd
--- /dev/null
+++ b/dockerfiles/digitalbanking.dockerfile
@@ -0,0 +1,13 @@
+FROM amazoncorretto:17-alpine-jdk
+
+COPY ./dist/digitalbanking-sut.jar .
+COPY ./dist/jacocoagent.jar .
+
+
+
+
+ENTRYPOINT \
+ java \
+ -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \
+ -jar digitalbanking-sut.jar \
+ --server.port=8080 --REDIS_HOST=db --REDIS_PORT=6379 --REDIS_PASSWORD=jasonrocks --redis.host=db --redis.port=6379 --KAFKA_HOST=kafka --KAFKA_PORT=9092 --SPRING_CASSANDRA_HOST=cassandra --SPRING_CASSANDRA_PORT=9042 --SPRING_CASSANDRA_CLUSTER=test --SPRING_CASSANDRA_DATACENTER=datacenter1
\ No newline at end of file
diff --git a/dockerfiles/digitalbanking.yaml b/dockerfiles/digitalbanking.yaml
new file mode 100644
index 000000000..424f7e125
--- /dev/null
+++ b/dockerfiles/digitalbanking.yaml
@@ -0,0 +1,71 @@
+services:
+ mitmproxy:
+ image: mitmproxy/mitmproxy:10.2.4
+ user: "0:0"
+ environment:
+ MITM_LOG_DIR: /custom-logs
+ MITM_LOG_FILE: ${MITM_LOG_FILE:-minlog.csv}
+ command: >
+ mitmdump
+ --mode reverse:http://sut-digitalbanking:8080
+ --listen-host 0.0.0.0
+ --listen-port 8080
+ --set keep_host_header=true
+ -s /addons/minlog.py
+ volumes:
+ - ${HOST_LOG_DIR:-./mitm-logs}:/custom-logs
+ - ./addons:/addons:ro
+ ports:
+ - "${HOST_PORT:-8080}:8080"
+ depends_on:
+ - sut-digitalbanking
+ sut-digitalbanking:
+ image: webfuzzing/wfd-digitalbanking:FINAL
+# build:
+# dockerfile: ./dockerfiles/digitalbanking.dockerfile
+# context: ..
+ environment:
+ AUTH_PORT: ${AUTH_PORT:-8081}
+ ports:
+ - "${JACOCO_PORT:-6300}:6300"
+ depends_on:
+ db:
+ condition: service_healthy
+ cassandra:
+ condition: service_healthy
+ db:
+ image: redis/redis-stack-server:7.4.0-v1
+ environment:
+ REDIS_ARGS: --requirepass jasonrocks
+ healthcheck:
+ test: redis-cli -a jasonrocks ping | grep PONG
+ interval: 30s
+ timeout: 30s
+ retries: 3
+ cassandra:
+ image: cassandra:4.1
+ environment:
+ CASSANDRA_CLUSTER_NAME: test
+ CASSANDRA_DC: datacenter1
+ CASSANDRA_ENDPOINT_SNITCH: SimpleSnitch
+ HEAP_NEWSIZE: 128M
+ MAX_HEAP_SIZE: 512M
+ healthcheck:
+ test: cqlsh -e "CREATE KEYSPACE IF NOT EXISTS banking WITH replication = {'class':'SimpleStrategy','replication_factor':1};CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text, amounttype text, merchant text, referencekeytype text, referencekeyvalue text, originalamount text, amount text, trancd text, description text, initialdate text, settlementdate text, postingdate text, status text, disputeid text, transactionreturn text, location text, transactiontags text, primary key (tranid));"
+ interval: 30s
+ timeout: 30s
+ retries: 3
+ kafka:
+ image: apache/kafka:3.8.1
+ environment:
+ KAFKA_NODE_ID: 1
+ KAFKA_PROCESS_ROLES: broker,controller
+ KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
+ KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
+ KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+ KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
+ KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
+ KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
\ No newline at end of file
diff --git a/experiments/wb-exp.py b/experiments/wb-exp.py
index 36f8be7d8..a3eb25353 100644
--- a/experiments/wb-exp.py
+++ b/experiments/wb-exp.py
@@ -189,6 +189,7 @@ def __init__(self, name, platform):
Sut("catwatch", JDK_8),
Sut("commafeed", JDK_25),
Sut("cwa-verification", JDK_11),
+ Sut("digitalbanking", JDK_17),
Sut("erc20-rest-service", JDK_8),
Sut("familie-ba-sak",JDK_17),
Sut("features-service", JDK_8),
diff --git a/jdk_17_maven/cs/rest/digitalbanking/pom.xml b/jdk_17_maven/cs/rest/digitalbanking/pom.xml
index 22e523324..9d3defcab 100644
--- a/jdk_17_maven/cs/rest/digitalbanking/pom.xml
+++ b/jdk_17_maven/cs/rest/digitalbanking/pom.xml
@@ -84,6 +84,14 @@
org.springframework.boot
spring-boot-maven-plugin
+
+
+
+ digitalbanking
+ sut
+
+
diff --git a/jdk_17_maven/cs/rest/digitalbanking/src/main/java/com/jphaugla/controller/BankingController.java b/jdk_17_maven/cs/rest/digitalbanking/src/main/java/com/jphaugla/controller/BankingController.java
index af86560d4..9a8811511 100644
--- a/jdk_17_maven/cs/rest/digitalbanking/src/main/java/com/jphaugla/controller/BankingController.java
+++ b/jdk_17_maven/cs/rest/digitalbanking/src/main/java/com/jphaugla/controller/BankingController.java
@@ -53,7 +53,9 @@ public String saveTransaction(@RequestParam Boolean doKafka) throws ParseExcepti
return "Done";
}
- @GetMapping("/generateData")
+ // MODIFIED: disabled this endpoint, as it creates one customer per requested unit with no
+ // upper bound, so a large noOfCustomers exhausts the heap and kills the SUT.
+ // @GetMapping("/generateData")
@ResponseBody
public String generateData (@RequestParam Integer noOfCustomers, @RequestParam Integer noOfTransactions,
@RequestParam Integer noOfDays, @RequestParam String key_suffix,
diff --git a/jdk_17_maven/cs/rest/pom.xml b/jdk_17_maven/cs/rest/pom.xml
index 8991efea6..dbe35d4bc 100644
--- a/jdk_17_maven/cs/rest/pom.xml
+++ b/jdk_17_maven/cs/rest/pom.xml
@@ -17,6 +17,7 @@
tiltaksgjennomforing
ohsome-api
spring-rest-example
+ digitalbanking
diff --git a/jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml b/jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml
new file mode 100644
index 000000000..b1af7bba1
--- /dev/null
+++ b/jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml
@@ -0,0 +1,59 @@
+
+
+
+ 4.0.0
+
+ evomaster-benchmark-jdk17-em-embedded-rest-digitalbanking
+ jar
+
+
+ org.evomaster
+ evomaster-benchmark-jdk17-em-embedded-rest
+ 4.3.1-SNAPSHOT
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 3.1.4
+ pom
+ import
+
+
+
+
+
+
+
+ com.jphaugla
+ redis
+ 0.0.1-SNAPSHOT
+
+
+
+ org.testcontainers
+ testcontainers
+ compile
+
+
+ org.testcontainers
+ kafka
+ ${testcontainers.version}
+ compile
+
+
+
+
+ redis.clients
+ jedis
+ 4.4.3
+
+
+
+
diff --git a/jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java b/jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java
new file mode 100644
index 000000000..1532f1b6a
--- /dev/null
+++ b/jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java
@@ -0,0 +1,220 @@
+package em.embedded.digitalbanking;
+
+import com.jphaugla.DemoApplication;
+import org.evomaster.client.java.controller.EmbeddedSutController;
+import org.evomaster.client.java.controller.InstrumentedSutStarter;
+import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto;
+import org.evomaster.client.java.controller.api.dto.SutInfoDto;
+import org.evomaster.client.java.sql.DbSpecification;
+import org.evomaster.client.java.controller.problem.ProblemInfo;
+import org.evomaster.client.java.controller.problem.RestProblem;
+import org.springframework.boot.SpringApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.kafka.KafkaContainer;
+import redis.clients.jedis.JedisPooled;
+import redis.clients.jedis.UnifiedJedis;
+
+import java.time.Duration;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Class used to start/stop the SUT.
+ */
+public class EmbeddedEvoMasterController extends EmbeddedSutController {
+
+ /*
+ The SUT uses RediSearch (FT.CREATE), so it needs Redis Stack and not plain Redis.
+ */
+ private static final String REDIS_VERSION = "7.4.0-v1";
+
+ private static final int REDIS_PORT = 6379;
+
+ private static final String REDIS_PASSWORD = "jasonrocks";
+
+ private static final String CASSANDRA_VERSION = "4.1";
+
+ private static final int CASSANDRA_PORT = 9042;
+
+ private static final String CASSANDRA_CLUSTER = "test";
+
+ private static final String CASSANDRA_DATACENTER = "datacenter1";
+
+ private static final String KAFKA_VERSION = "3.8.1";
+
+ private static final int KAFKA_PORT = 9092;
+
+ /*
+ The SUT connects to an existing keyspace, and the "transaction" table is the one
+ scripts/trans.cql creates. Neither is created by the application itself.
+ */
+ private static final String INIT_CQL =
+ "CREATE KEYSPACE IF NOT EXISTS banking WITH replication = " +
+ "{'class':'SimpleStrategy','replication_factor':1};" +
+ "CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text," +
+ " amounttype text, merchant text, referencekeytype text, referencekeyvalue text," +
+ " originalamount text, amount text, trancd text, description text, initialdate text," +
+ " settlementdate text, postingdate text, status text, disputeid text," +
+ " transactionreturn text, location text, transactiontags text, primary key (tranid));";
+
+ private static final GenericContainer redis = new GenericContainer("redis/redis-stack-server:" + REDIS_VERSION)
+ .withEnv("REDIS_ARGS", "--requirepass " + REDIS_PASSWORD)
+ .withExposedPorts(REDIS_PORT);
+
+ private static final GenericContainer cassandra = new GenericContainer("cassandra:" + CASSANDRA_VERSION)
+ .withEnv("CASSANDRA_CLUSTER_NAME", CASSANDRA_CLUSTER)
+ .withEnv("CASSANDRA_DC", CASSANDRA_DATACENTER)
+ .withEnv("CASSANDRA_ENDPOINT_SNITCH", "SimpleSnitch")
+ .withEnv("HEAP_NEWSIZE", "128M")
+ .withEnv("MAX_HEAP_SIZE", "512M")
+ .withExposedPorts(CASSANDRA_PORT)
+ .waitingFor(Wait.forLogMessage(".*Startup complete.*", 1))
+ .withStartupTimeout(Duration.ofMinutes(5));
+
+ private static final KafkaContainer kafka = new KafkaContainer("apache/kafka:" + KAFKA_VERSION);
+
+
+ public static void main(String[] args) {
+
+ int port = 40100;
+ if (args.length > 0) {
+ port = Integer.parseInt(args[0]);
+ }
+
+ EmbeddedEvoMasterController controller = new EmbeddedEvoMasterController(port);
+ InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
+
+ starter.start();
+ }
+
+
+ private ConfigurableApplicationContext ctx;
+
+ private UnifiedJedis redisClient;
+
+ public EmbeddedEvoMasterController() {
+ this(0);
+ }
+
+ public EmbeddedEvoMasterController(int port) {
+ setControllerPort(port);
+ }
+
+
+ @Override
+ public String startSut() {
+
+ redis.start();
+ kafka.start();
+ cassandra.start();
+ initCassandraSchema();
+ redisClient = new JedisPooled("redis://:" + REDIS_PASSWORD + "@"
+ + redis.getHost() + ":" + redis.getMappedPort(REDIS_PORT));
+
+ ctx = SpringApplication.run(DemoApplication.class, new String[]{
+ "--server.port=0",
+ "--REDIS_HOST=" + redis.getHost(),
+ "--REDIS_PORT=" + redis.getMappedPort(REDIS_PORT),
+ "--REDIS_PASSWORD=" + REDIS_PASSWORD,
+ // the index creation runner reads these two instead of the spring.redis ones
+ "--redis.host=" + redis.getHost(),
+ "--redis.port=" + redis.getMappedPort(REDIS_PORT),
+ "--KAFKA_HOST=" + kafka.getHost(),
+ "--KAFKA_PORT=" + kafka.getMappedPort(KAFKA_PORT),
+ "--SPRING_CASSANDRA_HOST=" + cassandra.getHost(),
+ "--SPRING_CASSANDRA_PORT=" + cassandra.getMappedPort(CASSANDRA_PORT),
+ "--SPRING_CASSANDRA_CLUSTER=" + CASSANDRA_CLUSTER,
+ "--SPRING_CASSANDRA_DATACENTER=" + CASSANDRA_DATACENTER
+ });
+
+ return "http://localhost:" + getSutPort();
+ }
+
+ private void initCassandraSchema() {
+ try {
+ cassandra.execInContainer("cqlsh", "-e", INIT_CQL);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to create the Cassandra schema", e);
+ }
+ }
+
+ protected int getSutPort() {
+ return (Integer) ((Map) ctx.getEnvironment()
+ .getPropertySources().get("server.ports").getSource())
+ .get("local.server.port");
+ }
+
+
+ @Override
+ public boolean isSutRunning() {
+ return ctx != null && ctx.isRunning();
+ }
+
+ @Override
+ public void stopSut() {
+
+ if (ctx != null) {
+ ctx.stop();
+ ctx.close();
+ ctx = null;
+ }
+
+ if (redisClient != null) {
+ redisClient.close();
+ redisClient = null;
+ }
+
+ cassandra.stop();
+ kafka.stop();
+ redis.stop();
+ }
+
+ @Override
+ public String getPackagePrefixesToCover() {
+ return "com.jphaugla.";
+ }
+
+ /*
+ Redis is the only store that keeps state across tests. FLUSHALL would drop the
+ RediSearch indexes, which the SUT creates only at startup.
+ */
+ @Override
+ public void resetStateOfSUT() {
+ if (redisClient == null) {
+ return;
+ }
+ Set keys = redisClient.keys("*");
+ if (!keys.isEmpty()) {
+ redisClient.del(keys.toArray(new String[0]));
+ }
+ }
+
+
+ @Override
+ public List getDbSpecifications() {
+ return null;
+ }
+
+
+ @Override
+ public List getInfoForAuthentication() {
+ return null;
+ }
+
+
+ @Override
+ public ProblemInfo getProblemInfo() {
+ return new RestProblem(
+ "http://localhost:" + getSutPort() + "/v3/api-docs",
+ null
+ );
+ }
+
+ @Override
+ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
+ return SutInfoDto.OutputFormat.JAVA_JUNIT_5;
+ }
+}
diff --git a/jdk_17_maven/em/embedded/rest/pom.xml b/jdk_17_maven/em/embedded/rest/pom.xml
index 82cb6185d..dc184594d 100644
--- a/jdk_17_maven/em/embedded/rest/pom.xml
+++ b/jdk_17_maven/em/embedded/rest/pom.xml
@@ -16,6 +16,7 @@
tiltaksgjennomforing
ohsome-api
spring-rest-example
+ digitalbanking
diff --git a/jdk_17_maven/em/external/rest/digitalbanking/pom.xml b/jdk_17_maven/em/external/rest/digitalbanking/pom.xml
new file mode 100644
index 000000000..3779f6a31
--- /dev/null
+++ b/jdk_17_maven/em/external/rest/digitalbanking/pom.xml
@@ -0,0 +1,91 @@
+
+
+
+ 4.0.0
+
+ evomaster-benchmark-jdk17-em-external-rest-digitalbanking
+ jar
+
+
+ org.evomaster
+ evomaster-benchmark-jdk17-em-external-rest
+ 4.3.1-SNAPSHOT
+
+
+
+
+
+
+ org.testcontainers
+ testcontainers
+ compile
+
+
+ org.testcontainers
+ kafka
+ ${testcontainers.version}
+ compile
+
+
+
+
+ redis.clients
+ jedis
+ 4.4.3
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+ 3.6.2
+
+
+ package
+
+ shade
+
+
+ digitalbanking-evomaster-runner
+
+
+
+ em.external.digitalbanking.ExternalEvoMasterController
+
+ org.evomaster.client.java.instrumentation.InstrumentingAgent
+
+ org.evomaster.client.java.instrumentation.InstrumentingAgent
+
+ true
+ true
+
+
+
+
+
+
+ org.slf4j
+ shaded.emb.org.slf4j
+
+
+ com.fasterxml.jackson.annotation
+ shaded.emb.com.fasterxml.jackson.annotation
+
+
+
+
+
+
+
+
+
diff --git a/jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java b/jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java
new file mode 100644
index 000000000..c035b6076
--- /dev/null
+++ b/jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java
@@ -0,0 +1,272 @@
+package em.external.digitalbanking;
+
+
+import org.evomaster.client.java.controller.ExternalSutController;
+import org.evomaster.client.java.controller.InstrumentedSutStarter;
+import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto;
+import org.evomaster.client.java.controller.api.dto.SutInfoDto;
+import org.evomaster.client.java.sql.DbSpecification;
+import org.evomaster.client.java.controller.problem.ProblemInfo;
+import org.evomaster.client.java.controller.problem.RestProblem;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.kafka.KafkaContainer;
+import redis.clients.jedis.JedisPooled;
+import redis.clients.jedis.UnifiedJedis;
+
+import java.time.Duration;
+import java.util.List;
+import java.util.Set;
+
+public class ExternalEvoMasterController extends ExternalSutController {
+
+ private static final int DEFAULT_CONTROLLER_PORT = 40100;
+
+ private static final int DEFAULT_SUT_PORT = 12345;
+
+ /*
+ The SUT uses RediSearch (FT.CREATE), so it needs Redis Stack and not plain Redis.
+ */
+ private static final String REDIS_VERSION = "7.4.0-v1";
+
+ private static final int REDIS_PORT = 6379;
+
+ private static final String REDIS_PASSWORD = "jasonrocks";
+
+ private static final String CASSANDRA_VERSION = "4.1";
+
+ private static final int CASSANDRA_PORT = 9042;
+
+ private static final String CASSANDRA_CLUSTER = "test";
+
+ private static final String CASSANDRA_DATACENTER = "datacenter1";
+
+ private static final String KAFKA_VERSION = "3.8.1";
+
+ private static final int KAFKA_PORT = 9092;
+
+ /*
+ The SUT connects to an existing keyspace, and the "transaction" table is the one
+ scripts/trans.cql creates. Neither is created by the application itself.
+ */
+ private static final String INIT_CQL =
+ "CREATE KEYSPACE IF NOT EXISTS banking WITH replication = " +
+ "{'class':'SimpleStrategy','replication_factor':1};" +
+ "CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text," +
+ " amounttype text, merchant text, referencekeytype text, referencekeyvalue text," +
+ " originalamount text, amount text, trancd text, description text, initialdate text," +
+ " settlementdate text, postingdate text, status text, disputeid text," +
+ " transactionreturn text, location text, transactiontags text, primary key (tranid));";
+
+ private static final GenericContainer redis = new GenericContainer("redis/redis-stack-server:" + REDIS_VERSION)
+ .withEnv("REDIS_ARGS", "--requirepass " + REDIS_PASSWORD)
+ .withExposedPorts(REDIS_PORT);
+
+ private static final GenericContainer cassandra = new GenericContainer("cassandra:" + CASSANDRA_VERSION)
+ .withEnv("CASSANDRA_CLUSTER_NAME", CASSANDRA_CLUSTER)
+ .withEnv("CASSANDRA_DC", CASSANDRA_DATACENTER)
+ .withEnv("CASSANDRA_ENDPOINT_SNITCH", "SimpleSnitch")
+ .withEnv("HEAP_NEWSIZE", "128M")
+ .withEnv("MAX_HEAP_SIZE", "512M")
+ .withExposedPorts(CASSANDRA_PORT)
+ .waitingFor(Wait.forLogMessage(".*Startup complete.*", 1))
+ .withStartupTimeout(Duration.ofMinutes(5));
+
+ private static final KafkaContainer kafka = new KafkaContainer("apache/kafka:" + KAFKA_VERSION);
+
+
+ public static void main(String[] args) {
+
+ int controllerPort = DEFAULT_CONTROLLER_PORT;
+ if (args.length > 0) {
+ controllerPort = Integer.parseInt(args[0]);
+ }
+ int sutPort = DEFAULT_SUT_PORT;
+ if (args.length > 1) {
+ sutPort = Integer.parseInt(args[1]);
+ }
+ String jarLocation = "cs/rest/digitalbanking/target";
+ if (args.length > 2) {
+ jarLocation = args[2];
+ }
+ if (!jarLocation.endsWith(".jar")) {
+ jarLocation += "/digitalbanking-sut.jar";
+ }
+
+ int timeoutSeconds = 120;
+ if (args.length > 3) {
+ timeoutSeconds = Integer.parseInt(args[3]);
+ }
+
+ String command = "java";
+ if (args.length > 4) {
+ command = args[4];
+ }
+
+ ExternalEvoMasterController controller =
+ new ExternalEvoMasterController(controllerPort, jarLocation, sutPort, timeoutSeconds, command);
+
+ controller.setNeedsJdk17Options(true);
+
+ InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
+
+ starter.start();
+ }
+
+
+ private final int timeoutSeconds;
+
+ private final int sutPort;
+
+ private String jarLocation;
+
+ private UnifiedJedis redisClient;
+
+ public ExternalEvoMasterController() {
+ this(DEFAULT_CONTROLLER_PORT, "../target/digitalbanking-sut.jar", DEFAULT_SUT_PORT, 120, "java");
+ }
+
+ public ExternalEvoMasterController(String jarLocation) {
+ this();
+ this.jarLocation = jarLocation;
+ }
+
+ public ExternalEvoMasterController(int controllerPort, String jarLocation, int sutPort, int timeoutSeconds, String command) {
+ this.sutPort = sutPort;
+ this.jarLocation = jarLocation;
+ this.timeoutSeconds = timeoutSeconds;
+
+ setControllerPort(controllerPort);
+ setJavaCommand(command);
+ }
+
+ @Override
+ public String[] getInputParameters() {
+ return new String[]{
+ "--server.port=" + sutPort,
+ "--REDIS_HOST=" + redis.getHost(),
+ "--REDIS_PORT=" + redis.getMappedPort(REDIS_PORT),
+ "--REDIS_PASSWORD=" + REDIS_PASSWORD,
+ // the index creation runner reads these two instead of the spring.redis ones
+ "--redis.host=" + redis.getHost(),
+ "--redis.port=" + redis.getMappedPort(REDIS_PORT),
+ "--KAFKA_HOST=" + kafka.getHost(),
+ "--KAFKA_PORT=" + kafka.getMappedPort(KAFKA_PORT),
+ "--SPRING_CASSANDRA_HOST=" + cassandra.getHost(),
+ "--SPRING_CASSANDRA_PORT=" + cassandra.getMappedPort(CASSANDRA_PORT),
+ "--SPRING_CASSANDRA_CLUSTER=" + CASSANDRA_CLUSTER,
+ "--SPRING_CASSANDRA_DATACENTER=" + CASSANDRA_DATACENTER
+ };
+ }
+
+ @Override
+ public String[] getJVMParameters() {
+ return new String[]{};
+ }
+
+
+ @Override
+ public String getBaseURL() {
+ return "http://localhost:" + sutPort;
+ }
+
+ @Override
+ public String getPathToExecutableJar() {
+ return jarLocation;
+ }
+
+ /*
+ Spring logs "Started ... in" before the CommandLineRunners, and the SUT is unusable until
+ the RediSearch indexes exist. This is the last line that runner writes.
+ */
+ @Override
+ public String getLogMessageOfInitializedServer() {
+ return "rebuilding index on Disp";
+ }
+
+ @Override
+ public long getMaxAwaitForInitializationInSeconds() {
+ return timeoutSeconds;
+ }
+
+ @Override
+ public void preStart() {
+ redis.start();
+ kafka.start();
+ cassandra.start();
+ initCassandraSchema();
+ redisClient = new JedisPooled("redis://:" + REDIS_PASSWORD + "@"
+ + redis.getHost() + ":" + redis.getMappedPort(REDIS_PORT));
+ }
+
+ private void initCassandraSchema() {
+ try {
+ cassandra.execInContainer("cqlsh", "-e", INIT_CQL);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to create the Cassandra schema", e);
+ }
+ }
+
+ @Override
+ public void postStart() {
+ }
+
+ @Override
+ public void preStop() {
+ }
+
+ @Override
+ public void postStop() {
+ if (redisClient != null) {
+ redisClient.close();
+ redisClient = null;
+ }
+ cassandra.stop();
+ kafka.stop();
+ redis.stop();
+ }
+
+ @Override
+ public String getPackagePrefixesToCover() {
+ return "com.jphaugla.";
+ }
+
+ @Override
+ public ProblemInfo getProblemInfo() {
+ return new RestProblem(
+ getBaseURL() + "/v3/api-docs",
+ null
+ );
+ }
+
+ @Override
+ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
+ return SutInfoDto.OutputFormat.JAVA_JUNIT_5;
+ }
+
+ @Override
+ public List getInfoForAuthentication() {
+ return null;
+ }
+
+ /*
+ Redis is the only store that keeps state across tests. FLUSHALL would drop the
+ RediSearch indexes, which the SUT creates only at startup.
+ */
+ @Override
+ public void resetStateOfSUT() {
+ if (redisClient == null) {
+ return;
+ }
+ Set keys = redisClient.keys("*");
+ if (!keys.isEmpty()) {
+ redisClient.del(keys.toArray(new String[0]));
+ }
+ }
+
+ @Override
+ public List getDbSpecifications() {
+ return null;
+ }
+
+}
diff --git a/jdk_17_maven/em/external/rest/pom.xml b/jdk_17_maven/em/external/rest/pom.xml
index 0bef9c678..a687cd75a 100644
--- a/jdk_17_maven/em/external/rest/pom.xml
+++ b/jdk_17_maven/em/external/rest/pom.xml
@@ -17,6 +17,7 @@
tiltaksgjennomforing
ohsome-api
spring-rest-example
+ digitalbanking
\ No newline at end of file
diff --git a/openapi/digitalbanking.json b/openapi/digitalbanking.json
new file mode 100644
index 000000000..a4a1f50b3
--- /dev/null
+++ b/openapi/digitalbanking.json
@@ -0,0 +1,2144 @@
+{
+ "openapi": "3.0.1",
+ "info": {
+ "title": "OpenAPI definition",
+ "version": "v0"
+ },
+ "servers": [
+ {
+ "url": "http://localhost:12345",
+ "description": "Generated server url"
+ }
+ ],
+ "paths": {
+ "/profile": {
+ "get": {
+ "tags": [
+ "profile-controller"
+ ],
+ "operationId": "listAllFormsOfMetadata_1",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/RepresentationModelObject"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/profile/transactions": {
+ "get": {
+ "tags": [
+ "profile-controller"
+ ],
+ "operationId": "descriptor_1_1_1",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "*/*": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "application/alps+json": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "application/schema+json": {
+ "schema": {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/transactions": {
+ "get": {
+ "tags": [
+ "transaction-entity-controller"
+ ],
+ "description": "get-transaction",
+ "operationId": "getCollectionResource-transaction-get_1",
+ "parameters": [
+ {
+ "name": "page",
+ "in": "query",
+ "description": "Zero-based page index (0..N)",
+ "required": false,
+ "schema": {
+ "minimum": 0,
+ "type": "integer",
+ "default": 0
+ }
+ },
+ {
+ "name": "size",
+ "in": "query",
+ "description": "The size of the page to be returned",
+ "required": false,
+ "schema": {
+ "minimum": 1,
+ "type": "integer",
+ "default": 20
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
+ "required": false,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/PagedModelEntityModelTransaction"
+ }
+ },
+ "application/x-spring-data-compact+json": {
+ "schema": {
+ "$ref": "#/components/schemas/PagedModelEntityModelTransaction"
+ }
+ },
+ "text/uri-list": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "transaction-entity-controller"
+ ],
+ "description": "create-transaction",
+ "operationId": "postCollectionResource-transaction-post",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TransactionRequestBody"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntityModelTransaction"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/transactions/{id}": {
+ "get": {
+ "tags": [
+ "transaction-entity-controller"
+ ],
+ "description": "get-transaction",
+ "operationId": "getItemResource-transaction-get",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntityModelTransaction"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not Found"
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "transaction-entity-controller"
+ ],
+ "description": "update-transaction",
+ "operationId": "putItemResource-transaction-put",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TransactionRequestBody"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntityModelTransaction"
+ }
+ }
+ }
+ },
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntityModelTransaction"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "No Content"
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "transaction-entity-controller"
+ ],
+ "description": "delete-transaction",
+ "operationId": "deleteItemResource-transaction-delete",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ },
+ "404": {
+ "description": "Not Found"
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "transaction-entity-controller"
+ ],
+ "description": "patch-transaction",
+ "operationId": "patchItemResource-transaction-patch",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TransactionRequestBody"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntityModelTransaction"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/resolvedDispute": {
+ "put": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "resolvedDispute",
+ "parameters": [
+ {
+ "name": "disputeId",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/putDisputeChargeBackReason": {
+ "put": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "putDisputeChargeBackReason",
+ "parameters": [
+ {
+ "name": "disputeId",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "reasonCode",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/acceptDispute": {
+ "put": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "acceptDisputeChargeBack",
+ "parameters": [
+ {
+ "name": "disputeId",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postDispute": {
+ "post": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "postDispute",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Dispute"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postCustomer": {
+ "post": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "postCustomer",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Customer"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/transactionStatusReport": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "transactionStatusReport",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/testPipeline": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "testPipeline",
+ "parameters": [
+ {
+ "name": "noOfRecords",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/send": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "send",
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/returned_transactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getReturnedTransaction",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mostRecentTransactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "mostRecentTransactions",
+ "parameters": [
+ {
+ "name": "accountNo",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/merchantTransactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getMerchantTransactions",
+ "parameters": [
+ {
+ "name": "merchant",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "account",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "from",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ {
+ "name": "to",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/merchantCategoryTransactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getMerchantCategoryTransactions",
+ "parameters": [
+ {
+ "name": "merchantCategory",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "account",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "from",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ {
+ "name": "to",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/getTransaction": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getTransaction",
+ "parameters": [
+ {
+ "name": "transactionID",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Transaction"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/getTags": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getTransactionTagList",
+ "parameters": [
+ {
+ "name": "transactionID",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "uniqueItems": true,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/getTaggedTransactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getTaggedTransactions",
+ "parameters": [
+ {
+ "name": "accountNo",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "tag",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/getDispute": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getDispute",
+ "parameters": [
+ {
+ "name": "disputeId",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Dispute"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deleteCustomer": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "deleteCustomer",
+ "parameters": [
+ {
+ "name": "customerString",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deleteCustomerEmail": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "deleteCustomerEmail",
+ "parameters": [
+ {
+ "name": "customerId",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customer": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getCustomer",
+ "parameters": [
+ {
+ "name": "customerId",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Customer"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customerByZipcodeLastname": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getCustomerIdsbyZipcodeLastname",
+ "parameters": [
+ {
+ "name": "zipcode",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "lastname",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customerByStateCity": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getCustomerByStateCity",
+ "parameters": [
+ {
+ "name": "state",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "city",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customerByPhone": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getCustomerByPhone",
+ "parameters": [
+ {
+ "name": "phoneString",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Customer"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customerByEmail": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getCustomerByEmail",
+ "parameters": [
+ {
+ "name": "email",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Customer"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/creditCardTransactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getCreditCardTransactions",
+ "parameters": [
+ {
+ "name": "creditCard",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "from",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ {
+ "name": "to",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/addTag": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "addTag",
+ "parameters": [
+ {
+ "name": "transactionID",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "tag",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "operation",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/accountTransactions": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "getAccountTransactions",
+ "parameters": [
+ {
+ "name": "accountNo",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "from",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ {
+ "name": "to",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/SearchResult"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/save_transaction": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction_3",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction_2",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction_5",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "options": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction_6",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction_1",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveTransaction_4",
+ "parameters": [
+ {
+ "name": "doKafka",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/save_customer": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer_3",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer_2",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer_5",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "options": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer_6",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer_1",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveCustomer_4",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/save_account": {
+ "get": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount_3",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount_2",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount_5",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "options": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount_6",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount_1",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "banking-controller"
+ ],
+ "operationId": "saveAccount_4",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "AbstractJsonSchemaPropertyObject": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "readOnly": {
+ "type": "boolean"
+ }
+ }
+ },
+ "Item": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "properties": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/AbstractJsonSchemaPropertyObject"
+ }
+ },
+ "requiredProperties": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "JsonSchema": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "properties": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/AbstractJsonSchemaPropertyObject"
+ }
+ },
+ "requiredProperties": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "definitions": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/Item"
+ }
+ },
+ "type": {
+ "type": "string"
+ },
+ "$schema": {
+ "type": "string"
+ }
+ }
+ },
+ "Links": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/Link"
+ }
+ },
+ "RepresentationModelObject": {
+ "type": "object",
+ "properties": {
+ "_links": {
+ "$ref": "#/components/schemas/Links"
+ }
+ }
+ },
+ "EntityModelTransaction": {
+ "type": "object",
+ "properties": {
+ "accountno": {
+ "type": "string"
+ },
+ "amounttype": {
+ "type": "string"
+ },
+ "merchant": {
+ "type": "string"
+ },
+ "referencekeytype": {
+ "type": "string"
+ },
+ "referencekeyvalue": {
+ "type": "string"
+ },
+ "originalamount": {
+ "type": "string"
+ },
+ "amount": {
+ "type": "string"
+ },
+ "trancd": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "initialdate": {
+ "type": "string"
+ },
+ "settlementdate": {
+ "type": "string"
+ },
+ "postingdate": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "disputeid": {
+ "type": "string"
+ },
+ "transactionreturn": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "transactiontags": {
+ "type": "string"
+ },
+ "_links": {
+ "$ref": "#/components/schemas/Links"
+ }
+ }
+ },
+ "Transaction": {
+ "type": "object",
+ "properties": {
+ "tranid": {
+ "type": "string"
+ },
+ "accountno": {
+ "type": "string"
+ },
+ "amounttype": {
+ "type": "string"
+ },
+ "merchant": {
+ "type": "string"
+ },
+ "referencekeytype": {
+ "type": "string"
+ },
+ "referencekeyvalue": {
+ "type": "string"
+ },
+ "originalamount": {
+ "type": "string"
+ },
+ "amount": {
+ "type": "string"
+ },
+ "trancd": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "initialdate": {
+ "type": "string"
+ },
+ "settlementdate": {
+ "type": "string"
+ },
+ "postingdate": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "disputeid": {
+ "type": "string"
+ },
+ "transactionreturn": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "transactiontags": {
+ "type": "string"
+ }
+ }
+ },
+ "PageMetadata": {
+ "type": "object",
+ "properties": {
+ "size": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "totalElements": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "totalPages": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "number": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "PagedModelEntityModelTransaction": {
+ "type": "object",
+ "properties": {
+ "_embedded": {
+ "type": "object",
+ "properties": {
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/EntityModelTransaction"
+ }
+ }
+ }
+ },
+ "_links": {
+ "$ref": "#/components/schemas/Links"
+ },
+ "page": {
+ "$ref": "#/components/schemas/PageMetadata"
+ }
+ }
+ },
+ "TransactionRequestBody": {
+ "type": "object",
+ "properties": {
+ "tranid": {
+ "type": "string"
+ },
+ "accountno": {
+ "type": "string"
+ },
+ "amounttype": {
+ "type": "string"
+ },
+ "merchant": {
+ "type": "string"
+ },
+ "referencekeytype": {
+ "type": "string"
+ },
+ "referencekeyvalue": {
+ "type": "string"
+ },
+ "originalamount": {
+ "type": "string"
+ },
+ "amount": {
+ "type": "string"
+ },
+ "trancd": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "initialdate": {
+ "type": "string"
+ },
+ "settlementdate": {
+ "type": "string"
+ },
+ "postingdate": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "disputeid": {
+ "type": "string"
+ },
+ "transactionreturn": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "transactiontags": {
+ "type": "string"
+ }
+ }
+ },
+ "Dispute": {
+ "type": "object",
+ "properties": {
+ "disputeId": {
+ "type": "string"
+ },
+ "tranId": {
+ "type": "string"
+ },
+ "filingDate": {
+ "type": "string"
+ },
+ "reviewDate": {
+ "type": "string"
+ },
+ "reasonCode": {
+ "type": "string"
+ },
+ "acceptanceChargeBackDate": {
+ "type": "string"
+ },
+ "resolutionDate": {
+ "type": "string"
+ },
+ "lastUpdateDate": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "chargeBackAmount": {
+ "type": "string"
+ }
+ }
+ },
+ "Customer": {
+ "type": "object",
+ "properties": {
+ "customerId": {
+ "type": "string"
+ },
+ "addressLine1": {
+ "type": "string"
+ },
+ "addressLine2": {
+ "type": "string"
+ },
+ "addressType": {
+ "type": "string"
+ },
+ "billPayEnrolled": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "countryCode": {
+ "type": "string"
+ },
+ "createdBy": {
+ "type": "string"
+ },
+ "createdDatetime": {
+ "type": "string"
+ },
+ "customerOriginSystem": {
+ "type": "string"
+ },
+ "customerStatus": {
+ "type": "string"
+ },
+ "customerType": {
+ "type": "string"
+ },
+ "dateOfBirth": {
+ "type": "string"
+ },
+ "firstName": {
+ "type": "string"
+ },
+ "fullName": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "string"
+ },
+ "governmentId": {
+ "type": "string"
+ },
+ "governmentIdType": {
+ "type": "string"
+ },
+ "lastName": {
+ "type": "string"
+ },
+ "lastUpdated": {
+ "type": "string"
+ },
+ "lastUpdatedBy": {
+ "type": "string"
+ },
+ "middleName": {
+ "type": "string"
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "queryHelperColumn": {
+ "type": "string"
+ },
+ "stateAbbreviation": {
+ "type": "string"
+ },
+ "zipcode": {
+ "type": "string"
+ },
+ "zipcode4": {
+ "type": "string"
+ }
+ }
+ },
+ "Document": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "score": {
+ "type": "number",
+ "format": "double"
+ },
+ "payload": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "byte"
+ }
+ },
+ "properties": {
+ "type": "object"
+ }
+ }
+ },
+ "SearchResult": {
+ "type": "object",
+ "properties": {
+ "totalResults": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Document"
+ }
+ }
+ }
+ },
+ "Link": {
+ "type": "object",
+ "properties": {
+ "href": {
+ "type": "string"
+ },
+ "hreflang": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "deprecation": {
+ "type": "string"
+ },
+ "profile": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "templated": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml
index f97e3c15d..e13c3b6a4 100644
--- a/scripts/build/docker-compose.build.yml
+++ b/scripts/build/docker-compose.build.yml
@@ -197,6 +197,7 @@ services:
cp cs/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-sut.jar /dist/
cp cs/rest/ohsome-api/target/ohsome-api-sut.jar /dist/
cp cs/rest/spring-rest-example/target/spring-rest-example-sut.jar /dist/
+ cp cs/rest/digitalbanking/target/digitalbanking-sut.jar /dist/
if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then
cp em/external/web/spring-petclinic/target/spring-petclinic-evomaster-runner.jar /dist/
cp em/external/grpc/signal-registration/target/signal-registration-evomaster-runner.jar /dist/
@@ -204,6 +205,7 @@ services:
cp em/external/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-evomaster-runner.jar /dist/
cp em/external/rest/ohsome-api/target/ohsome-api-evomaster-runner.jar /dist/
cp em/external/rest/spring-rest-example/target/spring-rest-example-evomaster-runner.jar /dist/
+ cp em/external/rest/digitalbanking/target/digitalbanking-evomaster-runner.jar /dist/
fi
echo 'JDK 17 Maven build completed'
diff --git a/scripts/dist-wb.py b/scripts/dist-wb.py
old mode 100755
new mode 100644
index 8f7252fbb..e022853eb
--- a/scripts/dist-wb.py
+++ b/scripts/dist-wb.py
@@ -286,6 +286,9 @@ def build_jdk_17_maven():
copy(folder + "/cs/rest/spring-rest-example/target/spring-rest-example-sut.jar", DIST)
copy(folder + "/em/external/rest/spring-rest-example/target/spring-rest-example-evomaster-runner.jar", DIST)
+ copy(folder + "/cs/rest/digitalbanking/target/digitalbanking-sut.jar", DIST)
+ copy(folder + "/em/external/rest/digitalbanking/target/digitalbanking-evomaster-runner.jar", DIST)
+
####################
def build_jdk_21_maven():
folder = "jdk_21_maven"
diff --git a/scripts/dockerize/data/sut.csv b/scripts/dockerize/data/sut.csv
index b9b059b49..22f2b5a2d 100644
--- a/scripts/dockerize/data/sut.csv
+++ b/scripts/dockerize/data/sut.csv
@@ -42,3 +42,4 @@ adoptme,TRUE,-Xmx1G,--server.port=8080 --spring.neo4j.uri=bolt://db:7687 --sprin
arimaa,TRUE,,--server.port=8080 --spring.datasource.url=jdbc:mysql://db:3306/arimaadockermysqldb --spring.datasource.username=admin --spring.datasource.password=AdminPassword123! --spring.mongodb.uri=mongodb://mongodb:27017/arimaadb --spring.neo4j.uri=bolt://neo4j:7687 --spring.neo4j.authentication.username=neo4j --spring.neo4j.authentication.password=wfdNeo4jPass123,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db;mongodb;neo4j,"[{""image_name"": ""mysql:9.5.0"", ""tmp_fs"": """", ""environment"": ""MYSQL_DATABASE: arimaadockermysqldb;MYSQL_ROOT_PASSWORD: wfdRootPass123!"", ""volume"": ""../jdk_21_maven/cs/rest/arimaa/Database/mysql:/docker-entrypoint-initdb.d"", ""health_check_command"": ""mysqladmin ping -h localhost -u root -pwfdRootPass123! --silent""}, {""name"": ""mongodb"", ""image_name"": ""mongo:7"", ""tmp_fs"": """", ""environment"": """", ""volume"": ""./additional_files/arimaa/arimaa-mongo-seed.js:/docker-entrypoint-initdb.d/arimaa-mongo-seed.js"", ""health_check_command"": ""mongosh --quiet --eval \""db.adminCommand('ping')\""""}, {""name"": ""neo4j"", ""image_name"": ""neo4j:5.26"", ""tmp_fs"": """", ""environment"": ""NEO4J_AUTH: neo4j/wfdNeo4jPass123"", ""volume"": ""./additional_files/arimaa/arimaa-neo4j-seed.cypher:/seed.cypher"", ""health_check_command"": ""cypher-shell -u neo4j -p wfdNeo4jPass123 \""MATCH (:WfdSeedComplete) RETURN 1\"""", ""command"": ""[\""bash\"", \""-c\"", '/startup/docker-entrypoint.sh neo4j & pid=$!; until cypher-shell -u neo4j -p wfdNeo4jPass123 \""RETURN 1\"" >/dev/null 2>&1; do sleep 2; done; cypher-shell -u neo4j -p wfdNeo4jPass123 -f /seed.cypher; cypher-shell -u neo4j -p wfdNeo4jPass123 \""CREATE (:WfdSeedComplete)\""; wait $pid']""}]"
joinus,TRUE,,--server.port=8080 --spring.mongodb.uri=mongodb://db:27017/joinUs --spring.neo4j.uri=bolt://neo4j:7687 --spring.neo4j.authentication.username=neo4j --spring.neo4j.authentication.password=wfdNeo4jPass123 --logging.level.org.mongodb.driver=INFO --logging.level.org.neo4j.driver=INFO --logging.level.org.springframework.security=INFO,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db;neo4j,"[{""image_name"": ""mongo:7"", ""tmp_fs"": """", ""environment"": """", ""volume"": ""./additional_files/joinus/joinus-mongo-seed.js:/docker-entrypoint-initdb.d/joinus-mongo-seed.js"", ""health_check_command"": ""mongosh --quiet --eval \""db.adminCommand('ping')\""""}, {""name"": ""neo4j"", ""image_name"": ""neo4j:5.26"", ""tmp_fs"": """", ""environment"": ""NEO4J_AUTH: neo4j/wfdNeo4jPass123"", ""volume"": ""./additional_files/joinus/joinus-neo4j-seed.cypher:/seed.cypher"", ""health_check_command"": ""cypher-shell -u neo4j -p wfdNeo4jPass123 \""MATCH (:WfdSeedComplete) RETURN 1\"""", ""command"": ""[\""bash\"", \""-c\"", '/startup/docker-entrypoint.sh neo4j & pid=$!; until cypher-shell -u neo4j -p wfdNeo4jPass123 \""RETURN 1\"" >/dev/null 2>&1; do sleep 2; done; cypher-shell -u neo4j -p wfdNeo4jPass123 -f /seed.cypher; cypher-shell -u neo4j -p wfdNeo4jPass123 \""CREATE (:WfdSeedComplete)\""; wait $pid']""}]"
lovemining,TRUE,,--server.port=8080 --spring.data.mongodb.uri=mongodb://db:27017/LoveMining --spring.neo4j.uri=bolt://neo4j:7687 --spring.neo4j.authentication.username=neo4j --spring.neo4j.authentication.password=wfdNeo4jPass123,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db;neo4j,"[{""image_name"": ""mongo:7"", ""tmp_fs"": """", ""environment"": """", ""volume"": ""./additional_files/lovemining/lovemining-mongo-seed.js:/docker-entrypoint-initdb.d/lovemining-mongo-seed.js"", ""health_check_command"": ""mongosh --quiet --eval \""db.adminCommand('ping')\""""}, {""name"": ""neo4j"", ""image_name"": ""neo4j:5.26"", ""tmp_fs"": """", ""environment"": ""NEO4J_AUTH: neo4j/wfdNeo4jPass123"", ""volume"": ""./additional_files/lovemining/lovemining-neo4j-seed.cypher:/seed.cypher"", ""health_check_command"": ""cypher-shell -u neo4j -p wfdNeo4jPass123 \""MATCH (:WfdSeedComplete) RETURN 1\"""", ""command"": ""[\""bash\"", \""-c\"", '/startup/docker-entrypoint.sh neo4j & pid=$!; until cypher-shell -u neo4j -p wfdNeo4jPass123 \""RETURN 1\"" >/dev/null 2>&1; do sleep 2; done; cypher-shell -u neo4j -p wfdNeo4jPass123 -f /seed.cypher; cypher-shell -u neo4j -p wfdNeo4jPass123 \""CREATE (:WfdSeedComplete)\""; wait $pid']""}]"
+digitalbanking,TRUE,,--server.port=8080 --REDIS_HOST=db --REDIS_PORT=6379 --REDIS_PASSWORD=jasonrocks --redis.host=db --redis.port=6379 --KAFKA_HOST=kafka --KAFKA_PORT=9092 --SPRING_CASSANDRA_HOST=cassandra --SPRING_CASSANDRA_PORT=9042 --SPRING_CASSANDRA_CLUSTER=test --SPRING_CASSANDRA_DATACENTER=datacenter1,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db;cassandra,"[{""image_name"": ""redis/redis-stack-server:7.4.0-v1"", ""tmp_fs"": """", ""environment"": ""REDIS_ARGS: --requirepass jasonrocks"", ""volume"": """", ""health_check_command"": ""redis-cli -a jasonrocks ping | grep PONG""}, {""name"": ""cassandra"", ""image_name"": ""cassandra:4.1"", ""tmp_fs"": """", ""environment"": ""CASSANDRA_CLUSTER_NAME: test;CASSANDRA_DC: datacenter1;CASSANDRA_ENDPOINT_SNITCH: SimpleSnitch;HEAP_NEWSIZE: 128M;MAX_HEAP_SIZE: 512M"", ""volume"": """", ""health_check_command"": ""cqlsh -e \""CREATE KEYSPACE IF NOT EXISTS banking WITH replication = {'class':'SimpleStrategy','replication_factor':1};CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text, amounttype text, merchant text, referencekeytype text, referencekeyvalue text, originalamount text, amount text, trancd text, description text, initialdate text, settlementdate text, postingdate text, status text, disputeid text, transactionreturn text, location text, transactiontags text, primary key (tranid));\""""}, {""name"": ""kafka"", ""image_name"": ""apache/kafka:3.8.1"", ""tmp_fs"": """", ""environment"": ""KAFKA_NODE_ID: 1;KAFKA_PROCESS_ROLES: broker,controller;KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093;KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092;KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT;KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093;KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1;KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1;KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1;KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0"", ""volume"": """", ""health_check_command"": """"}]"
diff --git a/statistics/data.csv b/statistics/data.csv
index 6982fa4de..d1a734e3b 100644
--- a/statistics/data.csv
+++ b/statistics/data.csv
@@ -52,6 +52,7 @@ TRUE,redis-sample,REST,Java,JDK 21,Maven,18,1006,Redis,UNDEFINED,4,FALSE,https:/
TRUE,adoptme,REST,Java,JDK 21,Maven,41,6158,Neo4j,UNDEFINED,14,FALSE,https://github.com/daanimelian/Programacion3-TPO
TRUE,arimaa,REST,Java,JDK 21,Maven,141,9460,MySQL;MongoDB;Neo4j,UNDEFINED,38,TRUE,https://github.com/KEAArimaaProject/arimaa-backend
TRUE,lovemining,REST,Java,JDK 21,Maven,25,1793,MongoDB;Neo4j,UNDEFINED,18,TRUE,https://github.com/Andryd22/LoveMining
+TRUE,digitalbanking,REST,Java,JDK 17,Maven,27,2835,Redis;Cassandra,UNDEFINED,55,FALSE,https://github.com/jphaugla/Redisearch-Digital-Banking-redisTemplate
FALSE,ind0,REST,Java,JDK 8,Gradle,103,17039,PostgreSQL,Proprietary,20,FALSE,UNDEFINED
FALSE,ind1,REST,Java;Kotlin,JDK 11,Gradle,163,15240,PostgreSQL,Proprietary,53,FALSE,UNDEFINED
diff --git a/statistics/table_emb.md b/statistics/table_emb.md
index 0551bf1df..9bbdc5c8d 100644
--- a/statistics/table_emb.md
+++ b/statistics/table_emb.md
@@ -15,6 +15,7 @@
|REST|__catwatch__|9636|106|14|Java|JDK 8|Maven|H2||
|REST|__commafeed__|21287|201|44|Java|JDK 25|Maven|H2|✓|
|REST|__cwa-verification__|3955|47|5|Java|JDK 11|Maven|H2||
+|REST|__digitalbanking__|2835|27|55|Java|JDK 17|Maven|Redis, Cassandra||
|REST|__erc20-rest-service__|1378|7|13|Java|JDK 8|Gradle|||
|REST|__familie-ba-sak__|143556|1089|183|Kotlin|JDK 17|Maven|PostgreSQL|✓|
|REST|__features-service__|2275|39|18|Java|JDK 8|Maven|H2||