diff --git a/.gitignore b/.gitignore
index f787dd454..33f3182b8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -423,6 +423,9 @@ jdk_8_maven/em/external/rest/spring-batch-rest/target
/jdk_8_maven/cs/rest/original/spring-ecommerce/target
/jdk_8_maven/em/embedded/rest/spring-ecommerce/target
/jdk_8_maven/em/external/rest/spring-ecommerce/target
+/jdk_8_maven/cs/rest/original/notebook-manager/target/
+/jdk_8_maven/em/embedded/rest/notebook-manager/target/
+/jdk_8_maven/em/external/rest/notebook-manager/target/
/jdk_21_maven/cs/rest-gui/microcks/target
/jdk_21_maven/cs/rest-gui/microcks/commons/model/target
diff --git a/README.md b/README.md
index 31e94118d..05e97cb79 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 (53)
+### REST: Java/Kotlin (54)
* **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)
@@ -143,6 +143,8 @@ Auth configuration files can found in the [auth](auth) folder.
* **News** (LGPL), [jdk_8_maven/cs/rest/artificial/news](jdk_8_maven/cs/rest/artificial/news), from [https://github.com/arcuri82/testing_security_development_enterprise_systems](https://github.com/arcuri82/testing_security_development_enterprise_systems)
+* **NoteBook Manager** (not-known license), [jdk_8_maven/cs/rest/original/notebook-manager](jdk_8_maven/cs/rest/original/notebook-manager), from [https://github.com/birddevelper/NoteBookManager](https://github.com/birddevelper/NoteBookManager)
+
* **OCVN** (MIT), [jdk_8_maven/cs/rest-gui/ocvn](jdk_8_maven/cs/rest-gui/ocvn), from [https://github.com/devgateway/ocvn](https://github.com/devgateway/ocvn)
* **Ohsome API** (AGPL-3.0), [jdk_17_maven/cs/rest/ohsome-api](jdk_17_maven/cs/rest/ohsome-api), from [https://github.com/GIScience/ohsome-api](https://github.com/GIScience/ohsome-api)
diff --git a/dockerfiles/notebook-manager.dockerfile b/dockerfiles/notebook-manager.dockerfile
new file mode 100644
index 000000000..7af7028d6
--- /dev/null
+++ b/dockerfiles/notebook-manager.dockerfile
@@ -0,0 +1,13 @@
+FROM amazoncorretto:8-alpine-jdk
+
+COPY ./dist/notebook-manager-sut.jar .
+COPY ./dist/jacocoagent.jar .
+
+
+
+
+ENTRYPOINT \
+ java \
+ -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \
+ -jar notebook-manager-sut.jar \
+ --server.port=8080 --spring.datasource.url="jdbc:mysql://db:3306/notebook_manager?useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=root --spring.datasource.password=root
\ No newline at end of file
diff --git a/dockerfiles/notebook-manager.yaml b/dockerfiles/notebook-manager.yaml
new file mode 100644
index 000000000..109a4c4e7
--- /dev/null
+++ b/dockerfiles/notebook-manager.yaml
@@ -0,0 +1,45 @@
+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-notebook-manager: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-notebook-manager
+ sut-notebook-manager:
+ image: webfuzzing/wfd-notebook-manager:FINAL
+# build:
+# dockerfile: ./dockerfiles/notebook-manager.dockerfile
+# context: ..
+ environment:
+ AUTH_PORT: ${AUTH_PORT:-8081}
+ ports:
+ - "${JACOCO_PORT:-6300}:6300"
+ depends_on:
+ db:
+ condition: service_healthy
+ db:
+ image: mysql:8.0
+ tmpfs:
+ - '/var/lib/mysql'
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: notebook_manager
+ healthcheck:
+ test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
+ interval: 30s
+ timeout: 30s
+ retries: 3
\ No newline at end of file
diff --git a/experiments/bb-exp.py b/experiments/bb-exp.py
index 99a9f6ce3..ba2809a93 100644
--- a/experiments/bb-exp.py
+++ b/experiments/bb-exp.py
@@ -151,6 +151,7 @@ def __init__(self, name, auth, sleep, schemaformat, classfiles):
"jdk_21_maven/cs/rest-gui/microcks/minions/async/target/classes",
"jdk_21_maven/cs/rest-gui/microcks/webapp/target/classes"]),
Sut("movies-xml",False,SLEEP,JSON,["jdk_21_maven/cs/rest/movies-xml/target/classes"]),
+ Sut("notebook-manager",False,SLEEP,JSON,["jdk_8_maven/cs/rest/original/notebook-manager/target/classes"]),
Sut("ocvn",True,SLEEP,JSON,["jdk_8_maven/cs/rest-gui/ocvn/persistence/target/classes",
"jdk_8_maven/cs/rest-gui/ocvn/persistence-mongodb/target/classes",
"jdk_8_maven/cs/rest-gui/ocvn/web/target/classes"]),
diff --git a/experiments/wb-exp.py b/experiments/wb-exp.py
index a7d89d6a9..e8ea762ff 100644
--- a/experiments/wb-exp.py
+++ b/experiments/wb-exp.py
@@ -209,6 +209,7 @@ def __init__(self, name, platform):
Sut("market", JDK_11),
Sut("microcks", JDK_21),
Sut("movies-xml", JDK_21),
+ Sut("notebook-manager", JDK_8),
Sut("ocvn", JDK_8),
Sut("ohsome-api", JDK_17),
Sut("pay-publicapi",JDK_11),
diff --git a/jacoco.dockerfile b/jacoco.dockerfile
index 1fe52af9b..975907358 100644
--- a/jacoco.dockerfile
+++ b/jacoco.dockerfile
@@ -86,6 +86,7 @@ COPY jdk_21_maven/cs/rest-gui/microcks/distro/uber-async-minion/target/classes
COPY jdk_21_maven/cs/rest-gui/microcks/minions/async/target/classes ${CLASS_FILES}/jdk_21_maven/cs/rest-gui/microcks/minions/async/target/classes
COPY jdk_21_maven/cs/rest-gui/microcks/webapp/target/classes ${CLASS_FILES}/jdk_21_maven/cs/rest-gui/microcks/webapp/target/classes
COPY jdk_21_maven/cs/rest/movies-xml/target/classes ${CLASS_FILES}/jdk_21_maven/cs/rest/movies-xml/target/classes
+COPY jdk_8_maven/cs/rest/original/notebook-manager/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest/original/notebook-manager/target/classes
COPY jdk_8_maven/cs/rest-gui/ocvn/persistence/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest-gui/ocvn/persistence/target/classes
COPY jdk_8_maven/cs/rest-gui/ocvn/persistence-mongodb/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest-gui/ocvn/persistence-mongodb/target/classes
COPY jdk_8_maven/cs/rest-gui/ocvn/web/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest-gui/ocvn/web/target/classes
diff --git a/jdk_21_maven/cs/rest/flight-search-api/pom.xml b/jdk_21_maven/cs/rest/flight-search-api/pom.xml
index 9057e3104..2466b2b5b 100644
--- a/jdk_21_maven/cs/rest/flight-search-api/pom.xml
+++ b/jdk_21_maven/cs/rest/flight-search-api/pom.xml
@@ -162,11 +162,15 @@
${openapi.version}
+
+
+
org.springframework.boot
diff --git a/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml b/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml
index ae42ab9ee..8a924dbf3 100644
--- a/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml
+++ b/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml
@@ -72,6 +72,10 @@
org.springframework.boot
spring-boot-maven-plugin
+
+ notebook-manager
+ sut
+
org.projectlombok
diff --git a/jdk_8_maven/cs/rest/original/pom.xml b/jdk_8_maven/cs/rest/original/pom.xml
index c7206d241..0eddb3b24 100644
--- a/jdk_8_maven/cs/rest/original/pom.xml
+++ b/jdk_8_maven/cs/rest/original/pom.xml
@@ -27,6 +27,7 @@
spring-actuator-demo
swagger-petstore
spring-ecommerce
+ notebook-manager
diff --git a/jdk_8_maven/em/embedded/rest/notebook-manager/pom.xml b/jdk_8_maven/em/embedded/rest/notebook-manager/pom.xml
new file mode 100644
index 000000000..67d075e9a
--- /dev/null
+++ b/jdk_8_maven/em/embedded/rest/notebook-manager/pom.xml
@@ -0,0 +1,48 @@
+
+
+
+ 4.0.0
+
+ evomaster-benchmark-em-embedded-rest-notebook-manager
+ jar
+
+
+ org.evomaster
+ evomaster-benchmark-em-embedded-rest
+ 4.3.1-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 2.6.3
+ pom
+ import
+
+
+
+
+
+
+ bdp.sample
+ NoteBookManagerRest
+ 0.0.1-SNAPSHOT
+
+
+ org.testcontainers
+ testcontainers
+ compile
+
+
+ junit
+ junit
+ 4.12
+ compile
+
+
+
+
+
diff --git a/jdk_8_maven/em/embedded/rest/notebook-manager/src/main/java/em/embedded/bdp/sample/notebookmanager/EmbeddedEvoMasterController.java b/jdk_8_maven/em/embedded/rest/notebook-manager/src/main/java/em/embedded/bdp/sample/notebookmanager/EmbeddedEvoMasterController.java
new file mode 100644
index 000000000..b213bc4a4
--- /dev/null
+++ b/jdk_8_maven/em/embedded/rest/notebook-manager/src/main/java/em/embedded/bdp/sample/notebookmanager/EmbeddedEvoMasterController.java
@@ -0,0 +1,156 @@
+package em.embedded.bdp.sample.notebookmanager;
+
+
+import bdp.sample.notebookmanager.NoteBookApplication;
+import org.evomaster.client.java.controller.EmbeddedSutController;
+import org.evomaster.client.java.controller.InstrumentedSutStarter;
+import org.evomaster.client.java.controller.api.dto.SutInfoDto;
+import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto;
+import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType;
+import org.evomaster.client.java.controller.problem.ProblemInfo;
+import org.evomaster.client.java.controller.problem.RestProblem;
+import org.evomaster.client.java.sql.DbSpecification;
+import org.springframework.boot.SpringApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.testcontainers.containers.GenericContainer;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.*;
+
+/**
+ * Class used to start/stop the SUT.
+ */
+public class EmbeddedEvoMasterController extends EmbeddedSutController {
+
+ 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 static final String DB_NAME = "notebook_manager";
+
+ private static final GenericContainer mysql = new GenericContainer("mysql:8.0")
+ .withEnv(new HashMap(){{
+ put("MYSQL_ROOT_PASSWORD", "root");
+ put("MYSQL_DATABASE", DB_NAME);
+ }})
+ .withExposedPorts(3306)
+ .withTmpFs(Collections.singletonMap("/var/lib/mysql", "rw"));
+
+ private ConfigurableApplicationContext ctx;
+ private Connection sqlConnection;
+ private List dbSpecification;
+
+ public EmbeddedEvoMasterController() {
+ this(40100);
+ }
+
+ public EmbeddedEvoMasterController(int port) {
+ setControllerPort(port);
+ }
+
+ @Override
+ public String startSut() {
+
+ mysql.start();
+
+ String url = "jdbc:mysql://" + mysql.getHost() + ":" + mysql.getMappedPort(3306) + "/" + DB_NAME
+ + "?useSSL=false&allowPublicKeyRetrieval=true";
+
+ ctx = SpringApplication.run(NoteBookApplication.class, new String[]{
+ "--server.port=0",
+ "--spring.datasource.url=" + url,
+ "--spring.datasource.username=root",
+ "--spring.datasource.password=root"
+ });
+
+ closeDataBaseConnection();
+ JdbcTemplate jdbc = ctx.getBean(JdbcTemplate.class);
+ try {
+ sqlConnection = jdbc.getDataSource().getConnection();
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+
+ dbSpecification = Arrays.asList(new DbSpecification(DatabaseType.MYSQL, sqlConnection));
+
+ return "http://localhost:" + getSutPort();
+ }
+
+ 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() {
+ closeDataBaseConnection();
+ if (ctx != null) {
+ ctx.stop();
+ ctx.close();
+ }
+ mysql.stop();
+ }
+
+ private void closeDataBaseConnection() {
+ if (sqlConnection != null) {
+ try {
+ sqlConnection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ sqlConnection = null;
+ }
+ }
+
+ @Override
+ public String getPackagePrefixesToCover() {
+ return "bdp.sample.notebookmanager.";
+ }
+
+ @Override
+ public void resetStateOfSUT() {
+ }
+
+ @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_4;
+ }
+
+ @Override
+ public List getDbSpecifications() {
+ return dbSpecification;
+ }
+
+}
diff --git a/jdk_8_maven/em/embedded/rest/pom.xml b/jdk_8_maven/em/embedded/rest/pom.xml
index 8b7fa1cb7..8b1b2ab33 100644
--- a/jdk_8_maven/em/embedded/rest/pom.xml
+++ b/jdk_8_maven/em/embedded/rest/pom.xml
@@ -33,6 +33,7 @@
spring-actuator-demo
swagger-petstore
spring-ecommerce
+ notebook-manager
\ No newline at end of file
diff --git a/jdk_8_maven/em/external/rest/notebook-manager/pom.xml b/jdk_8_maven/em/external/rest/notebook-manager/pom.xml
new file mode 100644
index 000000000..9ce7e2ba4
--- /dev/null
+++ b/jdk_8_maven/em/external/rest/notebook-manager/pom.xml
@@ -0,0 +1,89 @@
+
+
+
+ 4.0.0
+
+ evomaster-benchmark-em-external-rest-notebook-manager
+ jar
+
+
+ org.evomaster
+ evomaster-benchmark-em-external-rest
+ 4.3.1-SNAPSHOT
+
+
+
+
+
+ org.testcontainers
+ testcontainers
+ compile
+
+
+ junit
+ junit
+ 4.12
+ compile
+
+
+ mysql
+ mysql-connector-java
+ 8.0.33
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+ 3.6.2
+
+
+ package
+
+ shade
+
+
+ notebook-manager-evomaster-runner
+
+
+
+ em.external.bdp.sample.notebookmanager.ExternalEvoMasterController
+
+ org.evomaster.client.java.instrumentation.InstrumentingAgent
+
+ org.evomaster.client.java.instrumentation.InstrumentingAgent
+
+ true
+ true
+
+
+
+
+
+
+ javax.validation
+ shaded.emb.javax.validation
+
+
+ org.slf4j
+ shaded.emb.org.slf4j
+
+
+ com.fasterxml.jackson.annotation
+ shaded.emb.com.fasterxml.jackson.annotation
+
+
+
+
+
+
+
+
+
diff --git a/jdk_8_maven/em/external/rest/notebook-manager/src/main/java/em/external/bdp/sample/notebookmanager/ExternalEvoMasterController.java b/jdk_8_maven/em/external/rest/notebook-manager/src/main/java/em/external/bdp/sample/notebookmanager/ExternalEvoMasterController.java
new file mode 100644
index 000000000..5139efd24
--- /dev/null
+++ b/jdk_8_maven/em/external/rest/notebook-manager/src/main/java/em/external/bdp/sample/notebookmanager/ExternalEvoMasterController.java
@@ -0,0 +1,212 @@
+package em.external.bdp.sample.notebookmanager;
+
+import org.evomaster.client.java.controller.ExternalSutController;
+import org.evomaster.client.java.controller.InstrumentedSutStarter;
+import org.evomaster.client.java.controller.api.dto.SutInfoDto;
+import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto;
+import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType;
+import org.evomaster.client.java.controller.problem.ProblemInfo;
+import org.evomaster.client.java.controller.problem.RestProblem;
+import org.evomaster.client.java.sql.DbSpecification;
+import org.testcontainers.containers.GenericContainer;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+public class ExternalEvoMasterController extends ExternalSutController {
+
+
+ public static void main(String[] args) {
+
+ int controllerPort = 40100;
+ if (args.length > 0) {
+ controllerPort = Integer.parseInt(args[0]);
+ }
+ int sutPort = 12345;
+ if (args.length > 1) {
+ sutPort = Integer.parseInt(args[1]);
+ }
+ String jarLocation = "cs/rest/original/notebook-manager/target";
+ if (args.length > 2) {
+ jarLocation = args[2];
+ }
+ if(! jarLocation.endsWith(".jar")) {
+ jarLocation += "/notebook-manager-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);
+ InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
+
+ starter.start();
+ }
+
+ private static final String DB_NAME = "notebook_manager";
+
+ private final int timeoutSeconds;
+ private final int sutPort;
+ private String jarLocation;
+ private Connection sqlConnection;
+
+ private List dbSpecification;
+
+ private static final GenericContainer mysql = new GenericContainer("mysql:8.0")
+ .withEnv(new HashMap(){{
+ put("MYSQL_ROOT_PASSWORD", "root");
+ put("MYSQL_DATABASE", DB_NAME);
+ }})
+ .withExposedPorts(3306)
+ .withTmpFs(Collections.singletonMap("/var/lib/mysql", "rw"));
+
+ public ExternalEvoMasterController(){
+ this(40100, "cs/rest/original/notebook-manager/target/notebook-manager-sut.jar", 12345, 120, "java");
+ }
+
+ public ExternalEvoMasterController(String jarLocation) {
+ this();
+ this.jarLocation = jarLocation;
+ }
+
+ public ExternalEvoMasterController(
+ int controllerPort, String jarLocation, int sutPort, int timeoutSeconds, String command
+ ) {
+
+ if(jarLocation==null || jarLocation.isEmpty()){
+ throw new IllegalArgumentException("Missing jar location");
+ }
+
+
+ this.sutPort = sutPort;
+ this.jarLocation = jarLocation;
+ this.timeoutSeconds = timeoutSeconds;
+ setControllerPort(controllerPort);
+ setJavaCommand(command);
+ }
+
+
+ @Override
+ public String[] getInputParameters() {
+ return new String[]{
+ "--server.port=" + sutPort,
+ "--spring.datasource.url=" + dbUrl(),
+ "--spring.datasource.username=root",
+ "--spring.datasource.password=root"
+ };
+ }
+
+ public String[] getJVMParameters() {
+ return new String[]{};
+ }
+
+ private String dbUrl() {
+ return "jdbc:mysql://" + mysql.getHost() + ":" + mysql.getMappedPort(3306) + "/" + DB_NAME
+ + "?useSSL=false&allowPublicKeyRetrieval=true";
+ }
+
+ @Override
+ public String getBaseURL() {
+ return "http://localhost:" + sutPort;
+ }
+
+ @Override
+ public String getPathToExecutableJar() {
+ return jarLocation;
+ }
+
+ @Override
+ public String getLogMessageOfInitializedServer() {
+ return "Started NoteBookApplication in";
+ }
+
+ @Override
+ public long getMaxAwaitForInitializationInSeconds() {
+ return timeoutSeconds;
+ }
+
+ @Override
+ public void preStart() {
+ mysql.start();
+ }
+
+ @Override
+ public void postStart() {
+ closeDataBaseConnection();
+
+ try {
+ sqlConnection = DriverManager.getConnection(dbUrl(), "root", "root");
+ dbSpecification = Arrays.asList(new DbSpecification(DatabaseType.MYSQL, sqlConnection));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void resetStateOfSUT() {
+ }
+
+ @Override
+ public void preStop() {
+ closeDataBaseConnection();
+ }
+
+ @Override
+ public void postStop() {
+ mysql.stop();
+ }
+
+ private void closeDataBaseConnection() {
+ if (sqlConnection != null) {
+ try {
+ sqlConnection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ sqlConnection = null;
+ }
+ }
+
+ @Override
+ public String getPackagePrefixesToCover() {
+ return "bdp.sample.notebookmanager.";
+ }
+
+ @Override
+ public ProblemInfo getProblemInfo() {
+ return new RestProblem(
+ getBaseURL() + "/v3/api-docs",
+ null
+ );
+ }
+
+ @Override
+ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
+ return SutInfoDto.OutputFormat.JAVA_JUNIT_4;
+ }
+
+
+ @Override
+ public List getInfoForAuthentication() {
+ return null;
+ }
+
+ @Override
+ public List getDbSpecifications() {
+ return dbSpecification;
+ }
+}
diff --git a/jdk_8_maven/em/external/rest/pom.xml b/jdk_8_maven/em/external/rest/pom.xml
index 09762a8ff..64d9bcbcb 100644
--- a/jdk_8_maven/em/external/rest/pom.xml
+++ b/jdk_8_maven/em/external/rest/pom.xml
@@ -34,6 +34,7 @@
spring-actuator-demo
swagger-petstore
spring-ecommerce
+ notebook-manager
\ No newline at end of file
diff --git a/openapi/notebook-manager.json b/openapi/notebook-manager.json
new file mode 100644
index 000000000..7c2762c9b
--- /dev/null
+++ b/openapi/notebook-manager.json
@@ -0,0 +1,291 @@
+{
+ "openapi": "3.0.1",
+ "info": {
+ "title": "OpenAPI definition",
+ "version": "v0"
+ },
+ "servers": [
+ {
+ "url": "http://localhost:8080",
+ "description": "Generated server url"
+ }
+ ],
+ "paths": {
+ "/api/notebooks": {
+ "get": {
+ "tags": [
+ "note-book-controller"
+ ],
+ "summary": "Get list of notebooks (Ordered by Id in ascending order), you must specify page number and page size",
+ "operationId": "getnotebooks",
+ "parameters": [
+ {
+ "name": "page",
+ "in": "query",
+ "description": "Page index (start from 0)",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "pageSize",
+ "in": "query",
+ "description": "Number of records per page",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "500": {
+ "description": "Internal Error"
+ },
+ "400": {
+ "description": "Invalid parameters supplied"
+ },
+ "200": {
+ "description": "Successful Operation",
+ "content": {
+ "application/json": {}
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "note-book-controller"
+ ],
+ "summary": "Create a new notebook",
+ "operationId": "createnotebook",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteBook"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "500": {
+ "description": "Internal Error"
+ },
+ "404": {
+ "description": "notebook not found"
+ },
+ "409": {
+ "description": "Duplicate notebook name"
+ },
+ "201": {
+ "description": "notebook created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteBook"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid id supplied"
+ }
+ }
+ }
+ },
+ "/api/notebooks/{notebookId}": {
+ "get": {
+ "tags": [
+ "note-book-controller"
+ ],
+ "summary": "Get a notebook by its id",
+ "operationId": "getnotebookById",
+ "parameters": [
+ {
+ "name": "notebookId",
+ "in": "path",
+ "description": "id of notebook to be retrieved",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "500": {
+ "description": "Internal Error"
+ },
+ "404": {
+ "description": "notebook not found"
+ },
+ "200": {
+ "description": "Found the notebook",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteBook"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid id supplied"
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "note-book-controller"
+ ],
+ "summary": "Delete a notebook by its id",
+ "operationId": "deletenotebook",
+ "parameters": [
+ {
+ "name": "notebookId",
+ "in": "path",
+ "description": "id of notebook to be deleted",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "500": {
+ "description": "Internal Error"
+ },
+ "404": {
+ "description": "notebook not found"
+ },
+ "202": {
+ "description": "notebook deleted"
+ },
+ "400": {
+ "description": "Invalid id supplied"
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "note-book-controller"
+ ],
+ "summary": "Update a notebook by its id",
+ "operationId": "updatenotebook",
+ "parameters": [
+ {
+ "name": "notebookId",
+ "in": "path",
+ "description": "id of notebook to be updated",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteBook"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "500": {
+ "description": "Internal Error"
+ },
+ "404": {
+ "description": "notebook not found"
+ },
+ "409": {
+ "description": "Duplicate notebook name"
+ },
+ "400": {
+ "description": "Invalid id supplied"
+ },
+ "202": {
+ "description": "notebook updated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NoteBook"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Link": {
+ "type": "object",
+ "properties": {
+ "rel": {
+ "type": "string"
+ },
+ "href": {
+ "type": "string"
+ },
+ "hreflang": {
+ "type": "string"
+ },
+ "media": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "deprecation": {
+ "type": "string"
+ },
+ "profile": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "NoteBook": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "currentPrice": {
+ "type": "number",
+ "format": "double"
+ },
+ "lastUpdate": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "links": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Link"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml
index 9d1936296..fc76eb66b 100644
--- a/scripts/build/docker-compose.build.yml
+++ b/scripts/build/docker-compose.build.yml
@@ -39,6 +39,7 @@ services:
cp cs/rest/original/spring-actuator-demo/target/spring-actuator-demo-sut.jar /dist/
cp cs/rest/original/swagger-petstore/target/swagger-petstore-sut.jar /dist/
cp cs/rest/original/spring-ecommerce/target/spring-ecommerce-sut.jar /dist/
+ cp cs/rest/original/notebook-manager/target/notebook-manager-sut.jar /dist/
cp cs/graphql/petclinic-graphql/target/petclinic-graphql-sut.jar /dist/
cp cs/graphql/graphql-ncs/target/graphql-ncs-sut.jar /dist/
cp cs/graphql/graphql-scs/target/graphql-scs-sut.jar /dist/
@@ -67,6 +68,7 @@ services:
cp em/external/rest/spring-actuator-demo/target/spring-actuator-demo-evomaster-runner.jar /dist/
cp em/external/rest/swagger-petstore/target/swagger-petstore-evomaster-runner.jar /dist/
cp em/external/rest/spring-ecommerce/target/spring-ecommerce-evomaster-runner.jar /dist/
+ cp em/external/rest/notebook-manager/target/notebook-manager-evomaster-runner.jar /dist/
cp em/external/graphql/petclinic-graphql/target/petclinic-graphql-evomaster-runner.jar /dist/
cp em/external/graphql/graphql-ncs/target/graphql-ncs-evomaster-runner.jar /dist/
cp em/external/graphql/graphql-scs/target/graphql-scs-evomaster-runner.jar /dist/
diff --git a/scripts/dist-wb.py b/scripts/dist-wb.py
index 9f882f45e..3185d5695 100644
--- a/scripts/dist-wb.py
+++ b/scripts/dist-wb.py
@@ -195,6 +195,9 @@ def build_jdk_8_maven():
copy(folder + "/cs/rest/original/spring-ecommerce/target/spring-ecommerce-sut.jar", DIST)
copy(folder + "/em/external/rest/spring-ecommerce/target/spring-ecommerce-evomaster-runner.jar", DIST)
+ copy(folder + "/cs/rest/original/notebook-manager/target/notebook-manager-sut.jar", DIST)
+ copy(folder + "/em/external/rest/notebook-manager/target/notebook-manager-evomaster-runner.jar", DIST)
+
# graphql
copy(folder + "/cs/graphql/petclinic-graphql/target/petclinic-graphql-sut.jar", DIST)
diff --git a/scripts/dockerize/data/sut.csv b/scripts/dockerize/data/sut.csv
index 496c0f728..fa844e835 100644
--- a/scripts/dockerize/data/sut.csv
+++ b/scripts/dockerize/data/sut.csv
@@ -52,3 +52,4 @@ management-cassandra,TRUE,-Dmgmtapi.cql.tcp=cassandra:9999,-K true -H tcp://0.0.
petclinic-rest,TRUE,,--server.port=8080 --spring.jpa.show-sql=false,http://localhost:8080/petclinic/v3/api-docs,http://localhost:8080,FALSE,,
traccar,TRUE,,traccar.xml,,http://localhost:8080,TRUE,,
flight-search-api,TRUE,,--server.port=8080 --spring.data.mongodb.host=db --spring.data.mongodb.port=27017 --spring.data.mongodb.database=flightdatabase,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db,"[{""image_name"": ""mongo:7"", ""tmp_fs"": """", ""environment"": """", ""volume"": ""./additional_files/flight-search-api/flight-search-api-mongo-seed.js:/docker-entrypoint-initdb.d/flight-search-api-mongo-seed.js"", ""health_check_command"": ""mongosh --quiet --eval \""db.adminCommand('ping')\""""}]"
+notebook-manager,TRUE,,"--server.port=8080 --spring.datasource.url=""jdbc:mysql://db:3306/notebook_manager?useSSL=false&allowPublicKeyRetrieval=true"" --spring.datasource.username=root --spring.datasource.password=root",http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db,"[{""image_name"": ""mysql:8.0"", ""tmp_fs"": ""/var/lib/mysql"", ""environment"": ""MYSQL_ROOT_PASSWORD: root;MYSQL_DATABASE: notebook_manager"", ""volume"": """", ""health_check_command"": [""CMD"", ""mysqladmin"", ""ping"", ""-h"", ""localhost""]}]"
diff --git a/statistics/data.csv b/statistics/data.csv
index c355ee423..bf28a3f6e 100644
--- a/statistics/data.csv
+++ b/statistics/data.csv
@@ -64,4 +64,5 @@ TRUE,management-cassandra,REST,Java,JDK 11,Maven,225,35096,Cassandra,Apache,63,F
TRUE,petclinic-rest,REST,Java,JDK 17,Maven,109,8675,H2,Apache,43,FALSE,https://github.com/spring-petclinic/spring-petclinic-rest
TRUE,traccar,REST,Java,JDK 21,Gradle,1478,141962,H2,Apache,117,TRUE,https://github.com/traccar/traccar
TRUE,flight-search-api,REST,Java,JDK 21,Maven,194,14440,MongoDB,MIT,40,TRUE,https://github.com/Rapter1990/flightsearchapi
+TRUE,notebook-manager,REST,Java,JDK 8,Maven,10,826,MySQL,UNDEFINED,5,FALSE,https://github.com/birddevelper/NoteBookManager
diff --git a/statistics/http-verbs.csv b/statistics/http-verbs.csv
index de086bdf9..358f77da0 100644
--- a/statistics/http-verbs.csv
+++ b/statistics/http-verbs.csv
@@ -25,6 +25,7 @@ management-cassandra,20,1,38,4,0,0,0,0,0,0
market,7,3,2,1,0,0,0,0,0,0
microcks,47,9,20,6,2,2,2,0,0,0
movies-xml,3,1,1,1,0,0,1,0,0,0
+notebook-manager,2,0,1,1,0,0,1,0,0,0
ocvn,96,0,96,0,0,0,0,0,0,0
ohsome-api,67,0,67,0,0,0,0,0,0,0
pay-publicapi,9,0,7,0,0,0,0,0,0,0
diff --git a/statistics/http-verbs.md b/statistics/http-verbs.md
index e68c1e34c..6082cfad6 100644
--- a/statistics/http-verbs.md
+++ b/statistics/http-verbs.md
@@ -26,6 +26,7 @@
| market | 7 | 3 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 13 |
| microcks | 47 | 9 | 20 | 6 | 2 | 2 | 2 | 0 | 0 | 0 | 88 |
| movies-xml | 3 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 7 |
+| notebook-manager | 2 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 5 |
| ocvn | 96 | 0 | 96 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 192 |
| ohsome-api | 67 | 0 | 67 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 134 |
| pay-publicapi | 9 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 16 |
@@ -53,4 +54,4 @@
| user-management | 7 | 2 | 7 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 21 |
| webgoat | 50 | 10 | 112 | 8 | 8 | 8 | 8 | 0 | 0 | 0 | 204 |
| youtube-mock | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
-| Total | 1053 | 176 | 763 | 175 | 21 | 20 | 53 | 0 | 0 | 0 | 2261 |
+| Total | 1055 | 176 | 764 | 176 | 21 | 20 | 54 | 0 | 0 | 0 | 2266 |
diff --git a/statistics/table_wfd.md b/statistics/table_wfd.md
index 3da16b539..fba51cc9d 100644
--- a/statistics/table_wfd.md
+++ b/statistics/table_wfd.md
@@ -34,6 +34,7 @@
|REST|__market__|9861|124|13|Java|JDK 11|Maven|H2|✓|
|REST|__microcks__|66186|471|88|Java|JDK 21|Maven|MongoDB|✓|
|REST|__movies-xml__|2502|22|7|Java|JDK 21|Maven|H2||
+|REST|__notebook-manager__|826|10|5|Java|JDK 8|Maven|MySQL||
|REST|__ocvn__|45521|526|258|Java|JDK 8|Maven|H2, MongoDB|✓|
|REST|__ohsome-api__|14166|87|134|Java|JDK 17|Maven|OSHDB||
|REST|__pay-publicapi__|34576|377|10|Java|JDK 11|Maven|Redis|✓|