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