From 2c5f43040c0b5842c18291ca2d5a0e676b4c4f54 Mon Sep 17 00:00:00 2001 From: Floris Claessens <FMD.Claessens@student.han.nl> Date: Wed, 24 May 2023 13:24:30 +0200 Subject: [PATCH 1/6] Created BootstrapService to handle the bootstrap functioncalling. This means BootstrapHelper is now deprecated (if this works) --- .../core/application/dtos/LoginDTO.java | 29 ++++ .../core/application/dtos/RegisterDTO.java | 11 ++ .../bootstrapapi/BootstrapService.java | 146 ++++++++++++++++++ .../bootstrapapi/IBootstrapService.java | 14 ++ .../networkmodule/http/BootstrapHelper.java | 1 + 5 files changed, 201 insertions(+) create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java new file mode 100644 index 00000000..56fb2082 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java @@ -0,0 +1,29 @@ +package nl.han.aim.asd.veilveilig.core.application.dtos; + +public class LoginDTO { + String email; + String password; + + + + public LoginDTO(String email, String password) { + this.email = email; + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} \ No newline at end of file diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java new file mode 100644 index 00000000..c77f33a8 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java @@ -0,0 +1,11 @@ +package nl.han.aim.asd.veilveilig.core.application.dtos; + +public record RegisterDTO(String email, + String password, + String company, + String firstname, + String lastname, + String address, + boolean seller) { + +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java new file mode 100644 index 00000000..f21589bc --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java @@ -0,0 +1,146 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; + +import com.google.gson.Gson; +import nl.han.aim.asd.veilveilig.core.application.dtos.LoginDTO; +import nl.han.aim.asd.veilveilig.core.application.dtos.RegisterDTO; +import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkRequest; +import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkResponse; + +import java.io.*; +import java.net.*; + +public class BootstrapService implements IBootstrapService{ + + public HttpURLConnection prepareConnection(String address, String urlExtension) { + HttpURLConnection connection = null; + try { + URI uri = new URI(address + urlExtension); + connection = (HttpURLConnection) uri.toURL().openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + } catch (Exception e) { + e.printStackTrace(); + } + return connection; + } + + @Override + public String getResponseBody(HttpURLConnection connection) throws Exception { + StringBuilder responseBuilder = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + responseBuilder.append(responseLine.trim()); + } + } + return responseBuilder.toString(); + } + + @Override + public String login(String email, String password, String address) { + try { + LoginDTO currentLogin = new LoginDTO(email, password); + HttpURLConnection connection = prepareConnection(address, "/login"); + + Gson gson = new Gson(); + String jsonInputString = gson.toJson(currentLogin); + try (OutputStream os = connection.getOutputStream()) { + byte[] input = jsonInputString.getBytes("utf-8"); + os.write(input, 0, input.length); + } catch (IOException e) { + throw new RuntimeException(e); + } + + + int responseStatus = connection.getResponseCode(); + switch (responseStatus) { + case 404 -> throw new Exception(responseStatus + " Not Found"); + case 401 -> throw new Exception(responseStatus + " Unauthorized Access Attempt"); + case 200 -> { + return connection.getResponseMessage(); + } + } + } catch (Exception e) + { + e.printStackTrace(); + } + return null; + } + + @Override + public int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller) { + try { + RegisterDTO currentRegister = new RegisterDTO(email, password, company, firstname, lastname, address, seller); + HttpURLConnection connection = prepareConnection(address, "/register"); + + Gson gson = new Gson(); + String jsonInputString = gson.toJson(currentRegister); + try (OutputStream os = connection.getOutputStream()) { + byte[] input = jsonInputString.getBytes("utf-8"); + os.write(input, 0, input.length); + } + return connection.getResponseCode(); + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + + @Override + public JoinNetworkResponse sendJoinRequest(JoinNetworkRequest request, String address) { + try { + HttpURLConnection connection = prepareConnection(address, "/joinNetwork"); + + Gson gson = new Gson(); + String jsonInputString = gson.toJson(request); + try (OutputStream os = connection.getOutputStream()) { + byte[] input = jsonInputString.getBytes("utf-8"); + os.write(input, 0, input.length); + } + + JoinNetworkResponse response; + int statusCode = connection.getResponseCode(); + if (statusCode == 200) { + response = gson.fromJson(getResponseBody(connection), JoinNetworkResponse.class); + response.setMaster(false); + } else if (statusCode == 201 || statusCode == 208) { + response = new JoinNetworkResponse(); + response.setMaster(true); + } else { + throw new Exception("Unexpected HTTP status code: " + statusCode); + } + + connection.disconnect(); + + return response; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public void sendNewMasterRequest(JoinNetworkRequest request, String address) { + try { + HttpURLConnection connection = prepareConnection(address, "/updateMaster"); + + Gson gson = new Gson(); + String jsonInputString = gson.toJson(request); + try (OutputStream os = connection.getOutputStream()) { + byte[] input = jsonInputString.getBytes("utf-8"); + os.write(input, 0, input.length); + } + + int statusCode = connection.getResponseCode(); + if(statusCode != 200){ + throw new Exception("Unexpected HTTP status code: " + statusCode); + } + + connection.disconnect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java new file mode 100644 index 00000000..2ace9836 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java @@ -0,0 +1,14 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; + +import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkRequest; +import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkResponse; + +import java.net.HttpURLConnection; + +public interface IBootstrapService { + String login(String email, String password, String address); + int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller); + JoinNetworkResponse sendJoinRequest(JoinNetworkRequest request, String address); + void sendNewMasterRequest(JoinNetworkRequest request, String address); + String getResponseBody(HttpURLConnection connection) throws Exception; +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/http/BootstrapHelper.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/http/BootstrapHelper.java index 15507a3d..2af093aa 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/http/BootstrapHelper.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/http/BootstrapHelper.java @@ -8,6 +8,7 @@ import java.io.*; import java.net.HttpURLConnection; import java.net.URL; +@Deprecated public class BootstrapHelper { public static JoinNetworkResponse sendJoinRequest(JoinNetworkRequest request, String address) { try { -- GitLab From 658a1fa5906de68e1fce43625b6c18e668071ef7 Mon Sep 17 00:00:00 2001 From: Tom Janssen <t.janssen16@student.han.nl> Date: Wed, 24 May 2023 15:46:32 +0200 Subject: [PATCH 2/6] Finished work on bootstrap package --- Veil_Veilig.iml | 113 ---------------- .../core/dependencyinjection/MyModule.java | 3 + .../bootstrapapi/BootstrapService.java | 66 ++++++--- .../bootstrapapi/IBootstrapService.java | 11 +- .../bootstrapapi/models/Auction.java | 66 +++++++++ .../bootstrapapi/models/Category.java | 18 +++ .../models/JoinNetworkRequest.java | 13 ++ .../models/JoinNetworkResponse.java | 31 +++++ .../bootstrapapi/models}/LoginDTO.java | 4 +- .../bootstrapapi/models/Lot.java | 128 ++++++++++++++++++ .../bootstrapapi/models/Photo.java | 41 ++++++ .../bootstrapapi/models}/RegisterDTO.java | 2 +- .../bootstrapapi/models/StartDataDto.java | 10 ++ .../infrastructure/networkmodule/Peer.java | 17 +-- src/test/java/network/manual/Main.java | 21 ++- 15 files changed, 385 insertions(+), 159 deletions(-) delete mode 100644 Veil_Veilig.iml create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkRequest.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkResponse.java rename src/main/java/nl/han/aim/asd/veilveilig/{core/application/dtos => modules/infrastructure/bootstrapapi/models}/LoginDTO.java (85%) create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java rename src/main/java/nl/han/aim/asd/veilveilig/{core/application/dtos => modules/infrastructure/bootstrapapi/models}/RegisterDTO.java (79%) create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java diff --git a/Veil_Veilig.iml b/Veil_Veilig.iml deleted file mode 100644 index e6c14492..00000000 --- a/Veil_Veilig.iml +++ /dev/null @@ -1,113 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> - <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_17"> - <output url="file://$MODULE_DIR$/target/classes" /> - <output-test url="file://$MODULE_DIR$/target/test-classes" /> - <content url="file://$MODULE_DIR$"> - <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> - <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> - <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> - <excludeFolder url="file://$MODULE_DIR$/target" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - <orderEntry type="library" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.9.2" level="project" /> - <orderEntry type="library" name="Maven: org.junit.platform:junit-platform-engine:1.9.2" level="project" /> - <orderEntry type="library" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" /> - <orderEntry type="library" name="Maven: org.junit.platform:junit-platform-commons:1.9.2" level="project" /> - <orderEntry type="library" name="Maven: org.junit.jupiter:junit-jupiter-api:5.9.2" level="project" /> - <orderEntry type="library" name="Maven: org.apiguardian:apiguardian-api:1.1.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.26" level="project" /> - <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.2.16.Final" level="project" /> - <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.1.Final" level="project" /> - <orderEntry type="library" name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final" level="project" /> - <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" /> - <orderEntry type="library" name="Maven: org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.1.Final" level="project" /> - <orderEntry type="library" name="Maven: org.jboss:jandex:2.0.3.Final" level="project" /> - <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.0" level="project" /> - <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" /> - <orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.0.1.Final" level="project" /> - <orderEntry type="library" name="Maven: org.xerial:sqlite-jdbc:3.41.2.1" level="project" /> - <orderEntry type="library" name="Maven: javax.inject:javax.inject:1" level="project" /> - <orderEntry type="library" name="Maven: com.google.inject:guice:5.1.0" level="project" /> - <orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" /> - <orderEntry type="library" name="Maven: com.google.guava:guava:30.1-jre" level="project" /> - <orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" /> - <orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" /> - <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" /> - <orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.5.0" level="project" /> - <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.3.4" level="project" /> - <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" /> - <orderEntry type="library" name="Maven: com.github.gwenn:sqlite-dialect:master" level="project" /> - <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" /> - <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.1" level="project" /> - <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:2.3.3" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" /> - <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-xjc:2.3.3" level="project" /> - <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-jxc:2.3.3" level="project" /> - <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:4.0.0" level="project" /> - <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-core:4.0.0" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.eclipse.angus:angus-activation:1.0.0" level="project" /> - <orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:4.0.0" level="project" /> - <orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:4.1.1" level="project" /> - <orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" /> - <orderEntry type="library" name="Maven: org.json:json:20220924" level="project" /> - <orderEntry type="library" name="Maven: nl.han.asd:rpc:1.1.15" level="project" /> - <orderEntry type="library" name="Maven: org.jetbrains:annotations:24.0.1" level="project" /> - <orderEntry type="library" name="Maven: com.microsoft.azure:applicationinsights-core:2.6.0" level="project" /> - <orderEntry type="library" name="Maven: com.microsoft.azure:applicationinsights-logging-log4j2:2.6.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.11.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.0" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:2.0.7" level="project" /> - <orderEntry type="library" name="Maven: nl.han.aim.asd:heartbeat-manager:1.0.11" level="project" /> - <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.10.1" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.plugins:maven-assembly-plugin:3.3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-plugin-api:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.sisu:sisu-inject-plexus:1.4.2" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.sisu:sisu-inject-bean:1.4.2" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.sisu:sisu-guice:noaop:2.1.7" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-core:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-settings:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-settings-builder:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-repository-metadata:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-model-builder:3.0" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.maven:maven-aether-provider:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.aether:aether-impl:1.7" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.aether:aether-spi:1.7" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.aether:aether-api:1.7" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.aether:aether-util:1.7" level="project" /> - <orderEntry type="library" name="Maven: org.codehaus.plexus:plexus-classworlds:2.2.3" level="project" /> - <orderEntry type="library" name="Maven: org.codehaus.plexus:plexus-component-annotations:1.5.5" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.plexus:plexus-sec-dispatcher:1.3" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.plexus:plexus-cipher:1.4" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-artifact:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-model:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.shared:maven-common-artifact-filters:3.1.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.shared:maven-shared-utils:3.1.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.shared:maven-artifact-transfer:0.11.0" level="project" /> - <orderEntry type="library" name="Maven: org.codehaus.plexus:plexus-interpolation:1.25" level="project" /> - <orderEntry type="library" name="Maven: org.codehaus.plexus:plexus-archiver:4.2.1" level="project" /> - <orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.19" level="project" /> - <orderEntry type="library" name="Maven: org.iq80.snappy:snappy:0.4" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.tukaani:xz:1.8" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.shared:file-management:3.0.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.shared:maven-shared-io:3.0.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-compat:3.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.wagon:wagon-provider-api:2.10" level="project" /> - <orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven.shared:maven-filtering:3.1.1" level="project" /> - <orderEntry type="library" name="Maven: org.sonatype.plexus:plexus-build-api:0.0.7" level="project" /> - <orderEntry type="library" name="Maven: org.codehaus.plexus:plexus-io:3.2.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.maven:maven-archiver:3.5.0" level="project" /> - <orderEntry type="library" name="Maven: org.codehaus.plexus:plexus-utils:3.3.0" level="project" /> - <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.6" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:4.11.0" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:5.3.0" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.14.4" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.14.4" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.3" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.2" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> - </component> -</module> \ No newline at end of file diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java b/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java index 499d64a7..3b478262 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java @@ -9,6 +9,8 @@ import nl.han.aim.asd.veilveilig.core.application.adapters.StorageAdapter; import nl.han.aim.asd.veilveilig.core.application.dependencies.*; import nl.han.aim.asd.veilveilig.core.application.ports.*; import nl.han.aim.asd.veilveilig.core.application.usecases.*; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.BootstrapService; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.IBootstrapService; import nl.han.aim.asd.veilveilig.modules.infrastructure.localstorage.*; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.Peer; import nl.han.aim.asd.veilveilig.rpc.IRpcServer; @@ -58,5 +60,6 @@ public class MyModule extends AbstractModule { bind(IRpcServer.class).toInstance(new RpcServer(rpcPort)); bind(IHeartbeatManager.class).toInstance(new HeartbeatManager(heartbeatPort)); bind(INetwork.class).to(Peer.class).asEagerSingleton(); + bind(IBootstrapService.class).to(BootstrapService.class).asEagerSingleton(); } } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java index f21589bc..703e3a15 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java @@ -1,31 +1,29 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; import com.google.gson.Gson; -import nl.han.aim.asd.veilveilig.core.application.dtos.LoginDTO; -import nl.han.aim.asd.veilveilig.core.application.dtos.RegisterDTO; -import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkRequest; -import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkResponse; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.*; import java.io.*; import java.net.*; public class BootstrapService implements IBootstrapService{ + String token; - public HttpURLConnection prepareConnection(String address, String urlExtension) { + public HttpURLConnection prepareConnection(String address, String urlExtension, String method) { HttpURLConnection connection = null; try { URI uri = new URI(address + urlExtension); connection = (HttpURLConnection) uri.toURL().openConnection(); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestMethod(method); + if(method == "POST") connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); } catch (Exception e) { - e.printStackTrace(); - } - return connection; + e.printStackTrace(); } + return connection; + } - @Override + @Override public String getResponseBody(HttpURLConnection connection) throws Exception { StringBuilder responseBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) { @@ -38,10 +36,10 @@ public class BootstrapService implements IBootstrapService{ } @Override - public String login(String email, String password, String address) { + public void login(String email, String password, String address) { try { LoginDTO currentLogin = new LoginDTO(email, password); - HttpURLConnection connection = prepareConnection(address, "/login"); + HttpURLConnection connection = prepareConnection(address, "/login", "POST"); Gson gson = new Gson(); String jsonInputString = gson.toJson(currentLogin); @@ -58,21 +56,20 @@ public class BootstrapService implements IBootstrapService{ case 404 -> throw new Exception(responseStatus + " Not Found"); case 401 -> throw new Exception(responseStatus + " Unauthorized Access Attempt"); case 200 -> { - return connection.getResponseMessage(); + token = getResponseBody(connection); } } } catch (Exception e) { e.printStackTrace(); } - return null; } @Override - public int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller) { + public int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller) { try { RegisterDTO currentRegister = new RegisterDTO(email, password, company, firstname, lastname, address, seller); - HttpURLConnection connection = prepareConnection(address, "/register"); + HttpURLConnection connection = prepareConnection(address, "/register", "POST"); Gson gson = new Gson(); String jsonInputString = gson.toJson(currentRegister); @@ -88,9 +85,11 @@ public class BootstrapService implements IBootstrapService{ } @Override - public JoinNetworkResponse sendJoinRequest(JoinNetworkRequest request, String address) { + public JoinNetworkResponse sendJoinRequest(String address, String ip, int port) { try { - HttpURLConnection connection = prepareConnection(address, "/joinNetwork"); + HttpURLConnection connection = prepareConnection(address, "/joinNetwork", "POST"); + + var request = new JoinNetworkRequest(ip, port, token); Gson gson = new Gson(); String jsonInputString = gson.toJson(request); @@ -121,9 +120,11 @@ public class BootstrapService implements IBootstrapService{ } @Override - public void sendNewMasterRequest(JoinNetworkRequest request, String address) { + public void sendNewMasterRequest(String address, String ip, int port) { try { - HttpURLConnection connection = prepareConnection(address, "/updateMaster"); + HttpURLConnection connection = prepareConnection(address, "/updateMaster", "POST"); + + var request = new JoinNetworkRequest(ip, port, token); Gson gson = new Gson(); String jsonInputString = gson.toJson(request); @@ -143,4 +144,27 @@ public class BootstrapService implements IBootstrapService{ } } + @Override + public StartDataDto getStartData(String address) { + try { + HttpURLConnection connection = prepareConnection(address, "/startdata", "GET"); + + Gson gson = new Gson(); + + int statusCode = connection.getResponseCode(); + if(statusCode != 200){ + throw new Exception("Unexpected HTTP status code: " + statusCode); + } + + var json = getResponseBody(connection); + StartDataDto startData = gson.fromJson(json, StartDataDto.class); + + connection.disconnect(); + + return startData; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java index 2ace9836..51200c07 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java @@ -1,14 +1,15 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; -import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkRequest; -import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkResponse; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.JoinNetworkResponse; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.StartDataDto; import java.net.HttpURLConnection; public interface IBootstrapService { - String login(String email, String password, String address); + void login(String email, String password, String address); int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller); - JoinNetworkResponse sendJoinRequest(JoinNetworkRequest request, String address); - void sendNewMasterRequest(JoinNetworkRequest request, String address); + JoinNetworkResponse sendJoinRequest(String address, String ip, int port); + void sendNewMasterRequest(String address, String ip, int port); String getResponseBody(HttpURLConnection connection) throws Exception; + StartDataDto getStartData(String address); } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java new file mode 100644 index 00000000..b3c36694 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java @@ -0,0 +1,66 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + + +import java.time.LocalDate; +import java.util.Date; + + +public class Auction { + String auction; + + String category; + + String auctionType; + + Date startDate; + + Date endDate; + + public Auction(String auction, String category, String auctionType, Date startDate, Date endDate) { + this.auction = auction; + this.category = category; + this.auctionType = auctionType; + this.startDate = startDate; + this.endDate = endDate; + } + + public String getAuction() { + return auction; + } + + public void setAuction(String auction) { + this.auction = auction; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getAuctionType() { + return auctionType; + } + + public void setAuctionType(String auctionType) { + this.auctionType = auctionType; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java new file mode 100644 index 00000000..aeef6dea --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java @@ -0,0 +1,18 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + + +public class Category { + String category; + + public Category(String category) { + this.category = category; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkRequest.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkRequest.java new file mode 100644 index 00000000..c082cd4b --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkRequest.java @@ -0,0 +1,13 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + +public class JoinNetworkRequest { + private String ip; + private int port; + private String token; + + public JoinNetworkRequest(String ip, int port, String token) { + this.ip = ip; + this.port = port; + this.token = token; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkResponse.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkResponse.java new file mode 100644 index 00000000..e861e0c7 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/JoinNetworkResponse.java @@ -0,0 +1,31 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + +public class JoinNetworkResponse { + private String ip; + private int port; + private boolean isMaster; + + public boolean isMaster() { + return isMaster; + } + + public void setMaster(boolean master) { + isMaster = master; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java similarity index 85% rename from src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java rename to src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java index 56fb2082..3ce656bb 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/LoginDTO.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java @@ -1,4 +1,4 @@ -package nl.han.aim.asd.veilveilig.core.application.dtos; +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; public class LoginDTO { String email; @@ -26,4 +26,4 @@ public class LoginDTO { public void setPassword(String password) { this.password = password; } -} \ No newline at end of file +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java new file mode 100644 index 00000000..22b73604 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java @@ -0,0 +1,128 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + +public class Lot { + String lid; + + String objectName; + + int reservePrice; + + String description; + + int quantity; + + String auction; + + String company; + + String email; + + String firstName; + + String lastName; + + String address; + + public Lot(String lid, String objectName, int reservePrice, String description, int quantity, String auction, + String company, String email, String firstName, String lastName, String address) { + this.lid = lid; + this.objectName = objectName; + this.reservePrice = reservePrice; + this.description = description; + this.quantity = quantity; + this.auction = auction; + this.company = company; + this.email = email; + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + } + + public String getLid() { + return lid; + } + + public void setLid(String lid) { + this.lid = lid; + } + + public String getObjectName() { + return objectName; + } + + public void setObjectName(String objectName) { + this.objectName = objectName; + } + + public int getReservePrice() { + return reservePrice; + } + + public void setReservePrice(int reservePrice) { + this.reservePrice = reservePrice; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getAuction() { + return auction; + } + + public void setAuction(String auction) { + this.auction = auction; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java new file mode 100644 index 00000000..a709e919 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java @@ -0,0 +1,41 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + + + +public class Photo { + String lid; + + int seqNo; + + String filename; + + public Photo(String lid, int seqNo, String filename) { + this.lid = lid; + this.seqNo = seqNo; + this.filename = filename; + } + + public String getLid() { + return lid; + } + + public void setLid(String lid) { + this.lid = lid; + } + + public int getSeqNo() { + return seqNo; + } + + public void setSeqNo(int seqNo) { + this.seqNo = seqNo; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java similarity index 79% rename from src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java rename to src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java index c77f33a8..5b60a30c 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dtos/RegisterDTO.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java @@ -1,4 +1,4 @@ -package nl.han.aim.asd.veilveilig.core.application.dtos; +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; public record RegisterDTO(String email, String password, diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java new file mode 100644 index 00000000..2f4962b3 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java @@ -0,0 +1,10 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; + +import java.util.List; + +public record StartDataDto( + List<Auction> auctions, + List<Lot> lots, + List<Category> categories, + List<Photo> photos +){} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java index 3a4246ba..9ce7910b 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java @@ -9,6 +9,7 @@ import nl.han.aim.asd.veilveilig.core.application.usecases.IOfferService; import nl.han.aim.asd.veilveilig.core.application.usecases.ISubscribeService; import nl.han.aim.asd.veilveilig.core.application.dtos.AuctionDTO; import nl.han.aim.asd.veilveilig.core.application.dtos.LotDTO; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.IBootstrapService; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkRequest; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.http.BootstrapHelper; import nl.han.aim.asd.veilveilig.rpc.IRpcServer; @@ -57,6 +58,8 @@ public class Peer implements IPeer, INetwork { IOfferService offerService; @Inject IAuctionService auctionService; + @Inject + IBootstrapService bootstrapService; @Inject public Peer(IRpcServer server, IHeartbeatManager heartbeatManager){ @@ -79,12 +82,7 @@ public class Peer implements IPeer, INetwork { public void joinNetwork(String bootstrapAddress){ this.bootstrapAddress = bootstrapAddress; - var response = BootstrapHelper.sendJoinRequest(new JoinNetworkRequest( - server.getOutgoingIpAddress().Address, - server.getOutgoingIpAddress().port, - "test", - "test" - ), bootstrapAddress); + var response = bootstrapService.sendJoinRequest(bootstrapAddress, server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); if(response.isMaster()) return; @@ -93,12 +91,7 @@ public class Peer implements IPeer, INetwork { try { current.getMaster(); } catch (Exception e){ - BootstrapHelper.sendNewMasterRequest(new JoinNetworkRequest( - server.getOutgoingIpAddress().Address, - server.getOutgoingIpAddress().port, - "test", - "test" - ), bootstrapAddress); + bootstrapService.sendNewMasterRequest(bootstrapAddress, server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); return; } diff --git a/src/test/java/network/manual/Main.java b/src/test/java/network/manual/Main.java index 6b114280..6774223c 100644 --- a/src/test/java/network/manual/Main.java +++ b/src/test/java/network/manual/Main.java @@ -9,6 +9,7 @@ import nl.han.aim.asd.veilveilig.core.application.dtos.AuctionDTO; import nl.han.aim.asd.veilveilig.core.application.dtos.LotDTO; import nl.han.aim.asd.veilveilig.core.application.dtos.OfferDTO; import nl.han.aim.asd.veilveilig.models.Auction; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.IBootstrapService; import nl.han.aim.asd.veilveilig.rpc.IRpcServer; import java.io.BufferedReader; @@ -27,12 +28,21 @@ public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - System.out.print("Enter IP address of bootstrap node: "); + System.out.print("Enter IP address of bootstrap node (type a number for one of the dev servers): "); String bootstrapIP = br.readLine().trim(); + if(bootstrapIP.equals("1") || bootstrapIP.equals("2") || bootstrapIP.equals("3")) bootstrapIP = "https://asd-bootstrap-dev" + bootstrapIP + ".azurewebsites.net"; System.out.print("Enter port for application to run on: "); String portTxt = br.readLine().trim(); - System.out.print("Enter your name: "); + System.out.print("Enter your email (type nothing to use example account): "); String name = br.readLine().trim(); + String password = ""; + if(name.isEmpty()) { + name = "test@gmail.com"; + password = "mypassword"; + } else { + System.out.println("Enter your password"); + password = br.readLine().trim(); + } int port = Integer.parseInt(portTxt); @@ -46,10 +56,11 @@ public class Main { auctionService = injector.getInstance(IAuctionService.class); subscribeService = injector.getInstance(ISubscribeService.class); offerService = injector.getInstance(IOfferService.class); - String bootstrapAddress = "https://" + bootstrapIP; - peer.joinNetwork(bootstrapAddress); - System.out.println("Bootstrap address: " + bootstrapAddress); + injector.getInstance(IBootstrapService.class).login(name, password, bootstrapIP); + peer.joinNetwork(bootstrapIP); + + System.out.println("Bootstrap address: " + bootstrapIP); String line = ""; -- GitLab From 2b923660333977815727c1059f27fd23e344a805 Mon Sep 17 00:00:00 2001 From: Tom Janssen <t.janssen16@student.han.nl> Date: Wed, 24 May 2023 15:56:27 +0200 Subject: [PATCH 3/6] Added setId to peer --- .../veilveilig/core/application/dependencies/INetwork.java | 1 + .../modules/infrastructure/networkmodule/Peer.java | 5 +++++ src/test/java/network/manual/Main.java | 1 + 3 files changed, 7 insertions(+) diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java index 9f6c512a..f2e0f587 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java @@ -16,4 +16,5 @@ public interface INetwork { void subscribeToLot(LotDTO lotDTO); void createAuction(AuctionDTO auctionDTO, List<LotDTO> lotDTOList); void sendOffer(OfferDTO offer, String auctionId); + void setId(String id); } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java index 9ce7910b..e9f43d6d 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java @@ -509,4 +509,9 @@ public class Peer implements IPeer, INetwork { } System.out.println("I received a ping for a newly created auction with auction id: " + auction.getAuctionid() + " and category: " + auction.getCategory()); } + + @Override + public void setId(String id) { + this.peerId = id; + } } diff --git a/src/test/java/network/manual/Main.java b/src/test/java/network/manual/Main.java index 6774223c..85638a1d 100644 --- a/src/test/java/network/manual/Main.java +++ b/src/test/java/network/manual/Main.java @@ -58,6 +58,7 @@ public class Main { offerService = injector.getInstance(IOfferService.class); injector.getInstance(IBootstrapService.class).login(name, password, bootstrapIP); + peer.setId(name); peer.joinNetwork(bootstrapIP); System.out.println("Bootstrap address: " + bootstrapIP); -- GitLab From c9ca130096665a81e230ce40295fb23d3ec74679 Mon Sep 17 00:00:00 2001 From: Tom Janssen <t.janssen16@student.han.nl> Date: Thu, 25 May 2023 10:21:31 +0200 Subject: [PATCH 4/6] Added ddl for database and made bootstrap package cooler --- .../dependencies}/IBootstrapService.java | 10 +- .../application/dependencies/INetwork.java | 2 +- .../dependencies/IStartDataService.java | 6 + .../core/dependencyinjection/MyModule.java | 4 +- .../bootstrapapi/BootstrapService.java | 27 ++-- .../bootstrapapi/StartDataService.java | 115 ++++++++++++++++++ .../infrastructure/networkmodule/Peer.java | 21 ++-- src/main/resources/database.sqlite | Bin 53248 -> 225280 bytes src/main/resources/sql/ddl.sql | 60 +++++++++ src/test/java/network/manual/ChaosMonkey.java | 6 +- src/test/java/network/manual/Main.java | 7 +- 11 files changed, 221 insertions(+), 37 deletions(-) rename src/main/java/nl/han/aim/asd/veilveilig/{modules/infrastructure/bootstrapapi => core/application/dependencies}/IBootstrapService.java (58%) create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IStartDataService.java create mode 100644 src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java create mode 100644 src/main/resources/sql/ddl.sql diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IBootstrapService.java similarity index 58% rename from src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java rename to src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IBootstrapService.java index 51200c07..93af5708 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/IBootstrapService.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IBootstrapService.java @@ -1,4 +1,4 @@ -package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; +package nl.han.aim.asd.veilveilig.core.application.dependencies; import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.JoinNetworkResponse; import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.StartDataDto; @@ -7,9 +7,9 @@ import java.net.HttpURLConnection; public interface IBootstrapService { void login(String email, String password, String address); - int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller); - JoinNetworkResponse sendJoinRequest(String address, String ip, int port); - void sendNewMasterRequest(String address, String ip, int port); + int register(String email, String password, String company, String firstname, String lastname, boolean seller); + JoinNetworkResponse sendJoinRequest(String ip, int port); + void sendNewMasterRequest( String ip, int port); String getResponseBody(HttpURLConnection connection) throws Exception; - StartDataDto getStartData(String address); + StartDataDto getStartData(); } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java index f2e0f587..a18c6db6 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/INetwork.java @@ -10,7 +10,7 @@ import java.util.List; public interface INetwork { void broadcastMessage(String message); - void joinNetwork(String bootstrapAddress); + void joinNetwork(); String getNetworkInfo(); void kill(); void subscribeToLot(LotDTO lotDTO); diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IStartDataService.java b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IStartDataService.java new file mode 100644 index 00000000..4dc6d2c2 --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/application/dependencies/IStartDataService.java @@ -0,0 +1,6 @@ +package nl.han.aim.asd.veilveilig.core.application.dependencies; + +public interface IStartDataService { + void insertStartData(); + void wipeAuctionDatabase(); +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java b/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java index 3b478262..53c91109 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/core/dependencyinjection/MyModule.java @@ -10,7 +10,8 @@ import nl.han.aim.asd.veilveilig.core.application.dependencies.*; import nl.han.aim.asd.veilveilig.core.application.ports.*; import nl.han.aim.asd.veilveilig.core.application.usecases.*; import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.BootstrapService; -import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.IBootstrapService; +import nl.han.aim.asd.veilveilig.core.application.dependencies.IBootstrapService; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.StartDataService; import nl.han.aim.asd.veilveilig.modules.infrastructure.localstorage.*; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.Peer; import nl.han.aim.asd.veilveilig.rpc.IRpcServer; @@ -55,6 +56,7 @@ public class MyModule extends AbstractModule { bind(IAuctionService.class).to(AuctionService.class); bind(ISubscribeService.class).to(SubscribeService.class); bind(IOfferService.class).to(OfferService.class); + bind(IStartDataService.class).to(StartDataService.class); // Network bind(IRpcServer.class).toInstance(new RpcServer(rpcPort)); diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java index 703e3a15..a5f3421d 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java @@ -1,15 +1,17 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; import com.google.gson.Gson; +import nl.han.aim.asd.veilveilig.core.application.dependencies.IBootstrapService; import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.*; import java.io.*; import java.net.*; -public class BootstrapService implements IBootstrapService{ +public class BootstrapService implements IBootstrapService { String token; + String address; - public HttpURLConnection prepareConnection(String address, String urlExtension, String method) { + public HttpURLConnection prepareConnection(String urlExtension, String method) { HttpURLConnection connection = null; try { URI uri = new URI(address + urlExtension); @@ -27,7 +29,7 @@ public class BootstrapService implements IBootstrapService{ public String getResponseBody(HttpURLConnection connection) throws Exception { StringBuilder responseBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) { - String responseLine = null; + String responseLine; while ((responseLine = br.readLine()) != null) { responseBuilder.append(responseLine.trim()); } @@ -37,9 +39,10 @@ public class BootstrapService implements IBootstrapService{ @Override public void login(String email, String password, String address) { + this.address = address; try { LoginDTO currentLogin = new LoginDTO(email, password); - HttpURLConnection connection = prepareConnection(address, "/login", "POST"); + HttpURLConnection connection = prepareConnection("/login", "POST"); Gson gson = new Gson(); String jsonInputString = gson.toJson(currentLogin); @@ -66,10 +69,10 @@ public class BootstrapService implements IBootstrapService{ } @Override - public int register(String email, String password, String company, String firstname, String lastname, String address, boolean seller) { + public int register(String email, String password, String company, String firstname, String lastname, boolean seller) { try { RegisterDTO currentRegister = new RegisterDTO(email, password, company, firstname, lastname, address, seller); - HttpURLConnection connection = prepareConnection(address, "/register", "POST"); + HttpURLConnection connection = prepareConnection("/register", "POST"); Gson gson = new Gson(); String jsonInputString = gson.toJson(currentRegister); @@ -85,9 +88,9 @@ public class BootstrapService implements IBootstrapService{ } @Override - public JoinNetworkResponse sendJoinRequest(String address, String ip, int port) { + public JoinNetworkResponse sendJoinRequest(String ip, int port) { try { - HttpURLConnection connection = prepareConnection(address, "/joinNetwork", "POST"); + HttpURLConnection connection = prepareConnection("/joinNetwork", "POST"); var request = new JoinNetworkRequest(ip, port, token); @@ -120,9 +123,9 @@ public class BootstrapService implements IBootstrapService{ } @Override - public void sendNewMasterRequest(String address, String ip, int port) { + public void sendNewMasterRequest(String ip, int port) { try { - HttpURLConnection connection = prepareConnection(address, "/updateMaster", "POST"); + HttpURLConnection connection = prepareConnection("/updateMaster", "POST"); var request = new JoinNetworkRequest(ip, port, token); @@ -145,9 +148,9 @@ public class BootstrapService implements IBootstrapService{ } @Override - public StartDataDto getStartData(String address) { + public StartDataDto getStartData() { try { - HttpURLConnection connection = prepareConnection(address, "/startdata", "GET"); + HttpURLConnection connection = prepareConnection("/startdata", "GET"); Gson gson = new Gson(); diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java new file mode 100644 index 00000000..4291fa4b --- /dev/null +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java @@ -0,0 +1,115 @@ +package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi; + +import com.google.inject.Inject; +import nl.han.aim.asd.veilveilig.core.application.dependencies.*; +import nl.han.aim.asd.veilveilig.core.application.dtos.AuctionDTO; +import nl.han.aim.asd.veilveilig.core.application.dtos.LotDTO; +import nl.han.aim.asd.veilveilig.core.application.dtos.UserDTO; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.Auction; +import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models.Lot; + +import java.util.ArrayList; +import java.util.List; + +public class StartDataService implements IStartDataService { + @Inject + ILotDAO lotDAO; + @Inject + IAuctionDAO auctionDAO; + @Inject + IUserDAO userDAO; + @Inject + IBootstrapService bootstrapService; + + public void insertStartData(){ + var data = bootstrapService.getStartData(); + + var auctions = mapAuctions(data.auctions()); + var lots = mapLots(data.lots()); + var users = mapUsersFromLots(data.lots()); + + for (var user : users) { + userDAO.saveOrUpdateUser(user); + } + + for (var lot : lots) { + lotDAO.saveOrUpdateLot(lot); + } + + for (var auction : auctions){ + auctionDAO.updateOrCreateAuction(auction); + } + } + + public void wipeAuctionDatabase(){ + var auctions = auctionDAO.getAllAuctions(); + + for (var auction : auctions){ + var lots = lotDAO.getAllLotsForAuction(auction.getAuctionid()); + for (var lot : lots){ + lot.setAuctionid(null); + lotDAO.saveOrUpdateLot(lot); + } + auctionDAO.deleteAuction(auction.getAuctionid()); + } + } + + private List<AuctionDTO> mapAuctions(List<Auction> auctionList){ + var result = new ArrayList<AuctionDTO>(); + + for (var auction : auctionList) { + var newAuction = new AuctionDTO(); + + newAuction.setAuctionid(auction.getAuction()); + newAuction.setAuctionType(auction.getAuctionType()); + newAuction.setCategory(auction.getCategory()); + newAuction.setStartDate(auction.getStartDate()); + newAuction.setEndDate(auction.getEndDate()); + + result.add(newAuction); + } + + return result; + } + + private List<LotDTO> mapLots(List<Lot> lotList){ + var result = new ArrayList<LotDTO>(); + + for (var lot : lotList) { + var newLot = new LotDTO(); + + newLot.setLotid(lot.getLid()); + newLot.setAuctionid(lot.getAuction()); + newLot.setQuantity(lot.getQuantity()); + newLot.setDescription(lot.getDescription()); + newLot.setUserEmail(lot.getEmail()); + newLot.setObjectName(lot.getObjectName()); + newLot.setReservePrice(lot.getReservePrice()); + + result.add(newLot); + } + + return result; + } + + private List<UserDTO> mapUsersFromLots(List<Lot> lotList){ + var result = new ArrayList<UserDTO>(); + + for (var lot : lotList) { + if(result.stream().filter(u -> u.getEmail() == lot.getEmail()).findFirst().isEmpty()) { + var newUser = new UserDTO(); + + newUser.setEmail(lot.getEmail()); + newUser.setAddress(lot.getAddress()); + newUser.setCompany(lot.getCompany()); + newUser.setFirstname(lot.getFirstName()); + newUser.setLastname(lot.getLastName()); + newUser.setSeller(true); + + result.add(newUser); + } + } + + return result; + } +} diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java index e9f43d6d..11b8615a 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/networkmodule/Peer.java @@ -9,7 +9,7 @@ import nl.han.aim.asd.veilveilig.core.application.usecases.IOfferService; import nl.han.aim.asd.veilveilig.core.application.usecases.ISubscribeService; import nl.han.aim.asd.veilveilig.core.application.dtos.AuctionDTO; import nl.han.aim.asd.veilveilig.core.application.dtos.LotDTO; -import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.IBootstrapService; +import nl.han.aim.asd.veilveilig.core.application.dependencies.IBootstrapService; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.models.JoinNetworkRequest; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.http.BootstrapHelper; import nl.han.aim.asd.veilveilig.rpc.IRpcServer; @@ -48,8 +48,6 @@ public class Peer implements IPeer, INetwork { private String managerID; - private String bootstrapAddress; - private boolean healing; @Inject @@ -76,13 +74,12 @@ public class Peer implements IPeer, INetwork { /** * This function connects the peer to the bootstrap server, so the bootstrap server can add this peer to the network. - * @param bootstrapAddress {@link String} is the http address of the bootstrap server. + * {@link String} is the http address of the bootstrap server. */ @Override - public void joinNetwork(String bootstrapAddress){ - this.bootstrapAddress = bootstrapAddress; + public void joinNetwork(){ - var response = bootstrapService.sendJoinRequest(bootstrapAddress, server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); + var response = bootstrapService.sendJoinRequest(server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); if(response.isMaster()) return; @@ -91,7 +88,7 @@ public class Peer implements IPeer, INetwork { try { current.getMaster(); } catch (Exception e){ - bootstrapService.sendNewMasterRequest(bootstrapAddress, server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); + bootstrapService.sendNewMasterRequest(server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); return; } @@ -252,7 +249,7 @@ public class Peer implements IPeer, INetwork { try { joinNetworkOnPeer(grandParent); } catch (Exception e){ - joinNetwork(bootstrapAddress); + joinNetwork(); } } else { if(sibling != null){ @@ -291,11 +288,7 @@ public class Peer implements IPeer, INetwork { * Adds new root to bootstrap if deleted peer was root of the tree */ private void addNewRootPeerToBootstrap(){ - BootstrapHelper.sendNewMasterRequest(new JoinNetworkRequest( - server.getOutgoingIpAddress().Address, - server.getOutgoingIpAddress().port, - "", "" - ), bootstrapAddress); + bootstrapService.sendNewMasterRequest(server.getOutgoingIpAddress().Address, server.getOutgoingIpAddress().port); } private void addPeerToHeartbeat(IPeer peer) { diff --git a/src/main/resources/database.sqlite b/src/main/resources/database.sqlite index 8619822081b636f6290a9ced3c06507ea3276283..f17eafcaab70de9f45f6c80d9dfa2534e78422b3 100644 GIT binary patch literal 225280 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 Q<L~N`4>Z^RU)EgzKMXvE$N&HU delta 962 zcmZuvO=uHQ5PqB8O`EivNeD|@qh?E`=%GKmY0^dzVrvlsQE5a9N_CrTZD=+xbXU+* zQ>b`t=ph~ya`fa+_uwhLdr~|~4%&-&5<x-e#d*7=xDejXyyeaN=KE&eG`>oWHot!+ zLf#WXB(x#4K=WcIh$qt}?p^r>MA$ir5&|o1IkDO6u=6?@PmG6b!?GV)#&#-aJl4&6 z)tD|(bBUUDz4k;|TBPfFx>>VmZGIuE+|;*}qK%oXq&zY{*n?{Qpo@9EW)#hey*Zc8 zD9csTLuQk5e8MHY%vjZa(5sB{8Z}fcr4;l^4UyrVeg|+lvD_=j7kd0Y={(*{^&&oH z0gR0GB0l27Sz&hAZO>cS$F=4}ADl#*?cxq}NHRVqis?*Aw{OsGQ?CZ^pIuvSc)l0T zWKYBJg(xy2RE<%25dOnA`DMfNDB{*7jB5+UI^DJ{#jcdL4BP5^Gc`HEQr)SP4XQlU zO{34X)7Jb3w*ETNdJUTGdz0{s45Tw6+cH@Jc}F!kAp@$$S~RRJuzrZ@VMB<9-P&8w zf)b9#D(uY3^1ytEZfxLORH^M+t~`hULi%<P&npbWxfl&GuI09#`!K$jV*LLRsR(i{ zw?6a9hw{Cm8zF?lomCz}6LB6s!qkwbmsKZwG8jYH{Z*w%mk81xACaUz=tiDmownq3 zJF6UK;mA~AcZeeg^yv0M;b?S*n&*T;NN|Y|8F7aRwTZ0ovSAsfUa8`Txu3z6z-|I@ v-#d3(-8bBYXc#*zz%hZJ@CSatF)I5E=YxEVOQ%JV2QDQruky@m-V6K#_Ztr? diff --git a/src/main/resources/sql/ddl.sql b/src/main/resources/sql/ddl.sql new file mode 100644 index 00000000..facae793 --- /dev/null +++ b/src/main/resources/sql/ddl.sql @@ -0,0 +1,60 @@ +DROP TABLE IF EXISTS Auction; +DROP TABLE IF EXISTS Strategy; +DROP TABLE IF EXISTS User; +DROP TABLE IF EXISTS Lot; +DROP TABLE IF EXISTS Offer; + +create table Auction +( + auctionid VARCHAR(256) not null + primary key, + category VARCHAR(128) not null, + auction_type VARCHAR(128) not null, + startdate DATE not null, + enddate DATE not null +); + +create table Strategy +( + id VARCHAR(255) + primary key, + strategy_value VARCHAR(8192), + compiled_strategy_value VARCHAR(8192) +); + +create table User +( + email VARCHAR(256) not null + primary key, + company VARCHAR(256), + firstname VARCHAR(256) not null, + lastname VARCHAR(256) not null, + address VARCHAR(256) not null, + seller BOOLEAN not null +); + +create table Lot +( + lotid VARCHAR(36) not null + primary key, + object_name VARCHAR(512) not null, + reserve_price INTEGER not null, + description TEXT, + quantity INTEGER not null, + auction VARCHAR(256) + references Auction, + user_email VARCHAR(256) not null + references User +); + +create table Offer +( + offerid VARCHAR(256) not null + primary key, + lotid VARCHAR(256) not null, + lot VARCHAR(256) + references Lot, + offer DOUBLE PRECISION not null, + bidder VARCHAR(256) not null, + round INTEGER not null +); \ No newline at end of file diff --git a/src/test/java/network/manual/ChaosMonkey.java b/src/test/java/network/manual/ChaosMonkey.java index 8dffdcec..cb6e011c 100644 --- a/src/test/java/network/manual/ChaosMonkey.java +++ b/src/test/java/network/manual/ChaosMonkey.java @@ -4,6 +4,7 @@ import com.google.inject.Guice; import com.google.inject.Injector; import nl.han.aim.asd.heartbeatmanager.HeartbeatManager; import nl.han.aim.asd.heartbeatmanager.IHeartbeatManager; +import nl.han.aim.asd.veilveilig.core.application.dependencies.IBootstrapService; import nl.han.aim.asd.veilveilig.core.application.dependencies.INetwork; import nl.han.aim.asd.veilveilig.core.dependencyinjection.MyModule; import nl.han.aim.asd.veilveilig.modules.infrastructure.networkmodule.Peer; @@ -32,6 +33,8 @@ public class ChaosMonkey { List<INetwork> peers = new ArrayList<>(); + bootstrapIP = "https://" + bootstrapIP; + int i = 20000; while (true) { @@ -41,8 +44,9 @@ public class ChaosMonkey { for (int j = 0; j < action; j++) { Injector injector = Guice.createInjector(new MyModule(i, i+1)); String name = "ChaosMonkey-" + (peers.size() + 1); + injector.getInstance(IBootstrapService.class).login("test@gmail.com", "mypassword", bootstrapIP); INetwork peer = injector.getInstance(INetwork.class); - peer.joinNetwork("https://" + bootstrapIP); + peer.joinNetwork(); peer.broadcastMessage("I joined to bring chaos!"); peers.add(peer); System.out.println("Peer " + name + " joined the network."); diff --git a/src/test/java/network/manual/Main.java b/src/test/java/network/manual/Main.java index 85638a1d..3785abbb 100644 --- a/src/test/java/network/manual/Main.java +++ b/src/test/java/network/manual/Main.java @@ -3,13 +3,13 @@ package network.manual; import com.google.inject.Guice; import com.google.inject.Injector; import nl.han.aim.asd.veilveilig.core.application.dependencies.INetwork; +import nl.han.aim.asd.veilveilig.core.application.dependencies.IStartDataService; import nl.han.aim.asd.veilveilig.core.application.usecases.*; import nl.han.aim.asd.veilveilig.core.dependencyinjection.MyModule; import nl.han.aim.asd.veilveilig.core.application.dtos.AuctionDTO; import nl.han.aim.asd.veilveilig.core.application.dtos.LotDTO; import nl.han.aim.asd.veilveilig.core.application.dtos.OfferDTO; -import nl.han.aim.asd.veilveilig.models.Auction; -import nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.IBootstrapService; +import nl.han.aim.asd.veilveilig.core.application.dependencies.IBootstrapService; import nl.han.aim.asd.veilveilig.rpc.IRpcServer; import java.io.BufferedReader; @@ -58,8 +58,9 @@ public class Main { offerService = injector.getInstance(IOfferService.class); injector.getInstance(IBootstrapService.class).login(name, password, bootstrapIP); + injector.getInstance(IStartDataService.class).insertStartData(); peer.setId(name); - peer.joinNetwork(bootstrapIP); + peer.joinNetwork(); System.out.println("Bootstrap address: " + bootstrapIP); -- GitLab From a916a8fb3e2cfa81fb076ba89a39690b5573496b Mon Sep 17 00:00:00 2001 From: Tom Janssen <t.janssen16@student.han.nl> Date: Thu, 25 May 2023 14:28:00 +0200 Subject: [PATCH 5/6] Added private --- .../bootstrapapi/models/Auction.java | 10 ++++----- .../bootstrapapi/models/Category.java | 2 +- .../bootstrapapi/models/LoginDTO.java | 4 ++-- .../bootstrapapi/models/Lot.java | 22 +++++++++---------- .../bootstrapapi/models/Photo.java | 6 ++--- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java index b3c36694..491686bd 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java @@ -6,15 +6,15 @@ import java.util.Date; public class Auction { - String auction; + private String auction; - String category; + private String category; - String auctionType; + private String auctionType; - Date startDate; + private Date startDate; - Date endDate; + private Date endDate; public Auction(String auction, String category, String auctionType, Date startDate, Date endDate) { this.auction = auction; diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java index aeef6dea..e27812ea 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java @@ -2,7 +2,7 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; public class Category { - String category; + private String category; public Category(String category) { this.category = category; diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java index 3ce656bb..dc68b08b 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/LoginDTO.java @@ -1,8 +1,8 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; public class LoginDTO { - String email; - String password; + private String email; + private String password; diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java index 22b73604..c8b9cbac 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java @@ -1,27 +1,27 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; public class Lot { - String lid; + private String lid; - String objectName; + private String objectName; - int reservePrice; + private int reservePrice; - String description; + private String description; - int quantity; + private int quantity; - String auction; + private String auction; - String company; + private String company; - String email; + private String email; - String firstName; + private String firstName; - String lastName; + private String lastName; - String address; + private String address; public Lot(String lid, String objectName, int reservePrice, String description, int quantity, String auction, String company, String email, String firstName, String lastName, String address) { diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java index a709e919..c5648aac 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java @@ -3,11 +3,11 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; public class Photo { - String lid; + private String lid; - int seqNo; + private int seqNo; - String filename; + private String filename; public Photo(String lid, int seqNo, String filename) { this.lid = lid; -- GitLab From b94a45de92e543e8f9e59d1967dd41bff5f147d5 Mon Sep 17 00:00:00 2001 From: Tom Janssen <t.janssen16@student.han.nl> Date: Thu, 25 May 2023 15:21:27 +0200 Subject: [PATCH 6/6] Solved some comments --- .../bootstrapapi/BootstrapService.java | 4 +- .../bootstrapapi/StartDataService.java | 6 +- .../bootstrapapi/models/Auction.java | 46 +-------- .../bootstrapapi/models/Category.java | 13 +-- .../bootstrapapi/models/Lot.java | 93 +------------------ .../bootstrapapi/models/Photo.java | 28 +----- .../bootstrapapi/models/RegisterDTO.java | 17 ++-- .../bootstrapapi/models/StartDataDto.java | 17 ++-- 8 files changed, 45 insertions(+), 179 deletions(-) diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java index a5f3421d..1c86b725 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/BootstrapService.java @@ -8,8 +8,8 @@ import java.io.*; import java.net.*; public class BootstrapService implements IBootstrapService { - String token; - String address; + private String token; + private String address; public HttpURLConnection prepareConnection(String urlExtension, String method) { HttpURLConnection connection = null; diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java index 4291fa4b..d477620a 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/StartDataService.java @@ -24,9 +24,9 @@ public class StartDataService implements IStartDataService { public void insertStartData(){ var data = bootstrapService.getStartData(); - var auctions = mapAuctions(data.auctions()); - var lots = mapLots(data.lots()); - var users = mapUsersFromLots(data.lots()); + var auctions = mapAuctions(data.getAuctions()); + var lots = mapLots(data.getLots()); + var users = mapUsersFromLots(data.getLots()); for (var user : users) { userDAO.saveOrUpdateUser(user); diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java index 491686bd..413cf0ea 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Auction.java @@ -1,10 +1,14 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; +import lombok.Getter; +import lombok.Setter; + import java.time.LocalDate; import java.util.Date; - +@Getter +@Setter public class Auction { private String auction; @@ -23,44 +27,4 @@ public class Auction { this.startDate = startDate; this.endDate = endDate; } - - public String getAuction() { - return auction; - } - - public void setAuction(String auction) { - this.auction = auction; - } - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } - - public String getAuctionType() { - return auctionType; - } - - public void setAuctionType(String auctionType) { - this.auctionType = auctionType; - } - - public Date getStartDate() { - return startDate; - } - - public void setStartDate(Date startDate) { - this.startDate = startDate; - } - - public Date getEndDate() { - return endDate; - } - - public void setEndDate(Date endDate) { - this.endDate = endDate; - } } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java index e27812ea..b6ab88d0 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Category.java @@ -1,18 +1,15 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class Category { private String category; public Category(String category) { this.category = category; } - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java index c8b9cbac..047fdc7e 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Lot.java @@ -1,5 +1,10 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class Lot { private String lid; @@ -37,92 +42,4 @@ public class Lot { this.lastName = lastName; this.address = address; } - - public String getLid() { - return lid; - } - - public void setLid(String lid) { - this.lid = lid; - } - - public String getObjectName() { - return objectName; - } - - public void setObjectName(String objectName) { - this.objectName = objectName; - } - - public int getReservePrice() { - return reservePrice; - } - - public void setReservePrice(int reservePrice) { - this.reservePrice = reservePrice; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public int getQuantity() { - return quantity; - } - - public void setQuantity(int quantity) { - this.quantity = quantity; - } - - public String getAuction() { - return auction; - } - - public void setAuction(String auction) { - this.auction = auction; - } - - public String getCompany() { - return company; - } - - public void setCompany(String company) { - this.company = company; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java index c5648aac..404106b9 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/Photo.java @@ -1,7 +1,11 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class Photo { private String lid; @@ -14,28 +18,4 @@ public class Photo { this.seqNo = seqNo; this.filename = filename; } - - public String getLid() { - return lid; - } - - public void setLid(String lid) { - this.lid = lid; - } - - public int getSeqNo() { - return seqNo; - } - - public void setSeqNo(int seqNo) { - this.seqNo = seqNo; - } - - public String getFilename() { - return filename; - } - - public void setFilename(String filename) { - this.filename = filename; - } } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java index 5b60a30c..0c1f320f 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/RegisterDTO.java @@ -1,11 +1,14 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; -public record RegisterDTO(String email, - String password, - String company, - String firstname, - String lastname, - String address, - boolean seller) { +import lombok.AllArgsConstructor; +@AllArgsConstructor +public class RegisterDTO { + private String email; + private String password; + private String company; + private String firstname; + private String lastname; + private String address; + private boolean seller; } diff --git a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java index 2f4962b3..3b61e86a 100644 --- a/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java +++ b/src/main/java/nl/han/aim/asd/veilveilig/modules/infrastructure/bootstrapapi/models/StartDataDto.java @@ -1,10 +1,15 @@ package nl.han.aim.asd.veilveilig.modules.infrastructure.bootstrapapi.models; +import lombok.AllArgsConstructor; +import lombok.Getter; + import java.util.List; -public record StartDataDto( - List<Auction> auctions, - List<Lot> lots, - List<Category> categories, - List<Photo> photos -){} +@Getter +@AllArgsConstructor +public class StartDataDto { + List<Auction> auctions; + List<Lot> lots; + List<Category> categories; + List<Photo> photos; +} -- GitLab