From 3fe2e19091acefc0c946a77d36e8251b23e5fb22 Mon Sep 17 00:00:00 2001 From: jez04 <david.jezek@post.cz> Date: Fri, 28 Feb 2025 17:39:17 +0100 Subject: [PATCH] feat: :tada: solution --- build-and-run.sh | 12 ++ java2-lab02-common-v1/.gitignore | 16 ++ java2-lab02-common-v1/pom.xml | 79 +++++++++ .../cz/vsb/fei/java2/lab02/common}/Score.java | 2 +- .../lab02/common/ScoreStorageInterface.java | 15 ++ .../src/main/java/module-info.java | 5 + .../java/cz/vsb/fei/java2/lab01/AppTest.java | 19 +++ java2-lab02-db-v1/.gitignore | 16 ++ java2-lab02-db-v1/pom.xml | 90 ++++++++++ .../vsb/fei/java2/lab02/db}/DbConnector.java | 11 +- .../src/main/java/module-info.java | 11 ++ .../src/main/resources/log4j2.xml | 13 ++ java2-lab02-file-v1/.gitignore | 16 ++ java2-lab02-file-v1/pom.xml | 84 +++++++++ .../java/cz/vsb/fei/file/FileStorage.java | 57 +++++++ .../src/main/java/module-info.java | 9 + .gitignore => java2-lab02-v1/.gitignore | 0 README.md => java2-lab02-v1/README.md | 0 java2-lab02-v1/pom.xml | 160 ++++++++++++++++++ java2-lab02-v1/scores.csv | 16 ++ .../main/java/lab/ScoreStorageFactory.java | 39 +++++ .../src/main/java/lab/game}/Bullet.java | 2 +- .../main/java/lab/game}/BulletAnimated.java | 2 +- .../src/main/java/lab/game}/Cannon.java | 2 +- .../main/java/lab/game}/Collisionable.java | 2 +- .../java/lab/game}/DrawableSimulable.java | 2 +- .../main/java/lab/game}/DrawingThread.java | 2 +- .../src/main/java/lab/game}/HitListener.java | 2 +- .../src/main/java/lab/game}/Routines.java | 2 +- .../src/main/java/lab/game}/Ufo.java | 2 +- .../src/main/java/lab/game}/World.java | 2 +- .../src/main/java/lab/game}/WorldEntity.java | 2 +- .../src/main/java/lab/gui}/App.java | 4 +- .../main/java/lab/gui}/GameController.java | 12 +- java2-lab02-v1/src/main/java/module-info.java | 11 ++ .../lab/game}/fireball-transparent.gif | Bin .../main/resources/lab/game}/ufo-small.gif | Bin .../src/main/resources/lab/game}/ufo.gif | Bin .../main/resources/lab/gui}/application.css | 0 .../main/resources/lab/gui}/gameWindow.fxml | 44 ++--- .../jez04/structure/test/AllOfContinue.java | 0 .../java/jez04/structure/test/ClassExist.java | 0 .../structure/test/ClassStructureTest.java | 27 +++ .../structure/test/ContainsInnerClasses.java | 0 .../java/jez04/structure/test/HasMethod.java | 0 .../jez04/structure/test/HasProperty.java | 0 .../jez04/structure/test/IsDescendatOf.java | 0 .../jez04/structure/test/IsInterface.java | 0 .../structure/test/ResourceContains.java | 0 .../jez04/structure/test/SrcContains.java | 0 .../jez04/structure/test/StructureHelper.java | 0 .../structure/test/StructureMatcher.java | 0 pom.xml | 82 --------- run.sh | 5 + src/main/java/lab/DataImporter.java | 69 -------- src/main/java/lab/Person.java | 57 ------- src/main/java/lab/ScoreStorageFactory.java | 13 -- src/main/java/module-info.java | 8 - .../structure/test/ClassStructureTest.java | 132 --------------- 59 files changed, 756 insertions(+), 400 deletions(-) create mode 100755 build-and-run.sh create mode 100644 java2-lab02-common-v1/.gitignore create mode 100644 java2-lab02-common-v1/pom.xml rename {src/main/java/lab => java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common}/Score.java (98%) create mode 100644 java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/ScoreStorageInterface.java create mode 100644 java2-lab02-common-v1/src/main/java/module-info.java create mode 100644 java2-lab02-common-v1/src/test/java/cz/vsb/fei/java2/lab01/AppTest.java create mode 100644 java2-lab02-db-v1/.gitignore create mode 100644 java2-lab02-db-v1/pom.xml rename {src/main/java/lab => java2-lab02-db-v1/src/main/java/cz/vsb/fei/java2/lab02/db}/DbConnector.java (86%) create mode 100644 java2-lab02-db-v1/src/main/java/module-info.java create mode 100644 java2-lab02-db-v1/src/main/resources/log4j2.xml create mode 100644 java2-lab02-file-v1/.gitignore create mode 100644 java2-lab02-file-v1/pom.xml create mode 100644 java2-lab02-file-v1/src/main/java/cz/vsb/fei/file/FileStorage.java create mode 100644 java2-lab02-file-v1/src/main/java/module-info.java rename .gitignore => java2-lab02-v1/.gitignore (100%) rename README.md => java2-lab02-v1/README.md (100%) create mode 100644 java2-lab02-v1/pom.xml create mode 100644 java2-lab02-v1/scores.csv create mode 100644 java2-lab02-v1/src/main/java/lab/ScoreStorageFactory.java rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/Bullet.java (98%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/BulletAnimated.java (98%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/Cannon.java (98%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/Collisionable.java (91%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/DrawableSimulable.java (89%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/DrawingThread.java (97%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/HitListener.java (81%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/Routines.java (94%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/Ufo.java (98%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/World.java (99%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/game}/WorldEntity.java (96%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/gui}/App.java (96%) rename {src/main/java/lab => java2-lab02-v1/src/main/java/lab/gui}/GameController.java (93%) create mode 100644 java2-lab02-v1/src/main/java/module-info.java rename {src/main/resources/lab => java2-lab02-v1/src/main/resources/lab/game}/fireball-transparent.gif (100%) rename {src/main/resources/lab => java2-lab02-v1/src/main/resources/lab/game}/ufo-small.gif (100%) rename {src/main/resources/lab => java2-lab02-v1/src/main/resources/lab/game}/ufo.gif (100%) rename {src/main/resources/lab => java2-lab02-v1/src/main/resources/lab/gui}/application.css (100%) rename {src/main/resources/lab => java2-lab02-v1/src/main/resources/lab/gui}/gameWindow.fxml (59%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/AllOfContinue.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/ClassExist.java (100%) create mode 100644 java2-lab02-v1/src/test/java/jez04/structure/test/ClassStructureTest.java rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/ContainsInnerClasses.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/HasMethod.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/HasProperty.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/IsDescendatOf.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/IsInterface.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/ResourceContains.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/SrcContains.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/StructureHelper.java (100%) rename {src => java2-lab02-v1/src}/test/java/jez04/structure/test/StructureMatcher.java (100%) delete mode 100644 pom.xml create mode 100755 run.sh delete mode 100644 src/main/java/lab/DataImporter.java delete mode 100644 src/main/java/lab/Person.java delete mode 100644 src/main/java/lab/ScoreStorageFactory.java delete mode 100644 src/main/java/module-info.java delete mode 100644 src/test/java/jez04/structure/test/ClassStructureTest.java diff --git a/build-and-run.sh b/build-and-run.sh new file mode 100755 index 0000000..503ff83 --- /dev/null +++ b/build-and-run.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +cd java2-lab02-common-v1 +mvn clean install +cd ../java2-lab02-db-v1 +mvn clean install +cd ../java2-lab02-file-v1 +mvn clean install +cd ../java2-lab02-v1 +mvn clean package +java --module-path target/java2-lab02-v1-0.0.1-SNAPHOST.jar:target/libs -m cz.vsb.fei.java2.lab02_module/lab.gui.App +cd .. diff --git a/java2-lab02-common-v1/.gitignore b/java2-lab02-common-v1/.gitignore new file mode 100644 index 0000000..98b99a5 --- /dev/null +++ b/java2-lab02-common-v1/.gitignore @@ -0,0 +1,16 @@ +# Eclipse +.classpath +.project +.settings/ + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# Maven +log/ +target/ diff --git a/java2-lab02-common-v1/pom.xml b/java2-lab02-common-v1/pom.xml new file mode 100644 index 0000000..fa426bc --- /dev/null +++ b/java2-lab02-common-v1/pom.xml @@ -0,0 +1,79 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-common-v1</artifactId> + <version>0.0.1-SNAPSHOT</version> + + <name>java2-lab02-common-v1</name> + + <packaging>jar</packaging> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>21</maven.compiler.release> + <JUnit.version>5.11.0</JUnit.version> + <log4j.version>2.23.1</log4j.version> + <lombok.version>1.18.34</lombok.version> + </properties> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.junit</groupId> + <artifactId>junit-bom</artifactId> + <version>${JUnit.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + <version>${log4j.version}</version> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + <version>${log4j.version}</version> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.13.0</version> + <configuration> + <annotationProcessorPaths> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.5.0</version> + </plugin> + </plugins> + </build> + +</project> diff --git a/src/main/java/lab/Score.java b/java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/Score.java similarity index 98% rename from src/main/java/lab/Score.java rename to java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/Score.java index 70d137a..cb962bd 100644 --- a/src/main/java/lab/Score.java +++ b/java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/Score.java @@ -1,4 +1,4 @@ -package lab; +package cz.vsb.fei.java2.lab02.common; import java.util.Random; diff --git a/java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/ScoreStorageInterface.java b/java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/ScoreStorageInterface.java new file mode 100644 index 0000000..deb19b3 --- /dev/null +++ b/java2-lab02-common-v1/src/main/java/cz/vsb/fei/java2/lab02/common/ScoreStorageInterface.java @@ -0,0 +1,15 @@ +package cz.vsb.fei.java2.lab02.common; + +import java.util.List; + +public interface ScoreStorageInterface { + + List<Score> getAll(); + + List<Score> getFirstTen(); + + void init(); + + void insertScore(Score score); + +} \ No newline at end of file diff --git a/java2-lab02-common-v1/src/main/java/module-info.java b/java2-lab02-common-v1/src/main/java/module-info.java new file mode 100644 index 0000000..e9edf40 --- /dev/null +++ b/java2-lab02-common-v1/src/main/java/module-info.java @@ -0,0 +1,5 @@ +module cz.vsb.fei.java2.lab02.common_module { + requires static lombok; + requires org.apache.logging.log4j; + exports cz.vsb.fei.java2.lab02.common; +} \ No newline at end of file diff --git a/java2-lab02-common-v1/src/test/java/cz/vsb/fei/java2/lab01/AppTest.java b/java2-lab02-common-v1/src/test/java/cz/vsb/fei/java2/lab01/AppTest.java new file mode 100644 index 0000000..9102a3a --- /dev/null +++ b/java2-lab02-common-v1/src/test/java/cz/vsb/fei/java2/lab01/AppTest.java @@ -0,0 +1,19 @@ +package cz.vsb.fei.java2.lab01; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +/** + * Unit test for simple App. + */ +class AppTest { + + /** + * Rigorous Test :-) + */ + @Test + void shouldAnswerWithTrue() { + assertTrue(true); + } +} diff --git a/java2-lab02-db-v1/.gitignore b/java2-lab02-db-v1/.gitignore new file mode 100644 index 0000000..98b99a5 --- /dev/null +++ b/java2-lab02-db-v1/.gitignore @@ -0,0 +1,16 @@ +# Eclipse +.classpath +.project +.settings/ + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# Maven +log/ +target/ diff --git a/java2-lab02-db-v1/pom.xml b/java2-lab02-db-v1/pom.xml new file mode 100644 index 0000000..d502341 --- /dev/null +++ b/java2-lab02-db-v1/pom.xml @@ -0,0 +1,90 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-db-v1</artifactId> + <version>0.0.1-SNAPSHOT</version> + + <name>java2-lab02-db-v1</name> + + <packaging>jar</packaging> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>21</maven.compiler.release> + <JUnit.version>5.11.0</JUnit.version> + <log4j.version>2.23.1</log4j.version> + <lombok.version>1.18.34</lombok.version> + </properties> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.junit</groupId> + <artifactId>junit-bom</artifactId> + <version>${JUnit.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-common-v1</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>2.3.232</version> + </dependency> + + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + <version>${log4j.version}</version> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + <version>${log4j.version}</version> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.13.0</version> + <configuration> + <annotationProcessorPaths> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.5.0</version> + </plugin> + </plugins> + </build> + +</project> diff --git a/src/main/java/lab/DbConnector.java b/java2-lab02-db-v1/src/main/java/cz/vsb/fei/java2/lab02/db/DbConnector.java similarity index 86% rename from src/main/java/lab/DbConnector.java rename to java2-lab02-db-v1/src/main/java/cz/vsb/fei/java2/lab02/db/DbConnector.java index d7a0594..4f8c076 100644 --- a/src/main/java/lab/DbConnector.java +++ b/java2-lab02-db-v1/src/main/java/cz/vsb/fei/java2/lab02/db/DbConnector.java @@ -1,4 +1,4 @@ -package lab; +package cz.vsb.fei.java2.lab02.db; import java.sql.Connection; import java.sql.DriverManager; @@ -9,14 +9,19 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.List; -public class DbConnector { +import cz.vsb.fei.java2.lab02.common.Score; +import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface; + +public class DbConnector implements ScoreStorageInterface { private static final String JDBC_CONECTIN_STRING = "jdbc:h2:file:./scoreDB"; + @Override public List<Score> getAll() { return queryScore("select * from scores;"); } + @Override public List<Score> getFirstTen() { return queryScore("select * from scores order by points desc limit 10;"); } @@ -35,6 +40,7 @@ public class DbConnector { return result; } + @Override public void init() { try (Connection con = DriverManager.getConnection(JDBC_CONECTIN_STRING); Statement stm = con.createStatement();) { @@ -44,6 +50,7 @@ public class DbConnector { } } + @Override public void insertScore(Score score) { try (Connection con = DriverManager.getConnection(JDBC_CONECTIN_STRING); PreparedStatement stm = con.prepareStatement("INSERT INTO scores VALUES (?, ?)");) { diff --git a/java2-lab02-db-v1/src/main/java/module-info.java b/java2-lab02-db-v1/src/main/java/module-info.java new file mode 100644 index 0000000..b10ea8f --- /dev/null +++ b/java2-lab02-db-v1/src/main/java/module-info.java @@ -0,0 +1,11 @@ +import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface; +import cz.vsb.fei.java2.lab02.db.DbConnector; + +module cz.vsb.fei.java2.lab02.db_module { + requires static lombok; + requires org.apache.logging.log4j; + requires transitive cz.vsb.fei.java2.lab02.common_module; + requires java.sql; + exports cz.vsb.fei.java2.lab02.db; + provides ScoreStorageInterface with cz.vsb.fei.java2.lab02.db.DbConnector; +} \ No newline at end of file diff --git a/java2-lab02-db-v1/src/main/resources/log4j2.xml b/java2-lab02-db-v1/src/main/resources/log4j2.xml new file mode 100644 index 0000000..acb3514 --- /dev/null +++ b/java2-lab02-db-v1/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ +<Configuration> + <Appenders> + <Console name="Console"> + <PatternLayout + pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> + </Console> + </Appenders> + <Loggers> + <Root level="info"> + <AppenderRef ref="Console"></AppenderRef> + </Root> + </Loggers> +</Configuration> diff --git a/java2-lab02-file-v1/.gitignore b/java2-lab02-file-v1/.gitignore new file mode 100644 index 0000000..98b99a5 --- /dev/null +++ b/java2-lab02-file-v1/.gitignore @@ -0,0 +1,16 @@ +# Eclipse +.classpath +.project +.settings/ + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# Maven +log/ +target/ diff --git a/java2-lab02-file-v1/pom.xml b/java2-lab02-file-v1/pom.xml new file mode 100644 index 0000000..902d86f --- /dev/null +++ b/java2-lab02-file-v1/pom.xml @@ -0,0 +1,84 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-file-v1</artifactId> + <version>1.0-SNAPSHOT</version> + + <name>java2-lab02-file-v1</name> + + <packaging>jar</packaging> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>21</maven.compiler.release> + <JUnit.version>5.11.0</JUnit.version> + <log4j.version>2.23.1</log4j.version> + <lombok.version>1.18.34</lombok.version> + </properties> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.junit</groupId> + <artifactId>junit-bom</artifactId> + <version>${JUnit.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-common-v1</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + <version>${log4j.version}</version> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + <version>${log4j.version}</version> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.13.0</version> + <configuration> + <annotationProcessorPaths> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.5.0</version> + </plugin> + </plugins> + </build> + +</project> diff --git a/java2-lab02-file-v1/src/main/java/cz/vsb/fei/file/FileStorage.java b/java2-lab02-file-v1/src/main/java/cz/vsb/fei/file/FileStorage.java new file mode 100644 index 0000000..291811e --- /dev/null +++ b/java2-lab02-file-v1/src/main/java/cz/vsb/fei/file/FileStorage.java @@ -0,0 +1,57 @@ +package cz.vsb.fei.file; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Stream; + +import cz.vsb.fei.java2.lab02.common.Score; +import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface; + +public class FileStorage implements ScoreStorageInterface { + + private static final String SCORE_FILE_NAME = "scores.csv"; + + @Override + public List<Score> getAll() { + if (Files.exists(Paths.get(SCORE_FILE_NAME))) { + try (Stream<String> lines = Files.lines(Paths.get(SCORE_FILE_NAME))) { + List<Score> result = lines.map(line -> line.split(";")) + .map(parts -> new Score(parts[0], Integer.parseInt(parts[1]))).toList(); + return new ArrayList<>(result); + } catch (IOException e) { + e.printStackTrace(); + } + } + return new ArrayList<>(); + } + + @Override + public List<Score> getFirstTen() { + List<Score> all = getAll(); + Collections.sort(all, Comparator.comparing(Score::getPoints).reversed()); + return all.subList(0, 10); + } + + @Override + public void init() { + /* noting to do */ + } + + @Override + public void insertScore(Score score) { + List<Score> all = getAll(); + all.add(score); + List<String> lines = all.stream().map(s -> String.format("%s;%d", s.getName(), s.getPoints())).toList(); + try { + Files.write(Paths.get(SCORE_FILE_NAME), lines, StandardOpenOption.CREATE); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/java2-lab02-file-v1/src/main/java/module-info.java b/java2-lab02-file-v1/src/main/java/module-info.java new file mode 100644 index 0000000..cff2f09 --- /dev/null +++ b/java2-lab02-file-v1/src/main/java/module-info.java @@ -0,0 +1,9 @@ +import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface; + +module cz.vsb.fei.file_module { + requires static lombok; + requires org.apache.logging.log4j; + requires transitive cz.vsb.fei.java2.lab02.common_module; + exports cz.vsb.fei.file; + provides ScoreStorageInterface with cz.vsb.fei.file.FileStorage; +} \ No newline at end of file diff --git a/.gitignore b/java2-lab02-v1/.gitignore similarity index 100% rename from .gitignore rename to java2-lab02-v1/.gitignore diff --git a/README.md b/java2-lab02-v1/README.md similarity index 100% rename from README.md rename to java2-lab02-v1/README.md diff --git a/java2-lab02-v1/pom.xml b/java2-lab02-v1/pom.xml new file mode 100644 index 0000000..a2b751b --- /dev/null +++ b/java2-lab02-v1/pom.xml @@ -0,0 +1,160 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-v1</artifactId> + <version>0.0.1-SNAPHOST</version> + + <name></name> + <packaging>jar</packaging> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.source>21</maven.compiler.source> + <maven.compiler.target>21</maven.compiler.target> + </properties> + <dependencies> + <dependency> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-common-v1</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-db-v1</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>cz.vsb.fei.java2</groupId> + <artifactId>java2-lab02-file-v1</artifactId> + <version>1.0-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-controls</artifactId> + <version>23</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-fxml</artifactId> + <version>23</version> + </dependency> + <!-- + https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-api</artifactId> + <version>5.11.0</version> + <scope>test</scope> + </dependency> + <!-- + https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <version>5.11.0</version> + <scope>test</scope> + </dependency> + <!-- + https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-params</artifactId> + <version>5.11.0</version> + <scope>test</scope> + </dependency> + <!-- https://mvnrepository.com/artifact/org.reflections/reflections --> + <dependency> + <groupId>org.reflections</groupId> + <artifactId>reflections</artifactId> + <version>0.10.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest</artifactId> + <version>3.0</version> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.13.0</version> + <configuration> + <failOnError>false</failOnError> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>3.8.1</version> + <executions> + <!-- Setup that goal copy-dependencies should be + automatically executed during phase package--> + <execution> + <id>copy-dependencies</id> + <phase>package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + <configuration> + <!--Specify where should be dependencies (libraries) copied--> + <outputDirectory>${project.build.directory}/libs</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.4.2</version> + <configuration> + <archive> + <!--Automatically create and add file MANIFEST.MF into jar and set specified properties--> + <manifest> + <addClasspath>true</addClasspath> + <classpathPrefix>libs/</classpathPrefix> + <mainClass>lab.gui.App</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + + </plugins> + <pluginManagement> + <plugins> + <!-- Ignore/Execute plugin execution in Eclipse (error of m2e + eclipse plugin) --> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>1.0.0</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <!-- copy-dependency plugin --> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <versionRange>[1.0.0,)</versionRange> + <goals> + <goal>copy-dependencies</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore /> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> diff --git a/java2-lab02-v1/scores.csv b/java2-lab02-v1/scores.csv new file mode 100644 index 0000000..c7f3e2f --- /dev/null +++ b/java2-lab02-v1/scores.csv @@ -0,0 +1,16 @@ +NetworkNinja;122 +VirtualVoyager;198 +TweetTrendsetter;109 +WebWizard;262 +ScreenSage;95 +CodeCommander;276 +FunctionFanatic;288 +LogicLover;289 +DataDetective;112 +ScreenSage;181 +BitBuilder;51 +PixelArtist;242 +RenderRogue;62 +AppArchitect;225 +DataDreamer;62 +EmojiEnthusiast;101 diff --git a/java2-lab02-v1/src/main/java/lab/ScoreStorageFactory.java b/java2-lab02-v1/src/main/java/lab/ScoreStorageFactory.java new file mode 100644 index 0000000..b613d07 --- /dev/null +++ b/java2-lab02-v1/src/main/java/lab/ScoreStorageFactory.java @@ -0,0 +1,39 @@ +package lab; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Random; +import java.util.ServiceLoader; + +import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.stage.Modality; +import javafx.scene.control.Alert.AlertType; + +public class ScoreStorageFactory { + + private static ScoreStorageInterface instance; + + private ScoreStorageFactory() { + /* hide public one constructor */ + } + + public static ScoreStorageInterface getInstance() { + if (instance == null) { + List<ScoreStorageInterface> availableImplementations = new ArrayList<>(); + ServiceLoader.load(ScoreStorageInterface.class).forEach(availableImplementations::add); + if (availableImplementations.isEmpty()) { + throw new NoSuchElementException( + "Service loader did not find any implementation of interface ScoreStorageInterface."); + } + instance = availableImplementations.get(new Random().nextInt(availableImplementations.size())); + Alert info = new Alert(AlertType.INFORMATION, + String.format("Storage %s selected.", instance.getClass().getName()), ButtonType.OK); + info.initModality(Modality.WINDOW_MODAL); + info.showAndWait(); + } + return instance; + } +} diff --git a/src/main/java/lab/Bullet.java b/java2-lab02-v1/src/main/java/lab/game/Bullet.java similarity index 98% rename from src/main/java/lab/Bullet.java rename to java2-lab02-v1/src/main/java/lab/game/Bullet.java index 76f904f..709849e 100644 --- a/src/main/java/lab/Bullet.java +++ b/java2-lab02-v1/src/main/java/lab/game/Bullet.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import javafx.geometry.Point2D; import javafx.geometry.Rectangle2D; diff --git a/src/main/java/lab/BulletAnimated.java b/java2-lab02-v1/src/main/java/lab/game/BulletAnimated.java similarity index 98% rename from src/main/java/lab/BulletAnimated.java rename to java2-lab02-v1/src/main/java/lab/game/BulletAnimated.java index 8274916..5e3c181 100644 --- a/src/main/java/lab/BulletAnimated.java +++ b/java2-lab02-v1/src/main/java/lab/game/BulletAnimated.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/lab/Cannon.java b/java2-lab02-v1/src/main/java/lab/game/Cannon.java similarity index 98% rename from src/main/java/lab/Cannon.java rename to java2-lab02-v1/src/main/java/lab/game/Cannon.java index e31f1ed..cf53855 100644 --- a/src/main/java/lab/Cannon.java +++ b/java2-lab02-v1/src/main/java/lab/game/Cannon.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; diff --git a/src/main/java/lab/Collisionable.java b/java2-lab02-v1/src/main/java/lab/game/Collisionable.java similarity index 91% rename from src/main/java/lab/Collisionable.java rename to java2-lab02-v1/src/main/java/lab/game/Collisionable.java index 40a8157..cf0bcdf 100644 --- a/src/main/java/lab/Collisionable.java +++ b/java2-lab02-v1/src/main/java/lab/game/Collisionable.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import javafx.geometry.Rectangle2D; diff --git a/src/main/java/lab/DrawableSimulable.java b/java2-lab02-v1/src/main/java/lab/game/DrawableSimulable.java similarity index 89% rename from src/main/java/lab/DrawableSimulable.java rename to java2-lab02-v1/src/main/java/lab/game/DrawableSimulable.java index d5b5d45..244dd11 100644 --- a/src/main/java/lab/DrawableSimulable.java +++ b/java2-lab02-v1/src/main/java/lab/game/DrawableSimulable.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import javafx.scene.canvas.GraphicsContext; diff --git a/src/main/java/lab/DrawingThread.java b/java2-lab02-v1/src/main/java/lab/game/DrawingThread.java similarity index 97% rename from src/main/java/lab/DrawingThread.java rename to java2-lab02-v1/src/main/java/lab/game/DrawingThread.java index 8c0f65f..426b8c0 100644 --- a/src/main/java/lab/DrawingThread.java +++ b/java2-lab02-v1/src/main/java/lab/game/DrawingThread.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import javafx.animation.AnimationTimer; import javafx.scene.canvas.Canvas; diff --git a/src/main/java/lab/HitListener.java b/java2-lab02-v1/src/main/java/lab/game/HitListener.java similarity index 81% rename from src/main/java/lab/HitListener.java rename to java2-lab02-v1/src/main/java/lab/game/HitListener.java index 833d7e3..c40f903 100644 --- a/src/main/java/lab/HitListener.java +++ b/java2-lab02-v1/src/main/java/lab/game/HitListener.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; @FunctionalInterface public interface HitListener { diff --git a/src/main/java/lab/Routines.java b/java2-lab02-v1/src/main/java/lab/game/Routines.java similarity index 94% rename from src/main/java/lab/Routines.java rename to java2-lab02-v1/src/main/java/lab/game/Routines.java index 89fcce7..47e508c 100644 --- a/src/main/java/lab/Routines.java +++ b/java2-lab02-v1/src/main/java/lab/game/Routines.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; public class Routines { diff --git a/src/main/java/lab/Ufo.java b/java2-lab02-v1/src/main/java/lab/game/Ufo.java similarity index 98% rename from src/main/java/lab/Ufo.java rename to java2-lab02-v1/src/main/java/lab/game/Ufo.java index 013939b..462bcc9 100644 --- a/src/main/java/lab/Ufo.java +++ b/java2-lab02-v1/src/main/java/lab/game/Ufo.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import java.util.Random; diff --git a/src/main/java/lab/World.java b/java2-lab02-v1/src/main/java/lab/game/World.java similarity index 99% rename from src/main/java/lab/World.java rename to java2-lab02-v1/src/main/java/lab/game/World.java index d34bdf6..1a49271 100644 --- a/src/main/java/lab/World.java +++ b/java2-lab02-v1/src/main/java/lab/game/World.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/lab/WorldEntity.java b/java2-lab02-v1/src/main/java/lab/game/WorldEntity.java similarity index 96% rename from src/main/java/lab/WorldEntity.java rename to java2-lab02-v1/src/main/java/lab/game/WorldEntity.java index 8322894..e858399 100644 --- a/src/main/java/lab/WorldEntity.java +++ b/java2-lab02-v1/src/main/java/lab/game/WorldEntity.java @@ -1,4 +1,4 @@ -package lab; +package lab.game; import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; diff --git a/src/main/java/lab/App.java b/java2-lab02-v1/src/main/java/lab/gui/App.java similarity index 96% rename from src/main/java/lab/App.java rename to java2-lab02-v1/src/main/java/lab/gui/App.java index bd778ae..115b897 100644 --- a/src/main/java/lab/App.java +++ b/java2-lab02-v1/src/main/java/lab/gui/App.java @@ -1,4 +1,4 @@ -package lab; +package lab.gui; import javafx.application.Application; import javafx.fxml.FXMLLoader; @@ -24,7 +24,7 @@ public class App extends Application { public void start(Stage primaryStage) { try { // Construct a main window with a canvas. - FXMLLoader gameLoader = new FXMLLoader(getClass().getResource("/lab/gameWindow.fxml")); + FXMLLoader gameLoader = new FXMLLoader(getClass().getResource("/lab/gui/gameWindow.fxml")); Parent root = gameLoader.load(); GameController gameController = gameLoader.getController(); Scene scene = new Scene(root); diff --git a/src/main/java/lab/GameController.java b/java2-lab02-v1/src/main/java/lab/gui/GameController.java similarity index 93% rename from src/main/java/lab/GameController.java rename to java2-lab02-v1/src/main/java/lab/gui/GameController.java index 745de93..6fa4faf 100644 --- a/src/main/java/lab/GameController.java +++ b/java2-lab02-v1/src/main/java/lab/gui/GameController.java @@ -1,7 +1,8 @@ -package lab; +package lab.gui; import java.util.List; +import cz.vsb.fei.java2.lab02.common.Score; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.geometry.Point2D; @@ -12,6 +13,10 @@ import javafx.scene.control.Slider; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; +import lab.ScoreStorageFactory; +import lab.game.BulletAnimated; +import lab.game.DrawingThread; +import lab.game.World; public class GameController { @@ -112,11 +117,10 @@ public class GameController { nickColumn.setCellValueFactory(new PropertyValueFactory<>("name")); pointsColumn.setCellValueFactory(new PropertyValueFactory<>("points")); - initDB(); + initStorage(); } - private void initDB() { - //Stream.generate(Score::generate).limit(10).toList(); + private void initStorage() { ScoreStorageFactory.getInstance().init(); scores.getItems().addAll(ScoreStorageFactory.getInstance().getAll()); } diff --git a/java2-lab02-v1/src/main/java/module-info.java b/java2-lab02-v1/src/main/java/module-info.java new file mode 100644 index 0000000..3c46773 --- /dev/null +++ b/java2-lab02-v1/src/main/java/module-info.java @@ -0,0 +1,11 @@ +import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface; + +module cz.vsb.fei.java2.lab02_module { + requires transitive javafx.controls; + requires javafx.fxml; + requires javafx.base; + requires cz.vsb.fei.java2.lab02.common_module; + opens lab.gui to javafx.fxml; + exports lab.gui to javafx.fxml,javafx.graphics; + uses ScoreStorageInterface; +} \ No newline at end of file diff --git a/src/main/resources/lab/fireball-transparent.gif b/java2-lab02-v1/src/main/resources/lab/game/fireball-transparent.gif similarity index 100% rename from src/main/resources/lab/fireball-transparent.gif rename to java2-lab02-v1/src/main/resources/lab/game/fireball-transparent.gif diff --git a/src/main/resources/lab/ufo-small.gif b/java2-lab02-v1/src/main/resources/lab/game/ufo-small.gif similarity index 100% rename from src/main/resources/lab/ufo-small.gif rename to java2-lab02-v1/src/main/resources/lab/game/ufo-small.gif diff --git a/src/main/resources/lab/ufo.gif b/java2-lab02-v1/src/main/resources/lab/game/ufo.gif similarity index 100% rename from src/main/resources/lab/ufo.gif rename to java2-lab02-v1/src/main/resources/lab/game/ufo.gif diff --git a/src/main/resources/lab/application.css b/java2-lab02-v1/src/main/resources/lab/gui/application.css similarity index 100% rename from src/main/resources/lab/application.css rename to java2-lab02-v1/src/main/resources/lab/gui/application.css diff --git a/src/main/resources/lab/gameWindow.fxml b/java2-lab02-v1/src/main/resources/lab/gui/gameWindow.fxml similarity index 59% rename from src/main/resources/lab/gameWindow.fxml rename to java2-lab02-v1/src/main/resources/lab/gui/gameWindow.fxml index 9eb99f9..2579b5b 100644 --- a/src/main/resources/lab/gameWindow.fxml +++ b/java2-lab02-v1/src/main/resources/lab/gui/gameWindow.fxml @@ -4,6 +4,7 @@ <?import javafx.scene.Cursor?> <?import javafx.scene.canvas.Canvas?> <?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> <?import javafx.scene.control.Slider?> <?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableView?> @@ -13,28 +14,33 @@ <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Font?> -<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="388.0" prefWidth="911.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> +<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="388.0" prefWidth="911.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.gui.GameController"> <bottom> - <HBox alignment="TOP_CENTER" prefHeight="66.0" prefWidth="866.0" BorderPane.alignment="CENTER"> + <VBox BorderPane.alignment="CENTER"> <children> - <Slider fx:id="angle" majorTickUnit="15.0" max="90.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minorTickCount="5" showTickLabels="true" showTickMarks="true" HBox.hgrow="ALWAYS" /> - <Button mnemonicParsing="false" onAction="#fire" style="-fx-background-color: RED;" text="Fire" textAlignment="CENTER"> - <font> - <Font name="System Bold" size="24.0" /> - </font> - <cursor> - <Cursor fx:constant="CROSSHAIR" /> - </cursor> - <opaqueInsets> - <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> - </opaqueInsets> - <HBox.margin> - <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> - </HBox.margin> - </Button> - <Slider fx:id="speed" max="200.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="50.0" minorTickCount="5" showTickLabels="true" showTickMarks="true" value="50.0" HBox.hgrow="ALWAYS" /> + <Label fx:id="hits" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Hits count: 0" VBox.vgrow="ALWAYS" /> + <HBox alignment="TOP_CENTER" prefHeight="66.0" prefWidth="866.0"> + <children> + <Slider fx:id="angle" majorTickUnit="15.0" max="90.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minorTickCount="5" showTickLabels="true" showTickMarks="true" HBox.hgrow="ALWAYS" /> + <Button mnemonicParsing="false" onAction="#fire" style="-fx-background-color: RED;" text="Fire" textAlignment="CENTER"> + <font> + <Font name="System Bold" size="24.0" /> + </font> + <cursor> + <Cursor fx:constant="CROSSHAIR" /> + </cursor> + <opaqueInsets> + <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> + </opaqueInsets> + <HBox.margin> + <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> + </HBox.margin> + </Button> + <Slider fx:id="speed" max="200.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="50.0" minorTickCount="5" showTickLabels="true" showTickMarks="true" value="50.0" HBox.hgrow="ALWAYS" /> + </children> + </HBox> </children> - </HBox> + </VBox> </bottom> <left> <StackPane style="-fx-border-image-width: 3px; -fx-border-style: SOLID;" BorderPane.alignment="CENTER"> diff --git a/src/test/java/jez04/structure/test/AllOfContinue.java b/java2-lab02-v1/src/test/java/jez04/structure/test/AllOfContinue.java similarity index 100% rename from src/test/java/jez04/structure/test/AllOfContinue.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/AllOfContinue.java diff --git a/src/test/java/jez04/structure/test/ClassExist.java b/java2-lab02-v1/src/test/java/jez04/structure/test/ClassExist.java similarity index 100% rename from src/test/java/jez04/structure/test/ClassExist.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/ClassExist.java diff --git a/java2-lab02-v1/src/test/java/jez04/structure/test/ClassStructureTest.java b/java2-lab02-v1/src/test/java/jez04/structure/test/ClassStructureTest.java new file mode 100644 index 0000000..7eb5fb7 --- /dev/null +++ b/java2-lab02-v1/src/test/java/jez04/structure/test/ClassStructureTest.java @@ -0,0 +1,27 @@ +package jez04.structure.test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.hamcrest.Matchers.stringContainsInOrder; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class ClassStructureTest { + + StructureHelper helper = StructureHelper.getInstance(); + +} diff --git a/src/test/java/jez04/structure/test/ContainsInnerClasses.java b/java2-lab02-v1/src/test/java/jez04/structure/test/ContainsInnerClasses.java similarity index 100% rename from src/test/java/jez04/structure/test/ContainsInnerClasses.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/ContainsInnerClasses.java diff --git a/src/test/java/jez04/structure/test/HasMethod.java b/java2-lab02-v1/src/test/java/jez04/structure/test/HasMethod.java similarity index 100% rename from src/test/java/jez04/structure/test/HasMethod.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/HasMethod.java diff --git a/src/test/java/jez04/structure/test/HasProperty.java b/java2-lab02-v1/src/test/java/jez04/structure/test/HasProperty.java similarity index 100% rename from src/test/java/jez04/structure/test/HasProperty.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/HasProperty.java diff --git a/src/test/java/jez04/structure/test/IsDescendatOf.java b/java2-lab02-v1/src/test/java/jez04/structure/test/IsDescendatOf.java similarity index 100% rename from src/test/java/jez04/structure/test/IsDescendatOf.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/IsDescendatOf.java diff --git a/src/test/java/jez04/structure/test/IsInterface.java b/java2-lab02-v1/src/test/java/jez04/structure/test/IsInterface.java similarity index 100% rename from src/test/java/jez04/structure/test/IsInterface.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/IsInterface.java diff --git a/src/test/java/jez04/structure/test/ResourceContains.java b/java2-lab02-v1/src/test/java/jez04/structure/test/ResourceContains.java similarity index 100% rename from src/test/java/jez04/structure/test/ResourceContains.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/ResourceContains.java diff --git a/src/test/java/jez04/structure/test/SrcContains.java b/java2-lab02-v1/src/test/java/jez04/structure/test/SrcContains.java similarity index 100% rename from src/test/java/jez04/structure/test/SrcContains.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/SrcContains.java diff --git a/src/test/java/jez04/structure/test/StructureHelper.java b/java2-lab02-v1/src/test/java/jez04/structure/test/StructureHelper.java similarity index 100% rename from src/test/java/jez04/structure/test/StructureHelper.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/StructureHelper.java diff --git a/src/test/java/jez04/structure/test/StructureMatcher.java b/java2-lab02-v1/src/test/java/jez04/structure/test/StructureMatcher.java similarity index 100% rename from src/test/java/jez04/structure/test/StructureMatcher.java rename to java2-lab02-v1/src/test/java/jez04/structure/test/StructureMatcher.java diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f9a7995..0000000 --- a/pom.xml +++ /dev/null @@ -1,82 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <groupId>vsb-cs-java2</groupId> - <artifactId>java2lab02v1</artifactId> - <version>0.0.1-SNAPHOST</version> - <packaging>jar</packaging> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <maven.compiler.source>21</maven.compiler.source> - <maven.compiler.target>21</maven.compiler.target> - </properties> - <dependencies> - <!-- https://mvnrepository.com/artifact/com.h2database/h2 --> - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <version>2.3.232</version> - </dependency> - - <dependency> - <groupId>org.openjfx</groupId> - <artifactId>javafx-controls</artifactId> - <version>23</version> - </dependency> - <dependency> - <groupId>org.openjfx</groupId> - <artifactId>javafx-fxml</artifactId> - <version>23</version> - </dependency> - <!-- - https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-api</artifactId> - <version>5.11.0</version> - <scope>test</scope> - </dependency> - <!-- - https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-engine</artifactId> - <version>5.11.0</version> - <scope>test</scope> - </dependency> - <!-- - https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-params</artifactId> - <version>5.11.0</version> - <scope>test</scope> - </dependency> - <!-- https://mvnrepository.com/artifact/org.reflections/reflections --> - <dependency> - <groupId>org.reflections</groupId> - <artifactId>reflections</artifactId> - <version>0.10.2</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest</artifactId> - <version>3.0</version> - <scope>test</scope> - </dependency> - </dependencies> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>3.13.0</version> - <configuration> - <failOnError>false</failOnError> - </configuration> - </plugin> - </plugins> - </build> -</project> diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..7a891a7 --- /dev/null +++ b/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd java2-lab02-v1 +java --module-path target/java2-lab02-v1-0.0.1-SNAPHOST.jar:target/libs -m cz.vsb.fei.java2.lab02_module/lab.gui.App +cd .. diff --git a/src/main/java/lab/DataImporter.java b/src/main/java/lab/DataImporter.java deleted file mode 100644 index 735c61e..0000000 --- a/src/main/java/lab/DataImporter.java +++ /dev/null @@ -1,69 +0,0 @@ -package lab; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.regex.MatchResult; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -public class DataImporter { - private static final Pattern personTextPattern = Pattern.compile("\\{[^\\{\\}]*address"); - private static final Pattern firstNamePattern = Pattern.compile("\"firstname\":\"([\\p{IsAlphabetic}']+)\""); - private static final Pattern lastNamePattern = Pattern.compile("\"lastname\":\"([\\p{IsAlphabetic}']+)\""); - private static final Pattern datePattern = Pattern.compile("\"birthday\":\"(\\d{4}-\\d{2}-\\d{2})\""); - private static final DateTimeFormatter czechDate = DateTimeFormatter.ofPattern("dd. MM. YYYY"); - - public static void main(String[] args) { - importPlayers(); - } - - public static void importPlayers() { - List<Person> persons = parseData(downloadText()).stream().map(DataImporter::parsePerson).toList(); - - for (Person person : persons) { - System.out.printf("%s %s (%s): age=%d, 50th: %s , next in: %d%n" - , person.getFirstName(), person.getLastName() - , person.getDayOfBirth().format(czechDate) - , person.getAge() - , person.get50thBirthDay().format(czechDate) - , person.getDaysToBirthday()); - } - } - - public static String downloadText() { - try { - URL url = new URI("https://fakerapi.it/api/v2/persons?_quantity=20").toURL(); - try (InputStream is = url.openStream()) { - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is)); - return bufferedReader.lines().collect(Collectors.joining("\n")); - } - } catch (URISyntaxException | IOException e) { - e.printStackTrace(); - return ""; - } - } - - public static List<String> parseData(String data) { - Matcher matcher = personTextPattern.matcher(data); - return matcher.results().map(MatchResult::group).toList(); - } - - public static Person parsePerson(String personText) { - String firstName = firstNamePattern.matcher(personText).results().map(result -> result.group(1)).findAny() - .orElse(""); - String lastName = lastNamePattern.matcher(personText).results().map(result -> result.group(1)).findAny() - .orElse(""); - LocalDate date = datePattern.matcher(personText).results().map(result -> result.group(1)).map(text -> LocalDate.parse(text, DateTimeFormatter.ISO_DATE)).findAny() - .orElse(LocalDate.EPOCH); - return new Person(firstName, lastName, date); - } -} diff --git a/src/main/java/lab/Person.java b/src/main/java/lab/Person.java deleted file mode 100644 index 3694c1e..0000000 --- a/src/main/java/lab/Person.java +++ /dev/null @@ -1,57 +0,0 @@ -package lab; - -import java.time.Duration; -import java.time.LocalDate; -import java.time.Period; -import java.time.temporal.ChronoUnit; - -public class Person { - - private String firstName; - private String lastName; - private LocalDate dayOfBirth; - - public Person(String firstName, String lastName, LocalDate dayOfBirth) { - super(); - this.firstName = firstName; - this.lastName = lastName; - this.dayOfBirth = dayOfBirth; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getFirstName() { - return firstName; - } - - public LocalDate getDayOfBirth() { - return dayOfBirth; - } - - public int getAge() { - return Period.between(dayOfBirth, LocalDate.now()).getYears(); - } - - public static void main(String[] args) { - Person p = new Person("", "", LocalDate.now().minusDays(3700)); - System.out.println(p.getAge()); - System.out.println(p.getDaysToBirthday()); - } - public LocalDate get50thBirthDay() { - return dayOfBirth.plusYears(50); - } - - public long getDaysToBirthday() { - LocalDate nextBirthday = dayOfBirth.withYear(LocalDate.now().getYear()); - if(nextBirthday.isBefore(LocalDate.now())){ - nextBirthday = nextBirthday.plusYears(1); - } - return ChronoUnit.DAYS.between(LocalDate.now(), nextBirthday); - } -} diff --git a/src/main/java/lab/ScoreStorageFactory.java b/src/main/java/lab/ScoreStorageFactory.java deleted file mode 100644 index 3346de6..0000000 --- a/src/main/java/lab/ScoreStorageFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package lab; - -public class ScoreStorageFactory { - - private static DbConnector instance; - - public static DbConnector getInstance() { - if(instance == null) { - instance = new DbConnector(); - } - return instance; - } -} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java deleted file mode 100644 index 51b9b1c..0000000 --- a/src/main/java/module-info.java +++ /dev/null @@ -1,8 +0,0 @@ -module lab01 { - requires transitive javafx.controls; - requires javafx.fxml; - requires javafx.base; - requires java.sql; - opens lab to javafx.fxml; - exports lab; -} \ No newline at end of file diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java deleted file mode 100644 index 1e4cce5..0000000 --- a/src/test/java/jez04/structure/test/ClassStructureTest.java +++ /dev/null @@ -1,132 +0,0 @@ -package jez04.structure.test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.endsWith; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; -import static org.hamcrest.Matchers.stringContainsInOrder; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URISyntaxException; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.List; - -import org.junit.jupiter.api.Test; - -class ClassStructureTest { - - StructureHelper helper = StructureHelper.getInstance(); - - @Test - void dataImporterTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> c = helper.getClassRegexp(".*Data.*"); - } - - @Test - void dataImporterDownloadTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> d = helper.getClassRegexp(".*Data.*"); - assertThat(d, new HasMethod(".*down.*", String.class).useRegExp(true).caseSensitive(false)); - Method download = helper.getMethod(d, ".*down.*", false, String.class); - String downloadedText = (String) download.invoke(null); - assertThat(downloadedText, allOf( - endsWith("}]}"), - startsWith("{\"status\":\"OK\""), - stringContainsInOrder("firstname"), - stringContainsInOrder("lastname"), - stringContainsInOrder("birthday") - )); - - } - - @Test - void dataImporterParseAllTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> d = helper.getClassRegexp(".*Data.*"); - helper.hasMethod(d, ".*parse.*", false, List.class, String.class); - Method parse = helper.getMethod(d, ".*parse.*", false, List.class, String.class); - List<String> texts = (List<String>) parse.invoke(null, "{\"id\":1,\"firstname\":\"Tatum\",\"lastname\":\"Block\",\"email\":\"lonnie.bergstrom@stoltenberg.com\",\"phone\":\"+12397191764\",\"birthday\":\"1946-11-06\",\"gender\":\"male\",\"address\":{"); - assertThat(texts, not(empty())); - } - - @Test - void personTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist("Person", false, false)); - Class<?> p = helper.getClass("Person", false); - } - - @Test - void dataImporterParsePersonTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> d = helper.getClassRegexp(".*Data.*"); - - assertThat("", new ClassExist("Person", false, false)); - Class<?> p = helper.getClass("Person", false); - helper.hasMethod(d, ".*parse.*", false, p, String.class); - Method parsePerson = helper.getMethod(d, ".*parse.*", false, p, String.class); - Object person = parsePerson.invoke(null, "{\"id\":1,\"firstname\":\"Tatum\",\"lastname\":\"Block\",\"email\":\"lonnie.bergstrom@stoltenberg.com\",\"phone\":\"+12397191764\",\"birthday\":\"1946-11-06\",\"gender\":\"male\",\"address\":{"); - assertThat(person, notNullValue()); - } - - @Test - void personAgeTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> d = helper.getClassRegexp(".*Data.*"); - - assertThat("", new ClassExist("Person", false, false)); - Class<?> p = helper.getClass("Person", false); - helper.hasMethod(d, ".*parse.*", false, p, String.class); - Method parsePerson = helper.getMethod(d, ".*parse.*", false, p, String.class); - Object person = parsePerson.invoke(null, "{\"id\":1,\"firstname\":\"Tatum\",\"lastname\":\"Block\",\"email\":\"lonnie.bergstrom@stoltenberg.com\",\"phone\":\"+12397191764\",\"birthday\":\"1946-11-06\",\"gender\":\"male\",\"address\":{"); - assertThat(person, notNullValue()); - - Method age = helper.getMethod(p, ".*age.*", false, int.class); - int result = (int)age.invoke(person); - assertEquals(78, result , "Calculate wrong age."); - } - - @Test - void person50birthdayTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> d = helper.getClassRegexp(".*Data.*"); - - assertThat("", new ClassExist("Person", false, false)); - Class<?> p = helper.getClass("Person", false); - helper.hasMethod(d, ".*parse.*", false, p, String.class); - Method parsePerson = helper.getMethod(d, ".*parse.*", false, p, String.class); - Object person = parsePerson.invoke(null, "{\"id\":1,\"firstname\":\"Tatum\",\"lastname\":\"Block\",\"email\":\"lonnie.bergstrom@stoltenberg.com\",\"phone\":\"+12397191764\",\"birthday\":\"1946-11-06\",\"gender\":\"male\",\"address\":{"); - assertThat(person, notNullValue()); - - Method birth50 = helper.getMethod(p, ".*50.*", false, LocalDate.class); - LocalDate ldBirth50 = (LocalDate)birth50.invoke(person); - assertEquals(LocalDate.of(1996, 11, 06), ldBirth50 , "Calculate wrong 50th birthday."); - - } - - @Test - void personNextBirthdayTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException { - assertThat("", new ClassExist(".*Data.*", false, true)); - Class<?> d = helper.getClassRegexp(".*Data.*"); - - assertThat("", new ClassExist("Person", false, false)); - Class<?> p = helper.getClass("Person", false); - helper.hasMethod(d, ".*parse.*", false, p, String.class); - Method parsePerson = helper.getMethod(d, ".*parse.*", false, p, String.class); - LocalDate bod =LocalDate.now().plusDays(338).minusYears(10); - Object person = parsePerson.invoke(null, "{\"id\":1,\"firstname\":\"Tatum\",\"lastname\":\"Block\",\"email\":\"lonnie.bergstrom@stoltenberg.com\",\"phone\":\"+12397191764\",\"birthday\":\""+ bod.format(DateTimeFormatter.ISO_DATE) +"\",\"gender\":\"male\",\"address\":{"); - assertThat(person, notNullValue()); - - Method daysM = helper.getMethod(p, ".*days.*", false, long.class); - long days= (long)daysM.invoke(person); - assertEquals(338, days , "Calculate wrong days to next birthday."); - } - -} -- GitLab