diff --git a/src/main/java/lab/App.java b/src/main/java/lab/App.java index 7c60166e57c2302147e706efa2339e890e39430d..9a2c2db85648a36072ae4149a7d08ed00c682f31 100644 --- a/src/main/java/lab/App.java +++ b/src/main/java/lab/App.java @@ -1,5 +1,8 @@ package lab; +import java.io.IOException; +import java.net.URL; + import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -16,6 +19,9 @@ import javafx.stage.WindowEvent; public class App extends Application { private GameController gameController; + + private Stage primaryStage; + public static void main(String[] args) { launch(args); } @@ -23,15 +29,8 @@ public class App extends Application { @Override public void start(Stage primaryStage) { try { - System.out.println(getClass().getResource("/lab/LochNess.gif")); - // Construct a main window with a canvas. - FXMLLoader gameLoader = new FXMLLoader(getClass().getResource("/lab/gameWindow.fxml")); - Parent root = gameLoader.load(); - GameController gameController = gameLoader.getController(); - Scene scene = new Scene(root); - String css = this.getClass().getResource("/lab/application.css").toExternalForm(); - scene.getStylesheets().add(css); - primaryStage.setScene(scene); + this.primaryStage = primaryStage; + switchToMenu(); primaryStage.resizableProperty().set(false); primaryStage.setTitle("Java 1 - 1th laboratory"); primaryStage.show(); @@ -42,9 +41,34 @@ public class App extends Application { } } + public void switchToGame(String name, int numberOfMonsters) throws IOException { + // Construct a main window with a canvas. + FXMLLoader gameLoader = new FXMLLoader(getClass().getResource("/lab/gameWindow.fxml")); + Parent root = gameLoader.load(); + gameController = gameLoader.getController(); + Scene scene = new Scene(root); + URL cssUrl = getClass().getResource("application.css"); + scene.getStylesheets().add(cssUrl.toString()); + primaryStage.setScene(scene); + gameController.startGame(name, numberOfMonsters); + } + private void switchToMenu() throws IOException { + // Construct a main window with a canvas. + FXMLLoader menuLoader = new FXMLLoader(getClass().getResource("/lab/mainScreen.fxml")); + Parent root = menuLoader.load(); + MainScreenController menuController = menuLoader.getController(); + menuController.setApp(this); + Scene scene = new Scene(root); + URL cssUrl = getClass().getResource("application.css"); + scene.getStylesheets().add(cssUrl.toString()); + primaryStage.setScene(scene); + } + @Override public void stop() throws Exception { - gameController.stop(); + if(gameController != null) { + gameController.stop(); + } super.stop(); } diff --git a/src/main/java/lab/Difficult.java b/src/main/java/lab/Difficult.java new file mode 100644 index 0000000000000000000000000000000000000000..6186f2776225b25fed0029b5a39512e3ea6d8149 --- /dev/null +++ b/src/main/java/lab/Difficult.java @@ -0,0 +1,16 @@ +package lab; + +public enum Difficult { + EASY(2), MEDIUM(5), HARD(10); + + private final int numberOfMonsters; + + private Difficult(int numberOfMonsters) { + this.numberOfMonsters = numberOfMonsters; + } + + public int getNumberOfMonsters() { + return numberOfMonsters; + } + +} diff --git a/src/main/java/lab/DrawingThread.java b/src/main/java/lab/DrawingThread.java index 2131dcde1e186f3c5d072ab68f8004ddf565befe..cf32ffe0d802a87a7cfe90f2cf5be072b5b42d59 100644 --- a/src/main/java/lab/DrawingThread.java +++ b/src/main/java/lab/DrawingThread.java @@ -7,7 +7,6 @@ import javafx.scene.paint.Color; public class DrawingThread extends AnimationTimer { - private final Canvas canvas; private final GraphicsContext gc; private Scene scene; private int frameCount = 0; @@ -15,10 +14,9 @@ public class DrawingThread extends AnimationTimer { private long lastTime; private long lastSecond = 0; - public DrawingThread(Canvas canvas) { - this.canvas = canvas; + public DrawingThread(Canvas canvas, Scene scene) { + this.scene = scene; this.gc = canvas.getGraphicsContext2D(); - scene = new Scene(canvas.getWidth(), canvas.getHeight()); lastTime = System.nanoTime(); } @@ -30,6 +28,10 @@ public class DrawingThread extends AnimationTimer { long timeDelta = now - lastTime; scene.draw(gc); scene.simulate(timeDelta); + computeAndShowFps(now, timeDelta); + } + + private void computeAndShowFps(long now, long timeDelta) { long currentSecond = now / 1_000_000_000; if(lastSecond == currentSecond) { frameCount ++; @@ -45,8 +47,4 @@ public class DrawingThread extends AnimationTimer { gc.strokeText(Double.toString(1_000_000_000d/timeDelta), 10, 50); } - public Scene getScene() { - return scene; - } - } diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java index b6c34cde97501ae2fce9e6f6ce9c8e4beb230ea5..6d13ce1ae88e4cc6b3cce01b2f0535498db16013 100644 --- a/src/main/java/lab/GameController.java +++ b/src/main/java/lab/GameController.java @@ -4,54 +4,64 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.geometry.Point2D; import javafx.scene.canvas.Canvas; +import javafx.scene.control.Label; import javafx.scene.control.Slider; public class GameController { + private Scene scene; + @FXML private Slider boatPosition; private DrawingThread timer; - @FXML - private Canvas canvas; + @FXML + private Canvas canvas; - @FXML - private Slider speed; + @FXML + private Slider speed; - @FXML - void changePosition(ActionEvent event) { - timer.getScene().getRock().changePosition(); + @FXML + private Label playerName; - } + @FXML + void changePosition(ActionEvent event) { + scene.getRock().changePosition(); - @FXML - void initialize() { - assert boatPosition != null : "fx:id=\"angle\" was not injected: check your FXML file 'gameWindow.fxml'."; - assert canvas != null : "fx:id=\"canvas\" was not injected: check your FXML file 'gameWindow.fxml'."; - assert speed != null : "fx:id=\"speed\" was not injected: check your FXML file 'gameWindow.fxml'."; - timer = new DrawingThread(canvas); - timer.start(); + } + + @FXML + void initialize() { + assert boatPosition != null : "fx:id=\"angle\" was not injected: check your FXML file 'gameWindow.fxml'."; + assert canvas != null : "fx:id=\"canvas\" was not injected: check your FXML file 'gameWindow.fxml'."; + assert speed != null : "fx:id=\"speed\" was not injected: check your FXML file 'gameWindow.fxml'."; boatPosition.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { - timer.getScene().getBoat().setPosInPercentage(newValue.doubleValue()); + scene.getBoat().setPosInPercentage(newValue.doubleValue()); } }); speed.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { - timer.getScene().getBackground().setSpeed(newValue.doubleValue()); + scene.getBackground().setSpeed(newValue.doubleValue()); } }); - } + } + + public void startGame(String name, int numberOfMonsters) { + playerName.setText(name); + scene = new Scene(canvas.getWidth(), canvas.getHeight(), numberOfMonsters); + timer = new DrawingThread(canvas, scene); + timer.start(); + + } public void stop() { timer.stop(); } - } diff --git a/src/main/java/lab/MainScreenController.java b/src/main/java/lab/MainScreenController.java new file mode 100644 index 0000000000000000000000000000000000000000..0dec5be7b1aa951966086b353c060841bab53d4d --- /dev/null +++ b/src/main/java/lab/MainScreenController.java @@ -0,0 +1,53 @@ +package lab; + +import java.io.IOException; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.RadioButton; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; + +/** + * + */ +public class MainScreenController { + + @FXML + private ToggleGroup difficult; + + @FXML + private ToggleButton easy; + + @FXML + private ToggleButton hard; + + @FXML + private ToggleButton medium; + + @FXML + private TextField name; + + private App app; + + @FXML + void play(ActionEvent event) throws IOException { + Difficult dif = (Difficult)difficult.getSelectedToggle().getProperties().get(Difficult.class); + app.switchToGame(name.getText(), dif.getNumberOfMonsters()); + } + + public void setApp(App app) { + this.app = app; + } + + @FXML + void initialize() { + assert difficult != null : "fx:id=\"difficult\" was not injected: check your FXML file 'mainScreen.fxml'."; + assert name != null : "fx:id=\"name\" was not injected: check your FXML file 'mainScreen.fxml'."; + easy.getProperties().put(Difficult.class, Difficult.EASY); + medium.getProperties().put(Difficult.class, Difficult.MEDIUM); + hard.getProperties().put(Difficult.class, Difficult.HARD); + } + +} diff --git a/src/main/java/lab/Scene.java b/src/main/java/lab/Scene.java index 15cfb208115598a7d5efa2bed28a41af959fa470..0b45059b8aa688226ff075cf41f2c6ec78b0a2c0 100644 --- a/src/main/java/lab/Scene.java +++ b/src/main/java/lab/Scene.java @@ -13,9 +13,9 @@ public class Scene { private Rock rock; private Background background; - public Scene(double width, double height) { + public Scene(double width, double height, int numberOfMonsters) { size = new Dimension2D(width, height); - sceneEntitites = new DrawableSimulable[8]; + sceneEntitites = new DrawableSimulable[3+numberOfMonsters]; background = new Background(this); rock = new Rock(this, new Point2D(300, 300), new Dimension2D(30, 50)); boat = new Boat(this, new Point2D(20, 200)); diff --git a/src/main/resources/lab/application.css b/src/main/resources/lab/application.css index 6b9fb330f149d81344ba2e7edf1381808a377c11..0ef5f16d2f48ec78d47f3fb51574fd4d86e33022 100644 --- a/src/main/resources/lab/application.css +++ b/src/main/resources/lab/application.css @@ -1,6 +1,63 @@ /* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */ -#changeButton { - -fx-background-image: url("LochNess.gif"); +Label { + -fx-font-size: 20.0px; + -fx-padding: 10.0px; + -fx-text-fill: white; + -fx-font-weight: 900; +} + +#name{ + -fx-font-weight: 900; + -fx-font-size: 20.0px; + -fx-padding: 10.0px; + -fx-background-color: RGBA(0.0,0.0,255.0,0.5); + -fx-background-insets:5.0px; +} +#panel { + -fx-background-image:url("game-background.jpg"); + -fx-background-size: stretch; +} +#gamePanel { + -fx-background-color:RGB(0.0,0.0,100.0); +} +#menuPanel { + -fx-background-image:url("lochness-background.jpg"); + -fx-background-size: stretch; +} + +#playButton { + -fx-background-color: RGBA(0.0,0.0,255.0,0.5); +} +#playButton:hover { + -fx-background-color: RGBA(0.0,0.0,255.0,0.5); + -fx-text-fill: white; +} + +.difficultButton .radio{ + visibility: hidden; +} +.difficultButton .dot{ + -fx-background-color: red; +} + +.difficultButton { + -fx-background-color: RGBA(0.0,0.0,100.0,0.8); + -fx-border-color: RGBA(0.0,0.0,100.0,0.8); + -fx-border-width:3px; + -fx-border-radius:30.0px; + -fx-text-fill: white; + -fx-font-size: 20.0px; + -fx-background-radius:30.0px; +} + +.difficultButton:hover{ + -fx-effect: dropshadow(gaussian, rgba(255, 255, 0, 0.7), 50.0, 0.7, 0.0, 0.0); + -fx-background-color : RGBA(50,0,0,0.8); +} + +.difficultButton:selected{ + -fx-background-color : RGBA(0,0,100,0.9); + -fx-border-color:RGBA(255,255,0,0.9); +} -} \ No newline at end of file diff --git a/src/main/resources/lab/gameWindow.fxml b/src/main/resources/lab/gameWindow.fxml index b6bc9fadbec86351a12b2fe8319e858d702075df..bda0678d5628ac2f9529507c95718b8d0f2dc513 100644 --- a/src/main/resources/lab/gameWindow.fxml +++ b/src/main/resources/lab/gameWindow.fxml @@ -4,12 +4,13 @@ <?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.layout.BorderPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.text.Font?> -<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="459.0" prefWidth="824.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> +<BorderPane fx:id="gamePanel" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="491.0" prefWidth="824.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> <bottom> <HBox alignment="TOP_CENTER" prefHeight="66.0" prefWidth="824.0" BorderPane.alignment="CENTER"> <children> @@ -32,7 +33,7 @@ </HBox> </bottom> <center> - <Canvas fx:id="canvas" height="340.0" width="749.0" BorderPane.alignment="CENTER"> + <Canvas fx:id="canvas" height="376.0" width="777.0" BorderPane.alignment="CENTER"> <BorderPane.margin> <Insets /> </BorderPane.margin> @@ -41,4 +42,7 @@ <left> <Slider fx:id="boatPosition" blockIncrement="5.0" majorTickUnit="10.0" max="80.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="20.0" minorTickCount="5" orientation="VERTICAL" prefHeight="331.0" prefWidth="38.0" showTickLabels="true" showTickMarks="true" BorderPane.alignment="CENTER" /> </left> + <top> + <Label fx:id="playerName" text="Label" BorderPane.alignment="CENTER" /> + </top> </BorderPane> diff --git a/src/main/resources/lab/lochness-background.jpg b/src/main/resources/lab/lochness-background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d142b918c7e96d6587b6496acf8317d4fe4f223 Binary files /dev/null and b/src/main/resources/lab/lochness-background.jpg differ diff --git a/src/main/resources/lab/mainScreen.fxml b/src/main/resources/lab/mainScreen.fxml new file mode 100644 index 0000000000000000000000000000000000000000..4f2bc2fa0f4c22443a8f5dc1ba6daaeac0f3bcf9 --- /dev/null +++ b/src/main/resources/lab/mainScreen.fxml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.control.ToggleGroup?> +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.text.Font?> + +<BorderPane fx:id="menuPanel" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.MainScreenController"> + <top> + <HBox prefWidth="200.0" BorderPane.alignment="CENTER"> + <children> + <Label text="Player name:" /> + <TextField fx:id="name" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" promptText="type player name like Java Duke" HBox.hgrow="ALWAYS" /> + </children> + </HBox> + </top> + <bottom> + <Button fx:id="playButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#play" text="Play" BorderPane.alignment="CENTER"> + <font> + <Font name="System Bold" size="51.0" /> + </font></Button> + </bottom> + <center> + <HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER"> + <children> + <RadioButton fx:id="easy" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" styleClass="difficultButton" text="Easy" HBox.hgrow="ALWAYS"> + <toggleGroup> + <ToggleGroup fx:id="difficult" /> + </toggleGroup> + <HBox.margin> + <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" /> + </HBox.margin> + </RadioButton> + <RadioButton fx:id="medium" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" selected="true" styleClass="difficultButton" text="Medium" toggleGroup="$difficult" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" /> + </HBox.margin> + </RadioButton> + <RadioButton fx:id="hard" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" styleClass="difficultButton" text="Hard" toggleGroup="$difficult" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" /> + </HBox.margin> + </RadioButton> + </children> + </HBox> + </center> +</BorderPane> diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java index ff0654d3b929e8e689fe8db89dcadb7e678cbae9..a2bd575d2beeb033060a608037fdd747eb7fa735 100644 --- a/src/test/java/jez04/structure/test/ClassStructureTest.java +++ b/src/test/java/jez04/structure/test/ClassStructureTest.java @@ -3,10 +3,20 @@ package jez04.structure.test; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -26,20 +36,18 @@ import javafx.fxml.FXML; class ClassStructureTest { + Set<String> allClasses = getNameOfAllClasses(); @Test - void hasClassWithPropertyWithFxmlAnnotationTest() { - Set<String> names = getNameOfAllClasses(); - long annotationCount = 0; - for (String name : names) { - Class<?> c = getClass(name); - annotationCount += countPropertyWithAnnotation(c, ".*", FXML.class); - annotationCount += countMethodWithAnnotation(c, ".*", FXML.class); + void printAllclassesTest() { + System.out.println("========================================="); + System.out.println("All detected classes:"); + for (String name : allClasses) { + System.out.println(name); } - assertTrue(annotationCount >= 2, "Only " + annotationCount + " FXML annotation found. Requred atleast 2!"); + System.out.println("========================================="); } - @Test void gameControllerExistenceTest() { classExist("GameController"); @@ -53,6 +61,11 @@ class ClassStructureTest { Class<?> c = getClass("GameController"); hasPropertyWithAnnotation(c, ".*", FXML.class); } + + @Test + void countControllersTest() { + assertTrue(countClassesMatches(".*Controller") > 1, "Only one class named .*Controller found"); + } @Test void gameControllerActionEventTest() { classExist("GameController"); @@ -60,27 +73,18 @@ class ClassStructureTest { hasMethodRegexp(c, ".*", void.class, ActionEvent.class); } - @Test - void backgroundExistenceTest() { - classExist("Background"); - } - @Test - void backgroundExistenceSetAngleTest() { - classExist("Background"); - Class<?> c = getClass("Background"); - hasMethod(c, "setSpeed"); - } - @Test - void backgroundExistenceSetSpeedTest() { - classExist("Background"); - Class<?> c = getClass("Background"); - hasMethod(c, "setSpeed"); - } - private void isInterface(Class<?> c) { assertTrue(c.isInterface(), c.getName() + " have to be interface."); } + + private long countClassesMatches(String nameRegExp) { + return allClasses.stream().filter(c -> c.matches(nameRegExp)).count(); + } + + private List<String> getClassesMatches(String nameRegExp) { + return allClasses.stream().filter(c -> c.matches(nameRegExp)).toList(); + } private void classExist(String name) { assertTrue(allClasses.stream().anyMatch(c -> c.endsWith(name)), "Interface " + name + " not found"); @@ -131,22 +135,6 @@ class ClassStructureTest { "No field " + propertyNameRegexp + " with annotation " + annotation.getName() + " in class " + classDef.getName()); } - private long countPropertyWithAnnotation(Class<?> classDef, String propertyNameRegexp, Class<?> annotation) { - List<Field> fields = Arrays.asList(classDef.getDeclaredFields()); - long propeertyFxmlAnnotationCount = fields.stream().filter(f -> f.getName().matches(propertyNameRegexp)) - .flatMap(f -> Arrays.asList( - f.getAnnotations()).stream()).map(a -> a.annotationType()).filter(a -> - a.equals(annotation)).count(); - return propeertyFxmlAnnotationCount; - } - private long countMethodWithAnnotation(Class<?> classDef, String propertyNameRegexp, Class<?> annotation) { - List<Method> methods = Arrays.asList(classDef.getDeclaredMethods()); - long methodFxmlAnnotationCount = methods.stream().filter(f -> f.getName().matches(propertyNameRegexp)) - .flatMap(m -> Arrays.asList( - m.getAnnotations()).stream()).map(a -> a.annotationType()).filter(a -> - a.equals(annotation)).count(); - return methodFxmlAnnotationCount; - } private void hasMethod(Class<?> interfaceDef, String methodName, Class<?> returnType) { List<Method> methods = Arrays.asList(interfaceDef.getDeclaredMethods()); @@ -212,10 +200,13 @@ class ClassStructureTest { } private Set<String> getNameOfAllClasses() { - List<String> initClassesName = Arrays.asList("lab.Routines", "lab.App", "lab.DrawingThread"); + List<String> initClassesName = new ArrayList<>(); + dynamicaliFoundSomeClass(initClassesName); + initClassesName.addAll(List.of("lab.Routines", "lab.App", "lab.DrawingThread")); for (String className : initClassesName) { try { Class.forName(className); + break; } catch (ClassNotFoundException e) { System.out.println(String.format("Class '%s' cannot be loaded: %s", className, e.getMessage())); } @@ -228,13 +219,67 @@ class ClassStructureTest { || p.getName().startsWith("javassist")) { continue; } + System.out.println(p.getName()); Configuration conf = new ConfigurationBuilder().addScanners(Scanners.SubTypes.filterResultsBy(pc -> true)) .forPackages(p.getName()); Reflections reflections = new Reflections(conf); allClasses.addAll(reflections.getAll(Scanners.SubTypes.filterResultsBy(c -> { + System.out.println(c); return true; }))); } + for (String string : allClasses) { + System.out.println(string); + } return allClasses; } -} \ No newline at end of file + private void dynamicaliFoundSomeClass(List<String> initClassesName) { + URL myClassUrl = ClassStructureTest.class.getResource("ClassStructureTest.class"); + myClassUrl.getFile(); + try { + Path classRoot = Paths.get(myClassUrl.toURI()).getParent().getParent().getParent().getParent(); + if("test-classes".equals(classRoot.getFileName().toString())) { + classRoot = classRoot.getParent().resolve("classes"); + } + System.out.println("class root: " + classRoot); + final Path classRootFinal = classRoot; + Files.walkFileTree(classRoot, new FileVisitor<Path>() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if(List.of("jez04", "META-INF").contains(dir.getFileName().toString())) { + return FileVisitResult.SKIP_SUBTREE; + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + System.out.println("VISIT: " + file); + if("module-info.class".equals(file.getFileName().toString())) { + return FileVisitResult.CONTINUE; + } + if(!file.getFileName().toString().endsWith(".class")) { + return FileVisitResult.CONTINUE; + } + String foundClassName = classRootFinal.relativize(file).toString(); + foundClassName = foundClassName.substring(0, foundClassName.length()-6).replace(File.separatorChar, '.'); + initClassesName.add(foundClassName); + return FileVisitResult.TERMINATE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + }); + } catch (URISyntaxException | IOException e) { + e.printStackTrace(); + } + } +}