From 1c58e61ea691f6970809aa6eaf5223d4b78cb5b6 Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Sun, 5 Oct 2025 15:13:52 -0400 Subject: Added sessions to keep track of current golfer throughout ui --- src/main/java/design/persistence/PersonalDatabase.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src') diff --git a/src/main/java/design/persistence/PersonalDatabase.java b/src/main/java/design/persistence/PersonalDatabase.java index a045d59..886bd0b 100644 --- a/src/main/java/design/persistence/PersonalDatabase.java +++ b/src/main/java/design/persistence/PersonalDatabase.java @@ -8,8 +8,21 @@ public interface PersonalDatabase { PersonalDatabase INSTANCE = new JSONPersonalDatabase("data/personaldb.json"); Golfer[] getGolfers(); + Golfer getGolfer(String name); + void addGolfer(Golfer golfer) throws IOException; + void removeGolfer(Golfer golfer) throws IOException; + void updateGolfer(Golfer golfer) throws IOException; + + default Golfer loadOrCreateGolfer(String username, String fullNameIfNew, String pwIfNew) throws IOException { + Golfer g = getGolfer(username); + if (g != null) + return g; + g = new Golfer(fullNameIfNew, username, pwIfNew); + addGolfer(g); + return g; + } } -- cgit v1.2.3 From 204654ad4a69677e9f38308344760ddb33316758 Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Sun, 5 Oct 2025 15:14:03 -0400 Subject: Added sessions to keep track of current golfer throughout ui --- .../java/design/controller/userinput/Session.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/design/controller/userinput/Session.java (limited to 'src') diff --git a/src/main/java/design/controller/userinput/Session.java b/src/main/java/design/controller/userinput/Session.java new file mode 100644 index 0000000..4de1614 --- /dev/null +++ b/src/main/java/design/controller/userinput/Session.java @@ -0,0 +1,24 @@ +package design.controller.userinput; + +import design.model.Golfer; +import design.persistence.MasterDatabase; +import design.persistence.PersonalDatabase; + +public final class Session { + private Session() { + } + + public static final PersonalDatabase PDB = PersonalDatabase.INSTANCE; + public static final MasterDatabase MDB = MasterDatabase.INSTANCE; + + private static Golfer currentGolfer; + + public static Golfer getCurrentGolfer() { + return currentGolfer; + } + + public static void setCurrentGolfer(Golfer currentGolfer) { + Session.currentGolfer = currentGolfer; + } + +} -- cgit v1.2.3 From 042c456a542a60262e71f694fa21e0dfcfc25f3a Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Sun, 5 Oct 2025 16:42:54 -0400 Subject: Completed HolePlayMenu and basic CourseSelectionMenu, minal updates to other classes --- .../userinput/menus/CourseSelectMenu.java | 50 ++++++++++++ .../controller/userinput/menus/HolePlayMenu.java | 88 ++++++++++++++++++++++ .../controller/userinput/menus/MainMenu.java | 6 +- .../controller/userinput/menus/SelectUser.java | 12 ++- .../design/persistence/JSONPersonalDatabase.java | 8 +- 5 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 src/main/java/design/controller/userinput/menus/CourseSelectMenu.java create mode 100644 src/main/java/design/controller/userinput/menus/HolePlayMenu.java (limited to 'src') diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java new file mode 100644 index 0000000..cf6f4b1 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -0,0 +1,50 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.controller.userinput.Session; +import design.model.Course; +import design.model.Hole; +import design.model.Round; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class CourseSelectMenu extends Menu { + + @Override + public String getTitle() { + return "course select"; + } + + @Override + public List getMenuOptions() { + List opts = new ArrayList<>(); + + // 0) pick course by number TODO: add error checking + opts.add(new MenuOption("pick course by number (1..1000)", a -> { + Scanner sc = new Scanner(System.in); + + System.out.print("Course number (1..1000): "); + int n = Integer.parseInt(sc.nextLine().trim()); + Course c = Session.MDB.getCourse(n - 1); + + System.out.print("Starting hole (1..18, blank=1): "); + String s = sc.nextLine().trim(); + int start = s.isEmpty() ? 1 : Integer.parseInt(s); + + Hole startHole = c.getHoles().get(start - 1); + + Round r = new Round(c, LocalDateTime.now(), startHole); + Session.getCurrentGolfer().addRound(r); + new HolePlayMenu(r).present(); + })); + + // 1) back + opts.add(new MenuOption("back to main menu", a -> new MainMenu().present())); + + return opts; + } +} diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java new file mode 100644 index 0000000..63447e2 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -0,0 +1,88 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.controller.userinput.Session; +import design.model.Club; +import design.model.Round; +import design.model.holeplay.HolePlayContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class HolePlayMenu extends Menu { + + private final Round round; + private final HolePlayContext ctx; + + public HolePlayMenu(Round round) { + this.round = round; + this.ctx = new HolePlayContext(Session.getCurrentGolfer(), round, Session.PDB); + } + + @Override + public String getTitle() { + return String.format("hole play - %s | hole %d", round.getCourse().getName(), + round.getCurrentHole().getNumber()); + } + + @Override + public List getMenuOptions() { + List opts = new ArrayList<>(); + + boolean inSetup = (ctx.getCurrentPlay() == null); + + if (inSetup) { + // 0) Start hole + opts.add(new MenuOption("start hole", (a) -> { + ctx.startHole(); + System.out.println("Started hole " + round.getCurrentHole().getNumber() + "."); + this.present(); + })); + } else { + // 0) Take a shot + opts.add(new MenuOption("take a shot", (a) -> { + // Gets club + Scanner sc = new Scanner(System.in); + System.out.print("Club nickname: "); + String nick = sc.nextLine().trim(); + // Defaulted to Driver for now + // TODO update logic + Club club = new Club("Generic", nick, Club.ClubType.DRIVER); + + // Get shot distance (defaults to 0 of not stated) + System.out.print("Distance (yds, blank=0): "); + String ds = sc.nextLine().trim(); + int dist = 0; + if (!ds.isEmpty()) { + dist = Integer.parseInt(ds); + } + + // Records shot + ctx.recordShot(club, dist); + System.out.println("Shot recorded: " + dist + " yds with " + club.getNickname()); + + this.present(); + })); + + // 1) Hole out + opts.add(new MenuOption("hole out", (a) -> { + // Precedes to next hole + int prev = round.getCurrentHole().getNumber(); + ctx.holeOut(); + System.out.println("Holed out on " + prev + ". Next: " + round.getCurrentHole().getNumber()); + this.present(); + })); + } + + // End round (always shown) + opts.add(new MenuOption("end round", (a) -> { + ctx.endRoundNow(); + System.out.println("Round ended."); + new MainMenu().present(); + })); + + return opts; + } +} diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java index fb3cee9..bbf008e 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -16,8 +16,8 @@ public class MainMenu extends Menu { return List.of( new MenuOption("user settings...", (a) -> new UserSettings().present()), new MenuOption("statistics...", (a) -> new StatisticsMenu().present()), - new MenuOption("log round...", (a) -> {}), - new MenuOption("quit", (a) -> {}) - ); + new MenuOption("log round...", (a) -> new CourseSelectMenu().present()), + new MenuOption("quit", (a) -> { + })); } } diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index 1963f1d..d93e687 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -2,6 +2,7 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import design.controller.userinput.Session; import design.persistence.PersonalDatabase; import java.util.ArrayList; @@ -19,9 +20,14 @@ public class SelectUser extends Menu { @Override public List getMenuOptions() { var l = new ArrayList(); - l.addAll(Arrays.stream(personalDB.getGolfers()) - .map(i -> new MenuOption(i.getUsername(), (a) -> {})).toList()); - l.add(new MenuOption("", (a) -> {})); + // Sets user in Session too + l.addAll(Arrays.stream(personalDB.getGolfers()).map(i -> new MenuOption(i.getUsername(), (a) -> { + Session.setCurrentGolfer(i); + System.out.printf("Loaded user: %s%n", i.getUsername()); + new UserSettings().present(); + })).toList()); + l.add(new MenuOption("", (a) -> { + })); return l; } } diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java index 0efa362..187c2d2 100644 --- a/src/main/java/design/persistence/JSONPersonalDatabase.java +++ b/src/main/java/design/persistence/JSONPersonalDatabase.java @@ -16,6 +16,7 @@ import design.model.Golfer; import java.io.File; import java.io.IOException; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -30,6 +31,8 @@ public class JSONPersonalDatabase implements PersonalDatabase { this.cache = new HashMap<>(); this.mapper = new ObjectMapper(); + mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + SimpleModule module = new SimpleModule(); module.addDeserializer(Course.class, new CourseIdDeserializer()); module.addSerializer(Course.class, new CourseIdSerializer()); @@ -58,9 +61,12 @@ public class JSONPersonalDatabase implements PersonalDatabase { mapper.writer(new CustomPrettyPrinter()).writeValue(file, data); } + // turns that collection into a real array of golfers @Override public Golfer[] getGolfers() { - return new Golfer[0]; + Collection golfers = cache.values(); + Golfer[] array = golfers.toArray(new Golfer[golfers.size()]); + return array; } @Override -- cgit v1.2.3 From c9992d357a0df160c8b577c12bd70338627ef2ce Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Mon, 6 Oct 2025 16:48:53 -0400 Subject: Updated code basied on feed back --- src/main/java/design/controller/userinput/Session.java | 9 --------- .../design/controller/userinput/menus/CourseSelectMenu.java | 13 ++++++++----- .../design/controller/userinput/menus/HolePlayMenu.java | 3 ++- src/main/java/design/persistence/JSONPersonalDatabase.java | 8 ++++---- src/main/java/design/persistence/PersonalDatabase.java | 10 ---------- 5 files changed, 14 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/main/java/design/controller/userinput/Session.java b/src/main/java/design/controller/userinput/Session.java index 4de1614..7fbb786 100644 --- a/src/main/java/design/controller/userinput/Session.java +++ b/src/main/java/design/controller/userinput/Session.java @@ -1,16 +1,8 @@ package design.controller.userinput; import design.model.Golfer; -import design.persistence.MasterDatabase; -import design.persistence.PersonalDatabase; public final class Session { - private Session() { - } - - public static final PersonalDatabase PDB = PersonalDatabase.INSTANCE; - public static final MasterDatabase MDB = MasterDatabase.INSTANCE; - private static Golfer currentGolfer; public static Golfer getCurrentGolfer() { @@ -20,5 +12,4 @@ public final class Session { public static void setCurrentGolfer(Golfer currentGolfer) { Session.currentGolfer = currentGolfer; } - } diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java index cf6f4b1..7cef7fc 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -12,6 +12,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import design.persistence.MasterDatabase; +import design.persistence.PersonalDatabase; + public class CourseSelectMenu extends Menu { @Override @@ -23,13 +26,16 @@ public class CourseSelectMenu extends Menu { public List getMenuOptions() { List opts = new ArrayList<>(); - // 0) pick course by number TODO: add error checking + // 0) back + opts.add(new MenuOption("back to main menu", a -> new MainMenu().present())); + + // 1) pick course by number TODO: add error checking opts.add(new MenuOption("pick course by number (1..1000)", a -> { Scanner sc = new Scanner(System.in); System.out.print("Course number (1..1000): "); int n = Integer.parseInt(sc.nextLine().trim()); - Course c = Session.MDB.getCourse(n - 1); + Course c = MasterDatabase.INSTANCE.getCourse(n - 1); System.out.print("Starting hole (1..18, blank=1): "); String s = sc.nextLine().trim(); @@ -42,9 +48,6 @@ public class CourseSelectMenu extends Menu { new HolePlayMenu(r).present(); })); - // 1) back - opts.add(new MenuOption("back to main menu", a -> new MainMenu().present())); - return opts; } } diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index 63447e2..782b662 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -6,6 +6,7 @@ import design.controller.userinput.Session; import design.model.Club; import design.model.Round; import design.model.holeplay.HolePlayContext; +import design.persistence.PersonalDatabase; import java.util.ArrayList; import java.util.List; @@ -18,7 +19,7 @@ public class HolePlayMenu extends Menu { public HolePlayMenu(Round round) { this.round = round; - this.ctx = new HolePlayContext(Session.getCurrentGolfer(), round, Session.PDB); + this.ctx = new HolePlayContext(Session.getCurrentGolfer(), round, PersonalDatabase.INSTANCE); } @Override diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java index 187c2d2..b034680 100644 --- a/src/main/java/design/persistence/JSONPersonalDatabase.java +++ b/src/main/java/design/persistence/JSONPersonalDatabase.java @@ -31,7 +31,9 @@ public class JSONPersonalDatabase implements PersonalDatabase { this.cache = new HashMap<>(); this.mapper = new ObjectMapper(); - mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // TODO: Once the saved JSON matches the model, consider removing. + // TEMP: tolerate unknown props while the model stabilizes + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); SimpleModule module = new SimpleModule(); module.addDeserializer(Course.class, new CourseIdDeserializer()); @@ -64,9 +66,7 @@ public class JSONPersonalDatabase implements PersonalDatabase { // turns that collection into a real array of golfers @Override public Golfer[] getGolfers() { - Collection golfers = cache.values(); - Golfer[] array = golfers.toArray(new Golfer[golfers.size()]); - return array; + return cache.values().toArray(Golfer[]::new); } @Override diff --git a/src/main/java/design/persistence/PersonalDatabase.java b/src/main/java/design/persistence/PersonalDatabase.java index 886bd0b..428694b 100644 --- a/src/main/java/design/persistence/PersonalDatabase.java +++ b/src/main/java/design/persistence/PersonalDatabase.java @@ -1,7 +1,6 @@ package design.persistence; import design.model.Golfer; - import java.io.IOException; public interface PersonalDatabase { @@ -16,13 +15,4 @@ public interface PersonalDatabase { void removeGolfer(Golfer golfer) throws IOException; void updateGolfer(Golfer golfer) throws IOException; - - default Golfer loadOrCreateGolfer(String username, String fullNameIfNew, String pwIfNew) throws IOException { - Golfer g = getGolfer(username); - if (g != null) - return g; - g = new Golfer(fullNameIfNew, username, pwIfNew); - addGolfer(g); - return g; - } } -- cgit v1.2.3 From b701fc29ee79dc8ceaaaa94e38154c08c13d9b71 Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Mon, 6 Oct 2025 17:22:10 -0400 Subject: Continue skight updates --- src/main/java/design/controller/userinput/menus/MainMenu.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java index bbf008e..c76e61a 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -17,7 +17,6 @@ public class MainMenu extends Menu { new MenuOption("user settings...", (a) -> new UserSettings().present()), new MenuOption("statistics...", (a) -> new StatisticsMenu().present()), new MenuOption("log round...", (a) -> new CourseSelectMenu().present()), - new MenuOption("quit", (a) -> { - })); + new MenuOption("quit", (a) -> {})); } } -- cgit v1.2.3 From 026a61737b9ad7517f1f82ba49d0fe61afac91ff Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Mon, 6 Oct 2025 17:59:49 -0400 Subject: Updated location of Sesion.java --- src/main/java/design/controller/userinput/Session.java | 15 --------------- .../controller/userinput/menus/CourseSelectMenu.java | 3 +-- src/main/java/design/runtime/Session.java | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/design/controller/userinput/Session.java create mode 100644 src/main/java/design/runtime/Session.java (limited to 'src') diff --git a/src/main/java/design/controller/userinput/Session.java b/src/main/java/design/controller/userinput/Session.java deleted file mode 100644 index 7fbb786..0000000 --- a/src/main/java/design/controller/userinput/Session.java +++ /dev/null @@ -1,15 +0,0 @@ -package design.controller.userinput; - -import design.model.Golfer; - -public final class Session { - private static Golfer currentGolfer; - - public static Golfer getCurrentGolfer() { - return currentGolfer; - } - - public static void setCurrentGolfer(Golfer currentGolfer) { - Session.currentGolfer = currentGolfer; - } -} diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java index 7cef7fc..881c393 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -2,7 +2,6 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; -import design.controller.userinput.Session; import design.model.Course; import design.model.Hole; import design.model.Round; @@ -13,7 +12,7 @@ import java.util.List; import java.util.Scanner; import design.persistence.MasterDatabase; -import design.persistence.PersonalDatabase; +import design.runtime.Session; public class CourseSelectMenu extends Menu { diff --git a/src/main/java/design/runtime/Session.java b/src/main/java/design/runtime/Session.java new file mode 100644 index 0000000..fbf4b9c --- /dev/null +++ b/src/main/java/design/runtime/Session.java @@ -0,0 +1,15 @@ +package design.runtime; + +import design.model.Golfer; + +public final class Session { + private static Golfer currentGolfer; + + public static Golfer getCurrentGolfer() { + return currentGolfer; + } + + public static void setCurrentGolfer(Golfer currentGolfer) { + Session.currentGolfer = currentGolfer; + } +} -- cgit v1.2.3 From f142eaeda48822dd595d4c3e07329f462a681aed Mon Sep 17 00:00:00 2001 From: sowgro Date: Mon, 6 Oct 2025 21:56:28 -0400 Subject: update imports --- src/main/java/design/controller/userinput/menus/HolePlayMenu.java | 2 +- src/main/java/design/controller/userinput/menus/SelectUser.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index 782b662..bcd7560 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -2,7 +2,7 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; -import design.controller.userinput.Session; +import design.runtime.Session; import design.model.Club; import design.model.Round; import design.model.holeplay.HolePlayContext; diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index d93e687..2f1a867 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -2,7 +2,7 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; -import design.controller.userinput.Session; +import design.runtime.Session; import design.persistence.PersonalDatabase; import java.util.ArrayList; -- cgit v1.2.3 From 97561886cb2ebc3f71558edd8d2202aa3a0cb03d Mon Sep 17 00:00:00 2001 From: sowgro Date: Mon, 6 Oct 2025 22:14:01 -0400 Subject: fix really bad error handling --- src/main/java/design/controller/userinput/Menu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java index 7677793..605b640 100644 --- a/src/main/java/design/controller/userinput/Menu.java +++ b/src/main/java/design/controller/userinput/Menu.java @@ -21,7 +21,7 @@ public abstract class Menu { try { int i = Integer.parseInt(split[0]); menuOptions.get(i).onCommand(Arrays.copyOfRange(split, 1, split.length)); - } catch (Exception ex) { + } catch (ArrayIndexOutOfBoundsException ex) { System.err.printf("Invalid option \"%s\"\n", line); present(); } -- cgit v1.2.3