From ff16d383d522d523c7ce26e0ba4844f98504c88d Mon Sep 17 00:00:00 2001
From: jez04 <david.jezek@post.cz>
Date: Mon, 11 Nov 2024 03:35:51 +0100
Subject: [PATCH] feat: :tada: solution

---
 src/main/java/cz/vsb/fei/lab/App.java         | 106 ++++++++++++------
 src/main/java/cz/vsb/fei/lab/Score.java       |  39 +++++--
 .../java/cz/vsb/fei/lab/ScoreNotLoaded.java   |  26 +++--
 src/main/java/cz/vsb/fei/lab/Utilities.java   |   4 +-
 .../structure/test/ClassStructureTest.java    |  12 +-
 5 files changed, 126 insertions(+), 61 deletions(-)

diff --git a/src/main/java/cz/vsb/fei/lab/App.java b/src/main/java/cz/vsb/fei/lab/App.java
index a1535ba..5ce92f0 100644
--- a/src/main/java/cz/vsb/fei/lab/App.java
+++ b/src/main/java/cz/vsb/fei/lab/App.java
@@ -1,7 +1,15 @@
 package cz.vsb.fei.lab;
 
+import java.io.BufferedReader;
 import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
 import java.io.Reader;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import lombok.extern.log4j.Log4j2;
