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