@@ -18,57 +26,83 @@ public class App {
 		log.info("Launching Java application.");
 		App app = new App();
 		app.printScores(app.loadScores());
-		/*použijte metody generateScores, saveScores (i pro soubor s adresářem)
-		 * A pro soubory bestScore-ok.csv a bestScores-err.csv vyuĹľijte metodu 
-		 * App.class.getResourceAsStream a loadScoresFromStream*/
-		//TODO
+		List<Score> scores = app.generateScores(200);
+		app.saveScores(scores, "test.csv");
+		app.saveScores(scores, "test/test.csv");
+		try {
+			app.printScores(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScore-ok.csv"))));
+			app.printScores(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv"))));
+		} catch (ScoreNotLoaded e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 
 	}
 
-	/*zajistěte aby metoda vytvořila kolekci objektů Score dle daného počtu*/
 	public List<Score> generateScores(int count) {
-		//TODO
-		return null;
+		List<Score> scores = new ArrayList<Score>();
+		for (int i = 0; i < count; i++) {
+			scores.add(Score.generate());
+		}
+		return scores;
 	}
 
-	/*zajistěte aby se daná kolekce zapsala do souboru ve formátu csv (hodnoty jsou oddělené středníkem nebo čárkou)
-	 * Zajistěte aby se v případě potřeby vytvořili i adresáře uvedené v názvu souboru*/
-	public void saveScores(List<Score> scores, String file) {
-		//TODO
+	public void saveScores(List<Score> scores, String file) throws FileNotFoundException {
+		Paths.get(file).toAbsolutePath().getParent().toFile().mkdirs();
+		try (PrintWriter printWriter = new PrintWriter(file)) {
+			for (Score score : scores) {
+				printWriter.format("%s;%d%n", score.getName(), score.getPoints());
+			}
+		}
 	}
 
-	/*Zajistěte aby metoda vypsala kolekci do konzole*/
 	public void printScores(List<Score> scores) {
-		//TODO
+		for (Score score : scores) {
+			System.out.println(score);
+		}
 	}
 
-	/*zajistěte aby metoda načetla score ze souboru bestScores.csv
-	 * pomocĂ­ metody loadScoresFromFile
-	 * případnou vyjímku odchťte a vypište ji do konzole.
-	 * Metoda v tomto případě bude vracet prázdnou kolekci.
-	 * Otestujte chování metody v případě nenexistujícího souboru.*/
 	public List<Score> loadScores() {
-		//TODO
-		return null;
+		try {
+			List<Score> scores = loadScoresFromFile("bestScores.csv");
+			return scores;
+
+		} catch (ScoreNotLoaded e) {
+			System.out.println("Exception \"" + e.getMessage() + "\". alreaded loaded scores:" + e.getCount());
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return Collections.emptyList();
 	}
 
-	/*Pro daný soubor vytvořte Reader a s využitím metody loadScoresFromStream
-	 * načtěte score. Odchyťte vyjímku ScoreNotLoaded vytvořte novou stejného typu,
-	 * ale to message přidejte název souboru jehož načítání selhalo.
-	 * Ostatní vyjímky předejte výše*/
-	public List<Score> loadScoresFromFile(String filename) {
-		//TODO
-		return null;
+	public List<Score> loadScoresFromFile(String filename) throws ScoreNotLoaded, FileNotFoundException, IOException {
+		try (Reader inputReader = new FileReader(filename)) {
+			return loadScoresFromStream(inputReader);
+		} catch (ScoreNotLoaded e) {
+			throw new ScoreNotLoaded("Info about scores from file " + filename + "cannot be loaded.", e.getCount(), e);
+		}
 	}
 
-	/*Proveďte samotné načtení dat z Readru. Počítejte počet načtených score.
-	 *Pokud řádek obsahuje neplatný počet bodů (NomberFormatException) přeskočte ho a pouze do konzoli vypište 
-	 *informaci o přeskočení řádku.
-	 *V případě jakékoliv jiné chyby/vyjímky (Exception) vytvořte vyjímku ScoreNotLoaded,
-	 *která bude obsahovat i počet již načtených řádků*/
-	public List<Score> loadScoresFromStream(Reader inputReader)  {
-		//TODO
-		return null;
+	public List<Score> loadScoresFromStream(Reader inputReader) throws ScoreNotLoaded {
+		int count = 0;
+		try (BufferedReader bufferedReader = new BufferedReader(inputReader)) {
+			String line;
+			List<Score> scores = new ArrayList<>();
+			while ((line = bufferedReader.readLine()) != null) {
+				String[] parts = line.split(";");
+				try {
+					scores.add(new Score(parts[0], Integer.parseInt(parts[1])));
+					count++;
+				} catch (NumberFormatException e) {
+					System.out.println(
+							String.format("WARNING: Cannot parse points for player %s. Value: %s", parts[0], parts[1]));
+				}
+			}
+			return scores;
+		} catch (Exception e) {
+			throw new ScoreNotLoaded("Info about scores cannot be loaded.", count, e);
+		}
 	}
 
-}
+}
\ No newline at end of file
diff --git a/src/main/java/cz/vsb/fei/lab/Score.java b/src/main/java/cz/vsb/fei/lab/Score.java
index 3a2ae97..21aeab7 100644
--- a/src/main/java/cz/vsb/fei/lab/Score.java
+++ b/src/main/java/cz/vsb/fei/lab/Score.java
@@ -2,12 +2,37 @@ package cz.vsb.fei.lab;
 
 public class Score {
 
-	/*doplňte třídu tak aby měla dva parametry:
-	 * name typu string
-	 * points typu int
-	 * Přidejte get/set metody pro oba parametry
-	 * překryjte metodu toString
-	 * vytvořte statickou metodu generate, která vygeneruje náhodné score s využitím metody Utilities.getRandomNick*/
+	private String name;
+	private int points;
+
+	public Score(String name, int points) {
+		this.name = name;
+		this.points = points;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getPoints() {
+		return points;
+	}
+
+	public void setPoints(int points) {
+		this.points = points;
+	}
+
+	public static Score generate() {
+		return new Score(Utilities.getRandomNick(), Utilities.RANDOM.nextInt(20, 300));
+	}
+
+	@Override
+	public String toString() {
+		return "Score [name=" + name + ", points=" + points + "]";
+	}
 	
-	//TODO
 }
diff --git a/src/main/java/cz/vsb/fei/lab/ScoreNotLoaded.java b/src/main/java/cz/vsb/fei/lab/ScoreNotLoaded.java
index 99af977..7b946e7 100644
--- a/src/main/java/cz/vsb/fei/lab/ScoreNotLoaded.java
+++ b/src/main/java/cz/vsb/fei/lab/ScoreNotLoaded.java
@@ -1,11 +1,23 @@
 package cz.vsb.fei.lab;
 
-public class ScoreNotLoaded  {
-/*Zajistěte aby třída byla vyjímka s konstruktorem se třemi parametry:
- * message typu string
- * count typu int
- * ex tybu Throwable
- * parametry message a ex využijte pro volání konstruktoru předka*/
+public class ScoreNotLoaded extends Exception {
+
+	private static final long serialVersionUID = -3234631445203246158L;
 	
-	//TODO
+	private int count;
+
+	public ScoreNotLoaded(String message, int count) {
+		super(message);
+		this.count = count;
+	}
+
+	public ScoreNotLoaded(String message, int count, Throwable cause) {
+		super(message, cause);
+		this.count = count;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
 }
diff --git a/src/main/java/cz/vsb/fei/lab/Utilities.java b/src/main/java/cz/vsb/fei/lab/Utilities.java
index e176b9d..4cb72f3 100644
--- a/src/main/java/cz/vsb/fei/lab/Utilities.java
+++ b/src/main/java/cz/vsb/fei/lab/Utilities.java
@@ -4,7 +4,7 @@ import java.util.Random;
 
 public class Utilities {
 	public static final Random RANDOM = new Random();
-	public static final String[] nicks = { "CyberSurfer", "PixelPioneer", "SocialSavvy", "DigitalDynamo", "ByteBuddy", "InstaGuru",
+	public static final String[] niks = { "CyberSurfer", "PixelPioneer", "SocialSavvy", "DigitalDynamo", "ByteBuddy", "InstaGuru",
 			"TikTokTornado", "SnapMaster", "TweetTrendsetter", "ChatChampion", "HashtagHero", "EmojiEnthusiast",
 			"StoryStylist", "SelfieStar", "FilterFanatic", "VlogVirtuoso", "Memelord", "InfluencerInsider",
 			"StreamSupreme", "GeekyGizmo", "CodeCommander", "JavaJuggernaut", "ByteNinja", "SyntaxSamurai",
@@ -23,6 +23,6 @@ public class Utilities {
 			"CloudConqueror", "EchoExplorer", "FunctionFanatic", "RobotRanger" };
 	
 	public static String getRandomNick() {
-		return nicks[RANDOM.nextInt(nicks.length)];
+		return niks[RANDOM.nextInt(niks.length)];
 	}
 }
diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java
index 3d40105..d0241bc 100644
--- a/src/test/java/jez04/structure/test/ClassStructureTest.java
+++ b/src/test/java/jez04/structure/test/ClassStructureTest.java
@@ -1,6 +1,5 @@
 package jez04.structure.test;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -43,19 +42,14 @@ class ClassStructureTest {
 		assertTrue(app.generateScores(10).size() == 10);
 	}
 	@Test
-	void loadScoresFromStreamTest() throws Exception {
+	void loadScoresFromStreamTest() throws ScoreNotLoaded {
 		App app = new App();
 		assertTrue(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScore-ok.csv"))).size() > 1);
 	}
 
-	void loadScoresFromStreamExceptionTest() throws Exception {
+	void loadScoresFromStreamExceptionTest() throws ScoreNotLoaded {
 		App app = new App();
-		try {
-			app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv"))).size();
-			fail("Exception not throwen");
-		} catch (Exception e) {
-			assertEquals(e.getClass(), ScoreNotLoaded.class, "Expected exception of type ScoreNotLoaded");
-		}
+		assertThrows(ScoreNotLoaded.class, () -> app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv"))).size() );
 	}
 
 	void loadScoresTest() {
-- 
GitLab