From f8776e90675f9300bff149fdb63e40ba256dba9d Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Fri, 28 Apr 2023 21:56:23 +0900 Subject: [PATCH 01/61] feat: declare the application object --- src/me/day10/smartstore/SmartStoreApp.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/me/day10/smartstore/SmartStoreApp.java diff --git a/src/me/day10/smartstore/SmartStoreApp.java b/src/me/day10/smartstore/SmartStoreApp.java new file mode 100644 index 00000000..6a38cc56 --- /dev/null +++ b/src/me/day10/smartstore/SmartStoreApp.java @@ -0,0 +1,20 @@ +package me.day10.smartstore; + +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.StartMenu; + +public class SmartStoreApp { + + private static final SmartStoreApp INSTANCE = new SmartStoreApp(); + private SmartStoreApp() {} + public static SmartStoreApp getInstance() { + return INSTANCE; + } + + public SmartStoreApp test() { + return this; + } + + public void run() { + } +} From 2bfe7f6326e23c1e60d12d125947d06a4fa92489 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Fri, 28 Apr 2023 21:56:53 +0900 Subject: [PATCH 02/61] feat: main method --- src/me/day10/smartstore/Main.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/me/day10/smartstore/Main.java diff --git a/src/me/day10/smartstore/Main.java b/src/me/day10/smartstore/Main.java new file mode 100644 index 00000000..8201156c --- /dev/null +++ b/src/me/day10/smartstore/Main.java @@ -0,0 +1,8 @@ +package me.day10.smartstore; + +public class Main { + public static void main(String[] args) { +// SmartStoreApp.test().run(); + SmartStoreApp.getInstance().run(); + } +} From ffbc37413aa8f377d287dd28670528f40afe361d Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 15:17:43 +0900 Subject: [PATCH 03/61] feat: add interface `Menu` --- src/me/day10/smartstore/menu/Menu.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/me/day10/smartstore/menu/Menu.java diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java new file mode 100644 index 00000000..73d654a7 --- /dev/null +++ b/src/me/day10/smartstore/menu/Menu.java @@ -0,0 +1,5 @@ +package me.day10.smartstore.menu; + +public interface Menu { + Menu printAndInputAndGetNextMenu(); +} From b496caea2dfb9a6151b6f2452b53262ecc18121d Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 15:22:49 +0900 Subject: [PATCH 04/61] feat: add class `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/me/day10/smartstore/menu/StartMenu.java diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java new file mode 100644 index 00000000..c7113628 --- /dev/null +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -0,0 +1,13 @@ +package me.day10.smartstore.menu; + +public class StartMenu implements Menu { + + private static final StartMenu INSTANCE = new StartMenu(); + private StartMenu() {} + public static StartMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From 1ce8ffd6d834edee6752865d7f9a9c3b5d748381 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 15:25:11 +0900 Subject: [PATCH 05/61] feat: add class `CustomerMenu` --- src/me/day10/smartstore/menu/CustomerMenu.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/me/day10/smartstore/menu/CustomerMenu.java diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/CustomerMenu.java new file mode 100644 index 00000000..7c99bff5 --- /dev/null +++ b/src/me/day10/smartstore/menu/CustomerMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class CustomerMenu implements Menu { + + private static class InstanceHolder { + private static final CustomerMenu INSTANCE = new CustomerMenu(); + } + private CustomerMenu() {} + public static CustomerMenu getInstance() { return CustomerMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From a3ab7840952d39096950f45b476ced01eab2ea50 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 19:04:47 +0900 Subject: [PATCH 06/61] feat: add class `ClassificationSummary` --- .../menu/ClassificationSummaryMenu.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/me/day10/smartstore/menu/ClassificationSummaryMenu.java diff --git a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java new file mode 100644 index 00000000..2709c58d --- /dev/null +++ b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class ClassificationSummaryMenu implements Menu { + + private static class InstanceHolder { + private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(); + } + private ClassificationSummaryMenu() {} + public static ClassificationSummaryMenu getInstance() { return ClassificationSummaryMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From 86c4e3c436c4e3726ff172dffc9d5e99fb5eccb0 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 19:06:01 +0900 Subject: [PATCH 07/61] feat: add class `GroupMenu` --- src/me/day10/smartstore/menu/GroupMenu.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/me/day10/smartstore/menu/GroupMenu.java diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java new file mode 100644 index 00000000..0f18b1fd --- /dev/null +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class GroupMenu implements Menu { + + private static class InstanceHolder { + private static final GroupMenu INSTANCE = new GroupMenu(); + } + private GroupMenu() {} + public static GroupMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From 323a2404c86b50d80b8e00abafefa9ba45002c40 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 19:06:32 +0900 Subject: [PATCH 08/61] feat: add class `EndMenu` --- src/me/day10/smartstore/menu/EndMenu.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/me/day10/smartstore/menu/EndMenu.java diff --git a/src/me/day10/smartstore/menu/EndMenu.java b/src/me/day10/smartstore/menu/EndMenu.java new file mode 100644 index 00000000..90783cf5 --- /dev/null +++ b/src/me/day10/smartstore/menu/EndMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class EndMenu implements Menu { + + private static class InstanceHolder { + private static final EndMenu INSTANCE = new EndMenu(); + } + private EndMenu() {} + public static EndMenu getInstance() { return EndMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From 5811b4a6e41790a053b193453a1f134456a339e0 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 29 Apr 2023 20:21:54 +0900 Subject: [PATCH 09/61] feat: run() of `SmartStoreApp` --- src/me/day10/smartstore/SmartStoreApp.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/me/day10/smartstore/SmartStoreApp.java b/src/me/day10/smartstore/SmartStoreApp.java index 6a38cc56..b7dc5029 100644 --- a/src/me/day10/smartstore/SmartStoreApp.java +++ b/src/me/day10/smartstore/SmartStoreApp.java @@ -16,5 +16,8 @@ public SmartStoreApp test() { } public void run() { + Menu menu = StartMenu.getInstance(); + while (menu != null) + menu = menu.printAndInputAndGetNextMenu(); } } From 415dc408e7eabefea42b87312154c7ccbc45a5a1 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:27:54 +0900 Subject: [PATCH 10/61] feat: add constant `OUTPUT` of class `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index c7113628..9a531526 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -6,6 +6,16 @@ public class StartMenu implements Menu { private StartMenu() {} public static StartMenu getInstance() { return INSTANCE; } + private static final String OUTPUT = + '\n' + + "==============================" + '\n' + + "1. " + "Group" + '\n' + + "2. " + "Customer Data" + '\n' + + "3. " + "Classification Summary" + '\n' + + "4. " + "Quit" + '\n' + + "==============================" + '\n' + + "Choose One: "; + @Override public Menu printAndInputAndGetNextMenu() { return null; From ed6f25e59f193b01383e4237a6dbd02024ec0cd6 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:44:53 +0900 Subject: [PATCH 11/61] feat: add field `nextMenu` of class `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index 9a531526..01e54764 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -1,5 +1,7 @@ package me.day10.smartstore.menu; +import java.util.InputMismatchException; + public class StartMenu implements Menu { private static final StartMenu INSTANCE = new StartMenu(); @@ -16,6 +18,14 @@ private StartMenu() {} "==============================" + '\n' + "Choose One: "; + private final Menu[] nextMenu = { + null, + GroupMenu.getInstance(), // 1 + CustomerMenu.getInstance(), // 2 + ClassificationSummaryMenu.getInstance(), // 3 + EndMenu.getInstance() // 4 + }; + @Override public Menu printAndInputAndGetNextMenu() { return null; From d40e2ac7e39686a359b41e91d0128ed5ef98b7a4 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:46:16 +0900 Subject: [PATCH 12/61] feat: add skeleton of `printAndInputAndGetNextMenu()` of `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index 01e54764..3f0696fd 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -28,6 +28,18 @@ private StartMenu() {} @Override public Menu printAndInputAndGetNextMenu() { - return null; + while (true) { + try { + print(OUTPUT); + int i = input(); + return nextMenu[i]; + } catch (Exception e) { + // something to do + } + } } + + private void print(String s) {} + + private int input() { return 0; } } From de6d2bd70e3c6432aa58ca06f737dbeddb5c0592 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:46:58 +0900 Subject: [PATCH 13/61] feat: add class `Printer` --- src/me/day10/smartstore/menu/Printer.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/me/day10/smartstore/menu/Printer.java diff --git a/src/me/day10/smartstore/menu/Printer.java b/src/me/day10/smartstore/menu/Printer.java new file mode 100644 index 00000000..7ebfc1ba --- /dev/null +++ b/src/me/day10/smartstore/menu/Printer.java @@ -0,0 +1,22 @@ +package me.day10.smartstore.menu; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.OutputStreamWriter; + +public class Printer { + private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + private static final Printer INSTANCE = new Printer(); + private Printer() {} + public static Printer getInstance() { return INSTANCE; } + + public void print(String str) throws RuntimeException { + try { + bw.write(str); + bw.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} From d9cfd096d5636e589b5e1d247c9893b419fa4f54 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:49:59 +0900 Subject: [PATCH 14/61] feat: add `print()` in `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index 3f0696fd..cb0019c1 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -8,6 +8,7 @@ public class StartMenu implements Menu { private StartMenu() {} public static StartMenu getInstance() { return INSTANCE; } + private static final Printer printer = Printer.getInstance(); private static final String OUTPUT = '\n' + "==============================" + '\n' + @@ -39,7 +40,9 @@ public Menu printAndInputAndGetNextMenu() { } } - private void print(String s) {} + private void print(String s) { + printer.print(s); + } private int input() { return 0; } } From c6d704c4eabaf61c18196f66ac98237b5b5546f7 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:55:50 +0900 Subject: [PATCH 15/61] feat: add class `Reader` --- src/me/day10/smartstore/menu/Reader.java | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/me/day10/smartstore/menu/Reader.java diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/day10/smartstore/menu/Reader.java new file mode 100644 index 00000000..ce2dfe9f --- /dev/null +++ b/src/me/day10/smartstore/menu/Reader.java @@ -0,0 +1,32 @@ +package me.day10.smartstore.menu; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.InputMismatchException; +import java.util.StringTokenizer; + +public class Reader { + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + private static final Reader INSTANCE = new Reader(); + private Reader() {} + public static Reader getInstance() { return INSTANCE; } + + public int inputInteger() throws NumberFormatException { + StringTokenizer st = new StringTokenizer(nextLine()); + try { + return Integer.parseInt(st.nextToken()); + } catch (NumberFormatException e) { + throw new InputMismatchException(); + } + } + + private String nextLine() throws RuntimeException { + try { + return br.readLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} From 4c4b02b2a3a2ef4d022d579e2fc4d758a7868613 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:57:38 +0900 Subject: [PATCH 16/61] feat: implement `input()` of `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index cb0019c1..2fa0daaf 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -8,6 +8,7 @@ public class StartMenu implements Menu { private StartMenu() {} public static StartMenu getInstance() { return INSTANCE; } + private static final Reader reader = Reader.getInstance(); private static final Printer printer = Printer.getInstance(); private static final String OUTPUT = '\n' + @@ -44,5 +45,10 @@ private void print(String s) { printer.print(s); } - private int input() { return 0; } + private int input() throws InputMismatchException, Exception { + int ret = reader.inputInteger(); + if (ret <= 0 || ret >= nextMenu.length) + throw new Exception("Invalid Menu Input." + " Please try again.\n"); + return ret; + } } From a5a454c5a256015dd17e107bb53b0b4dfd283acf Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 14:59:15 +0900 Subject: [PATCH 17/61] refactor: modify the exeption handling logic of `printAndInputAndGetNextMenu()` of `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index 2fa0daaf..d10d1b13 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -35,8 +35,10 @@ public Menu printAndInputAndGetNextMenu() { print(OUTPUT); int i = input(); return nextMenu[i]; + } catch (InputMismatchException e) { + print("Invalid Format for Input." + " Please try again.\n"); } catch (Exception e) { - // something to do + print(e.getMessage()); } } } From 7cbae1b78a0bc3ee4dd2e2bb7d169c70fb66bbb1 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 15:00:18 +0900 Subject: [PATCH 18/61] feat: add class `InvalidMenuException` --- src/me/day10/smartstore/menu/InvalidMenuException.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/me/day10/smartstore/menu/InvalidMenuException.java diff --git a/src/me/day10/smartstore/menu/InvalidMenuException.java b/src/me/day10/smartstore/menu/InvalidMenuException.java new file mode 100644 index 00000000..9cac28e5 --- /dev/null +++ b/src/me/day10/smartstore/menu/InvalidMenuException.java @@ -0,0 +1,8 @@ +package me.day10.smartstore.menu; + +public class InvalidMenuException extends Exception { + + public InvalidMenuException(String s) { + super(s); + } +} From 9146a5f81a5b5410097ec18eebc64daa72f62762 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 15:01:22 +0900 Subject: [PATCH 19/61] refactor: use `InvalidMenuException` in `StartMenu` --- src/me/day10/smartstore/menu/StartMenu.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index d10d1b13..73ad7854 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -37,7 +37,7 @@ public Menu printAndInputAndGetNextMenu() { return nextMenu[i]; } catch (InputMismatchException e) { print("Invalid Format for Input." + " Please try again.\n"); - } catch (Exception e) { + } catch (InvalidMenuException e) { print(e.getMessage()); } } @@ -47,10 +47,10 @@ private void print(String s) { printer.print(s); } - private int input() throws InputMismatchException, Exception { + private int input() throws InputMismatchException, InvalidMenuException { int ret = reader.inputInteger(); if (ret <= 0 || ret >= nextMenu.length) - throw new Exception("Invalid Menu Input." + " Please try again.\n"); + throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); return ret; } } From 799d7b3329b278991feef6cee302db7147abf054 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 15:02:52 +0900 Subject: [PATCH 20/61] refactor: move the messege for `InputMismatchException` from `StartMenu` to `Reader` --- src/me/day10/smartstore/menu/Reader.java | 2 +- src/me/day10/smartstore/menu/StartMenu.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/day10/smartstore/menu/Reader.java index ce2dfe9f..20e56987 100644 --- a/src/me/day10/smartstore/menu/Reader.java +++ b/src/me/day10/smartstore/menu/Reader.java @@ -18,7 +18,7 @@ public int inputInteger() throws NumberFormatException { try { return Integer.parseInt(st.nextToken()); } catch (NumberFormatException e) { - throw new InputMismatchException(); + throw new InputMismatchException("Invalid Format for Input." + " Please try again.\n"); } } diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index 73ad7854..c583d453 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -35,9 +35,7 @@ public Menu printAndInputAndGetNextMenu() { print(OUTPUT); int i = input(); return nextMenu[i]; - } catch (InputMismatchException e) { - print("Invalid Format for Input." + " Please try again.\n"); - } catch (InvalidMenuException e) { + } catch (InputMismatchException | InvalidMenuException e) { print(e.getMessage()); } } From 886d3f1e0e5d09eed5129e6d74ec57112f7e7104 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 15:05:18 +0900 Subject: [PATCH 21/61] feat: implement `printAndInputAndGetNextMenu()` of `EndMenu` --- src/me/day10/smartstore/menu/EndMenu.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/me/day10/smartstore/menu/EndMenu.java b/src/me/day10/smartstore/menu/EndMenu.java index 90783cf5..611233e5 100644 --- a/src/me/day10/smartstore/menu/EndMenu.java +++ b/src/me/day10/smartstore/menu/EndMenu.java @@ -10,6 +10,7 @@ private EndMenu() {} @Override public Menu printAndInputAndGetNextMenu() { + Printer.getInstance().print("\nProgram Finished.\n"); return null; } } From 99f584a3ece2c4952a9c983233abd396746501bf Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 15:43:19 +0900 Subject: [PATCH 22/61] feat: implement the skeleton of `GroupMenu` --- src/me/day10/smartstore/menu/GroupMenu.java | 30 ++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java index 0f18b1fd..2ea12ce9 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -8,8 +8,36 @@ private static class InstanceHolder { private GroupMenu() {} public static GroupMenu getInstance() { return InstanceHolder.INSTANCE; } + private static final String OUTPUT = + '\n' + + "==========Group Menu==========" + '\n' + + "1. " + "Set Parameter" + '\n' + + "2. " + "View Parameter" + '\n' + + "3. " + "Update Parameter" + '\n' + + "4. " + "Back" + '\n' + + "==============================" + '\n' + + "Choose One: "; + + private final Menu[] nextMenu = { + null, + }; + @Override public Menu printAndInputAndGetNextMenu() { - return null; + while (true) { + try { + print(OUTPUT); + int menu = inputMenu(); + return nextMenu[menu]; + } catch (Exception e) { + print(e.getMessage()); + } + } + } + + private void print(String s) {} + + private int inputMenu() { + return 0; } } From b3c325ae8e691cc84ea4af0dda2d83614aa35058 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 20:53:54 +0900 Subject: [PATCH 23/61] feat: implement class `GroupMenu` --- src/me/day10/smartstore/menu/GroupMenu.java | 27 ++++++++++++++----- .../smartstore/menu/SetParameterMenu.java | 15 +++++++++++ .../smartstore/menu/UpdateParameterMenu.java | 15 +++++++++++ .../smartstore/menu/ViewParameterMenu.java | 15 +++++++++++ 4 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/me/day10/smartstore/menu/SetParameterMenu.java create mode 100644 src/me/day10/smartstore/menu/UpdateParameterMenu.java create mode 100644 src/me/day10/smartstore/menu/ViewParameterMenu.java diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java index 2ea12ce9..8cf5fab6 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -1,5 +1,7 @@ package me.day10.smartstore.menu; +import java.util.InputMismatchException; + public class GroupMenu implements Menu { private static class InstanceHolder { @@ -8,7 +10,9 @@ private static class InstanceHolder { private GroupMenu() {} public static GroupMenu getInstance() { return InstanceHolder.INSTANCE; } - private static final String OUTPUT = + private static final Reader reader = Reader.getInstance(); + private static final Printer printer = Printer.getInstance(); + private static final String MENU_OUTPUT = '\n' + "==========Group Menu==========" + '\n' + "1. " + "Set Parameter" + '\n' + @@ -20,24 +24,33 @@ private GroupMenu() {} private final Menu[] nextMenu = { null, + SetParameterMenu.getInstance(), // 1 + ViewParameterMenu.getInstance(), // 2 + UpdateParameterMenu.getInstance(), // 3 + null, // 4 (StartMenu 순환 의존) }; @Override public Menu printAndInputAndGetNextMenu() { while (true) { try { - print(OUTPUT); + print(MENU_OUTPUT); int menu = inputMenu(); - return nextMenu[menu]; - } catch (Exception e) { + return (menu == 4) ? StartMenu.getInstance() : nextMenu[menu]; + } catch (InputMismatchException | InvalidMenuException e) { print(e.getMessage()); } } } - private void print(String s) {} + private void print(String s) { + printer.print(s); + } - private int inputMenu() { - return 0; + private int inputMenu() throws InputMismatchException, InvalidMenuException { + int i = reader.inputInteger(); + if (i <= 0 || i >= nextMenu.length) + throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); + return i; } } diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java new file mode 100644 index 00000000..7acd0378 --- /dev/null +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class SetParameterMenu implements Menu { + + private static class InstanceHolder { + private static final SetParameterMenu INSTANCE = new SetParameterMenu(); + } + private SetParameterMenu() {} + public static SetParameterMenu getInstance() { return SetParameterMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} diff --git a/src/me/day10/smartstore/menu/UpdateParameterMenu.java b/src/me/day10/smartstore/menu/UpdateParameterMenu.java new file mode 100644 index 00000000..1d07ac03 --- /dev/null +++ b/src/me/day10/smartstore/menu/UpdateParameterMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class UpdateParameterMenu implements Menu { + + private static class InstanceHolder { + private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); + } + private UpdateParameterMenu() {} + public static UpdateParameterMenu getInstance() { return UpdateParameterMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java new file mode 100644 index 00000000..9bf2df60 --- /dev/null +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class ViewParameterMenu implements Menu { + + private static class InstanceHolder { + private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); + } + private ViewParameterMenu() {} + public static ViewParameterMenu getInstance() { return ViewParameterMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From 48da62aab3dd27be8ef1c442cc2f990dcd815f49 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 21:04:44 +0900 Subject: [PATCH 24/61] feat: add classes `GroupType` and `GroupTypeParameter` --- src/me/day10/smartstore/group/GroupType.java | 26 +++++++++++++++++++ .../smartstore/group/GroupTypeParameter.java | 17 ++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/me/day10/smartstore/group/GroupType.java create mode 100644 src/me/day10/smartstore/group/GroupTypeParameter.java diff --git a/src/me/day10/smartstore/group/GroupType.java b/src/me/day10/smartstore/group/GroupType.java new file mode 100644 index 00000000..ded13e7a --- /dev/null +++ b/src/me/day10/smartstore/group/GroupType.java @@ -0,0 +1,26 @@ +package me.day10.smartstore.group; + +public enum GroupType { + + GENERAL("G", null), + VIP("V", null), + VVIP("VV", null); + + GroupType(String shortcut, GroupTypeParameter groupTypeParameter) { + this.shortcut = shortcut; + this.groupTypeParameter = groupTypeParameter; + } + + private final GroupTypeParameter groupTypeParameter; + private final String shortcut; + + public String getShortcut() { + return this.shortcut; + } + + @Override + public String toString() { + return "\nGroupType: " + this.name() + '\n' + + "Parameter: " + this.groupTypeParameter + '\n'; + } +} diff --git a/src/me/day10/smartstore/group/GroupTypeParameter.java b/src/me/day10/smartstore/group/GroupTypeParameter.java new file mode 100644 index 00000000..f70e7758 --- /dev/null +++ b/src/me/day10/smartstore/group/GroupTypeParameter.java @@ -0,0 +1,17 @@ +package me.day10.smartstore.group; + +public class GroupTypeParameter { + int minSpentTime; + int minTotalPaid; + + public GroupTypeParameter(int minSpentTime, int minTotalPaid) { + this.minSpentTime = minSpentTime; + this.minTotalPaid = minTotalPaid; + } + + @Override + public String toString() { + return String.format("Parameter{minSpentTime=%d, minTotalPaid=%d}", + minSpentTime, minTotalPaid); + } +} From cdaab8eaf4aae4112c2885eddbbf06f188430145 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 22:46:15 +0900 Subject: [PATCH 25/61] feat: add `inputString()` in `Reader` --- src/me/day10/smartstore/menu/Reader.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/day10/smartstore/menu/Reader.java index 20e56987..8a77b494 100644 --- a/src/me/day10/smartstore/menu/Reader.java +++ b/src/me/day10/smartstore/menu/Reader.java @@ -22,6 +22,11 @@ public int inputInteger() throws NumberFormatException { } } + public String inputString() { + StringTokenizer st = new StringTokenizer(nextLine()); + return st.nextToken(); + } + private String nextLine() throws RuntimeException { try { return br.readLine(); From 3981b3bbea8c605a2a1158f348a6232e95dd4752 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 22:46:56 +0900 Subject: [PATCH 26/61] fix: `inputInteger()` of `Reader` throws `NumberFormatException` -> `InputMisMatchException` --- src/me/day10/smartstore/menu/Reader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/day10/smartstore/menu/Reader.java index 8a77b494..475e83ef 100644 --- a/src/me/day10/smartstore/menu/Reader.java +++ b/src/me/day10/smartstore/menu/Reader.java @@ -13,7 +13,7 @@ public class Reader { private Reader() {} public static Reader getInstance() { return INSTANCE; } - public int inputInteger() throws NumberFormatException { + public int inputInteger() throws InputMismatchException { StringTokenizer st = new StringTokenizer(nextLine()); try { return Integer.parseInt(st.nextToken()); From 290fb30e63531260d1edaa535e94aa8941dfc44e Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 22:49:32 +0900 Subject: [PATCH 27/61] feat: new class `BackMenuException` --- src/me/day10/smartstore/menu/BackMenuException.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/me/day10/smartstore/menu/BackMenuException.java diff --git a/src/me/day10/smartstore/menu/BackMenuException.java b/src/me/day10/smartstore/menu/BackMenuException.java new file mode 100644 index 00000000..668f146b --- /dev/null +++ b/src/me/day10/smartstore/menu/BackMenuException.java @@ -0,0 +1,8 @@ +package me.day10.smartstore.menu; + +public class BackMenuException extends Exception { + + public BackMenuException(String s) { + super(s); + } +} From 7addb20eb3ef02d9e43b0ce21aa3517268bcdca4 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 22:50:02 +0900 Subject: [PATCH 28/61] feat: implement class `ViewParameterMenu` --- .../smartstore/menu/ViewParameterMenu.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index 9bf2df60..41850e4d 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -1,5 +1,9 @@ package me.day10.smartstore.menu; +import me.day10.smartstore.group.GroupType; + +import java.util.Arrays; + public class ViewParameterMenu implements Menu { private static class InstanceHolder { @@ -8,8 +12,40 @@ private static class InstanceHolder { private ViewParameterMenu() {} public static ViewParameterMenu getInstance() { return ViewParameterMenu.InstanceHolder.INSTANCE; } + private static final Reader reader = Reader.getInstance(); + private static final Printer printer = Printer.getInstance(); + private static final String GROUP_OUTPUT = + "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + + "** Press 'end', if you want to exit! **\n"; + @Override public Menu printAndInputAndGetNextMenu() { - return null; + while (true) { + print(GROUP_OUTPUT); + try { + String groupName = InputGroupName(); + GroupType groupType = Arrays.stream(GroupType.values()) + .filter(t -> t.getShortcut().equals(groupName) || t.name().equals(groupName)) + .findAny() + .orElseThrow(IllegalArgumentException::new); + print(groupType.toString()); + } catch (BackMenuException e) { + print(e.getMessage()); + return GroupMenu.getInstance(); + } catch (IllegalArgumentException e) { + print("\nInvalid Group Name for Input. Please try again.\n"); + } + } + } + + private void print(String s) { + printer.print(s); + } + + private String InputGroupName() throws BackMenuException { + String s = reader.inputString().toUpperCase(); + if (s.equals("END")) + throw new BackMenuException("'end' is pressed. Exit this menu.\n"); + return s; } } From 35c6bc2558d038bc4df252c0a6149958209ec749 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 22:53:35 +0900 Subject: [PATCH 29/61] refactor: new class 'InvalidGroupTypeException' --- .../day10/smartstore/menu/InvalidGroupTypeException.java | 8 ++++++++ src/me/day10/smartstore/menu/ViewParameterMenu.java | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/me/day10/smartstore/menu/InvalidGroupTypeException.java diff --git a/src/me/day10/smartstore/menu/InvalidGroupTypeException.java b/src/me/day10/smartstore/menu/InvalidGroupTypeException.java new file mode 100644 index 00000000..e77fa663 --- /dev/null +++ b/src/me/day10/smartstore/menu/InvalidGroupTypeException.java @@ -0,0 +1,8 @@ +package me.day10.smartstore.menu; + +public class InvalidGroupTypeException extends Exception { + + public InvalidGroupTypeException(String s) { + super(s); + } +} diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index 41850e4d..ae619e93 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -27,13 +27,13 @@ public Menu printAndInputAndGetNextMenu() { GroupType groupType = Arrays.stream(GroupType.values()) .filter(t -> t.getShortcut().equals(groupName) || t.name().equals(groupName)) .findAny() - .orElseThrow(IllegalArgumentException::new); + .orElseThrow(() -> new InvalidGroupTypeException("\nInvalid Group Name for Input. Please try again.\n")); print(groupType.toString()); } catch (BackMenuException e) { print(e.getMessage()); return GroupMenu.getInstance(); - } catch (IllegalArgumentException e) { - print("\nInvalid Group Name for Input. Please try again.\n"); + } catch (InvalidGroupTypeException e) { + print(e.getMessage()); } } } From d5a167e6d4afb8e9f65ef58173f6c9a7c6955225 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 1 May 2023 22:56:22 +0900 Subject: [PATCH 30/61] refactor: extract method `getGroupTypeByString(String)` from `printAndInputAndGetNextMenu()` of `ViewParameterMenu` --- src/me/day10/smartstore/group/GroupType.java | 15 +++++++++++++-- .../day10/smartstore/menu/ViewParameterMenu.java | 5 +---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/me/day10/smartstore/group/GroupType.java b/src/me/day10/smartstore/group/GroupType.java index ded13e7a..75850b2a 100644 --- a/src/me/day10/smartstore/group/GroupType.java +++ b/src/me/day10/smartstore/group/GroupType.java @@ -1,5 +1,9 @@ package me.day10.smartstore.group; +import me.day10.smartstore.menu.InvalidGroupTypeException; + +import java.util.Arrays; + public enum GroupType { GENERAL("G", null), @@ -14,8 +18,15 @@ public enum GroupType { private final GroupTypeParameter groupTypeParameter; private final String shortcut; - public String getShortcut() { - return this.shortcut; + public static GroupType getGroupTypeByString(String s) throws InvalidGroupTypeException { + return Arrays.stream(GroupType.values()) + .filter(groupType -> groupType.isName(s)) + .findAny() + .orElseThrow(() -> new InvalidGroupTypeException("\nInvalid Group Name for Input. Please try again.\n")); + } + + private boolean isName(String s) { + return (this.shortcut.equals(s) || this.name().equals(s)); } @Override diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index ae619e93..3b5f7639 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -24,10 +24,7 @@ public Menu printAndInputAndGetNextMenu() { print(GROUP_OUTPUT); try { String groupName = InputGroupName(); - GroupType groupType = Arrays.stream(GroupType.values()) - .filter(t -> t.getShortcut().equals(groupName) || t.name().equals(groupName)) - .findAny() - .orElseThrow(() -> new InvalidGroupTypeException("\nInvalid Group Name for Input. Please try again.\n")); + GroupType groupType = GroupType.getGroupTypeByString(groupName); print(groupType.toString()); } catch (BackMenuException e) { print(e.getMessage()); From 797fb6eac5f198799e8622f69929b3a981ef59be Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Wed, 3 May 2023 21:37:03 +0900 Subject: [PATCH 31/61] =?UTF-8?q?=3D=3D=3D=3D=3D=3D=20=EC=9D=B4=EC=A0=9C?= =?UTF-8?q?=EB=B6=80=ED=84=B0=20`merge=20--squash`=EB=A5=BC=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=A9=EB=8B=88=EB=8B=A4=3D=3D=3D=3D=3D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 커밋이 다소 지저분해지는 감이 있습니다. 앞으로는 기능별로 브랜치를 만들고 제출 브랜치로 병합할 때 스쿼시 옵션을 적극 활용하겠습니다. --- src/me/day10/smartstore/use_merge_squash | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/me/day10/smartstore/use_merge_squash diff --git a/src/me/day10/smartstore/use_merge_squash b/src/me/day10/smartstore/use_merge_squash new file mode 100644 index 00000000..5dfc25bf --- /dev/null +++ b/src/me/day10/smartstore/use_merge_squash @@ -0,0 +1 @@ +use `merge --squash` from now on From ef80e791cd25c7b784e2b29ba8cf7a79c659143f Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Wed, 3 May 2023 23:42:52 +0900 Subject: [PATCH 32/61] feat: implement class `SetParameterMenu` --- src/me/day10/smartstore/group/GroupType.java | 15 ++- .../smartstore/group/GroupTypeParameter.java | 11 +- .../smartstore/menu/SetParameterMenu.java | 112 +++++++++++++++++- 3 files changed, 131 insertions(+), 7 deletions(-) diff --git a/src/me/day10/smartstore/group/GroupType.java b/src/me/day10/smartstore/group/GroupType.java index 75850b2a..b53449be 100644 --- a/src/me/day10/smartstore/group/GroupType.java +++ b/src/me/day10/smartstore/group/GroupType.java @@ -6,9 +6,9 @@ public enum GroupType { - GENERAL("G", null), - VIP("V", null), - VVIP("VV", null); + GENERAL("G", new GroupTypeParameter()), + VIP("V", new GroupTypeParameter()), + VVIP("VV", new GroupTypeParameter()); GroupType(String shortcut, GroupTypeParameter groupTypeParameter) { this.shortcut = shortcut; @@ -29,6 +29,15 @@ private boolean isName(String s) { return (this.shortcut.equals(s) || this.name().equals(s)); } + public GroupTypeParameter getGroupTypeParameter() { + return this.groupTypeParameter; + } + + public void setGroupTypeParameter(Integer minSpentTime, Integer minTotalPaid) { + this.groupTypeParameter.setMinSpentTime(minSpentTime); + this.groupTypeParameter.setMinTotalPaid(minTotalPaid); + } + @Override public String toString() { return "\nGroupType: " + this.name() + '\n' diff --git a/src/me/day10/smartstore/group/GroupTypeParameter.java b/src/me/day10/smartstore/group/GroupTypeParameter.java index f70e7758..2e4fb276 100644 --- a/src/me/day10/smartstore/group/GroupTypeParameter.java +++ b/src/me/day10/smartstore/group/GroupTypeParameter.java @@ -1,11 +1,16 @@ package me.day10.smartstore.group; public class GroupTypeParameter { - int minSpentTime; - int minTotalPaid; + private Integer minSpentTime; + private Integer minTotalPaid; - public GroupTypeParameter(int minSpentTime, int minTotalPaid) { + public GroupTypeParameter() {} + + public void setMinSpentTime(Integer minSpentTime) { this.minSpentTime = minSpentTime; + } + + public void setMinTotalPaid(Integer minTotalPaid) { this.minTotalPaid = minTotalPaid; } diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java index 7acd0378..07a2396c 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -1,5 +1,9 @@ package me.day10.smartstore.menu; +import me.day10.smartstore.group.GroupType; + +import java.util.InputMismatchException; + public class SetParameterMenu implements Menu { private static class InstanceHolder { @@ -8,8 +12,114 @@ private static class InstanceHolder { private SetParameterMenu() {} public static SetParameterMenu getInstance() { return SetParameterMenu.InstanceHolder.INSTANCE; } + private static final Reader reader = Reader.getInstance(); + private static final Printer printer = Printer.getInstance(); + private static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; + private static final String GROUP_OUTPUT = + '\n' + + "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + + END_INPUT; + + private static final String GROUP_SET_PARAMETER_OUTPUT = + "===== Set Group Parameter ====\n" + + " 1. Minimum Spent Time\n" + + " 2. Minimum Total Paid\n" + + " 3. Back\n" + + "==============================\n" + + "Choose One: "; + + private static final String MIN_SPENT_TIME_INPUT = + "\n" + + "Input Minimum Spent Time: \n" + + END_INPUT; + + private static final String MIN_TOTAL_PAID_INPUT = + "\n" + + "Input Minimum Total Paid: \n" + + END_INPUT; + + private static final Menu nextMenu[] = { + null, + null, // read minSpentTime + null, // read minTotalPaid + null // Back => GroupMenu + }; + @Override public Menu printAndInputAndGetNextMenu() { - return null; + Menu backMenu = GroupMenu.getInstance(); + while (true) { + print(GROUP_OUTPUT); + try { + String groupName = inputGroupName(); + GroupType groupType = GroupType.getGroupTypeByString(groupName); + print(groupType); + + Integer minSpentTime = null; + Integer minTotalPaid = null; + while (true) { + print(GROUP_SET_PARAMETER_OUTPUT); + try { + int menu = inputMenu(); + + if (menu == 1) { + print(MIN_SPENT_TIME_INPUT); + minSpentTime = inputIntegerOrEnd(); + } else if (menu == 2) { + print(MIN_TOTAL_PAID_INPUT); + minTotalPaid = inputIntegerOrEnd(); + } else { + groupType.setGroupTypeParameter(minSpentTime, minTotalPaid); + break; + } + } catch (InvalidMenuException | InputMismatchException e) { + print(e.getMessage()); + } catch (BackMenuException e) { + print(e.getMessage()); + break; + } + } + } catch (InvalidGroupTypeException e) { + print(e.getMessage()); + } catch (BackMenuException e) { + return backMenu; + } + } + } + + private void print(Object s) { + printer.print(s.toString()); + } + + private String inputGroupName() throws BackMenuException { + String s = reader.inputString().toUpperCase(); + checkIfInputIsEnd(s); + return s; + } + + private int inputMenu() throws InvalidMenuException { + int i = reader.inputInteger(); + if (i <= 0 || i >= nextMenu.length) + throw new InvalidMenuException("\nInvalid Menu for Input. Please try again.\n"); + return i; + } + + private Integer inputIntegerOrEnd() throws BackMenuException { + String s = reader.inputString().toUpperCase(); + checkIfInputIsEnd(s); + + try { + int i = Integer.parseInt(s); + if (i < 0) + throw new InputMismatchException("Invalid Input. Please try again.\n"); + return i; + } catch (NumberFormatException e) { + throw new InputMismatchException("Invalid Format for Input. Please try again.\n"); + } + } + + private void checkIfInputIsEnd(String s) throws BackMenuException { + if (s.equals("END")) + throw new BackMenuException("'end' is pressed. Exit this menu.\n\n"); } } From 9e9ca4eed57fdfc79306309c87f14e5dafb31cc3 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 18:01:58 +0900 Subject: [PATCH 33/61] feat: implement `CustomerMenu` --- .../smartstore/menu/AddCustomerMenu.java | 15 ++++++ .../day10/smartstore/menu/CustomerMenu.java | 46 ++++++++++++++++++- .../smartstore/menu/DeleteCustomerMenu.java | 15 ++++++ .../smartstore/menu/UpdateCustomerMenu.java | 15 ++++++ .../smartstore/menu/ViewCustomerMenu.java | 15 ++++++ 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/me/day10/smartstore/menu/AddCustomerMenu.java create mode 100644 src/me/day10/smartstore/menu/DeleteCustomerMenu.java create mode 100644 src/me/day10/smartstore/menu/UpdateCustomerMenu.java create mode 100644 src/me/day10/smartstore/menu/ViewCustomerMenu.java diff --git a/src/me/day10/smartstore/menu/AddCustomerMenu.java b/src/me/day10/smartstore/menu/AddCustomerMenu.java new file mode 100644 index 00000000..34c68aa1 --- /dev/null +++ b/src/me/day10/smartstore/menu/AddCustomerMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class AddCustomerMenu implements Menu { + + private static class InstanceHolder { + private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); + } + private AddCustomerMenu() {} + public static AddCustomerMenu getInstance() { return AddCustomerMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/CustomerMenu.java index 7c99bff5..26c91a84 100644 --- a/src/me/day10/smartstore/menu/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/CustomerMenu.java @@ -1,5 +1,7 @@ package me.day10.smartstore.menu; +import java.util.InputMismatchException; + public class CustomerMenu implements Menu { private static class InstanceHolder { @@ -8,8 +10,50 @@ private static class InstanceHolder { private CustomerMenu() {} public static CustomerMenu getInstance() { return CustomerMenu.InstanceHolder.INSTANCE; } + private static final Reader reader = Reader.getInstance(); + private static final Printer printer = Printer.getInstance(); + private static final String CUSTOMER_MENU_OUTPUT = + '\n' + + "======= " + "Customer" + " Menu ========\n" + + " 1. Add " + "Customer" + '\n' + + " 2. View " + "Customer" + '\n' + + " 3. Update " + "Customer" + '\n' + + " 4. Delete " + "Customer" + '\n' + + " 5. Back\n" + + "==============================\n" + + "Choose One: "; + + private final Menu nextMenu[] = { + null, + AddCustomerMenu.getInstance(), + ViewCustomerMenu.getInstance(), + UpdateCustomerMenu.getInstance(), + DeleteCustomerMenu.getInstance(), + null // back + }; + @Override public Menu printAndInputAndGetNextMenu() { - return null; + nextMenu[nextMenu.length - 1] = StartMenu.getInstance(); + while (true) { + print(CUSTOMER_MENU_OUTPUT); + try { + int menu = inputMenu(); + return nextMenu[menu]; + } catch (InvalidMenuException | InputMismatchException e) { + print(e.getMessage()); + } + } + } + + private void print(Object s) { + printer.print(s.toString()); + } + + private int inputMenu() throws InvalidMenuException, InputMismatchException { + int i = reader.inputInteger(); + if (i <= 0 || i >= nextMenu.length) + throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); + return i; } } diff --git a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/DeleteCustomerMenu.java new file mode 100644 index 00000000..39c8a210 --- /dev/null +++ b/src/me/day10/smartstore/menu/DeleteCustomerMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class DeleteCustomerMenu implements Menu { + + private static class InstanceHolder { + private static final DeleteCustomerMenu INSTANCE = new DeleteCustomerMenu(); + } + private DeleteCustomerMenu() {} + public static DeleteCustomerMenu getInstance() { return DeleteCustomerMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} diff --git a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/UpdateCustomerMenu.java new file mode 100644 index 00000000..2ad139a5 --- /dev/null +++ b/src/me/day10/smartstore/menu/UpdateCustomerMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class UpdateCustomerMenu implements Menu { + + private static class InstanceHolder { + private static final UpdateCustomerMenu INSTANCE = new UpdateCustomerMenu(); + } + private UpdateCustomerMenu() {} + public static UpdateCustomerMenu getInstance() { return UpdateCustomerMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} diff --git a/src/me/day10/smartstore/menu/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/ViewCustomerMenu.java new file mode 100644 index 00000000..097e95e9 --- /dev/null +++ b/src/me/day10/smartstore/menu/ViewCustomerMenu.java @@ -0,0 +1,15 @@ +package me.day10.smartstore.menu; + +public class ViewCustomerMenu implements Menu { + + private static class InstanceHolder { + private static final ViewCustomerMenu INSTANCE = new ViewCustomerMenu(); + } + private ViewCustomerMenu() {} + public static ViewCustomerMenu getInstance() { return ViewCustomerMenu.InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + return null; + } +} From ca5fc4980c577f020548af80bf7482f07cc5dbfc Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 18:23:21 +0900 Subject: [PATCH 34/61] refactor: modify interface `Menu` to abstract class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추상 메소드를 포착하여 `Menu`를 인터페이스로 잡고 시작하였으나, 중복되는 코드가 많아서 재사용성을 늘리고자 추상 클래스로 전환합니다. --- .../smartstore/menu/AddCustomerMenu.java | 2 +- .../menu/ClassificationSummaryMenu.java | 6 ++- .../day10/smartstore/menu/CustomerMenu.java | 39 ++++++------------ .../smartstore/menu/DeleteCustomerMenu.java | 4 +- src/me/day10/smartstore/menu/EndMenu.java | 4 +- src/me/day10/smartstore/menu/GroupMenu.java | 35 +++++----------- src/me/day10/smartstore/menu/Menu.java | 34 +++++++++++++++- .../smartstore/menu/SetParameterMenu.java | 40 +++++-------------- src/me/day10/smartstore/menu/StartMenu.java | 37 ++++++----------- .../smartstore/menu/UpdateCustomerMenu.java | 4 +- .../smartstore/menu/UpdateParameterMenu.java | 4 +- .../smartstore/menu/ViewCustomerMenu.java | 4 +- .../smartstore/menu/ViewParameterMenu.java | 12 +----- 13 files changed, 96 insertions(+), 129 deletions(-) diff --git a/src/me/day10/smartstore/menu/AddCustomerMenu.java b/src/me/day10/smartstore/menu/AddCustomerMenu.java index 34c68aa1..4de0f775 100644 --- a/src/me/day10/smartstore/menu/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/AddCustomerMenu.java @@ -1,6 +1,6 @@ package me.day10.smartstore.menu; -public class AddCustomerMenu implements Menu { +public class AddCustomerMenu extends Menu{ private static class InstanceHolder { private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); diff --git a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java index 2709c58d..a44531eb 100644 --- a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java +++ b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java @@ -1,11 +1,13 @@ package me.day10.smartstore.menu; -public class ClassificationSummaryMenu implements Menu { +public class ClassificationSummaryMenu extends Menu { private static class InstanceHolder { private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(); } - private ClassificationSummaryMenu() {} + private ClassificationSummaryMenu(Menu... nextMenus) { + super(nextMenus); + } public static ClassificationSummaryMenu getInstance() { return ClassificationSummaryMenu.InstanceHolder.INSTANCE; } @Override diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/CustomerMenu.java index 26c91a84..b216c7ac 100644 --- a/src/me/day10/smartstore/menu/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/CustomerMenu.java @@ -2,16 +2,23 @@ import java.util.InputMismatchException; -public class CustomerMenu implements Menu { +public class CustomerMenu extends Menu { private static class InstanceHolder { - private static final CustomerMenu INSTANCE = new CustomerMenu(); + private static final CustomerMenu INSTANCE = new CustomerMenu( + null, + AddCustomerMenu.getInstance(), + ViewCustomerMenu.getInstance(), + UpdateCustomerMenu.getInstance(), + DeleteCustomerMenu.getInstance(), + null // back + ); } - private CustomerMenu() {} - public static CustomerMenu getInstance() { return CustomerMenu.InstanceHolder.INSTANCE; } + private CustomerMenu(Menu... nextMenus) { + super(nextMenus); + } + public static CustomerMenu getInstance() { return InstanceHolder.INSTANCE; } - private static final Reader reader = Reader.getInstance(); - private static final Printer printer = Printer.getInstance(); private static final String CUSTOMER_MENU_OUTPUT = '\n' + "======= " + "Customer" + " Menu ========\n" + @@ -23,15 +30,6 @@ private CustomerMenu() {} "==============================\n" + "Choose One: "; - private final Menu nextMenu[] = { - null, - AddCustomerMenu.getInstance(), - ViewCustomerMenu.getInstance(), - UpdateCustomerMenu.getInstance(), - DeleteCustomerMenu.getInstance(), - null // back - }; - @Override public Menu printAndInputAndGetNextMenu() { nextMenu[nextMenu.length - 1] = StartMenu.getInstance(); @@ -45,15 +43,4 @@ public Menu printAndInputAndGetNextMenu() { } } } - - private void print(Object s) { - printer.print(s.toString()); - } - - private int inputMenu() throws InvalidMenuException, InputMismatchException { - int i = reader.inputInteger(); - if (i <= 0 || i >= nextMenu.length) - throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); - return i; - } } diff --git a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/DeleteCustomerMenu.java index 39c8a210..dce63352 100644 --- a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/DeleteCustomerMenu.java @@ -1,12 +1,12 @@ package me.day10.smartstore.menu; -public class DeleteCustomerMenu implements Menu { +public class DeleteCustomerMenu extends Menu { private static class InstanceHolder { private static final DeleteCustomerMenu INSTANCE = new DeleteCustomerMenu(); } private DeleteCustomerMenu() {} - public static DeleteCustomerMenu getInstance() { return DeleteCustomerMenu.InstanceHolder.INSTANCE; } + public static DeleteCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/EndMenu.java b/src/me/day10/smartstore/menu/EndMenu.java index 611233e5..9b74553e 100644 --- a/src/me/day10/smartstore/menu/EndMenu.java +++ b/src/me/day10/smartstore/menu/EndMenu.java @@ -1,12 +1,12 @@ package me.day10.smartstore.menu; -public class EndMenu implements Menu { +public class EndMenu extends Menu { private static class InstanceHolder { private static final EndMenu INSTANCE = new EndMenu(); } private EndMenu() {} - public static EndMenu getInstance() { return EndMenu.InstanceHolder.INSTANCE; } + public static EndMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java index 8cf5fab6..cbcd68af 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -2,16 +2,22 @@ import java.util.InputMismatchException; -public class GroupMenu implements Menu { +public class GroupMenu extends Menu { private static class InstanceHolder { - private static final GroupMenu INSTANCE = new GroupMenu(); + private static final GroupMenu INSTANCE = new GroupMenu( + null, + SetParameterMenu.getInstance(), // 1 + ViewParameterMenu.getInstance(), // 2 + UpdateParameterMenu.getInstance(), // 3 + null // 4 (StartMenu 순환 의존) + ); + } + private GroupMenu(Menu... nextMenus) { + super(nextMenus); } - private GroupMenu() {} public static GroupMenu getInstance() { return InstanceHolder.INSTANCE; } - private static final Reader reader = Reader.getInstance(); - private static final Printer printer = Printer.getInstance(); private static final String MENU_OUTPUT = '\n' + "==========Group Menu==========" + '\n' + @@ -22,14 +28,6 @@ private GroupMenu() {} "==============================" + '\n' + "Choose One: "; - private final Menu[] nextMenu = { - null, - SetParameterMenu.getInstance(), // 1 - ViewParameterMenu.getInstance(), // 2 - UpdateParameterMenu.getInstance(), // 3 - null, // 4 (StartMenu 순환 의존) - }; - @Override public Menu printAndInputAndGetNextMenu() { while (true) { @@ -42,15 +40,4 @@ public Menu printAndInputAndGetNextMenu() { } } } - - private void print(String s) { - printer.print(s); - } - - private int inputMenu() throws InputMismatchException, InvalidMenuException { - int i = reader.inputInteger(); - if (i <= 0 || i >= nextMenu.length) - throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); - return i; - } } diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 73d654a7..7f6fa2a8 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -1,5 +1,35 @@ package me.day10.smartstore.menu; -public interface Menu { - Menu printAndInputAndGetNextMenu(); +import java.util.InputMismatchException; + +public abstract class Menu { + + protected static final Reader reader = Reader.getInstance(); + protected static final Printer printer = Printer.getInstance(); + + protected final Menu[] nextMenu; + + Menu(Menu... nextMenus) { + int len = nextMenus.length; + nextMenu = new Menu[len]; + System.arraycopy(nextMenus, 0, nextMenu, 0, len); + } + + public abstract Menu printAndInputAndGetNextMenu(); + + protected void print(Object s) { + printer.print(s.toString()); + } + + protected int inputMenu() throws InputMismatchException, InvalidMenuException { + int ret = reader.inputInteger(); + if (ret <= 0 || ret >= nextMenu.length) + throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); + return ret; + } + + protected void checkIfInputIsEnd(String s) throws BackMenuException { + if (s.equals("END")) + throw new BackMenuException("'end' is pressed. Exit this menu.\n\n"); + } } diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java index 07a2396c..3567db7b 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -4,16 +4,21 @@ import java.util.InputMismatchException; -public class SetParameterMenu implements Menu { +public class SetParameterMenu extends Menu { private static class InstanceHolder { - private static final SetParameterMenu INSTANCE = new SetParameterMenu(); + private static final SetParameterMenu INSTANCE = new SetParameterMenu( + null, + null, // read minSpentTime + null, // read minTotalPaid + null // Back => GroupMenu + ); } - private SetParameterMenu() {} - public static SetParameterMenu getInstance() { return SetParameterMenu.InstanceHolder.INSTANCE; } + private SetParameterMenu(Menu... nextMenus) { + super(nextMenus); + } + public static SetParameterMenu getInstance() { return InstanceHolder.INSTANCE; } - private static final Reader reader = Reader.getInstance(); - private static final Printer printer = Printer.getInstance(); private static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; private static final String GROUP_OUTPUT = '\n' + @@ -38,13 +43,6 @@ private SetParameterMenu() {} "Input Minimum Total Paid: \n" + END_INPUT; - private static final Menu nextMenu[] = { - null, - null, // read minSpentTime - null, // read minTotalPaid - null // Back => GroupMenu - }; - @Override public Menu printAndInputAndGetNextMenu() { Menu backMenu = GroupMenu.getInstance(); @@ -87,23 +85,12 @@ public Menu printAndInputAndGetNextMenu() { } } - private void print(Object s) { - printer.print(s.toString()); - } - private String inputGroupName() throws BackMenuException { String s = reader.inputString().toUpperCase(); checkIfInputIsEnd(s); return s; } - private int inputMenu() throws InvalidMenuException { - int i = reader.inputInteger(); - if (i <= 0 || i >= nextMenu.length) - throw new InvalidMenuException("\nInvalid Menu for Input. Please try again.\n"); - return i; - } - private Integer inputIntegerOrEnd() throws BackMenuException { String s = reader.inputString().toUpperCase(); checkIfInputIsEnd(s); @@ -117,9 +104,4 @@ private Integer inputIntegerOrEnd() throws BackMenuException { throw new InputMismatchException("Invalid Format for Input. Please try again.\n"); } } - - private void checkIfInputIsEnd(String s) throws BackMenuException { - if (s.equals("END")) - throw new BackMenuException("'end' is pressed. Exit this menu.\n\n"); - } } diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index c583d453..c0ae16c9 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -2,14 +2,20 @@ import java.util.InputMismatchException; -public class StartMenu implements Menu { +public class StartMenu extends Menu { - private static final StartMenu INSTANCE = new StartMenu(); - private StartMenu() {} + private static final StartMenu INSTANCE = new StartMenu( + null, + GroupMenu.getInstance(), // 1 + CustomerMenu.getInstance(), // 2 + ClassificationSummaryMenu.getInstance(), // 3 + EndMenu.getInstance() // 4 + ); + private StartMenu(Menu... nextMenus) { + super(nextMenus); + } public static StartMenu getInstance() { return INSTANCE; } - private static final Reader reader = Reader.getInstance(); - private static final Printer printer = Printer.getInstance(); private static final String OUTPUT = '\n' + "==============================" + '\n' + @@ -20,35 +26,16 @@ private StartMenu() {} "==============================" + '\n' + "Choose One: "; - private final Menu[] nextMenu = { - null, - GroupMenu.getInstance(), // 1 - CustomerMenu.getInstance(), // 2 - ClassificationSummaryMenu.getInstance(), // 3 - EndMenu.getInstance() // 4 - }; - @Override public Menu printAndInputAndGetNextMenu() { while (true) { try { print(OUTPUT); - int i = input(); + int i = inputMenu(); return nextMenu[i]; } catch (InputMismatchException | InvalidMenuException e) { print(e.getMessage()); } } } - - private void print(String s) { - printer.print(s); - } - - private int input() throws InputMismatchException, InvalidMenuException { - int ret = reader.inputInteger(); - if (ret <= 0 || ret >= nextMenu.length) - throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); - return ret; - } } diff --git a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/UpdateCustomerMenu.java index 2ad139a5..df789549 100644 --- a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java +++ b/src/me/day10/smartstore/menu/UpdateCustomerMenu.java @@ -1,12 +1,12 @@ package me.day10.smartstore.menu; -public class UpdateCustomerMenu implements Menu { +public class UpdateCustomerMenu extends Menu { private static class InstanceHolder { private static final UpdateCustomerMenu INSTANCE = new UpdateCustomerMenu(); } private UpdateCustomerMenu() {} - public static UpdateCustomerMenu getInstance() { return UpdateCustomerMenu.InstanceHolder.INSTANCE; } + public static UpdateCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/UpdateParameterMenu.java b/src/me/day10/smartstore/menu/UpdateParameterMenu.java index 1d07ac03..5dcf7b12 100644 --- a/src/me/day10/smartstore/menu/UpdateParameterMenu.java +++ b/src/me/day10/smartstore/menu/UpdateParameterMenu.java @@ -1,12 +1,12 @@ package me.day10.smartstore.menu; -public class UpdateParameterMenu implements Menu { +public class UpdateParameterMenu extends Menu { private static class InstanceHolder { private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); } private UpdateParameterMenu() {} - public static UpdateParameterMenu getInstance() { return UpdateParameterMenu.InstanceHolder.INSTANCE; } + public static UpdateParameterMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/ViewCustomerMenu.java index 097e95e9..f243d22f 100644 --- a/src/me/day10/smartstore/menu/ViewCustomerMenu.java +++ b/src/me/day10/smartstore/menu/ViewCustomerMenu.java @@ -1,12 +1,12 @@ package me.day10.smartstore.menu; -public class ViewCustomerMenu implements Menu { +public class ViewCustomerMenu extends Menu { private static class InstanceHolder { private static final ViewCustomerMenu INSTANCE = new ViewCustomerMenu(); } private ViewCustomerMenu() {} - public static ViewCustomerMenu getInstance() { return ViewCustomerMenu.InstanceHolder.INSTANCE; } + public static ViewCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index 3b5f7639..e20b38f7 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -2,18 +2,14 @@ import me.day10.smartstore.group.GroupType; -import java.util.Arrays; - -public class ViewParameterMenu implements Menu { +public class ViewParameterMenu extends Menu { private static class InstanceHolder { private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); } private ViewParameterMenu() {} - public static ViewParameterMenu getInstance() { return ViewParameterMenu.InstanceHolder.INSTANCE; } + public static ViewParameterMenu getInstance() { return InstanceHolder.INSTANCE; } - private static final Reader reader = Reader.getInstance(); - private static final Printer printer = Printer.getInstance(); private static final String GROUP_OUTPUT = "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + "** Press 'end', if you want to exit! **\n"; @@ -35,10 +31,6 @@ public Menu printAndInputAndGetNextMenu() { } } - private void print(String s) { - printer.print(s); - } - private String InputGroupName() throws BackMenuException { String s = reader.inputString().toUpperCase(); if (s.equals("END")) From 6a67c7e9e9422e6c5ca89b9a309f755411a5bbc1 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 18:31:51 +0900 Subject: [PATCH 35/61] refactor: modify singleton method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에는 싱글턴을 위해서 Instance Holder를 썼습니다. Instance Holder는 클래스가 참조될 때 로드됨으로 메모리 낭비가 없다는 장점이 있습니다. 그러나 시스템 요구 사항에 따라 연쇄적으로 다음 메뉴를 참조하기 때문에 결국 모든 메뉴가 프로그램 시작 전에 JVM에 의해 초기화됩니다. 따라서 코드를 단순화하기 위하여 싱글턴의 구현 방식을 Eagar Initialization으로 변경합니다. --- .../smartstore/menu/AddCustomerMenu.java | 6 ++---- .../menu/ClassificationSummaryMenu.java | 6 ++---- .../day10/smartstore/menu/CustomerMenu.java | 20 +++++++++---------- .../smartstore/menu/DeleteCustomerMenu.java | 6 ++---- src/me/day10/smartstore/menu/EndMenu.java | 6 ++---- src/me/day10/smartstore/menu/GroupMenu.java | 18 ++++++++--------- .../smartstore/menu/SetParameterMenu.java | 16 +++++++-------- .../smartstore/menu/UpdateCustomerMenu.java | 6 ++---- .../smartstore/menu/UpdateParameterMenu.java | 6 ++---- .../smartstore/menu/ViewCustomerMenu.java | 6 ++---- .../smartstore/menu/ViewParameterMenu.java | 6 ++---- 11 files changed, 40 insertions(+), 62 deletions(-) diff --git a/src/me/day10/smartstore/menu/AddCustomerMenu.java b/src/me/day10/smartstore/menu/AddCustomerMenu.java index 4de0f775..56104528 100644 --- a/src/me/day10/smartstore/menu/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/AddCustomerMenu.java @@ -2,11 +2,9 @@ public class AddCustomerMenu extends Menu{ - private static class InstanceHolder { - private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); - } + private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); private AddCustomerMenu() {} - public static AddCustomerMenu getInstance() { return AddCustomerMenu.InstanceHolder.INSTANCE; } + public static AddCustomerMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java index a44531eb..835eb1fa 100644 --- a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java +++ b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java @@ -2,13 +2,11 @@ public class ClassificationSummaryMenu extends Menu { - private static class InstanceHolder { - private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(); - } + private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(); private ClassificationSummaryMenu(Menu... nextMenus) { super(nextMenus); } - public static ClassificationSummaryMenu getInstance() { return ClassificationSummaryMenu.InstanceHolder.INSTANCE; } + public static ClassificationSummaryMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/CustomerMenu.java index b216c7ac..75558e25 100644 --- a/src/me/day10/smartstore/menu/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/CustomerMenu.java @@ -4,20 +4,18 @@ public class CustomerMenu extends Menu { - private static class InstanceHolder { - private static final CustomerMenu INSTANCE = new CustomerMenu( - null, - AddCustomerMenu.getInstance(), - ViewCustomerMenu.getInstance(), - UpdateCustomerMenu.getInstance(), - DeleteCustomerMenu.getInstance(), - null // back - ); - } + private static final CustomerMenu INSTANCE = new CustomerMenu( + null, + AddCustomerMenu.getInstance(), + ViewCustomerMenu.getInstance(), + UpdateCustomerMenu.getInstance(), + DeleteCustomerMenu.getInstance(), + null // back + ); private CustomerMenu(Menu... nextMenus) { super(nextMenus); } - public static CustomerMenu getInstance() { return InstanceHolder.INSTANCE; } + public static CustomerMenu getInstance() { return INSTANCE; } private static final String CUSTOMER_MENU_OUTPUT = '\n' + diff --git a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/DeleteCustomerMenu.java index dce63352..dfc299a1 100644 --- a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/DeleteCustomerMenu.java @@ -2,11 +2,9 @@ public class DeleteCustomerMenu extends Menu { - private static class InstanceHolder { - private static final DeleteCustomerMenu INSTANCE = new DeleteCustomerMenu(); - } + private static final DeleteCustomerMenu INSTANCE = new DeleteCustomerMenu(); private DeleteCustomerMenu() {} - public static DeleteCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } + public static DeleteCustomerMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/EndMenu.java b/src/me/day10/smartstore/menu/EndMenu.java index 9b74553e..9c836838 100644 --- a/src/me/day10/smartstore/menu/EndMenu.java +++ b/src/me/day10/smartstore/menu/EndMenu.java @@ -2,11 +2,9 @@ public class EndMenu extends Menu { - private static class InstanceHolder { - private static final EndMenu INSTANCE = new EndMenu(); - } + private static final EndMenu INSTANCE = new EndMenu(); private EndMenu() {} - public static EndMenu getInstance() { return InstanceHolder.INSTANCE; } + public static EndMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java index cbcd68af..45bd2d29 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -4,19 +4,17 @@ public class GroupMenu extends Menu { - private static class InstanceHolder { - private static final GroupMenu INSTANCE = new GroupMenu( - null, - SetParameterMenu.getInstance(), // 1 - ViewParameterMenu.getInstance(), // 2 - UpdateParameterMenu.getInstance(), // 3 - null // 4 (StartMenu 순환 의존) - ); - } + private static final GroupMenu INSTANCE = new GroupMenu( + null, + SetParameterMenu.getInstance(), // 1 + ViewParameterMenu.getInstance(), // 2 + UpdateParameterMenu.getInstance(), // 3 + null // 4 (StartMenu 순환 의존) + ); private GroupMenu(Menu... nextMenus) { super(nextMenus); } - public static GroupMenu getInstance() { return InstanceHolder.INSTANCE; } + public static GroupMenu getInstance() { return INSTANCE; } private static final String MENU_OUTPUT = '\n' + diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java index 3567db7b..00253a4d 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -6,18 +6,16 @@ public class SetParameterMenu extends Menu { - private static class InstanceHolder { - private static final SetParameterMenu INSTANCE = new SetParameterMenu( - null, - null, // read minSpentTime - null, // read minTotalPaid - null // Back => GroupMenu - ); - } + private static final SetParameterMenu INSTANCE = new SetParameterMenu( + null, + null, // read minSpentTime + null, // read minTotalPaid + null // Back => GroupMenu + ); private SetParameterMenu(Menu... nextMenus) { super(nextMenus); } - public static SetParameterMenu getInstance() { return InstanceHolder.INSTANCE; } + public static SetParameterMenu getInstance() { return INSTANCE; } private static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; private static final String GROUP_OUTPUT = diff --git a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/UpdateCustomerMenu.java index df789549..adbb20a7 100644 --- a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java +++ b/src/me/day10/smartstore/menu/UpdateCustomerMenu.java @@ -2,11 +2,9 @@ public class UpdateCustomerMenu extends Menu { - private static class InstanceHolder { - private static final UpdateCustomerMenu INSTANCE = new UpdateCustomerMenu(); - } + private static final UpdateCustomerMenu INSTANCE = new UpdateCustomerMenu(); private UpdateCustomerMenu() {} - public static UpdateCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } + public static UpdateCustomerMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/UpdateParameterMenu.java b/src/me/day10/smartstore/menu/UpdateParameterMenu.java index 5dcf7b12..339647d1 100644 --- a/src/me/day10/smartstore/menu/UpdateParameterMenu.java +++ b/src/me/day10/smartstore/menu/UpdateParameterMenu.java @@ -2,11 +2,9 @@ public class UpdateParameterMenu extends Menu { - private static class InstanceHolder { - private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); - } + private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); private UpdateParameterMenu() {} - public static UpdateParameterMenu getInstance() { return InstanceHolder.INSTANCE; } + public static UpdateParameterMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/ViewCustomerMenu.java index f243d22f..d648a36c 100644 --- a/src/me/day10/smartstore/menu/ViewCustomerMenu.java +++ b/src/me/day10/smartstore/menu/ViewCustomerMenu.java @@ -2,11 +2,9 @@ public class ViewCustomerMenu extends Menu { - private static class InstanceHolder { - private static final ViewCustomerMenu INSTANCE = new ViewCustomerMenu(); - } + private static final ViewCustomerMenu INSTANCE = new ViewCustomerMenu(); private ViewCustomerMenu() {} - public static ViewCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } + public static ViewCustomerMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index e20b38f7..39f6d1ab 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -4,11 +4,9 @@ public class ViewParameterMenu extends Menu { - private static class InstanceHolder { - private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); - } + private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); private ViewParameterMenu() {} - public static ViewParameterMenu getInstance() { return InstanceHolder.INSTANCE; } + public static ViewParameterMenu getInstance() { return INSTANCE; } private static final String GROUP_OUTPUT = "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + From 5bc836a45e9b801a71a6565a5f4954b21b7971ef Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 18:52:31 +0900 Subject: [PATCH 36/61] refactor: add abstract class `TopicIntroMenu` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 특정 주제로 들어가기 전에는 내용만 다르고 동작은 반복되므로 중복 코드를 줄이기 위하여 새로운 추상 클래스 TopicIntro를 만듭니다. --- .../menu/ClassificationSummaryMenu.java | 16 +++---- .../day10/smartstore/menu/CustomerMenu.java | 45 +++++++------------ src/me/day10/smartstore/menu/GroupMenu.java | 42 +++++++---------- src/me/day10/smartstore/menu/StartMenu.java | 40 +++++++---------- .../day10/smartstore/menu/TopicIntroMenu.java | 33 ++++++++++++++ 5 files changed, 88 insertions(+), 88 deletions(-) create mode 100644 src/me/day10/smartstore/menu/TopicIntroMenu.java diff --git a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java index 835eb1fa..e5586278 100644 --- a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java +++ b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java @@ -1,15 +1,13 @@ package me.day10.smartstore.menu; -public class ClassificationSummaryMenu extends Menu { +public class ClassificationSummaryMenu extends TopicIntroMenu { - private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(); - private ClassificationSummaryMenu(Menu... nextMenus) { - super(nextMenus); - } - public static ClassificationSummaryMenu getInstance() { return INSTANCE; } + private static final String SUMMARY_MENU_OUTPUT = null; + private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(SUMMARY_MENU_OUTPUT); - @Override - public Menu printAndInputAndGetNextMenu() { - return null; + private ClassificationSummaryMenu(String TOPIC_OUTPUT, Menu... nextMenus) { + super(TOPIC_OUTPUT, nextMenus); } + + public static ClassificationSummaryMenu getInstance() { return INSTANCE; } } diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/CustomerMenu.java index 75558e25..09e5260a 100644 --- a/src/me/day10/smartstore/menu/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/CustomerMenu.java @@ -2,9 +2,21 @@ import java.util.InputMismatchException; -public class CustomerMenu extends Menu { +public class CustomerMenu extends TopicIntroMenu { + + private static final String CUSTOMER_MENU_OUTPUT = + '\n' + + "======= " + "Customer" + " Menu ========\n" + + " 1. Add " + "Customer" + '\n' + + " 2. View " + "Customer" + '\n' + + " 3. Update " + "Customer" + '\n' + + " 4. Delete " + "Customer" + '\n' + + " 5. Back\n" + + "==============================\n" + + "Choose One: "; private static final CustomerMenu INSTANCE = new CustomerMenu( + CUSTOMER_MENU_OUTPUT, null, AddCustomerMenu.getInstance(), ViewCustomerMenu.getInstance(), @@ -12,33 +24,10 @@ public class CustomerMenu extends Menu { DeleteCustomerMenu.getInstance(), null // back ); - private CustomerMenu(Menu... nextMenus) { - super(nextMenus); - } - public static CustomerMenu getInstance() { return INSTANCE; } - private static final String CUSTOMER_MENU_OUTPUT = - '\n' + - "======= " + "Customer" + " Menu ========\n" + - " 1. Add " + "Customer" + '\n' + - " 2. View " + "Customer" + '\n' + - " 3. Update " + "Customer" + '\n' + - " 4. Delete " + "Customer" + '\n' + - " 5. Back\n" + - "==============================\n" + - "Choose One: "; - - @Override - public Menu printAndInputAndGetNextMenu() { - nextMenu[nextMenu.length - 1] = StartMenu.getInstance(); - while (true) { - print(CUSTOMER_MENU_OUTPUT); - try { - int menu = inputMenu(); - return nextMenu[menu]; - } catch (InvalidMenuException | InputMismatchException e) { - print(e.getMessage()); - } - } + private CustomerMenu(String TOPIC_OUTPUT, Menu... nextMenus) { + super(TOPIC_OUTPUT, nextMenus); } + + public static CustomerMenu getInstance() { return INSTANCE; } } diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java index 45bd2d29..b9ec5083 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -2,40 +2,30 @@ import java.util.InputMismatchException; -public class GroupMenu extends Menu { +public class GroupMenu extends TopicIntroMenu { + + private static final String MENU_OUTPUT = + '\n' + + "========= Group Menu =========" + '\n' + + "1. " + "Set " + "Parameter" + '\n' + + "2. " + "View " + "Parameter" + '\n' + + "3. " + "Update " + "Parameter" + '\n' + + "4. " + "Back" + '\n' + + "==============================" + '\n' + + "Choose One: "; private static final GroupMenu INSTANCE = new GroupMenu( + MENU_OUTPUT, null, SetParameterMenu.getInstance(), // 1 ViewParameterMenu.getInstance(), // 2 UpdateParameterMenu.getInstance(), // 3 null // 4 (StartMenu 순환 의존) ); - private GroupMenu(Menu... nextMenus) { - super(nextMenus); - } - public static GroupMenu getInstance() { return INSTANCE; } - private static final String MENU_OUTPUT = - '\n' + - "==========Group Menu==========" + '\n' + - "1. " + "Set Parameter" + '\n' + - "2. " + "View Parameter" + '\n' + - "3. " + "Update Parameter" + '\n' + - "4. " + "Back" + '\n' + - "==============================" + '\n' + - "Choose One: "; - - @Override - public Menu printAndInputAndGetNextMenu() { - while (true) { - try { - print(MENU_OUTPUT); - int menu = inputMenu(); - return (menu == 4) ? StartMenu.getInstance() : nextMenu[menu]; - } catch (InputMismatchException | InvalidMenuException e) { - print(e.getMessage()); - } - } + private GroupMenu(String TOPIC_OUTPUT, Menu... nextMenus) { + super(TOPIC_OUTPUT, nextMenus); } + + public static GroupMenu getInstance() { return INSTANCE; } } diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index c0ae16c9..46a7acdd 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -2,23 +2,11 @@ import java.util.InputMismatchException; -public class StartMenu extends Menu { - - private static final StartMenu INSTANCE = new StartMenu( - null, - GroupMenu.getInstance(), // 1 - CustomerMenu.getInstance(), // 2 - ClassificationSummaryMenu.getInstance(), // 3 - EndMenu.getInstance() // 4 - ); - private StartMenu(Menu... nextMenus) { - super(nextMenus); - } - public static StartMenu getInstance() { return INSTANCE; } +public class StartMenu extends TopicIntroMenu { private static final String OUTPUT = '\n' + - "==============================" + '\n' + + "========= Start Menu =========" + '\n' + "1. " + "Group" + '\n' + "2. " + "Customer Data" + '\n' + "3. " + "Classification Summary" + '\n' + @@ -26,16 +14,18 @@ private StartMenu(Menu... nextMenus) { "==============================" + '\n' + "Choose One: "; - @Override - public Menu printAndInputAndGetNextMenu() { - while (true) { - try { - print(OUTPUT); - int i = inputMenu(); - return nextMenu[i]; - } catch (InputMismatchException | InvalidMenuException e) { - print(e.getMessage()); - } - } + private static final StartMenu INSTANCE = new StartMenu( + OUTPUT, + null, + GroupMenu.getInstance(), // 1 + CustomerMenu.getInstance(), // 2 + ClassificationSummaryMenu.getInstance(), // 3 + EndMenu.getInstance() // 4 + ); + + private StartMenu(String TOPIC_OUTPUT, Menu... nextMenus) { + super(TOPIC_OUTPUT, nextMenus); } + + public static StartMenu getInstance() { return INSTANCE; } } diff --git a/src/me/day10/smartstore/menu/TopicIntroMenu.java b/src/me/day10/smartstore/menu/TopicIntroMenu.java new file mode 100644 index 00000000..8dc24aa1 --- /dev/null +++ b/src/me/day10/smartstore/menu/TopicIntroMenu.java @@ -0,0 +1,33 @@ +package me.day10.smartstore.menu; + +import java.util.InputMismatchException; + +public abstract class TopicIntroMenu extends Menu { + + private final String TOPIC_OUTPUT; + + TopicIntroMenu(String TOPIC_OUTPUT, Menu... menus) { + super(menus); + this.TOPIC_OUTPUT = TOPIC_OUTPUT; + } + + @Override + public Menu printAndInputAndGetNextMenu() { + setBackMenu(); + while (true) { + try { + print(TOPIC_OUTPUT); + int i = inputMenu(); + return nextMenu[i]; + } catch (InputMismatchException | InvalidMenuException e) { + print(e.getMessage()); + } + } + } + + private void setBackMenu() { + StartMenu startMenu = StartMenu.getInstance(); + if (this != startMenu) + nextMenu[nextMenu.length - 1] = startMenu; + } +} From 387b78ecf953eb90f09bbbb6a27a468c1efce22d Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 19:20:12 +0900 Subject: [PATCH 37/61] refactor: extends more specific Exception MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 각 사용자 정의 예외들의 더 정확한 의미 표현을 위해 `Exception` 대신에 `IllegalArgumentException`을 상속합니다. --- src/me/day10/smartstore/menu/InvalidGroupTypeException.java | 2 +- src/me/day10/smartstore/menu/InvalidMenuException.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/me/day10/smartstore/menu/InvalidGroupTypeException.java b/src/me/day10/smartstore/menu/InvalidGroupTypeException.java index e77fa663..0b98d619 100644 --- a/src/me/day10/smartstore/menu/InvalidGroupTypeException.java +++ b/src/me/day10/smartstore/menu/InvalidGroupTypeException.java @@ -1,6 +1,6 @@ package me.day10.smartstore.menu; -public class InvalidGroupTypeException extends Exception { +public class InvalidGroupTypeException extends IllegalArgumentException { public InvalidGroupTypeException(String s) { super(s); diff --git a/src/me/day10/smartstore/menu/InvalidMenuException.java b/src/me/day10/smartstore/menu/InvalidMenuException.java index 9cac28e5..467f3409 100644 --- a/src/me/day10/smartstore/menu/InvalidMenuException.java +++ b/src/me/day10/smartstore/menu/InvalidMenuException.java @@ -1,6 +1,6 @@ package me.day10.smartstore.menu; -public class InvalidMenuException extends Exception { +public class InvalidMenuException extends IllegalArgumentException { public InvalidMenuException(String s) { super(s); From 3689d5c492f4f2bb753167e461ea4fb02509821f Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 19:40:47 +0900 Subject: [PATCH 38/61] refactor: extract common codes of the Group menus --- src/me/day10/smartstore/group/GroupType.java | 6 +- src/me/day10/smartstore/menu/Menu.java | 11 +++ .../smartstore/menu/SetParameterMenu.java | 75 +++++++------------ .../smartstore/menu/ViewParameterMenu.java | 18 +---- 4 files changed, 47 insertions(+), 63 deletions(-) diff --git a/src/me/day10/smartstore/group/GroupType.java b/src/me/day10/smartstore/group/GroupType.java index b53449be..f301c1b6 100644 --- a/src/me/day10/smartstore/group/GroupType.java +++ b/src/me/day10/smartstore/group/GroupType.java @@ -33,9 +33,9 @@ public GroupTypeParameter getGroupTypeParameter() { return this.groupTypeParameter; } - public void setGroupTypeParameter(Integer minSpentTime, Integer minTotalPaid) { - this.groupTypeParameter.setMinSpentTime(minSpentTime); - this.groupTypeParameter.setMinTotalPaid(minTotalPaid); + public void setGroupTypeParameter(Integer[] groupParameterArguments) { + this.groupTypeParameter.setMinSpentTime(groupParameterArguments[0]); + this.groupTypeParameter.setMinTotalPaid(groupParameterArguments[1]); } @Override diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 7f6fa2a8..ca0d5417 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -6,6 +6,11 @@ public abstract class Menu { protected static final Reader reader = Reader.getInstance(); protected static final Printer printer = Printer.getInstance(); + protected static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; + protected static final String GROUP_OUTPUT = + '\n' + + "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + + END_INPUT; protected final Menu[] nextMenu; @@ -28,6 +33,12 @@ protected int inputMenu() throws InputMismatchException, InvalidMenuException { return ret; } + protected String inputGroupName() throws BackMenuException { + String s = reader.inputString().toUpperCase(); + checkIfInputIsEnd(s); + return s; + } + protected void checkIfInputIsEnd(String s) throws BackMenuException { if (s.equals("END")) throw new BackMenuException("'end' is pressed. Exit this menu.\n\n"); diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java index 00253a4d..80474703 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -17,12 +17,6 @@ private SetParameterMenu(Menu... nextMenus) { } public static SetParameterMenu getInstance() { return INSTANCE; } - private static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; - private static final String GROUP_OUTPUT = - '\n' + - "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" - + END_INPUT; - private static final String GROUP_SET_PARAMETER_OUTPUT = "===== Set Group Parameter ====\n" + " 1. Minimum Spent Time\n" + @@ -31,15 +25,11 @@ private SetParameterMenu(Menu... nextMenus) { "==============================\n" + "Choose One: "; - private static final String MIN_SPENT_TIME_INPUT = - "\n" + - "Input Minimum Spent Time: \n" + - END_INPUT; - - private static final String MIN_TOTAL_PAID_INPUT = - "\n" + - "Input Minimum Total Paid: \n" + - END_INPUT; + private static final String[] GROUP_PARAMETER_INPUT = { + null, + "\n" + "Input Minimum " + "Spent Time:\n" + END_INPUT, + "\n" + "Input Minimum " + "Total Paid:\n" + END_INPUT + }; @Override public Menu printAndInputAndGetNextMenu() { @@ -50,43 +40,36 @@ public Menu printAndInputAndGetNextMenu() { String groupName = inputGroupName(); GroupType groupType = GroupType.getGroupTypeByString(groupName); print(groupType); - - Integer minSpentTime = null; - Integer minTotalPaid = null; - while (true) { - print(GROUP_SET_PARAMETER_OUTPUT); - try { - int menu = inputMenu(); - - if (menu == 1) { - print(MIN_SPENT_TIME_INPUT); - minSpentTime = inputIntegerOrEnd(); - } else if (menu == 2) { - print(MIN_TOTAL_PAID_INPUT); - minTotalPaid = inputIntegerOrEnd(); - } else { - groupType.setGroupTypeParameter(minSpentTime, minTotalPaid); - break; - } - } catch (InvalidMenuException | InputMismatchException e) { - print(e.getMessage()); - } catch (BackMenuException e) { - print(e.getMessage()); - break; - } - } - } catch (InvalidGroupTypeException e) { - print(e.getMessage()); + inputGroupParameter(groupType); } catch (BackMenuException e) { + print(e.getMessage()); return backMenu; + } catch (InvalidGroupTypeException e) { + print(e.getMessage()); } } } - private String inputGroupName() throws BackMenuException { - String s = reader.inputString().toUpperCase(); - checkIfInputIsEnd(s); - return s; + private void inputGroupParameter(GroupType groupType) { + Integer[] groupParameterArguments = { null, null, null }; // null, minSpentTime, minTotalPaid + while (true) { + print(GROUP_SET_PARAMETER_OUTPUT); + try { + int menu = inputMenu(); + if (menu <= 2) { + print(GROUP_PARAMETER_INPUT[menu]); + groupParameterArguments[menu] = inputIntegerOrEnd(); + } else { + groupType.setGroupTypeParameter(groupParameterArguments); + break; + } + } catch (BackMenuException e) { + print(e.getMessage()); + break; + } catch (InvalidMenuException | InputMismatchException e) { + print(e.getMessage()); + } + } } private Integer inputIntegerOrEnd() throws BackMenuException { diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index 39f6d1ab..9ddc93c3 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -8,31 +8,21 @@ public class ViewParameterMenu extends Menu { private ViewParameterMenu() {} public static ViewParameterMenu getInstance() { return INSTANCE; } - private static final String GROUP_OUTPUT = - "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + - "** Press 'end', if you want to exit! **\n"; - @Override public Menu printAndInputAndGetNextMenu() { + Menu backMenu = GroupMenu.getInstance(); while (true) { print(GROUP_OUTPUT); try { - String groupName = InputGroupName(); + String groupName = inputGroupName(); GroupType groupType = GroupType.getGroupTypeByString(groupName); - print(groupType.toString()); + print(groupType); } catch (BackMenuException e) { print(e.getMessage()); - return GroupMenu.getInstance(); + return backMenu; } catch (InvalidGroupTypeException e) { print(e.getMessage()); } } } - - private String InputGroupName() throws BackMenuException { - String s = reader.inputString().toUpperCase(); - if (s.equals("END")) - throw new BackMenuException("'end' is pressed. Exit this menu.\n"); - return s; - } } From 2f5dbc0d2d4ee43ddf8b199fc622f300b34af508 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 20:29:43 +0900 Subject: [PATCH 39/61] refactor: rename some classes, constants, methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 의미를 좀더 명확하게 하기 위해서 각종 이름을 변경합니다. --- src/me/day10/smartstore/group/Group.java | 42 +++++++++++++++++ .../smartstore/group/GroupParameter.java | 22 +++++++++ src/me/day10/smartstore/group/GroupType.java | 46 ------------------- .../smartstore/group/GroupTypeParameter.java | 22 --------- .../smartstore/menu/BackMenuException.java | 8 ---- .../smartstore/menu/ClassificationMenu.java | 13 ++++++ .../menu/ClassificationSummaryMenu.java | 13 ------ .../smartstore/menu/InputIsEndException.java | 8 ++++ .../menu/InvalidGroupNameException.java | 8 ++++ .../menu/InvalidGroupTypeException.java | 8 ---- src/me/day10/smartstore/menu/Menu.java | 6 +-- .../menu/{EndMenu.java => QuitMenu.java} | 8 ++-- .../smartstore/menu/SetParameterMenu.java | 46 ++++++++++--------- src/me/day10/smartstore/menu/StartMenu.java | 10 ++-- .../smartstore/menu/ViewParameterMenu.java | 10 ++-- 15 files changed, 133 insertions(+), 137 deletions(-) create mode 100644 src/me/day10/smartstore/group/Group.java create mode 100644 src/me/day10/smartstore/group/GroupParameter.java delete mode 100644 src/me/day10/smartstore/group/GroupType.java delete mode 100644 src/me/day10/smartstore/group/GroupTypeParameter.java delete mode 100644 src/me/day10/smartstore/menu/BackMenuException.java create mode 100644 src/me/day10/smartstore/menu/ClassificationMenu.java delete mode 100644 src/me/day10/smartstore/menu/ClassificationSummaryMenu.java create mode 100644 src/me/day10/smartstore/menu/InputIsEndException.java create mode 100644 src/me/day10/smartstore/menu/InvalidGroupNameException.java delete mode 100644 src/me/day10/smartstore/menu/InvalidGroupTypeException.java rename src/me/day10/smartstore/menu/{EndMenu.java => QuitMenu.java} (50%) diff --git a/src/me/day10/smartstore/group/Group.java b/src/me/day10/smartstore/group/Group.java new file mode 100644 index 00000000..8c9a981e --- /dev/null +++ b/src/me/day10/smartstore/group/Group.java @@ -0,0 +1,42 @@ +package me.day10.smartstore.group; + +import me.day10.smartstore.menu.InvalidGroupNameException; + +import java.util.Arrays; + +public enum Group { + + GENERAL("G", new GroupParameter()), + VIP("V", new GroupParameter()), + VVIP("VV", new GroupParameter()); + + Group(String shortcut, GroupParameter groupParameter) { + this.shortcut = shortcut; + this.groupParameter = groupParameter; + } + + private final GroupParameter groupParameter; + private final String shortcut; + + public static Group getGroupByString(String s) throws InvalidGroupNameException { + return Arrays.stream(Group.values()) + .filter(group -> group.isName(s)) + .findAny() + .orElseThrow(() -> new InvalidGroupNameException("\nInvalid Group Name for Input. Please try again.\n")); + } + + private boolean isName(String s) { + return (this.shortcut.equals(s) || this.name().equals(s)); + } + + public void setGroupParameter(Integer[] groupParameterArguments) { + this.groupParameter.setMinSpentHours(groupParameterArguments[1]); + this.groupParameter.setMinTotalAmountPaid(groupParameterArguments[2]); + } + + @Override + public String toString() { + return "\nGroupType: " + this.name() + '\n' + + "Parameter: " + this.groupParameter + '\n'; + } +} diff --git a/src/me/day10/smartstore/group/GroupParameter.java b/src/me/day10/smartstore/group/GroupParameter.java new file mode 100644 index 00000000..7ca6e2c6 --- /dev/null +++ b/src/me/day10/smartstore/group/GroupParameter.java @@ -0,0 +1,22 @@ +package me.day10.smartstore.group; + +public class GroupParameter { + private Integer minSpentHours; + private Integer minTotalAmountPaid; + + public GroupParameter() {} + + public void setMinSpentHours(Integer minSpentHours) { + this.minSpentHours = minSpentHours; + } + + public void setMinTotalAmountPaid(Integer minTotalAmountPaid) { + this.minTotalAmountPaid = minTotalAmountPaid; + } + + @Override + public String toString() { + return String.format("Parameter{minSpentHours=%d, minTotalAmountPaid=%d}", + minSpentHours, minTotalAmountPaid); + } +} diff --git a/src/me/day10/smartstore/group/GroupType.java b/src/me/day10/smartstore/group/GroupType.java deleted file mode 100644 index f301c1b6..00000000 --- a/src/me/day10/smartstore/group/GroupType.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.day10.smartstore.group; - -import me.day10.smartstore.menu.InvalidGroupTypeException; - -import java.util.Arrays; - -public enum GroupType { - - GENERAL("G", new GroupTypeParameter()), - VIP("V", new GroupTypeParameter()), - VVIP("VV", new GroupTypeParameter()); - - GroupType(String shortcut, GroupTypeParameter groupTypeParameter) { - this.shortcut = shortcut; - this.groupTypeParameter = groupTypeParameter; - } - - private final GroupTypeParameter groupTypeParameter; - private final String shortcut; - - public static GroupType getGroupTypeByString(String s) throws InvalidGroupTypeException { - return Arrays.stream(GroupType.values()) - .filter(groupType -> groupType.isName(s)) - .findAny() - .orElseThrow(() -> new InvalidGroupTypeException("\nInvalid Group Name for Input. Please try again.\n")); - } - - private boolean isName(String s) { - return (this.shortcut.equals(s) || this.name().equals(s)); - } - - public GroupTypeParameter getGroupTypeParameter() { - return this.groupTypeParameter; - } - - public void setGroupTypeParameter(Integer[] groupParameterArguments) { - this.groupTypeParameter.setMinSpentTime(groupParameterArguments[0]); - this.groupTypeParameter.setMinTotalPaid(groupParameterArguments[1]); - } - - @Override - public String toString() { - return "\nGroupType: " + this.name() + '\n' - + "Parameter: " + this.groupTypeParameter + '\n'; - } -} diff --git a/src/me/day10/smartstore/group/GroupTypeParameter.java b/src/me/day10/smartstore/group/GroupTypeParameter.java deleted file mode 100644 index 2e4fb276..00000000 --- a/src/me/day10/smartstore/group/GroupTypeParameter.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.day10.smartstore.group; - -public class GroupTypeParameter { - private Integer minSpentTime; - private Integer minTotalPaid; - - public GroupTypeParameter() {} - - public void setMinSpentTime(Integer minSpentTime) { - this.minSpentTime = minSpentTime; - } - - public void setMinTotalPaid(Integer minTotalPaid) { - this.minTotalPaid = minTotalPaid; - } - - @Override - public String toString() { - return String.format("Parameter{minSpentTime=%d, minTotalPaid=%d}", - minSpentTime, minTotalPaid); - } -} diff --git a/src/me/day10/smartstore/menu/BackMenuException.java b/src/me/day10/smartstore/menu/BackMenuException.java deleted file mode 100644 index 668f146b..00000000 --- a/src/me/day10/smartstore/menu/BackMenuException.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.day10.smartstore.menu; - -public class BackMenuException extends Exception { - - public BackMenuException(String s) { - super(s); - } -} diff --git a/src/me/day10/smartstore/menu/ClassificationMenu.java b/src/me/day10/smartstore/menu/ClassificationMenu.java new file mode 100644 index 00000000..09c4c815 --- /dev/null +++ b/src/me/day10/smartstore/menu/ClassificationMenu.java @@ -0,0 +1,13 @@ +package me.day10.smartstore.menu; + +public class ClassificationMenu extends TopicIntroMenu { + + private static final String SUMMARY_MENU_OUTPUT = null; + private static final ClassificationMenu INSTANCE = new ClassificationMenu(SUMMARY_MENU_OUTPUT); + + private ClassificationMenu(String TOPIC_OUTPUT, Menu... nextMenus) { + super(TOPIC_OUTPUT, nextMenus); + } + + public static ClassificationMenu getInstance() { return INSTANCE; } +} diff --git a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java b/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java deleted file mode 100644 index e5586278..00000000 --- a/src/me/day10/smartstore/menu/ClassificationSummaryMenu.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.day10.smartstore.menu; - -public class ClassificationSummaryMenu extends TopicIntroMenu { - - private static final String SUMMARY_MENU_OUTPUT = null; - private static final ClassificationSummaryMenu INSTANCE = new ClassificationSummaryMenu(SUMMARY_MENU_OUTPUT); - - private ClassificationSummaryMenu(String TOPIC_OUTPUT, Menu... nextMenus) { - super(TOPIC_OUTPUT, nextMenus); - } - - public static ClassificationSummaryMenu getInstance() { return INSTANCE; } -} diff --git a/src/me/day10/smartstore/menu/InputIsEndException.java b/src/me/day10/smartstore/menu/InputIsEndException.java new file mode 100644 index 00000000..5e997165 --- /dev/null +++ b/src/me/day10/smartstore/menu/InputIsEndException.java @@ -0,0 +1,8 @@ +package me.day10.smartstore.menu; + +public class InputIsEndException extends Exception { + + public InputIsEndException(String s) { + super(s); + } +} diff --git a/src/me/day10/smartstore/menu/InvalidGroupNameException.java b/src/me/day10/smartstore/menu/InvalidGroupNameException.java new file mode 100644 index 00000000..504ee699 --- /dev/null +++ b/src/me/day10/smartstore/menu/InvalidGroupNameException.java @@ -0,0 +1,8 @@ +package me.day10.smartstore.menu; + +public class InvalidGroupNameException extends IllegalArgumentException { + + public InvalidGroupNameException(String s) { + super(s); + } +} diff --git a/src/me/day10/smartstore/menu/InvalidGroupTypeException.java b/src/me/day10/smartstore/menu/InvalidGroupTypeException.java deleted file mode 100644 index 0b98d619..00000000 --- a/src/me/day10/smartstore/menu/InvalidGroupTypeException.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.day10.smartstore.menu; - -public class InvalidGroupTypeException extends IllegalArgumentException { - - public InvalidGroupTypeException(String s) { - super(s); - } -} diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index ca0d5417..e840300c 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -33,14 +33,14 @@ protected int inputMenu() throws InputMismatchException, InvalidMenuException { return ret; } - protected String inputGroupName() throws BackMenuException { + protected String inputGroupName() throws InputIsEndException { String s = reader.inputString().toUpperCase(); checkIfInputIsEnd(s); return s; } - protected void checkIfInputIsEnd(String s) throws BackMenuException { + protected void checkIfInputIsEnd(String s) throws InputIsEndException { if (s.equals("END")) - throw new BackMenuException("'end' is pressed. Exit this menu.\n\n"); + throw new InputIsEndException("'end' is pressed. Exit this menu.\n\n"); } } diff --git a/src/me/day10/smartstore/menu/EndMenu.java b/src/me/day10/smartstore/menu/QuitMenu.java similarity index 50% rename from src/me/day10/smartstore/menu/EndMenu.java rename to src/me/day10/smartstore/menu/QuitMenu.java index 9c836838..f2c20d5d 100644 --- a/src/me/day10/smartstore/menu/EndMenu.java +++ b/src/me/day10/smartstore/menu/QuitMenu.java @@ -1,10 +1,10 @@ package me.day10.smartstore.menu; -public class EndMenu extends Menu { +public class QuitMenu extends Menu { - private static final EndMenu INSTANCE = new EndMenu(); - private EndMenu() {} - public static EndMenu getInstance() { return INSTANCE; } + private static final QuitMenu INSTANCE = new QuitMenu(); + private QuitMenu() {} + public static QuitMenu getInstance() { return INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java index 80474703..39cdb05b 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -1,15 +1,16 @@ package me.day10.smartstore.menu; -import me.day10.smartstore.group.GroupType; +import me.day10.smartstore.group.Group; import java.util.InputMismatchException; public class SetParameterMenu extends Menu { + // null means handle the next menus in this private static final SetParameterMenu INSTANCE = new SetParameterMenu( null, - null, // read minSpentTime - null, // read minTotalPaid + null, // read minSpentHours + null, // read minTotalAmountPaid null // Back => GroupMenu ); private SetParameterMenu(Menu... nextMenus) { @@ -17,18 +18,18 @@ private SetParameterMenu(Menu... nextMenus) { } public static SetParameterMenu getInstance() { return INSTANCE; } - private static final String GROUP_SET_PARAMETER_OUTPUT = - "===== Set Group Parameter ====\n" + - " 1. Minimum Spent Time\n" + - " 2. Minimum Total Paid\n" + - " 3. Back\n" + - "==============================\n" + + private static final String SET_GROUP_PARAMETER_OUTPUT = + "===== Set Group Parameter ====" + '\n' + + " 1. " + "Minimum Spent Hours" + '\n' + + " 2. " + "Minimum Total Amount Paid" + '\n' + + " 3. " + "Back" + '\n' + + "==============================" + '\n' + "Choose One: "; private static final String[] GROUP_PARAMETER_INPUT = { null, - "\n" + "Input Minimum " + "Spent Time:\n" + END_INPUT, - "\n" + "Input Minimum " + "Total Paid:\n" + END_INPUT + "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, + "\n" + "Input " + "Minimum Total Amount Paid" + ":\n" + END_INPUT }; @Override @@ -38,32 +39,33 @@ public Menu printAndInputAndGetNextMenu() { print(GROUP_OUTPUT); try { String groupName = inputGroupName(); - GroupType groupType = GroupType.getGroupTypeByString(groupName); - print(groupType); - inputGroupParameter(groupType); - } catch (BackMenuException e) { + Group group = Group.getGroupByString(groupName); + print(group); + inputGroupParameter(group); + } catch (InputIsEndException e) { print(e.getMessage()); return backMenu; - } catch (InvalidGroupTypeException e) { + } catch (InvalidGroupNameException e) { print(e.getMessage()); } } } - private void inputGroupParameter(GroupType groupType) { - Integer[] groupParameterArguments = { null, null, null }; // null, minSpentTime, minTotalPaid + private void inputGroupParameter(Group group) { + Integer[] groupParameterArguments = { null, null, null }; // null, .., .. while (true) { - print(GROUP_SET_PARAMETER_OUTPUT); + print(SET_GROUP_PARAMETER_OUTPUT); try { int menu = inputMenu(); if (menu <= 2) { + assert menu != 0; print(GROUP_PARAMETER_INPUT[menu]); groupParameterArguments[menu] = inputIntegerOrEnd(); } else { - groupType.setGroupTypeParameter(groupParameterArguments); + group.setGroupParameter(groupParameterArguments); break; } - } catch (BackMenuException e) { + } catch (InputIsEndException e) { print(e.getMessage()); break; } catch (InvalidMenuException | InputMismatchException e) { @@ -72,7 +74,7 @@ private void inputGroupParameter(GroupType groupType) { } } - private Integer inputIntegerOrEnd() throws BackMenuException { + private Integer inputIntegerOrEnd() throws InputIsEndException { String s = reader.inputString().toUpperCase(); checkIfInputIsEnd(s); diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/StartMenu.java index 46a7acdd..96689c1f 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/StartMenu.java @@ -1,15 +1,13 @@ package me.day10.smartstore.menu; -import java.util.InputMismatchException; - public class StartMenu extends TopicIntroMenu { private static final String OUTPUT = '\n' + "========= Start Menu =========" + '\n' + "1. " + "Group" + '\n' + - "2. " + "Customer Data" + '\n' + - "3. " + "Classification Summary" + '\n' + + "2. " + "Customer" + '\n' + + "3. " + "Classification" + '\n' + "4. " + "Quit" + '\n' + "==============================" + '\n' + "Choose One: "; @@ -19,8 +17,8 @@ public class StartMenu extends TopicIntroMenu { null, GroupMenu.getInstance(), // 1 CustomerMenu.getInstance(), // 2 - ClassificationSummaryMenu.getInstance(), // 3 - EndMenu.getInstance() // 4 + ClassificationMenu.getInstance(), // 3 + QuitMenu.getInstance() // 4 ); private StartMenu(String TOPIC_OUTPUT, Menu... nextMenus) { diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/ViewParameterMenu.java index 9ddc93c3..72b70402 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/ViewParameterMenu.java @@ -1,6 +1,6 @@ package me.day10.smartstore.menu; -import me.day10.smartstore.group.GroupType; +import me.day10.smartstore.group.Group; public class ViewParameterMenu extends Menu { @@ -15,12 +15,12 @@ public Menu printAndInputAndGetNextMenu() { print(GROUP_OUTPUT); try { String groupName = inputGroupName(); - GroupType groupType = GroupType.getGroupTypeByString(groupName); - print(groupType); - } catch (BackMenuException e) { + Group group = Group.getGroupByString(groupName); + print(group); + } catch (InputIsEndException e) { print(e.getMessage()); return backMenu; - } catch (InvalidGroupTypeException e) { + } catch (InvalidGroupNameException e) { print(e.getMessage()); } } From 8a07b7b3cbf06b65678eece25af52072cae2c30a Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 21:02:25 +0900 Subject: [PATCH 40/61] chore: code formatting --- src/me/day10/smartstore/SmartStoreApp.java | 4 +-- .../smartstore/menu/AddCustomerMenu.java | 2 +- .../day10/smartstore/menu/CustomerMenu.java | 2 -- src/me/day10/smartstore/menu/GroupMenu.java | 2 -- src/me/day10/smartstore/menu/Menu.java | 2 +- src/me/day10/smartstore/menu/Printer.java | 1 - src/me/day10/smartstore/menu/Reader.java | 1 - .../smartstore/menu/SetParameterMenu.java | 28 +++++++++---------- 8 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/me/day10/smartstore/SmartStoreApp.java b/src/me/day10/smartstore/SmartStoreApp.java index b7dc5029..65c6b15d 100644 --- a/src/me/day10/smartstore/SmartStoreApp.java +++ b/src/me/day10/smartstore/SmartStoreApp.java @@ -7,9 +7,7 @@ public class SmartStoreApp { private static final SmartStoreApp INSTANCE = new SmartStoreApp(); private SmartStoreApp() {} - public static SmartStoreApp getInstance() { - return INSTANCE; - } + public static SmartStoreApp getInstance() { return INSTANCE; } public SmartStoreApp test() { return this; diff --git a/src/me/day10/smartstore/menu/AddCustomerMenu.java b/src/me/day10/smartstore/menu/AddCustomerMenu.java index 56104528..58930b07 100644 --- a/src/me/day10/smartstore/menu/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/AddCustomerMenu.java @@ -1,6 +1,6 @@ package me.day10.smartstore.menu; -public class AddCustomerMenu extends Menu{ +public class AddCustomerMenu extends Menu { private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); private AddCustomerMenu() {} diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/CustomerMenu.java index 09e5260a..7df05083 100644 --- a/src/me/day10/smartstore/menu/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/CustomerMenu.java @@ -1,7 +1,5 @@ package me.day10.smartstore.menu; -import java.util.InputMismatchException; - public class CustomerMenu extends TopicIntroMenu { private static final String CUSTOMER_MENU_OUTPUT = diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/GroupMenu.java index b9ec5083..3b461df0 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/GroupMenu.java @@ -1,7 +1,5 @@ package me.day10.smartstore.menu; -import java.util.InputMismatchException; - public class GroupMenu extends TopicIntroMenu { private static final String MENU_OUTPUT = diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index e840300c..57e10419 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -14,7 +14,7 @@ public abstract class Menu { protected final Menu[] nextMenu; - Menu(Menu... nextMenus) { + protected Menu(Menu... nextMenus) { int len = nextMenus.length; nextMenu = new Menu[len]; System.arraycopy(nextMenus, 0, nextMenu, 0, len); diff --git a/src/me/day10/smartstore/menu/Printer.java b/src/me/day10/smartstore/menu/Printer.java index 7ebfc1ba..45075ed1 100644 --- a/src/me/day10/smartstore/menu/Printer.java +++ b/src/me/day10/smartstore/menu/Printer.java @@ -6,7 +6,6 @@ public class Printer { private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); - private static final Printer INSTANCE = new Printer(); private Printer() {} public static Printer getInstance() { return INSTANCE; } diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/day10/smartstore/menu/Reader.java index 475e83ef..410a1e79 100644 --- a/src/me/day10/smartstore/menu/Reader.java +++ b/src/me/day10/smartstore/menu/Reader.java @@ -8,7 +8,6 @@ public class Reader { private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - private static final Reader INSTANCE = new Reader(); private Reader() {} public static Reader getInstance() { return INSTANCE; } diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/SetParameterMenu.java index 39cdb05b..9e4c5f54 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/SetParameterMenu.java @@ -6,6 +6,20 @@ public class SetParameterMenu extends Menu { + private static final String SET_GROUP_PARAMETER_OUTPUT = + "===== Set Group Parameter ====" + '\n' + + " 1. " + "Minimum Spent Hours" + '\n' + + " 2. " + "Minimum Total Amount Paid" + '\n' + + " 3. " + "Back" + '\n' + + "==============================" + '\n' + + "Choose One: "; + + private static final String[] GROUP_PARAMETER_INPUT = { + null, + "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, + "\n" + "Input " + "Minimum Total Amount Paid" + ":\n" + END_INPUT + }; + // null means handle the next menus in this private static final SetParameterMenu INSTANCE = new SetParameterMenu( null, @@ -18,20 +32,6 @@ private SetParameterMenu(Menu... nextMenus) { } public static SetParameterMenu getInstance() { return INSTANCE; } - private static final String SET_GROUP_PARAMETER_OUTPUT = - "===== Set Group Parameter ====" + '\n' + - " 1. " + "Minimum Spent Hours" + '\n' + - " 2. " + "Minimum Total Amount Paid" + '\n' + - " 3. " + "Back" + '\n' + - "==============================" + '\n' + - "Choose One: "; - - private static final String[] GROUP_PARAMETER_INPUT = { - null, - "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, - "\n" + "Input " + "Minimum Total Amount Paid" + ":\n" + END_INPUT - }; - @Override public Menu printAndInputAndGetNextMenu() { Menu backMenu = GroupMenu.getInstance(); From 8292a8d829472a3f1c5c930607379469169102f2 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 4 May 2023 21:18:22 +0900 Subject: [PATCH 41/61] refactor: add packages for each subject in menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스가 많아져서 보기가 복잡해서 편의를 위해 여러 패키지로 나눕니다. --- src/me/day10/smartstore/SmartStoreApp.java | 2 +- src/me/day10/smartstore/group/Group.java | 2 +- src/me/day10/smartstore/menu/Menu.java | 3 +++ .../smartstore/menu/{ => customer}/AddCustomerMenu.java | 4 +++- .../menu/{ => customer}/DeleteCustomerMenu.java | 4 +++- .../menu/{ => customer}/UpdateCustomerMenu.java | 4 +++- .../smartstore/menu/{ => customer}/ViewCustomerMenu.java | 4 +++- .../menu/{ => exception}/InputIsEndException.java | 2 +- .../menu/{ => exception}/InvalidGroupNameException.java | 2 +- .../menu/{ => exception}/InvalidMenuException.java | 2 +- .../smartstore/menu/{ => group}/SetParameterMenu.java | 7 ++++++- .../smartstore/menu/{ => group}/UpdateParameterMenu.java | 4 +++- .../smartstore/menu/{ => group}/ViewParameterMenu.java | 6 +++++- .../smartstore/menu/{ => topic}/ClassificationMenu.java | 4 +++- .../day10/smartstore/menu/{ => topic}/CustomerMenu.java | 8 +++++++- src/me/day10/smartstore/menu/{ => topic}/GroupMenu.java | 7 ++++++- src/me/day10/smartstore/menu/{ => topic}/StartMenu.java | 5 ++++- .../day10/smartstore/menu/{ => topic}/TopicIntroMenu.java | 5 ++++- 18 files changed, 58 insertions(+), 17 deletions(-) rename src/me/day10/smartstore/menu/{ => customer}/AddCustomerMenu.java (79%) rename src/me/day10/smartstore/menu/{ => customer}/DeleteCustomerMenu.java (80%) rename src/me/day10/smartstore/menu/{ => customer}/UpdateCustomerMenu.java (80%) rename src/me/day10/smartstore/menu/{ => customer}/ViewCustomerMenu.java (79%) rename src/me/day10/smartstore/menu/{ => exception}/InputIsEndException.java (73%) rename src/me/day10/smartstore/menu/{ => exception}/InvalidGroupNameException.java (77%) rename src/me/day10/smartstore/menu/{ => exception}/InvalidMenuException.java (76%) rename src/me/day10/smartstore/menu/{ => group}/SetParameterMenu.java (90%) rename src/me/day10/smartstore/menu/{ => group}/UpdateParameterMenu.java (80%) rename src/me/day10/smartstore/menu/{ => group}/ViewParameterMenu.java (76%) rename src/me/day10/smartstore/menu/{ => topic}/ClassificationMenu.java (83%) rename src/me/day10/smartstore/menu/{ => topic}/CustomerMenu.java (77%) rename src/me/day10/smartstore/menu/{ => topic}/GroupMenu.java (80%) rename src/me/day10/smartstore/menu/{ => topic}/StartMenu.java (89%) rename src/me/day10/smartstore/menu/{ => topic}/TopicIntroMenu.java (85%) diff --git a/src/me/day10/smartstore/SmartStoreApp.java b/src/me/day10/smartstore/SmartStoreApp.java index 65c6b15d..262e4eae 100644 --- a/src/me/day10/smartstore/SmartStoreApp.java +++ b/src/me/day10/smartstore/SmartStoreApp.java @@ -1,7 +1,7 @@ package me.day10.smartstore; import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.StartMenu; +import me.day10.smartstore.menu.topic.StartMenu; public class SmartStoreApp { diff --git a/src/me/day10/smartstore/group/Group.java b/src/me/day10/smartstore/group/Group.java index 8c9a981e..a70b984b 100644 --- a/src/me/day10/smartstore/group/Group.java +++ b/src/me/day10/smartstore/group/Group.java @@ -1,6 +1,6 @@ package me.day10.smartstore.group; -import me.day10.smartstore.menu.InvalidGroupNameException; +import me.day10.smartstore.menu.exception.InvalidGroupNameException; import java.util.Arrays; diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 57e10419..19052f93 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -1,5 +1,8 @@ package me.day10.smartstore.menu; +import me.day10.smartstore.menu.exception.InputIsEndException; +import me.day10.smartstore.menu.exception.InvalidMenuException; + import java.util.InputMismatchException; public abstract class Menu { diff --git a/src/me/day10/smartstore/menu/AddCustomerMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerMenu.java similarity index 79% rename from src/me/day10/smartstore/menu/AddCustomerMenu.java rename to src/me/day10/smartstore/menu/customer/AddCustomerMenu.java index 58930b07..cf6a74ae 100644 --- a/src/me/day10/smartstore/menu/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/AddCustomerMenu.java @@ -1,4 +1,6 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; public class AddCustomerMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java similarity index 80% rename from src/me/day10/smartstore/menu/DeleteCustomerMenu.java rename to src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java index dfc299a1..22aafa65 100644 --- a/src/me/day10/smartstore/menu/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java @@ -1,4 +1,6 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; public class DeleteCustomerMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java similarity index 80% rename from src/me/day10/smartstore/menu/UpdateCustomerMenu.java rename to src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java index adbb20a7..fec8a6ef 100644 --- a/src/me/day10/smartstore/menu/UpdateCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java @@ -1,4 +1,6 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; public class UpdateCustomerMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java similarity index 79% rename from src/me/day10/smartstore/menu/ViewCustomerMenu.java rename to src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java index d648a36c..f1beac16 100644 --- a/src/me/day10/smartstore/menu/ViewCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java @@ -1,4 +1,6 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; public class ViewCustomerMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/InputIsEndException.java b/src/me/day10/smartstore/menu/exception/InputIsEndException.java similarity index 73% rename from src/me/day10/smartstore/menu/InputIsEndException.java rename to src/me/day10/smartstore/menu/exception/InputIsEndException.java index 5e997165..49a6f90d 100644 --- a/src/me/day10/smartstore/menu/InputIsEndException.java +++ b/src/me/day10/smartstore/menu/exception/InputIsEndException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.exception; public class InputIsEndException extends Exception { diff --git a/src/me/day10/smartstore/menu/InvalidGroupNameException.java b/src/me/day10/smartstore/menu/exception/InvalidGroupNameException.java similarity index 77% rename from src/me/day10/smartstore/menu/InvalidGroupNameException.java rename to src/me/day10/smartstore/menu/exception/InvalidGroupNameException.java index 504ee699..ad810947 100644 --- a/src/me/day10/smartstore/menu/InvalidGroupNameException.java +++ b/src/me/day10/smartstore/menu/exception/InvalidGroupNameException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.exception; public class InvalidGroupNameException extends IllegalArgumentException { diff --git a/src/me/day10/smartstore/menu/InvalidMenuException.java b/src/me/day10/smartstore/menu/exception/InvalidMenuException.java similarity index 76% rename from src/me/day10/smartstore/menu/InvalidMenuException.java rename to src/me/day10/smartstore/menu/exception/InvalidMenuException.java index 467f3409..026fa6de 100644 --- a/src/me/day10/smartstore/menu/InvalidMenuException.java +++ b/src/me/day10/smartstore/menu/exception/InvalidMenuException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.exception; public class InvalidMenuException extends IllegalArgumentException { diff --git a/src/me/day10/smartstore/menu/SetParameterMenu.java b/src/me/day10/smartstore/menu/group/SetParameterMenu.java similarity index 90% rename from src/me/day10/smartstore/menu/SetParameterMenu.java rename to src/me/day10/smartstore/menu/group/SetParameterMenu.java index 9e4c5f54..6fbdfa7a 100644 --- a/src/me/day10/smartstore/menu/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/SetParameterMenu.java @@ -1,6 +1,11 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.group; import me.day10.smartstore.group.Group; +import me.day10.smartstore.menu.exception.InputIsEndException; +import me.day10.smartstore.menu.exception.InvalidGroupNameException; +import me.day10.smartstore.menu.exception.InvalidMenuException; +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.GroupMenu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/UpdateParameterMenu.java b/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java similarity index 80% rename from src/me/day10/smartstore/menu/UpdateParameterMenu.java rename to src/me/day10/smartstore/menu/group/UpdateParameterMenu.java index 339647d1..435131f5 100644 --- a/src/me/day10/smartstore/menu/UpdateParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java @@ -1,4 +1,6 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.group; + +import me.day10.smartstore.menu.Menu; public class UpdateParameterMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/ViewParameterMenu.java b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java similarity index 76% rename from src/me/day10/smartstore/menu/ViewParameterMenu.java rename to src/me/day10/smartstore/menu/group/ViewParameterMenu.java index 72b70402..2fbf35da 100644 --- a/src/me/day10/smartstore/menu/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java @@ -1,6 +1,10 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.group; import me.day10.smartstore.group.Group; +import me.day10.smartstore.menu.exception.InputIsEndException; +import me.day10.smartstore.menu.exception.InvalidGroupNameException; +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.GroupMenu; public class ViewParameterMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/ClassificationMenu.java b/src/me/day10/smartstore/menu/topic/ClassificationMenu.java similarity index 83% rename from src/me/day10/smartstore/menu/ClassificationMenu.java rename to src/me/day10/smartstore/menu/topic/ClassificationMenu.java index 09c4c815..cb7788aa 100644 --- a/src/me/day10/smartstore/menu/ClassificationMenu.java +++ b/src/me/day10/smartstore/menu/topic/ClassificationMenu.java @@ -1,4 +1,6 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.menu.Menu; public class ClassificationMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/CustomerMenu.java b/src/me/day10/smartstore/menu/topic/CustomerMenu.java similarity index 77% rename from src/me/day10/smartstore/menu/CustomerMenu.java rename to src/me/day10/smartstore/menu/topic/CustomerMenu.java index 7df05083..ebab0836 100644 --- a/src/me/day10/smartstore/menu/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/CustomerMenu.java @@ -1,4 +1,10 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.menu.*; +import me.day10.smartstore.menu.customer.AddCustomerMenu; +import me.day10.smartstore.menu.customer.DeleteCustomerMenu; +import me.day10.smartstore.menu.customer.UpdateCustomerMenu; +import me.day10.smartstore.menu.customer.ViewCustomerMenu; public class CustomerMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/GroupMenu.java b/src/me/day10/smartstore/menu/topic/GroupMenu.java similarity index 80% rename from src/me/day10/smartstore/menu/GroupMenu.java rename to src/me/day10/smartstore/menu/topic/GroupMenu.java index 3b461df0..ecca201e 100644 --- a/src/me/day10/smartstore/menu/GroupMenu.java +++ b/src/me/day10/smartstore/menu/topic/GroupMenu.java @@ -1,4 +1,9 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.group.SetParameterMenu; +import me.day10.smartstore.menu.group.UpdateParameterMenu; +import me.day10.smartstore.menu.group.ViewParameterMenu; public class GroupMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/StartMenu.java b/src/me/day10/smartstore/menu/topic/StartMenu.java similarity index 89% rename from src/me/day10/smartstore/menu/StartMenu.java rename to src/me/day10/smartstore/menu/topic/StartMenu.java index 96689c1f..f648765c 100644 --- a/src/me/day10/smartstore/menu/StartMenu.java +++ b/src/me/day10/smartstore/menu/topic/StartMenu.java @@ -1,4 +1,7 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.QuitMenu; public class StartMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/TopicIntroMenu.java b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java similarity index 85% rename from src/me/day10/smartstore/menu/TopicIntroMenu.java rename to src/me/day10/smartstore/menu/topic/TopicIntroMenu.java index 8dc24aa1..0d6d6a79 100644 --- a/src/me/day10/smartstore/menu/TopicIntroMenu.java +++ b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java @@ -1,4 +1,7 @@ -package me.day10.smartstore.menu; +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.menu.exception.InvalidMenuException; +import me.day10.smartstore.menu.Menu; import java.util.InputMismatchException; From b8dc53771596eb92a0de7b0a8bdb327e7541702e Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 10:49:23 +0900 Subject: [PATCH 42/61] feat: implment `ViewCustomerMenu` --- .../day10/smartstore/customer/Customer.java | 37 +++++++++++++++++++ .../customer/CustomerRepository.java | 16 ++++++++ src/me/day10/smartstore/customer/List.java | 37 +++++++++++++++++++ .../menu/customer/ViewCustomerMenu.java | 6 ++- 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/me/day10/smartstore/customer/Customer.java create mode 100644 src/me/day10/smartstore/customer/CustomerRepository.java create mode 100644 src/me/day10/smartstore/customer/List.java diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java new file mode 100644 index 00000000..0e308c49 --- /dev/null +++ b/src/me/day10/smartstore/customer/Customer.java @@ -0,0 +1,37 @@ +package me.day10.smartstore.customer; + +import me.day10.smartstore.group.Group; + +public class Customer { + + private static final int DEFAULT_SPENT_HOURS = 0; + private static final int DEFAULT_TOTAL_AMOUNT_PAID = 0; + private static final Group DEFAULT_GROUP = Group.GENERAL; + + private String id; + private String name; + private Integer spentHours; + private Integer totalAmountPaid; + private Group group; + + public Customer(String id) { + this(id, null, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_AMOUNT_PAID, DEFAULT_GROUP); + } + + public Customer(String id, String name, Integer spentHours, Integer totalAmountPaid, Group group) { + if (id == null) + throw new IllegalArgumentException("ID cannot be null.\n"); + + this.name = name; + this.spentHours = spentHours; + this.totalAmountPaid = totalAmountPaid; + this.group = group; + } + + @Override + public String toString() { + return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d,\n" + + "\tgroup=%s", + id, name, spentHours, totalAmountPaid, group); + } +} diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java new file mode 100644 index 00000000..a3962d55 --- /dev/null +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -0,0 +1,16 @@ +package me.day10.smartstore.customer; + +public class CustomerRepository extends List { + + private static class InstanceHolder { + private static final CustomerRepository INSTANCE = new CustomerRepository(); + } + public static CustomerRepository getInstance() { return InstanceHolder.INSTANCE; } + private CustomerRepository() {} + + @Override + public String toString() { + if (isEmpty()) return "No Customers. Please input one first.\n"; + return super.toString(); + } +} diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/day10/smartstore/customer/List.java new file mode 100644 index 00000000..e416d8a4 --- /dev/null +++ b/src/me/day10/smartstore/customer/List.java @@ -0,0 +1,37 @@ +package me.day10.smartstore.customer; + + +public abstract class List { + + private static final int DEFAULT_CAPACITY = 16; + private static final int MAX_CAPACITY = 100; + + // list[0] is always null: dummy + private E[] list; + private int size = 0; + + List() { + this(DEFAULT_CAPACITY); + } + + @SuppressWarnings("unchecked") + List(int initCapacity) { + if (initCapacity > MAX_CAPACITY) + initCapacity = MAX_CAPACITY; + list = (E[]) new Object[initCapacity]; + } + + public boolean isEmpty() { + return size == 0; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < size; ++i) { + String line = String.format("No. %2d => %s\n", i, list[i].toString()); + sb.append(line); + } + return sb.toString(); + } +} diff --git a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java index f1beac16..1dc30136 100644 --- a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java @@ -1,6 +1,8 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.CustomerMenu; public class ViewCustomerMenu extends Menu { @@ -10,6 +12,8 @@ private ViewCustomerMenu() {} @Override public Menu printAndInputAndGetNextMenu() { - return null; + print(CustomerRepository.getInstance()); + + return CustomerMenu.getInstance(); } } From a8fa411a2a99a710885154973ea3b5c9469ca4ab Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 17:52:55 +0900 Subject: [PATCH 43/61] feat: implement `AddCustomerMenu` --- src/me/day10/smartstore/AppException.java | 7 +++ .../day10/smartstore/customer/Customer.java | 4 ++ .../customer/CustomerRepository.java | 16 ++++++- src/me/day10/smartstore/customer/List.java | 14 ++++-- .../customer/MaxCapacityReachedException.java | 7 +++ src/me/day10/smartstore/menu/Menu.java | 4 ++ .../menu/customer/AddCustomerConfirmMenu.java | 13 +++++ .../menu/customer/AddCustomerMenu.java | 15 ------ .../menu/customer/InputCustomerIdMenu.java | 19 ++++++++ .../menu/customer/InputCustomerNameMenu.java | 16 +++++++ .../customer/InputCustomerSpentHoursMenu.java | 16 +++++++ .../InputCustomerTotalAmountPaidMenu.java | 16 +++++++ .../menu/topic/AddCustomerMenu.java | 47 +++++++++++++++++++ .../smartstore/menu/topic/CustomerMenu.java | 1 - .../smartstore/menu/topic/TopicIntroMenu.java | 16 ++++--- 15 files changed, 182 insertions(+), 29 deletions(-) create mode 100644 src/me/day10/smartstore/AppException.java create mode 100644 src/me/day10/smartstore/customer/MaxCapacityReachedException.java create mode 100644 src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java delete mode 100644 src/me/day10/smartstore/menu/customer/AddCustomerMenu.java create mode 100644 src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java create mode 100644 src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java create mode 100644 src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java create mode 100644 src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java create mode 100644 src/me/day10/smartstore/menu/topic/AddCustomerMenu.java diff --git a/src/me/day10/smartstore/AppException.java b/src/me/day10/smartstore/AppException.java new file mode 100644 index 00000000..7dcc97a8 --- /dev/null +++ b/src/me/day10/smartstore/AppException.java @@ -0,0 +1,7 @@ +package me.day10.smartstore; + +public class AppException extends Exception { + public AppException(String msg) { super(msg); } + public AppException(Exception e) { super(e); } + public AppException(String msg, Exception e) { super(msg, e); } +} diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index 0e308c49..a60edd1a 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -4,6 +4,8 @@ public class Customer { + public static final String ID_FORMAT = + "ID Format: 4~16 letters consisting of alphabets, digits, underscore(_)"; private static final int DEFAULT_SPENT_HOURS = 0; private static final int DEFAULT_TOTAL_AMOUNT_PAID = 0; private static final Group DEFAULT_GROUP = Group.GENERAL; @@ -14,6 +16,8 @@ public class Customer { private Integer totalAmountPaid; private Group group; + public Customer() {} + public Customer(String id) { this(id, null, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_AMOUNT_PAID, DEFAULT_GROUP); } diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index a3962d55..e86f4233 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -1,6 +1,6 @@ package me.day10.smartstore.customer; -public class CustomerRepository extends List { +public class CustomerRepository { private static class InstanceHolder { private static final CustomerRepository INSTANCE = new CustomerRepository(); @@ -8,9 +8,21 @@ private static class InstanceHolder { public static CustomerRepository getInstance() { return InstanceHolder.INSTANCE; } private CustomerRepository() {} + private List customerList = new List<>(); + private static Customer tempCustomer; + + public void checkIfCanAddMore() throws MaxCapacityReachedException { + if (customerList.isReachedMaxCapacity()) + throw new MaxCapacityReachedException("Repository reached the max capacity.\n"); + } + + public void resetTempCustomer() { + tempCustomer = new Customer(); + } + @Override public String toString() { - if (isEmpty()) return "No Customers. Please input one first.\n"; + if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; return super.toString(); } } diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/day10/smartstore/customer/List.java index e416d8a4..6ed1caee 100644 --- a/src/me/day10/smartstore/customer/List.java +++ b/src/me/day10/smartstore/customer/List.java @@ -1,14 +1,14 @@ package me.day10.smartstore.customer; -public abstract class List { +public class List { - private static final int DEFAULT_CAPACITY = 16; - private static final int MAX_CAPACITY = 100; + protected static final int DEFAULT_CAPACITY = 16; + protected static final int MAX_CAPACITY = 100; // list[0] is always null: dummy - private E[] list; - private int size = 0; + protected E[] list; + protected int size = 0; List() { this(DEFAULT_CAPACITY); @@ -21,6 +21,10 @@ public abstract class List { list = (E[]) new Object[initCapacity]; } + public boolean isReachedMaxCapacity() { + return list.length == MAX_CAPACITY; + } + public boolean isEmpty() { return size == 0; } diff --git a/src/me/day10/smartstore/customer/MaxCapacityReachedException.java b/src/me/day10/smartstore/customer/MaxCapacityReachedException.java new file mode 100644 index 00000000..c501f9f4 --- /dev/null +++ b/src/me/day10/smartstore/customer/MaxCapacityReachedException.java @@ -0,0 +1,7 @@ +package me.day10.smartstore.customer; + +import me.day10.smartstore.AppException; + +public class MaxCapacityReachedException extends AppException { + public MaxCapacityReachedException(String msg) { super(msg); } +} diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 19052f93..68288852 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -25,6 +25,10 @@ protected Menu(Menu... nextMenus) { public abstract Menu printAndInputAndGetNextMenu(); + protected final void setBackMenu(Menu backMenu) { + nextMenu[nextMenu.length - 1] = backMenu; + } + protected void print(Object s) { printer.print(s.toString()); } diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java new file mode 100644 index 00000000..e1076272 --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java @@ -0,0 +1,13 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; + +public class AddCustomerConfirmMenu extends Menu { + + private static final AddCustomerConfirmMenu INSTANCE = new AddCustomerConfirmMenu(null, null); + private AddCustomerConfirmMenu(Menu... nextMenus) { super(nextMenus); } + public static AddCustomerConfirmMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { return null; } +} diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerMenu.java deleted file mode 100644 index cf6a74ae..00000000 --- a/src/me/day10/smartstore/menu/customer/AddCustomerMenu.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.day10.smartstore.menu.customer; - -import me.day10.smartstore.menu.Menu; - -public class AddCustomerMenu extends Menu { - - private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); - private AddCustomerMenu() {} - public static AddCustomerMenu getInstance() { return INSTANCE; } - - @Override - public Menu printAndInputAndGetNextMenu() { - return null; - } -} diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java new file mode 100644 index 00000000..d62a33fb --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java @@ -0,0 +1,19 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; + +import static me.day10.smartstore.customer.Customer.ID_FORMAT; + +public class InputCustomerIdMenu extends Menu { + + private static final String ID_INPUT = + "Input " + "Customer" + "'s " + "ID" + ":\n" + + ID_FORMAT + '\n' + + END_INPUT; + private static final InputCustomerIdMenu INSTANCE = new InputCustomerIdMenu(null, null); + private InputCustomerIdMenu(Menu... nextMenus) { super(nextMenus); } + public static InputCustomerIdMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { return null; } +} diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java new file mode 100644 index 00000000..d4a0c951 --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java @@ -0,0 +1,16 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; + +public class InputCustomerNameMenu extends Menu { + + private static final String NAME_INPUT = + "Input " + "Customer" + "'s " + "Name" + ":\n" + + END_INPUT; + private static final InputCustomerNameMenu INSTANCE = new InputCustomerNameMenu(null, null); + private InputCustomerNameMenu(Menu... nextMenus) { super(nextMenus); } + public static InputCustomerNameMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { return null; } +} diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java new file mode 100644 index 00000000..811f5d22 --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java @@ -0,0 +1,16 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; + +public class InputCustomerSpentHoursMenu extends Menu { + + private static final String SPENT_HOURS_INPUT = + "Input " + "Customer" + "'s " + "Spent Hours" + ":\n" + + END_INPUT; + private static final InputCustomerSpentHoursMenu INSTANCE = new InputCustomerSpentHoursMenu(null, null); + private InputCustomerSpentHoursMenu(Menu... nextMenus) { super(nextMenus); } + public static InputCustomerSpentHoursMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { return null; } +} diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java new file mode 100644 index 00000000..6d3b2ad6 --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java @@ -0,0 +1,16 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; + +public class InputCustomerTotalAmountPaidMenu extends Menu { + + private static final String TOTAL_AMOUNT_PAID = + "Input " + "Customer" + "'s " + "Total Amount Paid" + ":\n" + + END_INPUT; + private static final InputCustomerTotalAmountPaidMenu INSTANCE = new InputCustomerTotalAmountPaidMenu(null, null); + private InputCustomerTotalAmountPaidMenu(Menu... nextMenus) { super(nextMenus); } + public static InputCustomerTotalAmountPaidMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { return null; } +} diff --git a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java new file mode 100644 index 00000000..5033d2de --- /dev/null +++ b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java @@ -0,0 +1,47 @@ +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.customer.MaxCapacityReachedException; +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.customer.*; + +public class AddCustomerMenu extends TopicIntroMenu { + + private static final String ADD_CUSTOMER_MENU_OUTPUT = + '\n' + + "======= Customer Info. =======" + '\n' + + " 1. " + "Customer " + "ID" + '\n' + + " 2. " + "Customer " + "Name" + '\n' + + " 3. " + "Customer " + "Spent Hours" + '\n' + + " 4. " + "Customer " + "Total Amount Paid" + '\n' + + " 5. " + "Confirm" + '\n' + + " 6. " + "Cancel(Back)" + '\n' + + "==============================" + '\n' + + "Choose One: "; + private static final AddCustomerMenu INSTANCE = new AddCustomerMenu( + null, + InputCustomerIdMenu.getInstance(), // id + InputCustomerNameMenu.getInstance(), // name + InputCustomerSpentHoursMenu.getInstance(), // spent hours + InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid + AddCustomerConfirmMenu.getInstance(), // confirm + null // cancel(back) => CustomerMenu + ); + private AddCustomerMenu(Menu... nextMenus) { super(ADD_CUSTOMER_MENU_OUTPUT, nextMenus); } + public static AddCustomerMenu getInstance() { return INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + CustomerRepository repository = CustomerRepository.getInstance(); + Menu backMenu = CustomerMenu.getInstance(); + setBackMenu(backMenu); + try { + repository.checkIfCanAddMore(); + } catch (MaxCapacityReachedException e) { + print(e.getMessage()); + return backMenu; + } + repository.resetTempCustomer(); + return inputMenuAndMoveToNextMenu(); + } +} diff --git a/src/me/day10/smartstore/menu/topic/CustomerMenu.java b/src/me/day10/smartstore/menu/topic/CustomerMenu.java index ebab0836..874c0e46 100644 --- a/src/me/day10/smartstore/menu/topic/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/CustomerMenu.java @@ -1,7 +1,6 @@ package me.day10.smartstore.menu.topic; import me.day10.smartstore.menu.*; -import me.day10.smartstore.menu.customer.AddCustomerMenu; import me.day10.smartstore.menu.customer.DeleteCustomerMenu; import me.day10.smartstore.menu.customer.UpdateCustomerMenu; import me.day10.smartstore.menu.customer.ViewCustomerMenu; diff --git a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java index 0d6d6a79..e59426f1 100644 --- a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java +++ b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java @@ -17,6 +17,16 @@ public abstract class TopicIntroMenu extends Menu { @Override public Menu printAndInputAndGetNextMenu() { setBackMenu(); + return inputMenuAndMoveToNextMenu(); + } + + protected void setBackMenu() { + StartMenu startMenu = StartMenu.getInstance(); + if (this != startMenu) + setBackMenu(startMenu); + } + + protected Menu inputMenuAndMoveToNextMenu() { while (true) { try { print(TOPIC_OUTPUT); @@ -27,10 +37,4 @@ public Menu printAndInputAndGetNextMenu() { } } } - - private void setBackMenu() { - StartMenu startMenu = StartMenu.getInstance(); - if (this != startMenu) - nextMenu[nextMenu.length - 1] = startMenu; - } } From ee6023a28aad05f6b81a3a1d79638bf578849b24 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 18:53:32 +0900 Subject: [PATCH 44/61] refactor: add abstract method `setNextMenus` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최상위 `Menu` 클래스에 추상 메소드 `setNextMenus()`를 추가합니다. 상호참조로 인해 뒤로 돌아가는 메뉴에 대해 싱글톤을 활용하려면 결국 호출되는 메소드 안에서 어떤 메뉴 객체로 돌아가야 하는지 명시적으로 지정해주었어야 했습니다. 그럴거면 아예 모든 다음 메뉴를 동적으로 지정해줌으로써 모든 메뉴의 동작의 일관성을 증진시키고, 더불어 InstanceHolder를 활용하여 메모리 낭비를 최소화할 수 있습니다. --- src/me/day10/smartstore/menu/Menu.java | 23 ++++++----- src/me/day10/smartstore/menu/QuitMenu.java | 3 ++ .../menu/customer/AddCustomerConfirmMenu.java | 14 +++++-- .../menu/customer/DeleteCustomerMenu.java | 13 +++++- .../menu/customer/InputCustomerIdMenu.java | 15 +++++-- .../menu/customer/InputCustomerNameMenu.java | 15 +++++-- .../customer/InputCustomerSpentHoursMenu.java | 15 +++++-- .../InputCustomerTotalAmountPaidMenu.java | 15 +++++-- .../menu/customer/UpdateCustomerMenu.java | 12 +++++- .../menu/customer/ViewCustomerMenu.java | 13 ++++-- .../menu/group/SetParameterMenu.java | 31 ++++++++------ .../menu/group/UpdateParameterMenu.java | 3 ++ .../menu/group/ViewParameterMenu.java | 15 +++++-- .../menu/topic/AddCustomerMenu.java | 39 +++++++++++------- .../menu/topic/ClassificationMenu.java | 13 +++--- .../smartstore/menu/topic/CustomerMenu.java | 40 +++++++++---------- .../smartstore/menu/topic/GroupMenu.java | 28 ++++++------- .../smartstore/menu/topic/StartMenu.java | 25 ++++++------ .../smartstore/menu/topic/TopicIntroMenu.java | 15 ++----- 19 files changed, 220 insertions(+), 127 deletions(-) diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 68288852..8c93f662 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -15,18 +15,23 @@ public abstract class Menu { "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + END_INPUT; - protected final Menu[] nextMenu; + protected Menu[] nextMenus; + protected Menu BACK_MENU; - protected Menu(Menu... nextMenus) { - int len = nextMenus.length; - nextMenu = new Menu[len]; - System.arraycopy(nextMenus, 0, nextMenu, 0, len); - } + protected Menu() {} public abstract Menu printAndInputAndGetNextMenu(); - protected final void setBackMenu(Menu backMenu) { - nextMenu[nextMenu.length - 1] = backMenu; + protected final Menu getBackMenu() { return BACK_MENU; } + + protected abstract void setNextMenus(); + + protected final void setNextMenus(Menu... nextMenus) { + int len = nextMenus.length; + if (this.nextMenus == null) + this.nextMenus = new Menu[len]; + System.arraycopy(nextMenus, 1, this.nextMenus, 1, len - 1); + BACK_MENU = this.nextMenus[len - 1]; } protected void print(Object s) { @@ -35,7 +40,7 @@ protected void print(Object s) { protected int inputMenu() throws InputMismatchException, InvalidMenuException { int ret = reader.inputInteger(); - if (ret <= 0 || ret >= nextMenu.length) + if (ret <= 0 || ret >= nextMenus.length) throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); return ret; } diff --git a/src/me/day10/smartstore/menu/QuitMenu.java b/src/me/day10/smartstore/menu/QuitMenu.java index f2c20d5d..2a14074f 100644 --- a/src/me/day10/smartstore/menu/QuitMenu.java +++ b/src/me/day10/smartstore/menu/QuitMenu.java @@ -11,4 +11,7 @@ public Menu printAndInputAndGetNextMenu() { Printer.getInstance().print("\nProgram Finished.\n"); return null; } + + @Override + protected void setNextMenus() {} } diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java index e1076272..db05ec3d 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java +++ b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java @@ -1,13 +1,21 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.AddCustomerMenu; public class AddCustomerConfirmMenu extends Menu { - private static final AddCustomerConfirmMenu INSTANCE = new AddCustomerConfirmMenu(null, null); - private AddCustomerConfirmMenu(Menu... nextMenus) { super(nextMenus); } - public static AddCustomerConfirmMenu getInstance() { return INSTANCE; } + private static class InstanceHolder { + private static final AddCustomerConfirmMenu INSTANCE = new AddCustomerConfirmMenu(); + } + private AddCustomerConfirmMenu() { super(); } + public static AddCustomerConfirmMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, AddCustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java index 22aafa65..a01ca8cc 100644 --- a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java @@ -1,15 +1,24 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.AddCustomerMenu; +import me.day10.smartstore.menu.topic.CustomerMenu; public class DeleteCustomerMenu extends Menu { - private static final DeleteCustomerMenu INSTANCE = new DeleteCustomerMenu(); + private static class InstanceHolder { + private static final DeleteCustomerMenu INSTANCE = new DeleteCustomerMenu(); + } private DeleteCustomerMenu() {} - public static DeleteCustomerMenu getInstance() { return INSTANCE; } + public static DeleteCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, CustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java index d62a33fb..1d78d147 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java @@ -1,6 +1,7 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.AddCustomerMenu; import static me.day10.smartstore.customer.Customer.ID_FORMAT; @@ -10,10 +11,18 @@ public class InputCustomerIdMenu extends Menu { "Input " + "Customer" + "'s " + "ID" + ":\n" + ID_FORMAT + '\n' + END_INPUT; - private static final InputCustomerIdMenu INSTANCE = new InputCustomerIdMenu(null, null); - private InputCustomerIdMenu(Menu... nextMenus) { super(nextMenus); } - public static InputCustomerIdMenu getInstance() { return INSTANCE; } + + private static class InstanceHolder { + private static final InputCustomerIdMenu INSTANCE = new InputCustomerIdMenu(); + } + private InputCustomerIdMenu() { super(); } + public static InputCustomerIdMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, AddCustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java index d4a0c951..e86ba4aa 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java @@ -1,16 +1,25 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.AddCustomerMenu; public class InputCustomerNameMenu extends Menu { private static final String NAME_INPUT = "Input " + "Customer" + "'s " + "Name" + ":\n" + END_INPUT; - private static final InputCustomerNameMenu INSTANCE = new InputCustomerNameMenu(null, null); - private InputCustomerNameMenu(Menu... nextMenus) { super(nextMenus); } - public static InputCustomerNameMenu getInstance() { return INSTANCE; } + + private static class InstanceHolder { + private static final InputCustomerNameMenu INSTANCE = new InputCustomerNameMenu(); + } + private InputCustomerNameMenu() { super(); } + public static InputCustomerNameMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, AddCustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java index 811f5d22..258688bd 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java @@ -1,16 +1,25 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.AddCustomerMenu; public class InputCustomerSpentHoursMenu extends Menu { private static final String SPENT_HOURS_INPUT = "Input " + "Customer" + "'s " + "Spent Hours" + ":\n" + END_INPUT; - private static final InputCustomerSpentHoursMenu INSTANCE = new InputCustomerSpentHoursMenu(null, null); - private InputCustomerSpentHoursMenu(Menu... nextMenus) { super(nextMenus); } - public static InputCustomerSpentHoursMenu getInstance() { return INSTANCE; } + + private static class InstanceHolder { + private static final InputCustomerSpentHoursMenu INSTANCE = new InputCustomerSpentHoursMenu(); + } + private InputCustomerSpentHoursMenu() { super(); } + public static InputCustomerSpentHoursMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, AddCustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java index 6d3b2ad6..736edb26 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java @@ -1,16 +1,25 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.AddCustomerMenu; public class InputCustomerTotalAmountPaidMenu extends Menu { private static final String TOTAL_AMOUNT_PAID = "Input " + "Customer" + "'s " + "Total Amount Paid" + ":\n" + END_INPUT; - private static final InputCustomerTotalAmountPaidMenu INSTANCE = new InputCustomerTotalAmountPaidMenu(null, null); - private InputCustomerTotalAmountPaidMenu(Menu... nextMenus) { super(nextMenus); } - public static InputCustomerTotalAmountPaidMenu getInstance() { return INSTANCE; } + + private static class InstanceHolder { + private static final InputCustomerTotalAmountPaidMenu INSTANCE = new InputCustomerTotalAmountPaidMenu(); + } + private InputCustomerTotalAmountPaidMenu() { super(); } + public static InputCustomerTotalAmountPaidMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, AddCustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java index fec8a6ef..dfd5726d 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java @@ -1,15 +1,23 @@ package me.day10.smartstore.menu.customer; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.CustomerMenu; public class UpdateCustomerMenu extends Menu { - private static final UpdateCustomerMenu INSTANCE = new UpdateCustomerMenu(); + private static class InstanceHolder { + private static final UpdateCustomerMenu INSTANCE = new UpdateCustomerMenu(); + } private UpdateCustomerMenu() {} - public static UpdateCustomerMenu getInstance() { return INSTANCE; } + public static UpdateCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() { + setNextMenus(null, CustomerMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java index 1dc30136..9506f377 100644 --- a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java @@ -6,14 +6,21 @@ public class ViewCustomerMenu extends Menu { - private static final ViewCustomerMenu INSTANCE = new ViewCustomerMenu(); + private static class InstanceHolder { + private static final ViewCustomerMenu INSTANCE = new ViewCustomerMenu(); + } private ViewCustomerMenu() {} - public static ViewCustomerMenu getInstance() { return INSTANCE; } + public static ViewCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { print(CustomerRepository.getInstance()); + setNextMenus(); + return getBackMenu(); + } - return CustomerMenu.getInstance(); + @Override + protected void setNextMenus() { + setNextMenus(null, CustomerMenu.getInstance()); } } diff --git a/src/me/day10/smartstore/menu/group/SetParameterMenu.java b/src/me/day10/smartstore/menu/group/SetParameterMenu.java index 6fbdfa7a..728f1878 100644 --- a/src/me/day10/smartstore/menu/group/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/SetParameterMenu.java @@ -18,28 +18,23 @@ public class SetParameterMenu extends Menu { " 3. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; - private static final String[] GROUP_PARAMETER_INPUT = { null, "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, "\n" + "Input " + "Minimum Total Amount Paid" + ":\n" + END_INPUT }; - // null means handle the next menus in this - private static final SetParameterMenu INSTANCE = new SetParameterMenu( - null, - null, // read minSpentHours - null, // read minTotalAmountPaid - null // Back => GroupMenu - ); - private SetParameterMenu(Menu... nextMenus) { - super(nextMenus); + private static class InstanceHolder { + private static final SetParameterMenu INSTANCE = new SetParameterMenu(); } - public static SetParameterMenu getInstance() { return INSTANCE; } + + private SetParameterMenu() { super(); } + + public static SetParameterMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { - Menu backMenu = GroupMenu.getInstance(); + setNextMenus(); while (true) { print(GROUP_OUTPUT); try { @@ -49,13 +44,23 @@ public Menu printAndInputAndGetNextMenu() { inputGroupParameter(group); } catch (InputIsEndException e) { print(e.getMessage()); - return backMenu; + return getBackMenu(); } catch (InvalidGroupNameException e) { print(e.getMessage()); } } } + @Override + public void setNextMenus() { + setNextMenus( + null, + null, // read minSpentHours + null, // read minTotalAmountPaid + GroupMenu.getInstance() // Back => GroupMenu + ); + } + private void inputGroupParameter(Group group) { Integer[] groupParameterArguments = { null, null, null }; // null, .., .. while (true) { diff --git a/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java b/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java index 435131f5..a5346de3 100644 --- a/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java @@ -12,4 +12,7 @@ private UpdateParameterMenu() {} public Menu printAndInputAndGetNextMenu() { return null; } + + @Override + protected void setNextMenus() {} } diff --git a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java index 2fbf35da..ae063596 100644 --- a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java @@ -8,13 +8,15 @@ public class ViewParameterMenu extends Menu { - private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); + private static class InstanceHolder { + private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); + } private ViewParameterMenu() {} - public static ViewParameterMenu getInstance() { return INSTANCE; } + public static ViewParameterMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { - Menu backMenu = GroupMenu.getInstance(); + setNextMenus(); while (true) { print(GROUP_OUTPUT); try { @@ -23,10 +25,15 @@ public Menu printAndInputAndGetNextMenu() { print(group); } catch (InputIsEndException e) { print(e.getMessage()); - return backMenu; + return getBackMenu(); } catch (InvalidGroupNameException e) { print(e.getMessage()); } } } + + @Override + protected void setNextMenus() { + setNextMenus(null, GroupMenu.getInstance()); + } } diff --git a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java index 5033d2de..3a237cf4 100644 --- a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java @@ -9,7 +9,7 @@ public class AddCustomerMenu extends TopicIntroMenu { private static final String ADD_CUSTOMER_MENU_OUTPUT = '\n' + - "======= Customer Info. =======" + '\n' + + "======= " + "Customer " + "Info. =======" + '\n' + " 1. " + "Customer " + "ID" + '\n' + " 2. " + "Customer " + "Name" + '\n' + " 3. " + "Customer " + "Spent Hours" + '\n' + @@ -18,30 +18,39 @@ public class AddCustomerMenu extends TopicIntroMenu { " 6. " + "Cancel(Back)" + '\n' + "==============================" + '\n' + "Choose One: "; - private static final AddCustomerMenu INSTANCE = new AddCustomerMenu( - null, - InputCustomerIdMenu.getInstance(), // id - InputCustomerNameMenu.getInstance(), // name - InputCustomerSpentHoursMenu.getInstance(), // spent hours - InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid - AddCustomerConfirmMenu.getInstance(), // confirm - null // cancel(back) => CustomerMenu - ); - private AddCustomerMenu(Menu... nextMenus) { super(ADD_CUSTOMER_MENU_OUTPUT, nextMenus); } - public static AddCustomerMenu getInstance() { return INSTANCE; } + + private static class InstanceHolder { + private static final AddCustomerMenu INSTANCE = new AddCustomerMenu(); + } + + private AddCustomerMenu() { super(ADD_CUSTOMER_MENU_OUTPUT); } + + public static AddCustomerMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { CustomerRepository repository = CustomerRepository.getInstance(); - Menu backMenu = CustomerMenu.getInstance(); - setBackMenu(backMenu); + setNextMenus(); try { repository.checkIfCanAddMore(); } catch (MaxCapacityReachedException e) { print(e.getMessage()); - return backMenu; + return getBackMenu(); } repository.resetTempCustomer(); return inputMenuAndMoveToNextMenu(); } + + @Override + protected void setNextMenus() { + setNextMenus( + null, + InputCustomerIdMenu.getInstance(), // id + InputCustomerNameMenu.getInstance(), // name + InputCustomerSpentHoursMenu.getInstance(), // spent hours + InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid + AddCustomerConfirmMenu.getInstance(), // confirm + CustomerMenu.getInstance() // cancel(back) => CustomerMenu + ); + } } diff --git a/src/me/day10/smartstore/menu/topic/ClassificationMenu.java b/src/me/day10/smartstore/menu/topic/ClassificationMenu.java index cb7788aa..5dfe2fd1 100644 --- a/src/me/day10/smartstore/menu/topic/ClassificationMenu.java +++ b/src/me/day10/smartstore/menu/topic/ClassificationMenu.java @@ -1,15 +1,16 @@ package me.day10.smartstore.menu.topic; -import me.day10.smartstore.menu.Menu; - public class ClassificationMenu extends TopicIntroMenu { private static final String SUMMARY_MENU_OUTPUT = null; - private static final ClassificationMenu INSTANCE = new ClassificationMenu(SUMMARY_MENU_OUTPUT); + private static final ClassificationMenu INSTANCE = new ClassificationMenu(); - private ClassificationMenu(String TOPIC_OUTPUT, Menu... nextMenus) { - super(TOPIC_OUTPUT, nextMenus); - } + private ClassificationMenu() { super(SUMMARY_MENU_OUTPUT); } public static ClassificationMenu getInstance() { return INSTANCE; } + + @Override + protected void setNextMenus() { + setNextMenus(); + } } diff --git a/src/me/day10/smartstore/menu/topic/CustomerMenu.java b/src/me/day10/smartstore/menu/topic/CustomerMenu.java index 874c0e46..373af830 100644 --- a/src/me/day10/smartstore/menu/topic/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/CustomerMenu.java @@ -1,6 +1,5 @@ package me.day10.smartstore.menu.topic; -import me.day10.smartstore.menu.*; import me.day10.smartstore.menu.customer.DeleteCustomerMenu; import me.day10.smartstore.menu.customer.UpdateCustomerMenu; import me.day10.smartstore.menu.customer.ViewCustomerMenu; @@ -8,29 +7,30 @@ public class CustomerMenu extends TopicIntroMenu { private static final String CUSTOMER_MENU_OUTPUT = - '\n' + + '\n' + "======= " + "Customer" + " Menu ========\n" + - " 1. Add " + "Customer" + '\n' + - " 2. View " + "Customer" + '\n' + - " 3. Update " + "Customer" + '\n' + - " 4. Delete " + "Customer" + '\n' + - " 5. Back\n" + + " 1. " + "Add " + "Customer" + '\n' + + " 2. " + "View " + "Customer" + '\n' + + " 3. " + "Update " + "Customer" + '\n' + + " 4. " + "Delete " + "Customer" + '\n' + + " 5. " + "Back" + '\n' + "==============================\n" + "Choose One: "; + private static final CustomerMenu INSTANCE = new CustomerMenu(); - private static final CustomerMenu INSTANCE = new CustomerMenu( - CUSTOMER_MENU_OUTPUT, - null, - AddCustomerMenu.getInstance(), - ViewCustomerMenu.getInstance(), - UpdateCustomerMenu.getInstance(), - DeleteCustomerMenu.getInstance(), - null // back - ); - - private CustomerMenu(String TOPIC_OUTPUT, Menu... nextMenus) { - super(TOPIC_OUTPUT, nextMenus); - } + private CustomerMenu() { super(CUSTOMER_MENU_OUTPUT); } public static CustomerMenu getInstance() { return INSTANCE; } + + @Override + protected void setNextMenus() { + setNextMenus( + null, + AddCustomerMenu.getInstance(), + ViewCustomerMenu.getInstance(), + UpdateCustomerMenu.getInstance(), + DeleteCustomerMenu.getInstance(), + StartMenu.getInstance() + ); + } } diff --git a/src/me/day10/smartstore/menu/topic/GroupMenu.java b/src/me/day10/smartstore/menu/topic/GroupMenu.java index ecca201e..99527a66 100644 --- a/src/me/day10/smartstore/menu/topic/GroupMenu.java +++ b/src/me/day10/smartstore/menu/topic/GroupMenu.java @@ -1,13 +1,12 @@ package me.day10.smartstore.menu.topic; -import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.group.SetParameterMenu; import me.day10.smartstore.menu.group.UpdateParameterMenu; import me.day10.smartstore.menu.group.ViewParameterMenu; public class GroupMenu extends TopicIntroMenu { - private static final String MENU_OUTPUT = + private static final String GROUP_MENU_OUTPUT = '\n' + "========= Group Menu =========" + '\n' + "1. " + "Set " + "Parameter" + '\n' + @@ -16,19 +15,20 @@ public class GroupMenu extends TopicIntroMenu { "4. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; + private static final GroupMenu INSTANCE = new GroupMenu(); - private static final GroupMenu INSTANCE = new GroupMenu( - MENU_OUTPUT, - null, - SetParameterMenu.getInstance(), // 1 - ViewParameterMenu.getInstance(), // 2 - UpdateParameterMenu.getInstance(), // 3 - null // 4 (StartMenu 순환 의존) - ); - - private GroupMenu(String TOPIC_OUTPUT, Menu... nextMenus) { - super(TOPIC_OUTPUT, nextMenus); - } + private GroupMenu() { super(GROUP_MENU_OUTPUT); } public static GroupMenu getInstance() { return INSTANCE; } + + @Override + protected void setNextMenus() { + setNextMenus( + null, + SetParameterMenu.getInstance(), // 1 + ViewParameterMenu.getInstance(), // 2 + UpdateParameterMenu.getInstance(), // 3 + StartMenu.getInstance() // 4 + ); + } } diff --git a/src/me/day10/smartstore/menu/topic/StartMenu.java b/src/me/day10/smartstore/menu/topic/StartMenu.java index f648765c..fea948e9 100644 --- a/src/me/day10/smartstore/menu/topic/StartMenu.java +++ b/src/me/day10/smartstore/menu/topic/StartMenu.java @@ -1,6 +1,5 @@ package me.day10.smartstore.menu.topic; -import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.QuitMenu; public class StartMenu extends TopicIntroMenu { @@ -15,18 +14,20 @@ public class StartMenu extends TopicIntroMenu { "==============================" + '\n' + "Choose One: "; - private static final StartMenu INSTANCE = new StartMenu( - OUTPUT, - null, - GroupMenu.getInstance(), // 1 - CustomerMenu.getInstance(), // 2 - ClassificationMenu.getInstance(), // 3 - QuitMenu.getInstance() // 4 - ); + private static final StartMenu INSTANCE = new StartMenu(); - private StartMenu(String TOPIC_OUTPUT, Menu... nextMenus) { - super(TOPIC_OUTPUT, nextMenus); - } + private StartMenu() { super(OUTPUT); } public static StartMenu getInstance() { return INSTANCE; } + + @Override + protected void setNextMenus() { + setNextMenus( + null, + GroupMenu.getInstance(), // 1 + CustomerMenu.getInstance(), // 2 + ClassificationMenu.getInstance(), // 3 + QuitMenu.getInstance() // 4 + ); + } } diff --git a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java index e59426f1..c82e3c7a 100644 --- a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java +++ b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java @@ -9,29 +9,20 @@ public abstract class TopicIntroMenu extends Menu { private final String TOPIC_OUTPUT; - TopicIntroMenu(String TOPIC_OUTPUT, Menu... menus) { - super(menus); - this.TOPIC_OUTPUT = TOPIC_OUTPUT; - } + TopicIntroMenu(String TOPIC_OUTPUT) { this.TOPIC_OUTPUT = TOPIC_OUTPUT; } @Override public Menu printAndInputAndGetNextMenu() { - setBackMenu(); + setNextMenus(); return inputMenuAndMoveToNextMenu(); } - protected void setBackMenu() { - StartMenu startMenu = StartMenu.getInstance(); - if (this != startMenu) - setBackMenu(startMenu); - } - protected Menu inputMenuAndMoveToNextMenu() { while (true) { try { print(TOPIC_OUTPUT); int i = inputMenu(); - return nextMenu[i]; + return nextMenus[i]; } catch (InputMismatchException | InvalidMenuException e) { print(e.getMessage()); } From 22f4776958f0f43db02e21cf7084c5ffe3a62bb3 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 19:43:29 +0900 Subject: [PATCH 45/61] feat: implement `InputCustomerIdMenu` --- .../day10/smartstore/customer/Customer.java | 33 ++++++++++++++++--- .../customer/CustomerRepository.java | 25 +++++++++++++- .../DuplicateCustomerIdException.java | 7 ++++ .../customer/InvalidCustomerIdException.java | 7 ++++ src/me/day10/smartstore/customer/List.java | 8 +++-- src/me/day10/smartstore/menu/Menu.java | 6 ++++ .../menu/customer/InputCustomerIdMenu.java | 27 ++++++++++++++- 7 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 src/me/day10/smartstore/customer/DuplicateCustomerIdException.java create mode 100644 src/me/day10/smartstore/customer/InvalidCustomerIdException.java diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index a60edd1a..4ff71041 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -16,22 +16,47 @@ public class Customer { private Integer totalAmountPaid; private Group group; - public Customer() {} + public Customer() { + this(null); + } public Customer(String id) { this(id, null, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_AMOUNT_PAID, DEFAULT_GROUP); } public Customer(String id, String name, Integer spentHours, Integer totalAmountPaid, Group group) { - if (id == null) - throw new IllegalArgumentException("ID cannot be null.\n"); - + this.id = id; this.name = name; this.spentHours = spentHours; this.totalAmountPaid = totalAmountPaid; this.group = group; } + public String getId() { return id; } + + public void setId(String id) throws InvalidCustomerIdException { + checkIfIdIsValid(id); + this.id = id; + } + + public static void checkIfIdIsValid(String id) throws InvalidCustomerIdException { + if (!isValidId(id)) + throw new InvalidCustomerIdException("Invalid ID input.\n"); + } + + private static boolean isValidId(String id) { + throwIfIdIsNull(id); + String pattern = "^[0-9a-zA-Z_]{4,16}$"; + return id.matches(pattern); + } + + private static void throwIfIdIsNull(String id) { throwIfNull(id, "ID"); } + + private static void throwIfNull(Object o, String title) { + if (o == null) + throw new IllegalArgumentException(title + " cannot be null.\n"); + } + @Override public String toString() { return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d,\n" + diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index e86f4233..5c61d0f5 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -8,7 +8,7 @@ private static class InstanceHolder { public static CustomerRepository getInstance() { return InstanceHolder.INSTANCE; } private CustomerRepository() {} - private List customerList = new List<>(); + private final List customerList = new List<>(); private static Customer tempCustomer; public void checkIfCanAddMore() throws MaxCapacityReachedException { @@ -20,6 +20,29 @@ public void resetTempCustomer() { tempCustomer = new Customer(); } + public void checkIfHasNoDuplicate(String id) throws DuplicateCustomerIdException { + if (hasCustomerWithId(id)) + throw new DuplicateCustomerIdException("The customer already exists which has same id."); + } + + private boolean hasCustomerWithId(String id) { + return findIdxById(id) >= 0; + } + + private int findIdxById(String id) { + assert id != null; + + int size = customerList.size(); + for (int i = 1; i <= size; ++i) + if (id.equals(customerList.get(i).getId())) + return i; + return -1; + } + + public void setTempId(String id) throws InvalidCustomerIdException { + tempCustomer.setId(id); + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; diff --git a/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java b/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java new file mode 100644 index 00000000..a43f0ac9 --- /dev/null +++ b/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java @@ -0,0 +1,7 @@ +package me.day10.smartstore.customer; + +import me.day10.smartstore.AppException; + +public class DuplicateCustomerIdException extends AppException { + public DuplicateCustomerIdException(String msg) { super(msg); } +} diff --git a/src/me/day10/smartstore/customer/InvalidCustomerIdException.java b/src/me/day10/smartstore/customer/InvalidCustomerIdException.java new file mode 100644 index 00000000..cbaca1bf --- /dev/null +++ b/src/me/day10/smartstore/customer/InvalidCustomerIdException.java @@ -0,0 +1,7 @@ +package me.day10.smartstore.customer; + +import me.day10.smartstore.AppException; + +public class InvalidCustomerIdException extends AppException { + public InvalidCustomerIdException(String msg) { super(msg); } +} diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/day10/smartstore/customer/List.java index 6ed1caee..4f9f2815 100644 --- a/src/me/day10/smartstore/customer/List.java +++ b/src/me/day10/smartstore/customer/List.java @@ -7,8 +7,8 @@ public class List { protected static final int MAX_CAPACITY = 100; // list[0] is always null: dummy - protected E[] list; - protected int size = 0; + private E[] list; + private int size = 0; List() { this(DEFAULT_CAPACITY); @@ -29,6 +29,10 @@ public boolean isEmpty() { return size == 0; } + public int size() { return size; } + + public E get(int idx) { return list[idx]; } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 8c93f662..a7468b6d 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -55,4 +55,10 @@ protected void checkIfInputIsEnd(String s) throws InputIsEndException { if (s.equals("END")) throw new InputIsEndException("'end' is pressed. Exit this menu.\n\n"); } + + protected final String inputStringOrEnd() throws InputIsEndException { + String s = reader.inputString(); + checkIfInputIsEnd(s.toUpperCase()); + return s; + } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java index 1d78d147..47f4815c 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java @@ -1,6 +1,10 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.customer.DuplicateCustomerIdException; +import me.day10.smartstore.customer.InvalidCustomerIdException; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.exception.InputIsEndException; import me.day10.smartstore.menu.topic.AddCustomerMenu; import static me.day10.smartstore.customer.Customer.ID_FORMAT; @@ -19,10 +23,31 @@ private static class InstanceHolder { public static InputCustomerIdMenu getInstance() { return InstanceHolder.INSTANCE; } @Override - public Menu printAndInputAndGetNextMenu() { return null; } + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + while (true) { + print(ID_INPUT); + try { + String id = inputCustomerIdOrEnd(); + CustomerRepository.getInstance().setTempId(id); + return getBackMenu(); + } catch (InputIsEndException e) { + print(e.getMessage()); + return getBackMenu(); + } catch (DuplicateCustomerIdException | InvalidCustomerIdException e) { + print(e.getMessage()); + } + } + } @Override protected void setNextMenus() { setNextMenus(null, AddCustomerMenu.getInstance()); } + + private String inputCustomerIdOrEnd() throws InputIsEndException, DuplicateCustomerIdException { + String id = inputStringOrEnd(); + CustomerRepository.getInstance().checkIfHasNoDuplicate(id); + return id; + } } From 75d0e795b3ed8204f9e25e8f102a2651ed4ebdf5 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 20:13:41 +0900 Subject: [PATCH 46/61] feat: implement `InputCustomerNameMenu` --- .../day10/smartstore/customer/Customer.java | 25 ++++++++++++++--- .../customer/CustomerRepository.java | 4 +++ .../InvalidCustomerNameException.java | 7 +++++ .../menu/customer/InputCustomerNameMenu.java | 27 ++++++++++++++++++- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/me/day10/smartstore/customer/InvalidCustomerNameException.java diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index 4ff71041..dec05cad 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -6,6 +6,11 @@ public class Customer { public static final String ID_FORMAT = "ID Format: 4~16 letters consisting of alphabets, digits, underscore(_)"; + public static final String NAME_FORMAT = + "Name Format: [1,4] space separated chuck(s) of alphabets of [2,32] lengths."; + private static final String ID_PATTERN = "^[0-9a-zA-Z_]{4,16}$"; + private static final String NAME_CHUCK = "[a-z]{2,32}"; + private static final String NAME_PATTERN = '^' + NAME_CHUCK + "( " + NAME_CHUCK + "){0,3}$"; private static final int DEFAULT_SPENT_HOURS = 0; private static final int DEFAULT_TOTAL_AMOUNT_PAID = 0; private static final Group DEFAULT_GROUP = Group.GENERAL; @@ -39,18 +44,30 @@ public void setId(String id) throws InvalidCustomerIdException { this.id = id; } + public void setName(String name) throws InvalidCustomerNameException { + checkIfNameIsValid(name); + this.name = name; + } + public static void checkIfIdIsValid(String id) throws InvalidCustomerIdException { if (!isValidId(id)) throw new InvalidCustomerIdException("Invalid ID input.\n"); } private static boolean isValidId(String id) { - throwIfIdIsNull(id); - String pattern = "^[0-9a-zA-Z_]{4,16}$"; - return id.matches(pattern); + throwIfNull(id, "ID"); + return id.matches(ID_PATTERN); } - private static void throwIfIdIsNull(String id) { throwIfNull(id, "ID"); } + public static void checkIfNameIsValid(String name) throws InvalidCustomerNameException { + if (!isValidName(name)) + throw new InvalidCustomerNameException("Invalid Name input.\n"); + } + + private static boolean isValidName(String name) { + throwIfNull(name, "Name"); + return name.matches(NAME_PATTERN); + } private static void throwIfNull(Object o, String title) { if (o == null) diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index 5c61d0f5..f481b3bb 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -43,6 +43,10 @@ public void setTempId(String id) throws InvalidCustomerIdException { tempCustomer.setId(id); } + public void setTempName(String name) throws InvalidCustomerNameException { + tempCustomer.setName(name); + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; diff --git a/src/me/day10/smartstore/customer/InvalidCustomerNameException.java b/src/me/day10/smartstore/customer/InvalidCustomerNameException.java new file mode 100644 index 00000000..23b83c71 --- /dev/null +++ b/src/me/day10/smartstore/customer/InvalidCustomerNameException.java @@ -0,0 +1,7 @@ +package me.day10.smartstore.customer; + +import me.day10.smartstore.AppException; + +public class InvalidCustomerNameException extends AppException { + public InvalidCustomerNameException(String msg) { super(msg); } +} diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java index e86ba4aa..bf791421 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java @@ -1,12 +1,18 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.customer.InvalidCustomerNameException; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.exception.InputIsEndException; import me.day10.smartstore.menu.topic.AddCustomerMenu; +import static me.day10.smartstore.customer.Customer.NAME_FORMAT; + public class InputCustomerNameMenu extends Menu { private static final String NAME_INPUT = "Input " + "Customer" + "'s " + "Name" + ":\n" + + NAME_FORMAT + '\n' + END_INPUT; private static class InstanceHolder { @@ -16,10 +22,29 @@ private static class InstanceHolder { public static InputCustomerNameMenu getInstance() { return InstanceHolder.INSTANCE; } @Override - public Menu printAndInputAndGetNextMenu() { return null; } + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + while (true) { + print(NAME_INPUT); + try { + String name = inputCustomerNameOrEnd(); + CustomerRepository.getInstance().setTempName(name); + return getBackMenu(); + } catch (InputIsEndException e) { + print(e.getMessage()); + return getBackMenu(); + } catch (InvalidCustomerNameException e) { + print(e.getMessage()); + } + } + } @Override protected void setNextMenus() { setNextMenus(null, AddCustomerMenu.getInstance()); } + + private String inputCustomerNameOrEnd() throws InputIsEndException { + return inputStringOrEnd(); + } } From 193872ae11962698037e27f9969fcd3139f4a0a3 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 20:43:00 +0900 Subject: [PATCH 47/61] refactor: add `InputCustomerPropertyMenu` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 재사용성을 높이기 위해 추상클래스를 새로 하나 만듭니다. 더불어 예외의 의미를 조금 더 정확하게 표현하기 위하여 몇몇 예외들의 상속 구조를 변경합니다. --- .../day10/smartstore/customer/Customer.java | 1 - .../customer/CustomerRepository.java | 4 +- .../DuplicateCustomerIdException.java | 4 +- .../customer/InvalidCustomerIdException.java | 4 +- .../InvalidCustomerNameException.java | 4 +- .../customer/MaxCapacityReachedException.java | 4 +- .../menu/customer/InputCustomerIdMenu.java | 36 +++------------ .../menu/customer/InputCustomerNameMenu.java | 34 +++++--------- .../customer/InputCustomerPropertyMenu.java | 45 +++++++++++++++++++ .../menu/exception/InputIsEndException.java | 4 +- 10 files changed, 72 insertions(+), 68 deletions(-) create mode 100644 src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index dec05cad..3d1a83a9 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -40,7 +40,6 @@ public Customer(String id, String name, Integer spentHours, Integer totalAmountP public String getId() { return id; } public void setId(String id) throws InvalidCustomerIdException { - checkIfIdIsValid(id); this.id = id; } diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index f481b3bb..3afc70b8 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -39,7 +39,9 @@ private int findIdxById(String id) { return -1; } - public void setTempId(String id) throws InvalidCustomerIdException { + public void setTempId(String id) throws InvalidCustomerIdException, DuplicateCustomerIdException { + Customer.checkIfIdIsValid(id); + checkIfHasNoDuplicate(id); tempCustomer.setId(id); } diff --git a/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java b/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java index a43f0ac9..e0748c70 100644 --- a/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java +++ b/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java @@ -1,7 +1,5 @@ package me.day10.smartstore.customer; -import me.day10.smartstore.AppException; - -public class DuplicateCustomerIdException extends AppException { +public class DuplicateCustomerIdException extends IllegalStateException { public DuplicateCustomerIdException(String msg) { super(msg); } } diff --git a/src/me/day10/smartstore/customer/InvalidCustomerIdException.java b/src/me/day10/smartstore/customer/InvalidCustomerIdException.java index cbaca1bf..22e7512d 100644 --- a/src/me/day10/smartstore/customer/InvalidCustomerIdException.java +++ b/src/me/day10/smartstore/customer/InvalidCustomerIdException.java @@ -1,7 +1,5 @@ package me.day10.smartstore.customer; -import me.day10.smartstore.AppException; - -public class InvalidCustomerIdException extends AppException { +public class InvalidCustomerIdException extends IllegalArgumentException { public InvalidCustomerIdException(String msg) { super(msg); } } diff --git a/src/me/day10/smartstore/customer/InvalidCustomerNameException.java b/src/me/day10/smartstore/customer/InvalidCustomerNameException.java index 23b83c71..1dda987c 100644 --- a/src/me/day10/smartstore/customer/InvalidCustomerNameException.java +++ b/src/me/day10/smartstore/customer/InvalidCustomerNameException.java @@ -1,7 +1,5 @@ package me.day10.smartstore.customer; -import me.day10.smartstore.AppException; - -public class InvalidCustomerNameException extends AppException { +public class InvalidCustomerNameException extends IllegalArgumentException { public InvalidCustomerNameException(String msg) { super(msg); } } diff --git a/src/me/day10/smartstore/customer/MaxCapacityReachedException.java b/src/me/day10/smartstore/customer/MaxCapacityReachedException.java index c501f9f4..e1ef9510 100644 --- a/src/me/day10/smartstore/customer/MaxCapacityReachedException.java +++ b/src/me/day10/smartstore/customer/MaxCapacityReachedException.java @@ -1,7 +1,5 @@ package me.day10.smartstore.customer; -import me.day10.smartstore.AppException; - -public class MaxCapacityReachedException extends AppException { +public class MaxCapacityReachedException extends IllegalStateException { public MaxCapacityReachedException(String msg) { super(msg); } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java index 47f4815c..45d469e3 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java @@ -3,51 +3,29 @@ import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.customer.DuplicateCustomerIdException; import me.day10.smartstore.customer.InvalidCustomerIdException; -import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.topic.AddCustomerMenu; import static me.day10.smartstore.customer.Customer.ID_FORMAT; -public class InputCustomerIdMenu extends Menu { +public class InputCustomerIdMenu extends InputCustomerPropertyMenu { private static final String ID_INPUT = "Input " + "Customer" + "'s " + "ID" + ":\n" + - ID_FORMAT + '\n' + - END_INPUT; + ID_FORMAT; private static class InstanceHolder { private static final InputCustomerIdMenu INSTANCE = new InputCustomerIdMenu(); } - private InputCustomerIdMenu() { super(); } + private InputCustomerIdMenu() { super(ID_INPUT); } public static InputCustomerIdMenu getInstance() { return InstanceHolder.INSTANCE; } @Override - public Menu printAndInputAndGetNextMenu() { - setNextMenus(); - while (true) { - print(ID_INPUT); - try { - String id = inputCustomerIdOrEnd(); - CustomerRepository.getInstance().setTempId(id); - return getBackMenu(); - } catch (InputIsEndException e) { - print(e.getMessage()); - return getBackMenu(); - } catch (DuplicateCustomerIdException | InvalidCustomerIdException e) { - print(e.getMessage()); - } - } + protected Object inputProperty() throws InputIsEndException { + return inputStringOrEnd(); } @Override - protected void setNextMenus() { - setNextMenus(null, AddCustomerMenu.getInstance()); - } - - private String inputCustomerIdOrEnd() throws InputIsEndException, DuplicateCustomerIdException { - String id = inputStringOrEnd(); - CustomerRepository.getInstance().checkIfHasNoDuplicate(id); - return id; + protected void setTempProperty(Object property) throws InvalidCustomerIdException, DuplicateCustomerIdException { + CustomerRepository.getInstance().setTempId((String) property); } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java index bf791421..bbc7326c 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java @@ -2,49 +2,35 @@ import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.customer.InvalidCustomerNameException; -import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.exception.InputIsEndException; import me.day10.smartstore.menu.topic.AddCustomerMenu; import static me.day10.smartstore.customer.Customer.NAME_FORMAT; -public class InputCustomerNameMenu extends Menu { +public class InputCustomerNameMenu extends InputCustomerPropertyMenu { private static final String NAME_INPUT = "Input " + "Customer" + "'s " + "Name" + ":\n" + - NAME_FORMAT + '\n' + - END_INPUT; + NAME_FORMAT; private static class InstanceHolder { private static final InputCustomerNameMenu INSTANCE = new InputCustomerNameMenu(); } - private InputCustomerNameMenu() { super(); } + private InputCustomerNameMenu() { super(NAME_INPUT); } public static InputCustomerNameMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - public Menu printAndInputAndGetNextMenu() { - setNextMenus(); - while (true) { - print(NAME_INPUT); - try { - String name = inputCustomerNameOrEnd(); - CustomerRepository.getInstance().setTempName(name); - return getBackMenu(); - } catch (InputIsEndException e) { - print(e.getMessage()); - return getBackMenu(); - } catch (InvalidCustomerNameException e) { - print(e.getMessage()); - } - } - } - @Override protected void setNextMenus() { setNextMenus(null, AddCustomerMenu.getInstance()); } - private String inputCustomerNameOrEnd() throws InputIsEndException { + @Override + protected String inputProperty() throws InputIsEndException { return inputStringOrEnd(); } + + @Override + protected void setTempProperty(Object property) throws InvalidCustomerNameException { + CustomerRepository.getInstance().setTempName((String) property); + } } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java new file mode 100644 index 00000000..1df838eb --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java @@ -0,0 +1,45 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.exception.InputIsEndException; +import me.day10.smartstore.menu.topic.AddCustomerMenu; + +public abstract class InputCustomerPropertyMenu extends Menu { + + private final String PROPERTY_INPUT; + + InputCustomerPropertyMenu(String msg) { + PROPERTY_INPUT = msg + '\n' + END_INPUT; + } + + @Override + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + inputPropertyAndSetItIntoTemp(); + return getBackMenu(); + } + + @Override + protected void setNextMenus() { + setNextMenus(null, AddCustomerMenu.getInstance()); + } + + protected void inputPropertyAndSetItIntoTemp() { + while (true) { + print(PROPERTY_INPUT); + try { + Object property = inputProperty(); + setTempProperty(property); + return; + } catch (IllegalArgumentException | IllegalStateException | InputIsEndException e) { + print(e.getMessage()); + if (e instanceof InputIsEndException) + return; + } + } + } + + protected abstract Object inputProperty() throws IllegalArgumentException, InputIsEndException; + + protected abstract void setTempProperty(Object property) throws IllegalArgumentException, IllegalStateException; +} diff --git a/src/me/day10/smartstore/menu/exception/InputIsEndException.java b/src/me/day10/smartstore/menu/exception/InputIsEndException.java index 49a6f90d..f0edf293 100644 --- a/src/me/day10/smartstore/menu/exception/InputIsEndException.java +++ b/src/me/day10/smartstore/menu/exception/InputIsEndException.java @@ -1,6 +1,8 @@ package me.day10.smartstore.menu.exception; -public class InputIsEndException extends Exception { +import me.day10.smartstore.AppException; + +public class InputIsEndException extends AppException { public InputIsEndException(String s) { super(s); From e1adfe4cbf4636efaddedc12d32bc763a07ba826 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 21:19:36 +0900 Subject: [PATCH 48/61] feat: implement `InputCustomerSpentHoursMenu` --- .../day10/smartstore/customer/Customer.java | 4 ++++ .../customer/CustomerRepository.java | 4 ++++ src/me/day10/smartstore/menu/Menu.java | 13 ++++++++++++ src/me/day10/smartstore/menu/Reader.java | 3 +-- .../customer/InputCustomerPropertyMenu.java | 7 +++++-- .../customer/InputCustomerSpentHoursMenu.java | 21 +++++++++++-------- .../menu/group/SetParameterMenu.java | 16 +------------- 7 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index 3d1a83a9..8b0c0ab1 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -48,6 +48,10 @@ public void setName(String name) throws InvalidCustomerNameException { this.name = name; } + public void setSpentHours(Integer spentHours) { + this.spentHours = spentHours; + } + public static void checkIfIdIsValid(String id) throws InvalidCustomerIdException { if (!isValidId(id)) throw new InvalidCustomerIdException("Invalid ID input.\n"); diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index 3afc70b8..2c78ebf4 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -49,6 +49,10 @@ public void setTempName(String name) throws InvalidCustomerNameException { tempCustomer.setName(name); } + public void setTempSpentHours(Integer spentHours) { + tempCustomer.setSpentHours(spentHours); + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index a7468b6d..e5d72fc6 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -61,4 +61,17 @@ protected final String inputStringOrEnd() throws InputIsEndException { checkIfInputIsEnd(s.toUpperCase()); return s; } + + protected Integer inputZeroOrPositiveIntegerOrEnd() throws InputIsEndException, InputMismatchException { + String s = inputStringOrEnd(); + + try { + int i = Integer.parseInt(s); + if (i < 0) + throw new InputMismatchException("Invalid Input. Please try again.\n"); + return i; + } catch (NumberFormatException e) { + throw new InputMismatchException("Invalid Format for Input. Please try again.\n"); + } + } } diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/day10/smartstore/menu/Reader.java index 410a1e79..9bc6e909 100644 --- a/src/me/day10/smartstore/menu/Reader.java +++ b/src/me/day10/smartstore/menu/Reader.java @@ -22,8 +22,7 @@ public int inputInteger() throws InputMismatchException { } public String inputString() { - StringTokenizer st = new StringTokenizer(nextLine()); - return st.nextToken(); + return nextLine(); } private String nextLine() throws RuntimeException { diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java index 1df838eb..4ac9bbcc 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java @@ -4,6 +4,8 @@ import me.day10.smartstore.menu.exception.InputIsEndException; import me.day10.smartstore.menu.topic.AddCustomerMenu; +import java.util.InputMismatchException; + public abstract class InputCustomerPropertyMenu extends Menu { private final String PROPERTY_INPUT; @@ -31,7 +33,8 @@ protected void inputPropertyAndSetItIntoTemp() { Object property = inputProperty(); setTempProperty(property); return; - } catch (IllegalArgumentException | IllegalStateException | InputIsEndException e) { + } catch (InputIsEndException | InputMismatchException | + IllegalArgumentException | IllegalStateException e) { print(e.getMessage()); if (e instanceof InputIsEndException) return; @@ -39,7 +42,7 @@ protected void inputPropertyAndSetItIntoTemp() { } } - protected abstract Object inputProperty() throws IllegalArgumentException, InputIsEndException; + protected abstract Object inputProperty() throws InputIsEndException, InputMismatchException; protected abstract void setTempProperty(Object property) throws IllegalArgumentException, IllegalStateException; } diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java index 258688bd..51949704 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java @@ -1,25 +1,28 @@ package me.day10.smartstore.menu.customer; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.AddCustomerMenu; +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.menu.exception.InputIsEndException; -public class InputCustomerSpentHoursMenu extends Menu { +import java.util.InputMismatchException; + +public class InputCustomerSpentHoursMenu extends InputCustomerPropertyMenu { private static final String SPENT_HOURS_INPUT = - "Input " + "Customer" + "'s " + "Spent Hours" + ":\n" + - END_INPUT; + "Input " + "Customer" + "'s " + "Spent Hours" + ':'; private static class InstanceHolder { private static final InputCustomerSpentHoursMenu INSTANCE = new InputCustomerSpentHoursMenu(); } - private InputCustomerSpentHoursMenu() { super(); } + private InputCustomerSpentHoursMenu() { super(SPENT_HOURS_INPUT); } public static InputCustomerSpentHoursMenu getInstance() { return InstanceHolder.INSTANCE; } @Override - public Menu printAndInputAndGetNextMenu() { return null; } + protected Object inputProperty() throws InputIsEndException, InputMismatchException { + return inputZeroOrPositiveIntegerOrEnd(); + } @Override - protected void setNextMenus() { - setNextMenus(null, AddCustomerMenu.getInstance()); + protected void setTempProperty(Object property) throws IllegalArgumentException, IllegalStateException { + CustomerRepository.getInstance().setTempSpentHours((Integer) property); } } diff --git a/src/me/day10/smartstore/menu/group/SetParameterMenu.java b/src/me/day10/smartstore/menu/group/SetParameterMenu.java index 728f1878..282e4dea 100644 --- a/src/me/day10/smartstore/menu/group/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/SetParameterMenu.java @@ -70,7 +70,7 @@ private void inputGroupParameter(Group group) { if (menu <= 2) { assert menu != 0; print(GROUP_PARAMETER_INPUT[menu]); - groupParameterArguments[menu] = inputIntegerOrEnd(); + groupParameterArguments[menu] = inputZeroOrPositiveIntegerOrEnd(); } else { group.setGroupParameter(groupParameterArguments); break; @@ -83,18 +83,4 @@ private void inputGroupParameter(Group group) { } } } - - private Integer inputIntegerOrEnd() throws InputIsEndException { - String s = reader.inputString().toUpperCase(); - checkIfInputIsEnd(s); - - try { - int i = Integer.parseInt(s); - if (i < 0) - throw new InputMismatchException("Invalid Input. Please try again.\n"); - return i; - } catch (NumberFormatException e) { - throw new InputMismatchException("Invalid Format for Input. Please try again.\n"); - } - } } From cf3fae0d8147d905157227051c3aec45822d6b5c Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sat, 6 May 2023 21:25:36 +0900 Subject: [PATCH 49/61] feat: implemenet `InputcustomerTotalAmountPaid` --- .../day10/smartstore/customer/Customer.java | 4 +++ .../customer/CustomerRepository.java | 4 +++ .../InputCustomerTotalAmountPaidMenu.java | 25 +++++++++++++------ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index 8b0c0ab1..36cc7d32 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -52,6 +52,10 @@ public void setSpentHours(Integer spentHours) { this.spentHours = spentHours; } + public void setTotalAmountPaid(Integer totalAmountPaid) { + this.totalAmountPaid = totalAmountPaid; + } + public static void checkIfIdIsValid(String id) throws InvalidCustomerIdException { if (!isValidId(id)) throw new InvalidCustomerIdException("Invalid ID input.\n"); diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index 2c78ebf4..d47e5376 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -53,6 +53,10 @@ public void setTempSpentHours(Integer spentHours) { tempCustomer.setSpentHours(spentHours); } + public void setTempTotalAmountPaid(Integer totalAmountPaid) { + tempCustomer.setTotalAmountPaid(totalAmountPaid); + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java index 736edb26..857fec82 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java @@ -1,25 +1,34 @@ package me.day10.smartstore.menu.customer; -import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.menu.exception.InputIsEndException; import me.day10.smartstore.menu.topic.AddCustomerMenu; -public class InputCustomerTotalAmountPaidMenu extends Menu { +import java.util.InputMismatchException; + +public class InputCustomerTotalAmountPaidMenu extends InputCustomerPropertyMenu { private static final String TOTAL_AMOUNT_PAID = - "Input " + "Customer" + "'s " + "Total Amount Paid" + ":\n" + - END_INPUT; + "Input " + "Customer" + "'s " + "Total Amount Paid" + ':'; private static class InstanceHolder { private static final InputCustomerTotalAmountPaidMenu INSTANCE = new InputCustomerTotalAmountPaidMenu(); } - private InputCustomerTotalAmountPaidMenu() { super(); } + private InputCustomerTotalAmountPaidMenu() { super(TOTAL_AMOUNT_PAID); } public static InputCustomerTotalAmountPaidMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - public Menu printAndInputAndGetNextMenu() { return null; } - @Override protected void setNextMenus() { setNextMenus(null, AddCustomerMenu.getInstance()); } + + @Override + protected Object inputProperty() throws InputIsEndException, InputMismatchException { + return inputZeroOrPositiveIntegerOrEnd(); + } + + @Override + protected void setTempProperty(Object property) throws IllegalArgumentException, IllegalStateException { + CustomerRepository.getInstance().setTempTotalAmountPaid((Integer) property); + } } From fa5f521d6f5e22a353230e65e3c4f3b1990b32f4 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sun, 7 May 2023 10:44:14 +0900 Subject: [PATCH 50/61] feat: implement `AddCustomerConfirmMenu` --- src/me/day10/smartstore/SmartStoreApp.java | 9 +++- .../day10/smartstore/customer/Customer.java | 5 +-- .../customer/CustomerRepository.java | 21 ++++++++-- src/me/day10/smartstore/customer/List.java | 33 ++++++++++++++- src/me/day10/smartstore/menu/Menu.java | 11 ++++- .../menu/customer/AddCustomerConfirmMenu.java | 41 ++++++++++++++++++- .../AddCustomerIntoRepositoryMenu.java | 30 ++++++++++++++ .../menu/topic/AddCustomerMenu.java | 3 +- 8 files changed, 139 insertions(+), 14 deletions(-) create mode 100644 src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java diff --git a/src/me/day10/smartstore/SmartStoreApp.java b/src/me/day10/smartstore/SmartStoreApp.java index 262e4eae..3136aaa8 100644 --- a/src/me/day10/smartstore/SmartStoreApp.java +++ b/src/me/day10/smartstore/SmartStoreApp.java @@ -15,7 +15,12 @@ public SmartStoreApp test() { public void run() { Menu menu = StartMenu.getInstance(); - while (menu != null) - menu = menu.printAndInputAndGetNextMenu(); + do { + Menu nextMenu = menu.printAndInputAndGetNextMenu(); + if (nextMenu == null) + return; + nextMenu.setPrevMenu(menu); + menu = nextMenu; + } while (true); } } diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index 36cc7d32..e357f03d 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -83,8 +83,7 @@ private static void throwIfNull(Object o, String title) { @Override public String toString() { - return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d,\n" + - "\tgroup=%s", - id, name, spentHours, totalAmountPaid, group); + return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d, group=%s}", + id, name, spentHours, totalAmountPaid, group.name()); } } diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index d47e5376..1f3f0613 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -12,8 +12,7 @@ private CustomerRepository() {} private static Customer tempCustomer; public void checkIfCanAddMore() throws MaxCapacityReachedException { - if (customerList.isReachedMaxCapacity()) - throw new MaxCapacityReachedException("Repository reached the max capacity.\n"); + customerList.checkIfReachedMaxCapacity(); } public void resetTempCustomer() { @@ -57,9 +56,25 @@ public void setTempTotalAmountPaid(Integer totalAmountPaid) { tempCustomer.setTotalAmountPaid(totalAmountPaid); } + public String getTempInfo() { + return tempCustomer.toString(); + } + + public void addTempIntoRepository() { + // app logic에 따라 다음 두 구문이 true 임을 보장합니다. + assert tempCustomer != null; + assert !customerList.isReachedMaxCapacity(); + + customerList.add(tempCustomer); + } + + public boolean isTempIdNull() { + return tempCustomer.getId() == null; + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; - return super.toString(); + return customerList.toString(); } } diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/day10/smartstore/customer/List.java index 4f9f2815..ef12be08 100644 --- a/src/me/day10/smartstore/customer/List.java +++ b/src/me/day10/smartstore/customer/List.java @@ -1,6 +1,8 @@ package me.day10.smartstore.customer; +import java.util.Arrays; + public class List { protected static final int DEFAULT_CAPACITY = 16; @@ -21,8 +23,13 @@ public class List { list = (E[]) new Object[initCapacity]; } + public void checkIfReachedMaxCapacity() throws MaxCapacityReachedException { + if (isReachedMaxCapacity()) + throw new MaxCapacityReachedException("The maximum capable number of elements was reached.\n"); + } + public boolean isReachedMaxCapacity() { - return list.length == MAX_CAPACITY; + return size == MAX_CAPACITY - 1; } public boolean isEmpty() { @@ -33,10 +40,32 @@ public boolean isEmpty() { public E get(int idx) { return list[idx]; } + public void add(E e) throws IllegalArgumentException, MaxCapacityReachedException { + checkIfNull(e); + checkIfReachedMaxCapacity(); + if (isFull()) + increaseCapacity(); + list[++size] = e; + } + + private void checkIfNull(E e) { + if (e == null) + throw new IllegalArgumentException("Input element is null"); + } + + private boolean isFull() { + return size == list.length; + } + + private void increaseCapacity() { + int newLength = Math.min(MAX_CAPACITY, list.length << 1); + list = Arrays.copyOf(list, newLength); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); - for (int i = 0; i < size; ++i) { + for (int i = 1; i <= size; ++i) { String line = String.format("No. %2d => %s\n", i, list[i].toString()); sb.append(line); } diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index e5d72fc6..50f0288b 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -16,7 +16,8 @@ public abstract class Menu { + END_INPUT; protected Menu[] nextMenus; - protected Menu BACK_MENU; + private Menu BACK_MENU; + private Menu prevMenu; protected Menu() {} @@ -74,4 +75,12 @@ protected Integer inputZeroOrPositiveIntegerOrEnd() throws InputIsEndException, throw new InputMismatchException("Invalid Format for Input. Please try again.\n"); } } + + public void setPrevMenu(Menu menu) { + this.prevMenu = menu; + } + + protected Menu getPrevMenu() { + return this.prevMenu; + } } diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java index db05ec3d..e9304e04 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java +++ b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java @@ -1,10 +1,22 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.exception.InvalidMenuException; import me.day10.smartstore.menu.topic.AddCustomerMenu; +import java.util.InputMismatchException; + public class AddCustomerConfirmMenu extends Menu { + private static final String ADD_CUSTOMER_CONFIRM_OUTPUT = + '\n' + + "==== Add Customer Confirm ====" + '\n' + + " 1. " + "Yes (Add)" + '\n' + + " 2. " + "No (Back)" + '\n' + + "==============================" + '\n' + + "Choose One: "; + private static class InstanceHolder { private static final AddCustomerConfirmMenu INSTANCE = new AddCustomerConfirmMenu(); } @@ -12,10 +24,35 @@ private static class InstanceHolder { public static AddCustomerConfirmMenu getInstance() { return InstanceHolder.INSTANCE; } @Override - public Menu printAndInputAndGetNextMenu() { return null; } + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + String tempCustomerInfo = getTempCustomerInfo(); + while (true) { + try { + print('\n' + tempCustomerInfo); + if (isTempCustomerIdNull()) { + print("\nID input must be required.\n"); + return getBackMenu(); + } + print(ADD_CUSTOMER_CONFIRM_OUTPUT); + int i = inputMenu(); + return nextMenus[i]; + } catch (InputMismatchException | InvalidMenuException e) { + print(e.getMessage()); + } + } + } @Override protected void setNextMenus() { - setNextMenus(null, AddCustomerMenu.getInstance()); + setNextMenus(null, AddCustomerIntoRepositoryMenu.getInstance(), AddCustomerMenu.getInstance()); + } + + private String getTempCustomerInfo() { + return CustomerRepository.getInstance().getTempInfo(); + } + + private boolean isTempCustomerIdNull() { + return CustomerRepository.getInstance().isTempIdNull(); } } diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java new file mode 100644 index 00000000..fbe9c34c --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java @@ -0,0 +1,30 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.CustomerMenu; + +public class AddCustomerIntoRepositoryMenu extends Menu { + + private static class InstanceHolder { + private static final AddCustomerIntoRepositoryMenu INSTANCE = new AddCustomerIntoRepositoryMenu(); + } + private AddCustomerIntoRepositoryMenu() {} + public static AddCustomerIntoRepositoryMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + addTempCustomerIntoRepository(); + return getBackMenu(); + } + + @Override + protected void setNextMenus() { + setNextMenus(null, CustomerMenu.getInstance()); + } + + private void addTempCustomerIntoRepository() { + CustomerRepository.getInstance().addTempIntoRepository(); + } +} diff --git a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java index 3a237cf4..f880be74 100644 --- a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java @@ -37,7 +37,8 @@ public Menu printAndInputAndGetNextMenu() { print(e.getMessage()); return getBackMenu(); } - repository.resetTempCustomer(); + if (getPrevMenu() == CustomerMenu.getInstance()) + repository.resetTempCustomer(); return inputMenuAndMoveToNextMenu(); } From 056d0bd00cea3caf513d377ef003f970cd3b31fa Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sun, 7 May 2023 19:15:42 +0900 Subject: [PATCH 51/61] feat: implement `DeleteCustomerMenu` --- .../customer/CustomerRepository.java | 8 ++++ src/me/day10/smartstore/customer/List.java | 41 ++++++++++++++++++- src/me/day10/smartstore/menu/Menu.java | 11 ++++- .../menu/customer/DeleteCustomerMenu.java | 21 +++++++++- 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index 1f3f0613..e03ea54e 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -72,6 +72,14 @@ public boolean isTempIdNull() { return tempCustomer.getId() == null; } + public int size() { + return customerList.size(); + } + + public String deleteAndGetInfoOf(int num) { + return customerList.remove(num).toString(); + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/day10/smartstore/customer/List.java index ef12be08..fabeb56d 100644 --- a/src/me/day10/smartstore/customer/List.java +++ b/src/me/day10/smartstore/customer/List.java @@ -7,10 +7,12 @@ public class List { protected static final int DEFAULT_CAPACITY = 16; protected static final int MAX_CAPACITY = 100; + private static final int MIN_CAPACITY = 16; // list[0] is always null: dummy private E[] list; private int size = 0; + private int reduceCapacityThreshold; List() { this(DEFAULT_CAPACITY); @@ -21,6 +23,7 @@ public class List { if (initCapacity > MAX_CAPACITY) initCapacity = MAX_CAPACITY; list = (E[]) new Object[initCapacity]; + reduceCapacityThreshold = initCapacity >>> 2; } public void checkIfReachedMaxCapacity() throws MaxCapacityReachedException { @@ -38,7 +41,10 @@ public boolean isEmpty() { public int size() { return size; } - public E get(int idx) { return list[idx]; } + public E get(int idx) { + checkIfOutOfBounds(idx); + return list[idx]; + } public void add(E e) throws IllegalArgumentException, MaxCapacityReachedException { checkIfNull(e); @@ -62,9 +68,40 @@ private void increaseCapacity() { list = Arrays.copyOf(list, newLength); } + public E remove(int idx) { + checkIfOutOfBounds(idx); + + E ret = list[idx]; + if (size - 1 <= reduceCapacityThreshold) { + reduceCapacity(idx); + } else { + System.arraycopy(list, idx + 1, list, idx, size - idx); + size--; + } + return ret; + } + + private void reduceCapacity(int idx) { + int newCapacity = Math.max(MIN_CAPACITY, list.length >>> 1); + @SuppressWarnings("unchecked") + E[] newList = (E[]) new Object[newCapacity]; + System.arraycopy(list, 0, newList, 0, idx - 1); + System.arraycopy(list, idx + 1, newList, idx, size - idx); + list = newList; + size--; + reduceCapacityThreshold = newCapacity >>> 2; + } + + private void checkIfOutOfBounds(int idx) { + if (idx < 1 || idx > size) { + String msg = String.format("Acceptable range: (1~%d), but input: %d", size, idx); + throw new ArrayIndexOutOfBoundsException(msg); + } + } + @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder("======= Stored Customers Info. =======\n"); for (int i = 1; i <= size; ++i) { String line = String.format("No. %2d => %s\n", i, list[i].toString()); sb.append(line); diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 50f0288b..17647d57 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -7,8 +7,8 @@ public abstract class Menu { - protected static final Reader reader = Reader.getInstance(); - protected static final Printer printer = Printer.getInstance(); + private static final Reader reader = Reader.getInstance(); + private static final Printer printer = Printer.getInstance(); protected static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; protected static final String GROUP_OUTPUT = '\n' + @@ -83,4 +83,11 @@ public void setPrevMenu(Menu menu) { protected Menu getPrevMenu() { return this.prevMenu; } + + protected int inputIntegerRanged(int fromInclusive, int toInclusive) throws InputMismatchException { + int i = reader.inputInteger(); + if (i < fromInclusive || i > toInclusive) + throw new InputMismatchException("Invalid Input. Please try again.\n"); + return i; + } } diff --git a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java index a01ca8cc..c6d78859 100644 --- a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java @@ -1,9 +1,11 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.AddCustomerMenu; import me.day10.smartstore.menu.topic.CustomerMenu; +import java.util.InputMismatchException; + public class DeleteCustomerMenu extends Menu { private static class InstanceHolder { @@ -14,7 +16,22 @@ private DeleteCustomerMenu() {} @Override public Menu printAndInputAndGetNextMenu() { - return null; + setNextMenus(); + CustomerRepository repository = CustomerRepository.getInstance(); + int size = repository.size(); + print('\n' + repository.toString()); + final String NUM_TO_DELETE_INPUT = "Which customer ( 1 ~ " + size + " )? "; + while (true) { + print(NUM_TO_DELETE_INPUT); + try { + int num = inputIntegerRanged(1, size); + String deletedCustomerInfo = repository.deleteAndGetInfoOf(num); + print('\n' + deletedCustomerInfo + "\n\n" + repository); + return getBackMenu(); + } catch (InputMismatchException e) { + print(e.getMessage()); + } + } } @Override From a88f4ae35a1dede36ef1edf8e12f1c961010440b Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Sun, 7 May 2023 23:05:03 +0900 Subject: [PATCH 52/61] feat: implement `UpdateCustomerMenu` --- .../day10/smartstore/customer/Customer.java | 22 ++++++--- .../customer/CustomerRepository.java | 24 +++++++++- src/me/day10/smartstore/menu/Menu.java | 2 +- .../menu/customer/DeleteCustomerMenu.java | 2 +- .../menu/customer/InputCustomerNameMenu.java | 6 --- .../customer/InputCustomerPropertyMenu.java | 10 ++--- .../InputCustomerTotalAmountPaidMenu.java | 6 --- .../customer/UpdateCustomerConfirmMenu.java | 45 +++++++++++++++++++ .../UpdateCustomerIntoRepositoryMenu.java | 30 +++++++++++++ .../menu/customer/UpdateCustomerMenu.java | 21 ++++++++- .../menu/topic/AddCustomerMenu.java | 7 ++- .../UpdateCustomerSelectPropertyMenu.java | 41 +++++++++++++++++ 12 files changed, 186 insertions(+), 30 deletions(-) create mode 100644 src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java create mode 100644 src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java create mode 100644 src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/day10/smartstore/customer/Customer.java index e357f03d..dcc2b56d 100644 --- a/src/me/day10/smartstore/customer/Customer.java +++ b/src/me/day10/smartstore/customer/Customer.java @@ -1,6 +1,7 @@ package me.day10.smartstore.customer; import me.day10.smartstore.group.Group; +import me.day10.smartstore.menu.topic.CustomerMenu; public class Customer { @@ -21,12 +22,8 @@ public class Customer { private Integer totalAmountPaid; private Group group; - public Customer() { - this(null); - } - - public Customer(String id) { - this(id, null, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_AMOUNT_PAID, DEFAULT_GROUP); + public Customer(String id, String name) { + this(id, name, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_AMOUNT_PAID, DEFAULT_GROUP); } public Customer(String id, String name, Integer spentHours, Integer totalAmountPaid, Group group) { @@ -37,6 +34,10 @@ public Customer(String id, String name, Integer spentHours, Integer totalAmountP this.group = group; } + public Customer(Customer e) { + copy(e); + } + public String getId() { return id; } public void setId(String id) throws InvalidCustomerIdException { @@ -44,7 +45,6 @@ public void setId(String id) throws InvalidCustomerIdException { } public void setName(String name) throws InvalidCustomerNameException { - checkIfNameIsValid(name); this.name = name; } @@ -81,6 +81,14 @@ private static void throwIfNull(Object o, String title) { throw new IllegalArgumentException(title + " cannot be null.\n"); } + public void copy(Customer e) { + id = e.id; + name = e.name; + spentHours = e.spentHours; + totalAmountPaid = e.totalAmountPaid; + group = e.group; + } + @Override public String toString() { return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d, group=%s}", diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index e03ea54e..73bccefd 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -10,13 +10,14 @@ private CustomerRepository() {} private final List customerList = new List<>(); private static Customer tempCustomer; + private static int tempIdx; public void checkIfCanAddMore() throws MaxCapacityReachedException { customerList.checkIfReachedMaxCapacity(); } public void resetTempCustomer() { - tempCustomer = new Customer(); + tempCustomer = new Customer(null, null); } public void checkIfHasNoDuplicate(String id) throws DuplicateCustomerIdException { @@ -45,6 +46,7 @@ public void setTempId(String id) throws InvalidCustomerIdException, DuplicateCus } public void setTempName(String name) throws InvalidCustomerNameException { + Customer.checkIfNameIsValid(name); tempCustomer.setName(name); } @@ -66,6 +68,7 @@ public void addTempIntoRepository() { assert !customerList.isReachedMaxCapacity(); customerList.add(tempCustomer); + tempCustomer = null; } public boolean isTempIdNull() { @@ -80,6 +83,25 @@ public String deleteAndGetInfoOf(int num) { return customerList.remove(num).toString(); } + public String setTempAndGetInfoOf(int num) { + Customer updatingCustomer = customerList.get(num); + tempCustomer = new Customer(updatingCustomer); + tempIdx = num; + return updatingCustomer.toString(); + } + + public void updateTempInRepository() { + customerList.get(tempIdx).copy(tempCustomer); + } + + public String getUpdateBeforeAndAfterInfo() { + Customer before = customerList.get(tempIdx); + Customer after = tempCustomer; + return String.format("\nNo. %2d\n", tempIdx) + + "Before: " + before.toString() + '\n'+ + "After : " + after.toString(); + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 17647d57..9a67e798 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -27,7 +27,7 @@ protected Menu() {} protected abstract void setNextMenus(); - protected final void setNextMenus(Menu... nextMenus) { + public final void setNextMenus(Menu... nextMenus) { int len = nextMenus.length; if (this.nextMenus == null) this.nextMenus = new Menu[len]; diff --git a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java index c6d78859..59288444 100644 --- a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java @@ -26,7 +26,7 @@ public Menu printAndInputAndGetNextMenu() { try { int num = inputIntegerRanged(1, size); String deletedCustomerInfo = repository.deleteAndGetInfoOf(num); - print('\n' + deletedCustomerInfo + "\n\n" + repository); + print("\nDelete\n No. " + num + ' ' + deletedCustomerInfo + "\n\n" + repository); return getBackMenu(); } catch (InputMismatchException e) { print(e.getMessage()); diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java index bbc7326c..8c55548e 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java @@ -3,7 +3,6 @@ import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.customer.InvalidCustomerNameException; import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.topic.AddCustomerMenu; import static me.day10.smartstore.customer.Customer.NAME_FORMAT; @@ -19,11 +18,6 @@ private static class InstanceHolder { private InputCustomerNameMenu() { super(NAME_INPUT); } public static InputCustomerNameMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - protected void setNextMenus() { - setNextMenus(null, AddCustomerMenu.getInstance()); - } - @Override protected String inputProperty() throws InputIsEndException { return inputStringOrEnd(); diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java index 4ac9bbcc..556e14c5 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java @@ -1,8 +1,9 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.topic.AddCustomerMenu; +import me.day10.smartstore.menu.topic.CustomerMenu; import java.util.InputMismatchException; @@ -16,15 +17,14 @@ public abstract class InputCustomerPropertyMenu extends Menu { @Override public Menu printAndInputAndGetNextMenu() { - setNextMenus(); + if (getPrevMenu() == UpdateCustomerMenu.getInstance()) + CustomerRepository.getInstance().resetTempCustomer(); inputPropertyAndSetItIntoTemp(); return getBackMenu(); } @Override - protected void setNextMenus() { - setNextMenus(null, AddCustomerMenu.getInstance()); - } + protected void setNextMenus() {} protected void inputPropertyAndSetItIntoTemp() { while (true) { diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java index 857fec82..85502914 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java +++ b/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java @@ -2,7 +2,6 @@ import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.topic.AddCustomerMenu; import java.util.InputMismatchException; @@ -17,11 +16,6 @@ private static class InstanceHolder { private InputCustomerTotalAmountPaidMenu() { super(TOTAL_AMOUNT_PAID); } public static InputCustomerTotalAmountPaidMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - protected void setNextMenus() { - setNextMenus(null, AddCustomerMenu.getInstance()); - } - @Override protected Object inputProperty() throws InputIsEndException, InputMismatchException { return inputZeroOrPositiveIntegerOrEnd(); diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java new file mode 100644 index 00000000..f6231589 --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java @@ -0,0 +1,45 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.exception.InvalidMenuException; + +import java.util.InputMismatchException; + +public class UpdateCustomerConfirmMenu extends Menu { + + private static final String UPDATE_CUSTOMER_CONFIRM_OUTPUT = + '\n' + + "==== Update Customer Confirm ====" + '\n' + + " 1. " + "Yes (Update)" + '\n' + + " 2. " + "No (Back)" + '\n' + + "==============================" + '\n' + + "Choose One: "; + + private static class InstanceHolder { + private static final UpdateCustomerConfirmMenu INSTANCE = new UpdateCustomerConfirmMenu(); + } + private UpdateCustomerConfirmMenu() { super(); } + public static UpdateCustomerConfirmMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + final String updateBeforeAndAfterInfo = CustomerRepository.getInstance().getUpdateBeforeAndAfterInfo(); + while (true) { + try { + print(updateBeforeAndAfterInfo); + print(UPDATE_CUSTOMER_CONFIRM_OUTPUT); + int i = inputMenu(); + return nextMenus[i]; + } catch (InputMismatchException | InvalidMenuException e) { + print(e.getMessage()); + } + } + } + + @Override + protected void setNextMenus() { + setNextMenus(null, UpdateCustomerIntoRepositoryMenu.getInstance(), UpdateCustomerMenu.getInstance()); + } +} diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java new file mode 100644 index 00000000..d246c325 --- /dev/null +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java @@ -0,0 +1,30 @@ +package me.day10.smartstore.menu.customer; + +import me.day10.smartstore.customer.CustomerRepository; +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.topic.CustomerMenu; + +public class UpdateCustomerIntoRepositoryMenu extends Menu { + + private static class InstanceHolder { + private static final UpdateCustomerIntoRepositoryMenu INSTANCE = new UpdateCustomerIntoRepositoryMenu(); + } + private UpdateCustomerIntoRepositoryMenu() {} + public static UpdateCustomerIntoRepositoryMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + updateTempCustomerInRepository(); + return getBackMenu(); + } + + @Override + protected void setNextMenus() { + setNextMenus(null, CustomerMenu.getInstance()); + } + + private void updateTempCustomerInRepository() { + CustomerRepository.getInstance().updateTempInRepository(); + } +} diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java index dfd5726d..d2de027d 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java @@ -1,7 +1,11 @@ package me.day10.smartstore.menu.customer; +import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.topic.CustomerMenu; +import me.day10.smartstore.menu.topic.UpdateCustomerSelectPropertyMenu; + +import java.util.InputMismatchException; public class UpdateCustomerMenu extends Menu { @@ -13,7 +17,22 @@ private UpdateCustomerMenu() {} @Override public Menu printAndInputAndGetNextMenu() { - return null; + setNextMenus(); + CustomerRepository repository = CustomerRepository.getInstance(); + int size = repository.size(); + print('\n' + repository.toString()); + final String NUM_TO_UPDATE_INPUT = "Which customer ( 1 ~ " + size + " )? "; + while (true) { + print(NUM_TO_UPDATE_INPUT); + try { + int num = inputIntegerRanged(1, size); + String updatingCustomerInfo = repository.setTempAndGetInfoOf(num); + print("======= Updating Customer Info. =======\n" + updatingCustomerInfo + '\n'); + return UpdateCustomerSelectPropertyMenu.getInstance(); + } catch (InputMismatchException e) { + print(e.getMessage()); + } + } } @Override diff --git a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java index f880be74..e91725db 100644 --- a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java @@ -44,7 +44,7 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus( + Menu[] nextMenus = { null, InputCustomerIdMenu.getInstance(), // id InputCustomerNameMenu.getInstance(), // name @@ -52,6 +52,9 @@ protected void setNextMenus() { InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid AddCustomerConfirmMenu.getInstance(), // confirm CustomerMenu.getInstance() // cancel(back) => CustomerMenu - ); + }; + for (int i = 1; i <= 4; ++i) + nextMenus[i].setNextMenus(null, this); + setNextMenus(nextMenus); } } diff --git a/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java b/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java new file mode 100644 index 00000000..d22edd77 --- /dev/null +++ b/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java @@ -0,0 +1,41 @@ +package me.day10.smartstore.menu.topic; + +import me.day10.smartstore.menu.Menu; +import me.day10.smartstore.menu.customer.*; + +public class UpdateCustomerSelectPropertyMenu extends TopicIntroMenu { + + private static final String CUSTOMER_PROPERTY_MENU_OUTPUT = + '\n' + + "===== Property to update =====" + '\n' + + " 1. " + "Customer " + "Name" + '\n' + + " 2. " + "Customer " + "Spent Hours" + '\n' + + " 3. " + "Customer " + "Total Amount Paid" + '\n' + + " 4. " + "Confirm" + '\n' + + " 5. " + "Cancel(Back)" + '\n' + + "==============================" + '\n' + + "Choose One: "; + + private static class InstanceHolder { + private static final UpdateCustomerSelectPropertyMenu INSTANCE = new UpdateCustomerSelectPropertyMenu(); + } + + private UpdateCustomerSelectPropertyMenu() { super(CUSTOMER_PROPERTY_MENU_OUTPUT); } + + public static UpdateCustomerSelectPropertyMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + protected void setNextMenus() { + Menu[] nextMenus = { + null, + InputCustomerNameMenu.getInstance(), // name + InputCustomerSpentHoursMenu.getInstance(), // spent hours + InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid + UpdateCustomerConfirmMenu.getInstance(), // confirm + CustomerMenu.getInstance() // cancel(back) => CustomerMenu + }; + for (int i = 1; i <= 3; ++i) + nextMenus[i].setNextMenus(null, this); + setNextMenus(nextMenus); + } +} From 34b65e8c4fa1e7fb3e3d9baa113e963676f3afc4 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 8 May 2023 11:03:38 +0900 Subject: [PATCH 53/61] refacotr: modify the array range (1 -> 0 begin) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 dummy를 지웁니다. 1. nextMenus의 dummy null (idx:0) 2. List의 dummy null (idx:0) 3. SetParameter의 dummy null (idx:0) 을 지우되 외부 코드에는 영향을 최소화하여 지웁니다. --- .../customer/CustomerRepository.java | 10 +++++---- src/me/day10/smartstore/customer/List.java | 21 +++++++++---------- src/me/day10/smartstore/group/Group.java | 4 ++-- src/me/day10/smartstore/menu/Menu.java | 11 ++++------ .../menu/customer/AddCustomerConfirmMenu.java | 5 ++--- .../AddCustomerIntoRepositoryMenu.java | 2 +- .../menu/customer/DeleteCustomerMenu.java | 2 +- .../customer/UpdateCustomerConfirmMenu.java | 5 ++--- .../UpdateCustomerIntoRepositoryMenu.java | 2 +- .../menu/customer/UpdateCustomerMenu.java | 2 +- .../menu/customer/ViewCustomerMenu.java | 2 +- .../menu/exception/InvalidMenuException.java | 8 ------- .../menu/group/SetParameterMenu.java | 6 ++---- .../menu/group/ViewParameterMenu.java | 2 +- .../menu/topic/AddCustomerMenu.java | 3 +-- .../smartstore/menu/topic/CustomerMenu.java | 1 - .../smartstore/menu/topic/GroupMenu.java | 1 - .../smartstore/menu/topic/StartMenu.java | 1 - .../smartstore/menu/topic/TopicIntroMenu.java | 3 +-- .../UpdateCustomerSelectPropertyMenu.java | 5 ++--- 20 files changed, 38 insertions(+), 58 deletions(-) delete mode 100644 src/me/day10/smartstore/menu/exception/InvalidMenuException.java diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/day10/smartstore/customer/CustomerRepository.java index 73bccefd..c2f915a8 100644 --- a/src/me/day10/smartstore/customer/CustomerRepository.java +++ b/src/me/day10/smartstore/customer/CustomerRepository.java @@ -33,7 +33,7 @@ private int findIdxById(String id) { assert id != null; int size = customerList.size(); - for (int i = 1; i <= size; ++i) + for (int i = 0; i < size; ++i) if (id.equals(customerList.get(i).getId())) return i; return -1; @@ -80,13 +80,15 @@ public int size() { } public String deleteAndGetInfoOf(int num) { - return customerList.remove(num).toString(); + int idx = num - 1; + return customerList.remove(idx).toString(); } public String setTempAndGetInfoOf(int num) { - Customer updatingCustomer = customerList.get(num); + int idx = num - 1; + Customer updatingCustomer = customerList.get(idx); tempCustomer = new Customer(updatingCustomer); - tempIdx = num; + tempIdx = idx; return updatingCustomer.toString(); } diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/day10/smartstore/customer/List.java index fabeb56d..19f4df7b 100644 --- a/src/me/day10/smartstore/customer/List.java +++ b/src/me/day10/smartstore/customer/List.java @@ -9,7 +9,6 @@ public class List { protected static final int MAX_CAPACITY = 100; private static final int MIN_CAPACITY = 16; - // list[0] is always null: dummy private E[] list; private int size = 0; private int reduceCapacityThreshold; @@ -32,7 +31,7 @@ public void checkIfReachedMaxCapacity() throws MaxCapacityReachedException { } public boolean isReachedMaxCapacity() { - return size == MAX_CAPACITY - 1; + return size == MAX_CAPACITY; } public boolean isEmpty() { @@ -41,7 +40,7 @@ public boolean isEmpty() { public int size() { return size; } - public E get(int idx) { + public E get(int idx) throws ArrayIndexOutOfBoundsException { checkIfOutOfBounds(idx); return list[idx]; } @@ -51,7 +50,7 @@ public void add(E e) throws IllegalArgumentException, MaxCapacityReachedExceptio checkIfReachedMaxCapacity(); if (isFull()) increaseCapacity(); - list[++size] = e; + list[size++] = e; } private void checkIfNull(E e) { @@ -68,7 +67,7 @@ private void increaseCapacity() { list = Arrays.copyOf(list, newLength); } - public E remove(int idx) { + public E remove(int idx) throws ArrayIndexOutOfBoundsException { checkIfOutOfBounds(idx); E ret = list[idx]; @@ -85,16 +84,16 @@ private void reduceCapacity(int idx) { int newCapacity = Math.max(MIN_CAPACITY, list.length >>> 1); @SuppressWarnings("unchecked") E[] newList = (E[]) new Object[newCapacity]; - System.arraycopy(list, 0, newList, 0, idx - 1); - System.arraycopy(list, idx + 1, newList, idx, size - idx); + System.arraycopy(list, 0, newList, 0, idx); + System.arraycopy(list, idx + 1, newList, idx, size - 1 - idx); list = newList; size--; reduceCapacityThreshold = newCapacity >>> 2; } private void checkIfOutOfBounds(int idx) { - if (idx < 1 || idx > size) { - String msg = String.format("Acceptable range: (1~%d), but input: %d", size, idx); + if (idx < 0 || idx >= size) { + String msg = String.format("Acceptable range: (0~%d), but input: %d", size - 1, idx); throw new ArrayIndexOutOfBoundsException(msg); } } @@ -102,8 +101,8 @@ private void checkIfOutOfBounds(int idx) { @Override public String toString() { StringBuilder sb = new StringBuilder("======= Stored Customers Info. =======\n"); - for (int i = 1; i <= size; ++i) { - String line = String.format("No. %2d => %s\n", i, list[i].toString()); + for (int i = 0; i < size; ++i) { + String line = String.format("No. %2d => %s\n", i + 1, list[i].toString()); sb.append(line); } return sb.toString(); diff --git a/src/me/day10/smartstore/group/Group.java b/src/me/day10/smartstore/group/Group.java index a70b984b..8b4a0b87 100644 --- a/src/me/day10/smartstore/group/Group.java +++ b/src/me/day10/smartstore/group/Group.java @@ -30,8 +30,8 @@ private boolean isName(String s) { } public void setGroupParameter(Integer[] groupParameterArguments) { - this.groupParameter.setMinSpentHours(groupParameterArguments[1]); - this.groupParameter.setMinTotalAmountPaid(groupParameterArguments[2]); + this.groupParameter.setMinSpentHours(groupParameterArguments[0]); + this.groupParameter.setMinTotalAmountPaid(groupParameterArguments[1]); } @Override diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 9a67e798..158e773b 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -1,7 +1,6 @@ package me.day10.smartstore.menu; import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.exception.InvalidMenuException; import java.util.InputMismatchException; @@ -31,7 +30,7 @@ public final void setNextMenus(Menu... nextMenus) { int len = nextMenus.length; if (this.nextMenus == null) this.nextMenus = new Menu[len]; - System.arraycopy(nextMenus, 1, this.nextMenus, 1, len - 1); + System.arraycopy(nextMenus, 0, this.nextMenus, 0, len); BACK_MENU = this.nextMenus[len - 1]; } @@ -39,11 +38,9 @@ protected void print(Object s) { printer.print(s.toString()); } - protected int inputMenu() throws InputMismatchException, InvalidMenuException { - int ret = reader.inputInteger(); - if (ret <= 0 || ret >= nextMenus.length) - throw new InvalidMenuException("Invalid Menu Input." + " Please try again.\n"); - return ret; + protected int inputMenu() throws InputMismatchException { + int menu = inputIntegerRanged(1, nextMenus.length); + return menu - 1; } protected String inputGroupName() throws InputIsEndException { diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java index e9304e04..e400d7a1 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java +++ b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java @@ -2,7 +2,6 @@ import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.exception.InvalidMenuException; import me.day10.smartstore.menu.topic.AddCustomerMenu; import java.util.InputMismatchException; @@ -37,7 +36,7 @@ public Menu printAndInputAndGetNextMenu() { print(ADD_CUSTOMER_CONFIRM_OUTPUT); int i = inputMenu(); return nextMenus[i]; - } catch (InputMismatchException | InvalidMenuException e) { + } catch (InputMismatchException e) { print(e.getMessage()); } } @@ -45,7 +44,7 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, AddCustomerIntoRepositoryMenu.getInstance(), AddCustomerMenu.getInstance()); + setNextMenus(AddCustomerIntoRepositoryMenu.getInstance(), AddCustomerMenu.getInstance()); } private String getTempCustomerInfo() { diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java index fbe9c34c..82800eaf 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java +++ b/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java @@ -21,7 +21,7 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, CustomerMenu.getInstance()); + setNextMenus(CustomerMenu.getInstance()); } private void addTempCustomerIntoRepository() { diff --git a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java index 59288444..5de0d326 100644 --- a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java @@ -36,6 +36,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, CustomerMenu.getInstance()); + setNextMenus(CustomerMenu.getInstance()); } } diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java index f6231589..ededc21b 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java @@ -2,7 +2,6 @@ import me.day10.smartstore.customer.CustomerRepository; import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.exception.InvalidMenuException; import java.util.InputMismatchException; @@ -32,7 +31,7 @@ public Menu printAndInputAndGetNextMenu() { print(UPDATE_CUSTOMER_CONFIRM_OUTPUT); int i = inputMenu(); return nextMenus[i]; - } catch (InputMismatchException | InvalidMenuException e) { + } catch (InputMismatchException e) { print(e.getMessage()); } } @@ -40,6 +39,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, UpdateCustomerIntoRepositoryMenu.getInstance(), UpdateCustomerMenu.getInstance()); + setNextMenus(UpdateCustomerIntoRepositoryMenu.getInstance(), UpdateCustomerMenu.getInstance()); } } diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java index d246c325..bf122133 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java @@ -21,7 +21,7 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, CustomerMenu.getInstance()); + setNextMenus(CustomerMenu.getInstance()); } private void updateTempCustomerInRepository() { diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java index d2de027d..b3b731dd 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java @@ -37,6 +37,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, CustomerMenu.getInstance()); + setNextMenus(CustomerMenu.getInstance()); } } diff --git a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java index 9506f377..57367c24 100644 --- a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java +++ b/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java @@ -21,6 +21,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, CustomerMenu.getInstance()); + setNextMenus(CustomerMenu.getInstance()); } } diff --git a/src/me/day10/smartstore/menu/exception/InvalidMenuException.java b/src/me/day10/smartstore/menu/exception/InvalidMenuException.java deleted file mode 100644 index 026fa6de..00000000 --- a/src/me/day10/smartstore/menu/exception/InvalidMenuException.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.day10.smartstore.menu.exception; - -public class InvalidMenuException extends IllegalArgumentException { - - public InvalidMenuException(String s) { - super(s); - } -} diff --git a/src/me/day10/smartstore/menu/group/SetParameterMenu.java b/src/me/day10/smartstore/menu/group/SetParameterMenu.java index 282e4dea..f3804dc9 100644 --- a/src/me/day10/smartstore/menu/group/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/SetParameterMenu.java @@ -3,7 +3,6 @@ import me.day10.smartstore.group.Group; import me.day10.smartstore.menu.exception.InputIsEndException; import me.day10.smartstore.menu.exception.InvalidGroupNameException; -import me.day10.smartstore.menu.exception.InvalidMenuException; import me.day10.smartstore.menu.Menu; import me.day10.smartstore.menu.topic.GroupMenu; @@ -54,7 +53,6 @@ public Menu printAndInputAndGetNextMenu() { @Override public void setNextMenus() { setNextMenus( - null, null, // read minSpentHours null, // read minTotalAmountPaid GroupMenu.getInstance() // Back => GroupMenu @@ -62,7 +60,7 @@ public void setNextMenus() { } private void inputGroupParameter(Group group) { - Integer[] groupParameterArguments = { null, null, null }; // null, .., .. + Integer[] groupParameterArguments = { null, null }; while (true) { print(SET_GROUP_PARAMETER_OUTPUT); try { @@ -78,7 +76,7 @@ private void inputGroupParameter(Group group) { } catch (InputIsEndException e) { print(e.getMessage()); break; - } catch (InvalidMenuException | InputMismatchException e) { + } catch (InputMismatchException e) { print(e.getMessage()); } } diff --git a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java index ae063596..7ac55ed7 100644 --- a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java @@ -34,6 +34,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(null, GroupMenu.getInstance()); + setNextMenus(GroupMenu.getInstance()); } } diff --git a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java index e91725db..0da0dc74 100644 --- a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java @@ -45,7 +45,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { Menu[] nextMenus = { - null, InputCustomerIdMenu.getInstance(), // id InputCustomerNameMenu.getInstance(), // name InputCustomerSpentHoursMenu.getInstance(), // spent hours @@ -53,7 +52,7 @@ protected void setNextMenus() { AddCustomerConfirmMenu.getInstance(), // confirm CustomerMenu.getInstance() // cancel(back) => CustomerMenu }; - for (int i = 1; i <= 4; ++i) + for (int i = 0; i <= 3; ++i) nextMenus[i].setNextMenus(null, this); setNextMenus(nextMenus); } diff --git a/src/me/day10/smartstore/menu/topic/CustomerMenu.java b/src/me/day10/smartstore/menu/topic/CustomerMenu.java index 373af830..fd628b89 100644 --- a/src/me/day10/smartstore/menu/topic/CustomerMenu.java +++ b/src/me/day10/smartstore/menu/topic/CustomerMenu.java @@ -25,7 +25,6 @@ public class CustomerMenu extends TopicIntroMenu { @Override protected void setNextMenus() { setNextMenus( - null, AddCustomerMenu.getInstance(), ViewCustomerMenu.getInstance(), UpdateCustomerMenu.getInstance(), diff --git a/src/me/day10/smartstore/menu/topic/GroupMenu.java b/src/me/day10/smartstore/menu/topic/GroupMenu.java index 99527a66..a126fb05 100644 --- a/src/me/day10/smartstore/menu/topic/GroupMenu.java +++ b/src/me/day10/smartstore/menu/topic/GroupMenu.java @@ -24,7 +24,6 @@ public class GroupMenu extends TopicIntroMenu { @Override protected void setNextMenus() { setNextMenus( - null, SetParameterMenu.getInstance(), // 1 ViewParameterMenu.getInstance(), // 2 UpdateParameterMenu.getInstance(), // 3 diff --git a/src/me/day10/smartstore/menu/topic/StartMenu.java b/src/me/day10/smartstore/menu/topic/StartMenu.java index fea948e9..ba4c5cf1 100644 --- a/src/me/day10/smartstore/menu/topic/StartMenu.java +++ b/src/me/day10/smartstore/menu/topic/StartMenu.java @@ -23,7 +23,6 @@ public class StartMenu extends TopicIntroMenu { @Override protected void setNextMenus() { setNextMenus( - null, GroupMenu.getInstance(), // 1 CustomerMenu.getInstance(), // 2 ClassificationMenu.getInstance(), // 3 diff --git a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java index c82e3c7a..06f086f1 100644 --- a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java +++ b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java @@ -1,6 +1,5 @@ package me.day10.smartstore.menu.topic; -import me.day10.smartstore.menu.exception.InvalidMenuException; import me.day10.smartstore.menu.Menu; import java.util.InputMismatchException; @@ -23,7 +22,7 @@ protected Menu inputMenuAndMoveToNextMenu() { print(TOPIC_OUTPUT); int i = inputMenu(); return nextMenus[i]; - } catch (InputMismatchException | InvalidMenuException e) { + } catch (InputMismatchException e) { print(e.getMessage()); } } diff --git a/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java b/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java index d22edd77..5a899c5f 100644 --- a/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java +++ b/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java @@ -27,14 +27,13 @@ private static class InstanceHolder { @Override protected void setNextMenus() { Menu[] nextMenus = { - null, InputCustomerNameMenu.getInstance(), // name InputCustomerSpentHoursMenu.getInstance(), // spent hours InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid - UpdateCustomerConfirmMenu.getInstance(), // confirm + UpdateCustomerConfirmMenu.getInstance(), // confirm CustomerMenu.getInstance() // cancel(back) => CustomerMenu }; - for (int i = 1; i <= 3; ++i) + for (int i = 0; i <= 2; ++i) nextMenus[i].setNextMenus(null, this); setNextMenus(nextMenus); } From 9c2f4fcc91640e882c55a642a558067d224434e6 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 8 May 2023 11:23:19 +0900 Subject: [PATCH 54/61] refactor: formatting in `Menu` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. formatting 2. `nextMenus` 필드의 접근제어자를 private으로 변경했습니다. 3. 불필요한 `inputGroupName()`을 다른 메소드로 대체했습니다. --- src/me/day10/smartstore/menu/Menu.java | 35 +++++++------------ .../menu/customer/AddCustomerConfirmMenu.java | 4 +-- .../customer/UpdateCustomerConfirmMenu.java | 4 +-- .../menu/group/SetParameterMenu.java | 4 +-- .../menu/group/ViewParameterMenu.java | 2 +- .../smartstore/menu/topic/TopicIntroMenu.java | 4 +-- 6 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/day10/smartstore/menu/Menu.java index 158e773b..c74f346c 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/day10/smartstore/menu/Menu.java @@ -14,7 +14,7 @@ public abstract class Menu { "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + END_INPUT; - protected Menu[] nextMenus; + private Menu[] nextMenus; private Menu BACK_MENU; private Menu prevMenu; @@ -22,10 +22,12 @@ protected Menu() {} public abstract Menu printAndInputAndGetNextMenu(); - protected final Menu getBackMenu() { return BACK_MENU; } - protected abstract void setNextMenus(); + protected final Menu getNextMenu(int idx) { return nextMenus[idx]; } + + protected final Menu getBackMenu() { return BACK_MENU; } + public final void setNextMenus(Menu... nextMenus) { int len = nextMenus.length; if (this.nextMenus == null) @@ -34,35 +36,32 @@ public final void setNextMenus(Menu... nextMenus) { BACK_MENU = this.nextMenus[len - 1]; } + public final void setPrevMenu(Menu menu) { this.prevMenu = menu; } + + protected final Menu getPrevMenu() { return this.prevMenu; } + protected void print(Object s) { printer.print(s.toString()); } - protected int inputMenu() throws InputMismatchException { + protected int inputMenuIdx() throws InputMismatchException { int menu = inputIntegerRanged(1, nextMenus.length); return menu - 1; } - protected String inputGroupName() throws InputIsEndException { - String s = reader.inputString().toUpperCase(); + protected final String inputStringOrEnd() throws InputIsEndException { + String s = reader.inputString(); checkIfInputIsEnd(s); return s; } protected void checkIfInputIsEnd(String s) throws InputIsEndException { - if (s.equals("END")) + if (s.equalsIgnoreCase("end")) throw new InputIsEndException("'end' is pressed. Exit this menu.\n\n"); } - protected final String inputStringOrEnd() throws InputIsEndException { - String s = reader.inputString(); - checkIfInputIsEnd(s.toUpperCase()); - return s; - } - protected Integer inputZeroOrPositiveIntegerOrEnd() throws InputIsEndException, InputMismatchException { String s = inputStringOrEnd(); - try { int i = Integer.parseInt(s); if (i < 0) @@ -73,14 +72,6 @@ protected Integer inputZeroOrPositiveIntegerOrEnd() throws InputIsEndException, } } - public void setPrevMenu(Menu menu) { - this.prevMenu = menu; - } - - protected Menu getPrevMenu() { - return this.prevMenu; - } - protected int inputIntegerRanged(int fromInclusive, int toInclusive) throws InputMismatchException { int i = reader.inputInteger(); if (i < fromInclusive || i > toInclusive) diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java index e400d7a1..206e868d 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java +++ b/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java @@ -34,8 +34,8 @@ public Menu printAndInputAndGetNextMenu() { return getBackMenu(); } print(ADD_CUSTOMER_CONFIRM_OUTPUT); - int i = inputMenu(); - return nextMenus[i]; + int menuIdx = inputMenuIdx(); + return getNextMenu(menuIdx); } catch (InputMismatchException e) { print(e.getMessage()); } diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java b/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java index ededc21b..bad1de19 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java +++ b/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java @@ -29,8 +29,8 @@ public Menu printAndInputAndGetNextMenu() { try { print(updateBeforeAndAfterInfo); print(UPDATE_CUSTOMER_CONFIRM_OUTPUT); - int i = inputMenu(); - return nextMenus[i]; + int menuIdx = inputMenuIdx(); + return getNextMenu(menuIdx); } catch (InputMismatchException e) { print(e.getMessage()); } diff --git a/src/me/day10/smartstore/menu/group/SetParameterMenu.java b/src/me/day10/smartstore/menu/group/SetParameterMenu.java index f3804dc9..7d4eedd7 100644 --- a/src/me/day10/smartstore/menu/group/SetParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/SetParameterMenu.java @@ -37,7 +37,7 @@ public Menu printAndInputAndGetNextMenu() { while (true) { print(GROUP_OUTPUT); try { - String groupName = inputGroupName(); + String groupName = inputStringOrEnd(); Group group = Group.getGroupByString(groupName); print(group); inputGroupParameter(group); @@ -64,7 +64,7 @@ private void inputGroupParameter(Group group) { while (true) { print(SET_GROUP_PARAMETER_OUTPUT); try { - int menu = inputMenu(); + int menu = inputMenuIdx(); if (menu <= 2) { assert menu != 0; print(GROUP_PARAMETER_INPUT[menu]); diff --git a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java index 7ac55ed7..6139fb28 100644 --- a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java +++ b/src/me/day10/smartstore/menu/group/ViewParameterMenu.java @@ -20,7 +20,7 @@ public Menu printAndInputAndGetNextMenu() { while (true) { print(GROUP_OUTPUT); try { - String groupName = inputGroupName(); + String groupName = inputStringOrEnd(); Group group = Group.getGroupByString(groupName); print(group); } catch (InputIsEndException e) { diff --git a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java index 06f086f1..f2fbac60 100644 --- a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java +++ b/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java @@ -20,8 +20,8 @@ protected Menu inputMenuAndMoveToNextMenu() { while (true) { try { print(TOPIC_OUTPUT); - int i = inputMenu(); - return nextMenus[i]; + int menuIdx = inputMenuIdx(); + return getNextMenu(menuIdx); } catch (InputMismatchException e) { print(e.getMessage()); } From 96667ec7e5c9bf0ebf1dba7ba973d6a742d506bf Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Mon, 8 May 2023 19:29:25 +0900 Subject: [PATCH 55/61] refactor: move directory me.day10.smartstore -> me.smartstore --- .../{day10 => }/smartstore/AppException.java | 2 +- src/me/{day10 => }/smartstore/Main.java | 2 +- .../{day10 => }/smartstore/SmartStoreApp.java | 6 ++--- .../smartstore/customer/Customer.java | 0 .../customer/CustomerRepository.java | 0 .../DuplicateCustomerIdException.java | 2 +- .../customer/InvalidCustomerIdException.java | 2 +- .../InvalidCustomerNameException.java | 2 +- .../{day10 => }/smartstore/customer/List.java | 0 .../customer/MaxCapacityReachedException.java | 2 +- .../{day10 => }/smartstore/group/Group.java | 26 ++++++++++--------- .../smartstore/group/GroupParameter.java | 2 +- src/me/smartstore/menu/InputHandlerMenu.java | 4 +++ src/me/{day10 => }/smartstore/menu/Menu.java | 4 +-- .../{day10 => }/smartstore/menu/Printer.java | 2 +- .../{day10 => }/smartstore/menu/QuitMenu.java | 2 +- .../{day10 => }/smartstore/menu/Reader.java | 2 +- .../menu/customer/AddCustomerConfirmMenu.java | 8 +++--- .../AddCustomerIntoRepositoryMenu.java | 8 +++--- .../menu/customer/DeleteCustomerMenu.java | 8 +++--- .../menu/customer/InputCustomerIdMenu.java | 12 ++++----- .../menu/customer/InputCustomerNameMenu.java | 10 +++---- .../customer/InputCustomerPropertyMenu.java | 10 +++---- .../customer/InputCustomerSpentHoursMenu.java | 6 ++--- .../InputCustomerTotalAmountPaidMenu.java | 6 ++--- .../customer/UpdateCustomerConfirmMenu.java | 6 ++--- .../UpdateCustomerIntoRepositoryMenu.java | 8 +++--- .../menu/customer/UpdateCustomerMenu.java | 10 +++---- .../menu/customer/ViewCustomerMenu.java | 8 +++--- .../menu/exception/InputIsEndException.java | 4 +-- .../exception/InvalidGroupNameException.java | 2 +- .../menu/group/SetParameterMenu.java | 12 ++++----- .../menu/group/UpdateParameterMenu.java | 4 +-- .../menu/group/ViewParameterMenu.java | 12 ++++----- .../menu/topic/AddCustomerMenu.java | 10 +++---- .../menu/topic/ClassificationMenu.java | 2 +- .../smartstore/menu/topic/CustomerMenu.java | 8 +++--- .../smartstore/menu/topic/GroupMenu.java | 8 +++--- .../smartstore/menu/topic/StartMenu.java | 4 +-- .../smartstore/menu/topic/TopicIntroMenu.java | 4 +-- .../UpdateCustomerSelectPropertyMenu.java | 6 ++--- .../{day10 => }/smartstore/use_merge_squash | 0 42 files changed, 121 insertions(+), 115 deletions(-) rename src/me/{day10 => }/smartstore/AppException.java (88%) rename src/me/{day10 => }/smartstore/Main.java (84%) rename src/me/{day10 => }/smartstore/SmartStoreApp.java (83%) rename src/me/{day10 => }/smartstore/customer/Customer.java (100%) rename src/me/{day10 => }/smartstore/customer/CustomerRepository.java (100%) rename src/me/{day10 => }/smartstore/customer/DuplicateCustomerIdException.java (79%) rename src/me/{day10 => }/smartstore/customer/InvalidCustomerIdException.java (79%) rename src/me/{day10 => }/smartstore/customer/InvalidCustomerNameException.java (79%) rename src/me/{day10 => }/smartstore/customer/List.java (100%) rename src/me/{day10 => }/smartstore/customer/MaxCapacityReachedException.java (79%) rename src/me/{day10 => }/smartstore/group/Group.java (67%) rename src/me/{day10 => }/smartstore/group/GroupParameter.java (94%) create mode 100644 src/me/smartstore/menu/InputHandlerMenu.java rename src/me/{day10 => }/smartstore/menu/Menu.java (96%) rename src/me/{day10 => }/smartstore/menu/Printer.java (94%) rename src/me/{day10 => }/smartstore/menu/QuitMenu.java (92%) rename src/me/{day10 => }/smartstore/menu/Reader.java (96%) rename src/me/{day10 => }/smartstore/menu/customer/AddCustomerConfirmMenu.java (90%) rename src/me/{day10 => }/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java (80%) rename src/me/{day10 => }/smartstore/menu/customer/DeleteCustomerMenu.java (86%) rename src/me/{day10 => }/smartstore/menu/customer/InputCustomerIdMenu.java (69%) rename src/me/{day10 => }/smartstore/menu/customer/InputCustomerNameMenu.java (73%) rename src/me/{day10 => }/smartstore/menu/customer/InputCustomerPropertyMenu.java (84%) rename src/me/{day10 => }/smartstore/menu/customer/InputCustomerSpentHoursMenu.java (85%) rename src/me/{day10 => }/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java (85%) rename src/me/{day10 => }/smartstore/menu/customer/UpdateCustomerConfirmMenu.java (91%) rename src/me/{day10 => }/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java (80%) rename src/me/{day10 => }/smartstore/menu/customer/UpdateCustomerMenu.java (83%) rename src/me/{day10 => }/smartstore/menu/customer/ViewCustomerMenu.java (75%) rename src/me/{day10 => }/smartstore/menu/exception/InputIsEndException.java (60%) rename src/me/{day10 => }/smartstore/menu/exception/InvalidGroupNameException.java (77%) rename src/me/{day10 => }/smartstore/menu/group/SetParameterMenu.java (89%) rename src/me/{day10 => }/smartstore/menu/group/UpdateParameterMenu.java (83%) rename src/me/{day10 => }/smartstore/menu/group/ViewParameterMenu.java (76%) rename src/me/{day10 => }/smartstore/menu/topic/AddCustomerMenu.java (90%) rename src/me/{day10 => }/smartstore/menu/topic/ClassificationMenu.java (91%) rename src/me/{day10 => }/smartstore/menu/topic/CustomerMenu.java (83%) rename src/me/{day10 => }/smartstore/menu/topic/GroupMenu.java (82%) rename src/me/{day10 => }/smartstore/menu/topic/StartMenu.java (92%) rename src/me/{day10 => }/smartstore/menu/topic/TopicIntroMenu.java (89%) rename src/me/{day10 => }/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java (92%) rename src/me/{day10 => }/smartstore/use_merge_squash (100%) diff --git a/src/me/day10/smartstore/AppException.java b/src/me/smartstore/AppException.java similarity index 88% rename from src/me/day10/smartstore/AppException.java rename to src/me/smartstore/AppException.java index 7dcc97a8..696f73dc 100644 --- a/src/me/day10/smartstore/AppException.java +++ b/src/me/smartstore/AppException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore; +package me.smartstore; public class AppException extends Exception { public AppException(String msg) { super(msg); } diff --git a/src/me/day10/smartstore/Main.java b/src/me/smartstore/Main.java similarity index 84% rename from src/me/day10/smartstore/Main.java rename to src/me/smartstore/Main.java index 8201156c..b40a15aa 100644 --- a/src/me/day10/smartstore/Main.java +++ b/src/me/smartstore/Main.java @@ -1,4 +1,4 @@ -package me.day10.smartstore; +package me.smartstore; public class Main { public static void main(String[] args) { diff --git a/src/me/day10/smartstore/SmartStoreApp.java b/src/me/smartstore/SmartStoreApp.java similarity index 83% rename from src/me/day10/smartstore/SmartStoreApp.java rename to src/me/smartstore/SmartStoreApp.java index 3136aaa8..ae310573 100644 --- a/src/me/day10/smartstore/SmartStoreApp.java +++ b/src/me/smartstore/SmartStoreApp.java @@ -1,7 +1,7 @@ -package me.day10.smartstore; +package me.smartstore; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.StartMenu; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.StartMenu; public class SmartStoreApp { diff --git a/src/me/day10/smartstore/customer/Customer.java b/src/me/smartstore/customer/Customer.java similarity index 100% rename from src/me/day10/smartstore/customer/Customer.java rename to src/me/smartstore/customer/Customer.java diff --git a/src/me/day10/smartstore/customer/CustomerRepository.java b/src/me/smartstore/customer/CustomerRepository.java similarity index 100% rename from src/me/day10/smartstore/customer/CustomerRepository.java rename to src/me/smartstore/customer/CustomerRepository.java diff --git a/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java b/src/me/smartstore/customer/DuplicateCustomerIdException.java similarity index 79% rename from src/me/day10/smartstore/customer/DuplicateCustomerIdException.java rename to src/me/smartstore/customer/DuplicateCustomerIdException.java index e0748c70..2de8221c 100644 --- a/src/me/day10/smartstore/customer/DuplicateCustomerIdException.java +++ b/src/me/smartstore/customer/DuplicateCustomerIdException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; public class DuplicateCustomerIdException extends IllegalStateException { public DuplicateCustomerIdException(String msg) { super(msg); } diff --git a/src/me/day10/smartstore/customer/InvalidCustomerIdException.java b/src/me/smartstore/customer/InvalidCustomerIdException.java similarity index 79% rename from src/me/day10/smartstore/customer/InvalidCustomerIdException.java rename to src/me/smartstore/customer/InvalidCustomerIdException.java index 22e7512d..4e411e34 100644 --- a/src/me/day10/smartstore/customer/InvalidCustomerIdException.java +++ b/src/me/smartstore/customer/InvalidCustomerIdException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; public class InvalidCustomerIdException extends IllegalArgumentException { public InvalidCustomerIdException(String msg) { super(msg); } diff --git a/src/me/day10/smartstore/customer/InvalidCustomerNameException.java b/src/me/smartstore/customer/InvalidCustomerNameException.java similarity index 79% rename from src/me/day10/smartstore/customer/InvalidCustomerNameException.java rename to src/me/smartstore/customer/InvalidCustomerNameException.java index 1dda987c..8ebd451e 100644 --- a/src/me/day10/smartstore/customer/InvalidCustomerNameException.java +++ b/src/me/smartstore/customer/InvalidCustomerNameException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; public class InvalidCustomerNameException extends IllegalArgumentException { public InvalidCustomerNameException(String msg) { super(msg); } diff --git a/src/me/day10/smartstore/customer/List.java b/src/me/smartstore/customer/List.java similarity index 100% rename from src/me/day10/smartstore/customer/List.java rename to src/me/smartstore/customer/List.java diff --git a/src/me/day10/smartstore/customer/MaxCapacityReachedException.java b/src/me/smartstore/customer/MaxCapacityReachedException.java similarity index 79% rename from src/me/day10/smartstore/customer/MaxCapacityReachedException.java rename to src/me/smartstore/customer/MaxCapacityReachedException.java index e1ef9510..ece7c576 100644 --- a/src/me/day10/smartstore/customer/MaxCapacityReachedException.java +++ b/src/me/smartstore/customer/MaxCapacityReachedException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; public class MaxCapacityReachedException extends IllegalStateException { public MaxCapacityReachedException(String msg) { super(msg); } diff --git a/src/me/day10/smartstore/group/Group.java b/src/me/smartstore/group/Group.java similarity index 67% rename from src/me/day10/smartstore/group/Group.java rename to src/me/smartstore/group/Group.java index 8b4a0b87..8590e70d 100644 --- a/src/me/day10/smartstore/group/Group.java +++ b/src/me/smartstore/group/Group.java @@ -1,32 +1,34 @@ -package me.day10.smartstore.group; +package me.smartstore.group; -import me.day10.smartstore.menu.exception.InvalidGroupNameException; +import me.smartstore.menu.exception.InvalidGroupNameException; import java.util.Arrays; public enum Group { - GENERAL("G", new GroupParameter()), - VIP("V", new GroupParameter()), - VVIP("VV", new GroupParameter()); + NONE("N"), + GENERAL("G"), + VIP("V"), + VVIP("VV"); - Group(String shortcut, GroupParameter groupParameter) { + private final String shortcut; + private final GroupParameter groupParameter; + + Group(String shortcut) { this.shortcut = shortcut; - this.groupParameter = groupParameter; + this.groupParameter = new GroupParameter(); } - private final GroupParameter groupParameter; - private final String shortcut; - public static Group getGroupByString(String s) throws InvalidGroupNameException { - return Arrays.stream(Group.values()) + Group[] groups = Group.values(); + return Arrays.stream(groups, 1, groups.length) .filter(group -> group.isName(s)) .findAny() .orElseThrow(() -> new InvalidGroupNameException("\nInvalid Group Name for Input. Please try again.\n")); } private boolean isName(String s) { - return (this.shortcut.equals(s) || this.name().equals(s)); + return this.shortcut.equalsIgnoreCase(s) || this.name().equalsIgnoreCase(s); } public void setGroupParameter(Integer[] groupParameterArguments) { diff --git a/src/me/day10/smartstore/group/GroupParameter.java b/src/me/smartstore/group/GroupParameter.java similarity index 94% rename from src/me/day10/smartstore/group/GroupParameter.java rename to src/me/smartstore/group/GroupParameter.java index 7ca6e2c6..d6ba8769 100644 --- a/src/me/day10/smartstore/group/GroupParameter.java +++ b/src/me/smartstore/group/GroupParameter.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.group; +package me.smartstore.group; public class GroupParameter { private Integer minSpentHours; diff --git a/src/me/smartstore/menu/InputHandlerMenu.java b/src/me/smartstore/menu/InputHandlerMenu.java new file mode 100644 index 00000000..313b5b61 --- /dev/null +++ b/src/me/smartstore/menu/InputHandlerMenu.java @@ -0,0 +1,4 @@ +package me.smartstore.menu; + +public abstract class InputHandlerMenu extends Menu { +} diff --git a/src/me/day10/smartstore/menu/Menu.java b/src/me/smartstore/menu/Menu.java similarity index 96% rename from src/me/day10/smartstore/menu/Menu.java rename to src/me/smartstore/menu/Menu.java index c74f346c..13400228 100644 --- a/src/me/day10/smartstore/menu/Menu.java +++ b/src/me/smartstore/menu/Menu.java @@ -1,6 +1,6 @@ -package me.day10.smartstore.menu; +package me.smartstore.menu; -import me.day10.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.exception.InputIsEndException; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/Printer.java b/src/me/smartstore/menu/Printer.java similarity index 94% rename from src/me/day10/smartstore/menu/Printer.java rename to src/me/smartstore/menu/Printer.java index 45075ed1..0bbb7f23 100644 --- a/src/me/day10/smartstore/menu/Printer.java +++ b/src/me/smartstore/menu/Printer.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu; +package me.smartstore.menu; import java.io.BufferedWriter; import java.io.IOException; diff --git a/src/me/day10/smartstore/menu/QuitMenu.java b/src/me/smartstore/menu/QuitMenu.java similarity index 92% rename from src/me/day10/smartstore/menu/QuitMenu.java rename to src/me/smartstore/menu/QuitMenu.java index 2a14074f..8cf54be5 100644 --- a/src/me/day10/smartstore/menu/QuitMenu.java +++ b/src/me/smartstore/menu/QuitMenu.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu; +package me.smartstore.menu; public class QuitMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/Reader.java b/src/me/smartstore/menu/Reader.java similarity index 96% rename from src/me/day10/smartstore/menu/Reader.java rename to src/me/smartstore/menu/Reader.java index 9bc6e909..a017ef77 100644 --- a/src/me/day10/smartstore/menu/Reader.java +++ b/src/me/smartstore/menu/Reader.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu; +package me.smartstore.menu; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java b/src/me/smartstore/menu/customer/AddCustomerConfirmMenu.java similarity index 90% rename from src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java rename to src/me/smartstore/menu/customer/AddCustomerConfirmMenu.java index 206e868d..c947f905 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerConfirmMenu.java +++ b/src/me/smartstore/menu/customer/AddCustomerConfirmMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.AddCustomerMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.AddCustomerMenu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java b/src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java similarity index 80% rename from src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java rename to src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java index 82800eaf..f47262cb 100644 --- a/src/me/day10/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java +++ b/src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.CustomerMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.CustomerMenu; public class AddCustomerIntoRepositoryMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java b/src/me/smartstore/menu/customer/DeleteCustomerMenu.java similarity index 86% rename from src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java rename to src/me/smartstore/menu/customer/DeleteCustomerMenu.java index 5de0d326..d9b9a2d9 100644 --- a/src/me/day10/smartstore/menu/customer/DeleteCustomerMenu.java +++ b/src/me/smartstore/menu/customer/DeleteCustomerMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.CustomerMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.CustomerMenu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java b/src/me/smartstore/menu/customer/InputCustomerIdMenu.java similarity index 69% rename from src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java rename to src/me/smartstore/menu/customer/InputCustomerIdMenu.java index 45d469e3..fa9b8ac1 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerIdMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerIdMenu.java @@ -1,11 +1,11 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.customer.DuplicateCustomerIdException; -import me.day10.smartstore.customer.InvalidCustomerIdException; -import me.day10.smartstore.menu.exception.InputIsEndException; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.DuplicateCustomerIdException; +import me.smartstore.customer.InvalidCustomerIdException; +import me.smartstore.menu.exception.InputIsEndException; -import static me.day10.smartstore.customer.Customer.ID_FORMAT; +import static me.smartstore.customer.Customer.ID_FORMAT; public class InputCustomerIdMenu extends InputCustomerPropertyMenu { diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/smartstore/menu/customer/InputCustomerNameMenu.java similarity index 73% rename from src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java rename to src/me/smartstore/menu/customer/InputCustomerNameMenu.java index 8c55548e..f28409f1 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerNameMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerNameMenu.java @@ -1,10 +1,10 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.customer.InvalidCustomerNameException; -import me.day10.smartstore.menu.exception.InputIsEndException; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.InvalidCustomerNameException; +import me.smartstore.menu.exception.InputIsEndException; -import static me.day10.smartstore.customer.Customer.NAME_FORMAT; +import static me.smartstore.customer.Customer.NAME_FORMAT; public class InputCustomerNameMenu extends InputCustomerPropertyMenu { diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java b/src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java similarity index 84% rename from src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java rename to src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java index 556e14c5..b2a98ffb 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerPropertyMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java @@ -1,9 +1,9 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.topic.CustomerMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.topic.CustomerMenu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java b/src/me/smartstore/menu/customer/InputCustomerSpentHoursMenu.java similarity index 85% rename from src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java rename to src/me/smartstore/menu/customer/InputCustomerSpentHoursMenu.java index 51949704..7902bfb7 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerSpentHoursMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerSpentHoursMenu.java @@ -1,7 +1,7 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.exception.InputIsEndException; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.exception.InputIsEndException; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java b/src/me/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java similarity index 85% rename from src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java rename to src/me/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java index 85502914..f2020da6 100644 --- a/src/me/day10/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java @@ -1,7 +1,7 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.exception.InputIsEndException; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.exception.InputIsEndException; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java b/src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java similarity index 91% rename from src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java rename to src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java index bad1de19..c67d3c1a 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerConfirmMenu.java +++ b/src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java @@ -1,7 +1,7 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java b/src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java similarity index 80% rename from src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java rename to src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java index bf122133..a1989094 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java +++ b/src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.CustomerMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.CustomerMenu; public class UpdateCustomerIntoRepositoryMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java b/src/me/smartstore/menu/customer/UpdateCustomerMenu.java similarity index 83% rename from src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java rename to src/me/smartstore/menu/customer/UpdateCustomerMenu.java index b3b731dd..47443fa0 100644 --- a/src/me/day10/smartstore/menu/customer/UpdateCustomerMenu.java +++ b/src/me/smartstore/menu/customer/UpdateCustomerMenu.java @@ -1,9 +1,9 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.CustomerMenu; -import me.day10.smartstore.menu.topic.UpdateCustomerSelectPropertyMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.CustomerMenu; +import me.smartstore.menu.topic.UpdateCustomerSelectPropertyMenu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java b/src/me/smartstore/menu/customer/ViewCustomerMenu.java similarity index 75% rename from src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java rename to src/me/smartstore/menu/customer/ViewCustomerMenu.java index 57367c24..8511a540 100644 --- a/src/me/day10/smartstore/menu/customer/ViewCustomerMenu.java +++ b/src/me/smartstore/menu/customer/ViewCustomerMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.customer; +package me.smartstore.menu.customer; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.CustomerMenu; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.CustomerMenu; public class ViewCustomerMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/exception/InputIsEndException.java b/src/me/smartstore/menu/exception/InputIsEndException.java similarity index 60% rename from src/me/day10/smartstore/menu/exception/InputIsEndException.java rename to src/me/smartstore/menu/exception/InputIsEndException.java index f0edf293..b50d4b1d 100644 --- a/src/me/day10/smartstore/menu/exception/InputIsEndException.java +++ b/src/me/smartstore/menu/exception/InputIsEndException.java @@ -1,6 +1,6 @@ -package me.day10.smartstore.menu.exception; +package me.smartstore.menu.exception; -import me.day10.smartstore.AppException; +import me.smartstore.AppException; public class InputIsEndException extends AppException { diff --git a/src/me/day10/smartstore/menu/exception/InvalidGroupNameException.java b/src/me/smartstore/menu/exception/InvalidGroupNameException.java similarity index 77% rename from src/me/day10/smartstore/menu/exception/InvalidGroupNameException.java rename to src/me/smartstore/menu/exception/InvalidGroupNameException.java index ad810947..5d061d27 100644 --- a/src/me/day10/smartstore/menu/exception/InvalidGroupNameException.java +++ b/src/me/smartstore/menu/exception/InvalidGroupNameException.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu.exception; +package me.smartstore.menu.exception; public class InvalidGroupNameException extends IllegalArgumentException { diff --git a/src/me/day10/smartstore/menu/group/SetParameterMenu.java b/src/me/smartstore/menu/group/SetParameterMenu.java similarity index 89% rename from src/me/day10/smartstore/menu/group/SetParameterMenu.java rename to src/me/smartstore/menu/group/SetParameterMenu.java index 7d4eedd7..100abb29 100644 --- a/src/me/day10/smartstore/menu/group/SetParameterMenu.java +++ b/src/me/smartstore/menu/group/SetParameterMenu.java @@ -1,10 +1,10 @@ -package me.day10.smartstore.menu.group; +package me.smartstore.menu.group; -import me.day10.smartstore.group.Group; -import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.exception.InvalidGroupNameException; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.GroupMenu; +import me.smartstore.group.Group; +import me.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.exception.InvalidGroupNameException; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.GroupMenu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java b/src/me/smartstore/menu/group/UpdateParameterMenu.java similarity index 83% rename from src/me/day10/smartstore/menu/group/UpdateParameterMenu.java rename to src/me/smartstore/menu/group/UpdateParameterMenu.java index a5346de3..ef7a0c97 100644 --- a/src/me/day10/smartstore/menu/group/UpdateParameterMenu.java +++ b/src/me/smartstore/menu/group/UpdateParameterMenu.java @@ -1,6 +1,6 @@ -package me.day10.smartstore.menu.group; +package me.smartstore.menu.group; -import me.day10.smartstore.menu.Menu; +import me.smartstore.menu.Menu; public class UpdateParameterMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java b/src/me/smartstore/menu/group/ViewParameterMenu.java similarity index 76% rename from src/me/day10/smartstore/menu/group/ViewParameterMenu.java rename to src/me/smartstore/menu/group/ViewParameterMenu.java index 6139fb28..9051d76d 100644 --- a/src/me/day10/smartstore/menu/group/ViewParameterMenu.java +++ b/src/me/smartstore/menu/group/ViewParameterMenu.java @@ -1,10 +1,10 @@ -package me.day10.smartstore.menu.group; +package me.smartstore.menu.group; -import me.day10.smartstore.group.Group; -import me.day10.smartstore.menu.exception.InputIsEndException; -import me.day10.smartstore.menu.exception.InvalidGroupNameException; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.topic.GroupMenu; +import me.smartstore.group.Group; +import me.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.exception.InvalidGroupNameException; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.GroupMenu; public class ViewParameterMenu extends Menu { diff --git a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java b/src/me/smartstore/menu/topic/AddCustomerMenu.java similarity index 90% rename from src/me/day10/smartstore/menu/topic/AddCustomerMenu.java rename to src/me/smartstore/menu/topic/AddCustomerMenu.java index 0da0dc74..6c761b32 100644 --- a/src/me/day10/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/smartstore/menu/topic/AddCustomerMenu.java @@ -1,9 +1,9 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; -import me.day10.smartstore.customer.CustomerRepository; -import me.day10.smartstore.customer.MaxCapacityReachedException; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.customer.*; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.MaxCapacityReachedException; +import me.smartstore.menu.Menu; +import me.smartstore.menu.customer.*; public class AddCustomerMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/topic/ClassificationMenu.java b/src/me/smartstore/menu/topic/ClassificationMenu.java similarity index 91% rename from src/me/day10/smartstore/menu/topic/ClassificationMenu.java rename to src/me/smartstore/menu/topic/ClassificationMenu.java index 5dfe2fd1..e3c652b9 100644 --- a/src/me/day10/smartstore/menu/topic/ClassificationMenu.java +++ b/src/me/smartstore/menu/topic/ClassificationMenu.java @@ -1,4 +1,4 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; public class ClassificationMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/topic/CustomerMenu.java b/src/me/smartstore/menu/topic/CustomerMenu.java similarity index 83% rename from src/me/day10/smartstore/menu/topic/CustomerMenu.java rename to src/me/smartstore/menu/topic/CustomerMenu.java index fd628b89..ae721c41 100644 --- a/src/me/day10/smartstore/menu/topic/CustomerMenu.java +++ b/src/me/smartstore/menu/topic/CustomerMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; -import me.day10.smartstore.menu.customer.DeleteCustomerMenu; -import me.day10.smartstore.menu.customer.UpdateCustomerMenu; -import me.day10.smartstore.menu.customer.ViewCustomerMenu; +import me.smartstore.menu.customer.DeleteCustomerMenu; +import me.smartstore.menu.customer.UpdateCustomerMenu; +import me.smartstore.menu.customer.ViewCustomerMenu; public class CustomerMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/topic/GroupMenu.java b/src/me/smartstore/menu/topic/GroupMenu.java similarity index 82% rename from src/me/day10/smartstore/menu/topic/GroupMenu.java rename to src/me/smartstore/menu/topic/GroupMenu.java index a126fb05..d7e415c1 100644 --- a/src/me/day10/smartstore/menu/topic/GroupMenu.java +++ b/src/me/smartstore/menu/topic/GroupMenu.java @@ -1,8 +1,8 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; -import me.day10.smartstore.menu.group.SetParameterMenu; -import me.day10.smartstore.menu.group.UpdateParameterMenu; -import me.day10.smartstore.menu.group.ViewParameterMenu; +import me.smartstore.menu.group.SetParameterMenu; +import me.smartstore.menu.group.UpdateParameterMenu; +import me.smartstore.menu.group.ViewParameterMenu; public class GroupMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/topic/StartMenu.java b/src/me/smartstore/menu/topic/StartMenu.java similarity index 92% rename from src/me/day10/smartstore/menu/topic/StartMenu.java rename to src/me/smartstore/menu/topic/StartMenu.java index ba4c5cf1..ad1baf5d 100644 --- a/src/me/day10/smartstore/menu/topic/StartMenu.java +++ b/src/me/smartstore/menu/topic/StartMenu.java @@ -1,6 +1,6 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; -import me.day10.smartstore.menu.QuitMenu; +import me.smartstore.menu.QuitMenu; public class StartMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java b/src/me/smartstore/menu/topic/TopicIntroMenu.java similarity index 89% rename from src/me/day10/smartstore/menu/topic/TopicIntroMenu.java rename to src/me/smartstore/menu/topic/TopicIntroMenu.java index f2fbac60..02f2a264 100644 --- a/src/me/day10/smartstore/menu/topic/TopicIntroMenu.java +++ b/src/me/smartstore/menu/topic/TopicIntroMenu.java @@ -1,6 +1,6 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; -import me.day10.smartstore.menu.Menu; +import me.smartstore.menu.Menu; import java.util.InputMismatchException; diff --git a/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java b/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java similarity index 92% rename from src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java rename to src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java index 5a899c5f..d384fd76 100644 --- a/src/me/day10/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java +++ b/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java @@ -1,7 +1,7 @@ -package me.day10.smartstore.menu.topic; +package me.smartstore.menu.topic; -import me.day10.smartstore.menu.Menu; -import me.day10.smartstore.menu.customer.*; +import me.smartstore.menu.Menu; +import me.smartstore.menu.customer.*; public class UpdateCustomerSelectPropertyMenu extends TopicIntroMenu { diff --git a/src/me/day10/smartstore/use_merge_squash b/src/me/smartstore/use_merge_squash similarity index 100% rename from src/me/day10/smartstore/use_merge_squash rename to src/me/smartstore/use_merge_squash From d1de8bd31c0cad075f87c9f1ec72b2549ee70694 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Tue, 9 May 2023 15:36:10 +0900 Subject: [PATCH 56/61] feat: implemenet `ClassificationMenu` --- src/me/smartstore/customer/Customer.java | 17 +++-- .../customer/CustomerRepository.java | 64 ++++++++++++++++++- src/me/smartstore/customer/List.java | 15 ++++- src/me/smartstore/customer/Order.java | 21 ++++++ .../classification/SummaryByNameMenu.java | 21 ++++++ .../SummaryBySpentHoursMenu.java | 21 ++++++ .../SummaryByTotalPaidAmountMenu.java | 21 ++++++ .../classification/SummaryDefaultMenu.java | 24 +++++++ .../menu/classification/SummaryMenu.java | 39 +++++++++++ .../menu/topic/ClassificationMenu.java | 21 +++++- 10 files changed, 255 insertions(+), 9 deletions(-) create mode 100644 src/me/smartstore/customer/Order.java create mode 100644 src/me/smartstore/menu/classification/SummaryByNameMenu.java create mode 100644 src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java create mode 100644 src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java create mode 100644 src/me/smartstore/menu/classification/SummaryDefaultMenu.java create mode 100644 src/me/smartstore/menu/classification/SummaryMenu.java diff --git a/src/me/smartstore/customer/Customer.java b/src/me/smartstore/customer/Customer.java index dcc2b56d..b51a7e4f 100644 --- a/src/me/smartstore/customer/Customer.java +++ b/src/me/smartstore/customer/Customer.java @@ -1,10 +1,16 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; -import me.day10.smartstore.group.Group; -import me.day10.smartstore.menu.topic.CustomerMenu; +import me.smartstore.group.Group; +import java.util.Comparator; public class Customer { + public static final Comparator ORDER_NAME_ASC = Comparator.comparing(e -> e.name); + public static final Comparator ORDER_NAME_DEC = (e1, e2) -> e2.name.compareTo(e1.name); + public static final Comparator ORDER_SPENT_HOURS_ASC = Comparator.comparing(e -> e.spentHours); + public static final Comparator ORDER_SPENT_HOURS_DEC = (e1, e2) -> e2.spentHours.compareTo(e1.spentHours); + public static final Comparator ORDER_TOTAL_PAID_AMOUNT_ASC = Comparator.comparing(e -> e.totalAmountPaid); + public static final Comparator ORDER_TOTAL_PAID_AMOUNT_DEC = (e1, e2) -> e2.totalAmountPaid.compareTo(e1.totalAmountPaid); public static final String ID_FORMAT = "ID Format: 4~16 letters consisting of alphabets, digits, underscore(_)"; public static final String NAME_FORMAT = @@ -14,7 +20,8 @@ public class Customer { private static final String NAME_PATTERN = '^' + NAME_CHUCK + "( " + NAME_CHUCK + "){0,3}$"; private static final int DEFAULT_SPENT_HOURS = 0; private static final int DEFAULT_TOTAL_AMOUNT_PAID = 0; - private static final Group DEFAULT_GROUP = Group.GENERAL; + private static final Group DEFAULT_GROUP = Group.NONE; + private String id; private String name; @@ -89,6 +96,8 @@ public void copy(Customer e) { group = e.group; } + public Group getGroup() { return group; } + @Override public String toString() { return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d, group=%s}", diff --git a/src/me/smartstore/customer/CustomerRepository.java b/src/me/smartstore/customer/CustomerRepository.java index c2f915a8..90dd11d6 100644 --- a/src/me/smartstore/customer/CustomerRepository.java +++ b/src/me/smartstore/customer/CustomerRepository.java @@ -1,4 +1,8 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; + +import me.smartstore.group.Group; + +import java.util.Comparator; public class CustomerRepository { @@ -104,9 +108,65 @@ public String getUpdateBeforeAndAfterInfo() { "After : " + after.toString(); } + public String getSummary() { + Group[] groups = Group.values(); + int len = groups.length; + StringBuilder[] stringBuilders = new StringBuilder[len]; + int[] cnt = new int[len]; + for (int i = 0; i < len; ++i) { + StringBuilder sb = new StringBuilder(); + sb.append('\n').append("==============================") + .append(groups[i]) + .append("==============================").append('\n'); + stringBuilders[i] = sb; + } + + int size = customerList.size(); + for (int i = 0; i < size; ++i) { + Customer customer = customerList.get(i); + Group group = customer.getGroup(); + for (int j = 0; j < len; ++j) { + if (group == groups[j]) { + stringBuilders[j].append(customer).append('\n'); + cnt[j]++; + break; + } + } + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < len; ++i) { + sb.append(stringBuilders[i]); + if (cnt[i] == 0) + sb.append("No Customers.").append('\n'); + } + return sb.append('\n').toString(); + } + + public String getSummaryByName(Order order) { + Comparator cmp = order == Order.ASCENDING ? Customer.ORDER_NAME_ASC + : Customer.ORDER_NAME_DEC; + customerList.sort(cmp); + return getSummary(); + } + + public String getSummaryBySpentHours(Order order) { + Comparator cmp = order == Order.ASCENDING ? Customer.ORDER_SPENT_HOURS_ASC + : Customer.ORDER_SPENT_HOURS_DEC; + customerList.sort(cmp); + return getSummary(); + } + + public String getSummaryByTotalPaidAmount(Order order) { + Comparator cmp = order == Order.ASCENDING ? Customer.ORDER_TOTAL_PAID_AMOUNT_ASC + : Customer.ORDER_TOTAL_PAID_AMOUNT_DEC; + customerList.sort(cmp); + return getSummary(); + } + @Override public String toString() { - if (customerList.isEmpty()) return "No Customers. Please input one first.\n"; + if (customerList.isEmpty()) return "No Customers." + " Please input one first.\n"; return customerList.toString(); } } diff --git a/src/me/smartstore/customer/List.java b/src/me/smartstore/customer/List.java index 19f4df7b..149ac51a 100644 --- a/src/me/smartstore/customer/List.java +++ b/src/me/smartstore/customer/List.java @@ -1,7 +1,8 @@ -package me.day10.smartstore.customer; +package me.smartstore.customer; import java.util.Arrays; +import java.util.Comparator; public class List { @@ -98,6 +99,18 @@ private void checkIfOutOfBounds(int idx) { } } + public void sort(Comparator comparator) { + for (int i = 1; i < size; ++i) { + int j = i; + E src = list[j--]; + while (j >= 0 && comparator.compare(list[j], src) > 0) { + list[j + 1] = list[j]; + j--; + } + list[j + 1] = src; + } + } + @Override public String toString() { StringBuilder sb = new StringBuilder("======= Stored Customers Info. =======\n"); diff --git a/src/me/smartstore/customer/Order.java b/src/me/smartstore/customer/Order.java new file mode 100644 index 00000000..0b6c5d39 --- /dev/null +++ b/src/me/smartstore/customer/Order.java @@ -0,0 +1,21 @@ +package me.smartstore.customer; + +import java.util.Arrays; +import java.util.InputMismatchException; + +public enum Order { + ASCENDING("A"), DESCENDING("D"); + + private final String shortcut; + + Order(String shortcut) { + this.shortcut = shortcut; + } + + public static Order getOrderByName(String name) throws InputMismatchException { + return Arrays.stream(values()) + .filter(order -> order.shortcut.equalsIgnoreCase(name) || order.name().equalsIgnoreCase(name)) + .findFirst() + .orElseThrow(() -> new InputMismatchException("Invalid Order name for input. Please try again.\n")); + } +} diff --git a/src/me/smartstore/menu/classification/SummaryByNameMenu.java b/src/me/smartstore/menu/classification/SummaryByNameMenu.java new file mode 100644 index 00000000..0965c1f3 --- /dev/null +++ b/src/me/smartstore/menu/classification/SummaryByNameMenu.java @@ -0,0 +1,21 @@ +package me.smartstore.menu.classification; + +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.Order; + +public class SummaryByNameMenu extends SummaryMenu { + + private static class InstanceHolder { + private static final SummaryByNameMenu INSTANCE = new SummaryByNameMenu(); + } + private SummaryByNameMenu() {} + public static SummaryByNameMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + protected void setNextMenus() {} + + @Override + protected String getSummary(Order order) { + return CustomerRepository.getInstance().getSummaryByName(order); + } +} diff --git a/src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java b/src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java new file mode 100644 index 00000000..717c32ee --- /dev/null +++ b/src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java @@ -0,0 +1,21 @@ +package me.smartstore.menu.classification; + +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.Order; + +public class SummaryBySpentHoursMenu extends SummaryMenu { + + private static class InstanceHolder { + private static final SummaryBySpentHoursMenu INSTANCE = new SummaryBySpentHoursMenu(); + } + private SummaryBySpentHoursMenu() {} + public static SummaryBySpentHoursMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + protected void setNextMenus() {} + + @Override + protected String getSummary(Order order) { + return CustomerRepository.getInstance().getSummaryBySpentHours(order); + } +} diff --git a/src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java b/src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java new file mode 100644 index 00000000..e8e5251a --- /dev/null +++ b/src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java @@ -0,0 +1,21 @@ +package me.smartstore.menu.classification; + +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.Order; + +public class SummaryByTotalPaidAmountMenu extends SummaryMenu { + + private static class InstanceHolder { + private static final SummaryByTotalPaidAmountMenu INSTANCE = new SummaryByTotalPaidAmountMenu(); + } + private SummaryByTotalPaidAmountMenu() {} + public static SummaryByTotalPaidAmountMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + protected void setNextMenus() {} + + @Override + protected String getSummary(Order order) { + return CustomerRepository.getInstance().getSummaryByTotalPaidAmount(order); + } +} diff --git a/src/me/smartstore/menu/classification/SummaryDefaultMenu.java b/src/me/smartstore/menu/classification/SummaryDefaultMenu.java new file mode 100644 index 00000000..6c158bed --- /dev/null +++ b/src/me/smartstore/menu/classification/SummaryDefaultMenu.java @@ -0,0 +1,24 @@ +package me.smartstore.menu.classification; + +import me.smartstore.customer.CustomerRepository; +import me.smartstore.customer.Order; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.CustomerMenu; + +public class SummaryDefaultMenu extends Menu { + + private static class InstanceHolder { + private static final SummaryDefaultMenu INSTANCE = new SummaryDefaultMenu(); + } + private SummaryDefaultMenu() {} + public static SummaryDefaultMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + print(CustomerRepository.getInstance().getSummary()); + return getPrevMenu(); + } + + @Override + protected void setNextMenus() {} +} diff --git a/src/me/smartstore/menu/classification/SummaryMenu.java b/src/me/smartstore/menu/classification/SummaryMenu.java new file mode 100644 index 00000000..325c6f9d --- /dev/null +++ b/src/me/smartstore/menu/classification/SummaryMenu.java @@ -0,0 +1,39 @@ +package me.smartstore.menu.classification; + +import me.smartstore.customer.Order; +import me.smartstore.menu.Menu; +import me.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.topic.ClassificationMenu; + +import java.util.InputMismatchException; + +import static me.smartstore.customer.Order.getOrderByName; + +public abstract class SummaryMenu extends Menu { + private static final String ORDER_INPUT = + "Which order (ASCENDING (A), DESCENDING (D))?\n" + + END_INPUT; + + @Override + public Menu printAndInputAndGetNextMenu() { + while (true) { + print(ORDER_INPUT); + try { + String orderName = inputStringOrEnd(); + Order order = getOrderByName(orderName); + print(getSummary(order)); + return getPrevMenu(); + } catch (InputIsEndException e) { + print(e.getMessage()); + return getPrevMenu(); + } catch (InputMismatchException e) { + print(e.getMessage()); + } + } + } + + @Override + protected void setNextMenus() {} + + protected abstract String getSummary(Order order); +} diff --git a/src/me/smartstore/menu/topic/ClassificationMenu.java b/src/me/smartstore/menu/topic/ClassificationMenu.java index e3c652b9..39e5458a 100644 --- a/src/me/smartstore/menu/topic/ClassificationMenu.java +++ b/src/me/smartstore/menu/topic/ClassificationMenu.java @@ -1,8 +1,19 @@ package me.smartstore.menu.topic; +import me.smartstore.menu.classification.*; + public class ClassificationMenu extends TopicIntroMenu { - private static final String SUMMARY_MENU_OUTPUT = null; + private static final String SUMMARY_MENU_OUTPUT = + '\n' + + "===== Classification Menu ====" + '\n' + + " 1. " + "Summary " + '\n' + + " 2. " + "Summary " + "(Sorted By " + "Name" + ")\n" + + " 3. " + "Summary " + "(Sorted By " + "Spent Hours" + ")\n" + + " 4. " + "Summary " + "(Sorted By " + "Total Paid Amount" + ")\n" + + " 5. " + "Back" + '\n' + + "==============================" + '\n' + + "Choose One: "; private static final ClassificationMenu INSTANCE = new ClassificationMenu(); private ClassificationMenu() { super(SUMMARY_MENU_OUTPUT); } @@ -11,6 +22,12 @@ public class ClassificationMenu extends TopicIntroMenu { @Override protected void setNextMenus() { - setNextMenus(); + setNextMenus( + SummaryDefaultMenu.getInstance(), + SummaryByNameMenu.getInstance(), + SummaryBySpentHoursMenu.getInstance(), + SummaryByTotalPaidAmountMenu.getInstance(), + StartMenu.getInstance() + ); } } From 0867f52c87d6e493f3d25d7042d9ca6a8ad5ecef Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Tue, 9 May 2023 15:57:39 +0900 Subject: [PATCH 57/61] refactor: rename `totalAmountPaid` to `totalPaidAmount` --- src/me/smartstore/customer/Customer.java | 22 +++++++++---------- .../customer/CustomerRepository.java | 4 ++-- src/me/smartstore/group/Group.java | 2 +- src/me/smartstore/group/GroupParameter.java | 10 ++++----- .../customer/InputCustomerPropertyMenu.java | 1 - ... => InputCustomerTotalPaidAmountMenu.java} | 12 +++++----- .../menu/group/SetParameterMenu.java | 6 ++--- .../menu/topic/AddCustomerMenu.java | 2 +- .../UpdateCustomerSelectPropertyMenu.java | 4 ++-- 9 files changed, 31 insertions(+), 32 deletions(-) rename src/me/smartstore/menu/customer/{InputCustomerTotalAmountPaidMenu.java => InputCustomerTotalPaidAmountMenu.java} (60%) diff --git a/src/me/smartstore/customer/Customer.java b/src/me/smartstore/customer/Customer.java index b51a7e4f..9671a80d 100644 --- a/src/me/smartstore/customer/Customer.java +++ b/src/me/smartstore/customer/Customer.java @@ -9,8 +9,8 @@ public class Customer { public static final Comparator ORDER_NAME_DEC = (e1, e2) -> e2.name.compareTo(e1.name); public static final Comparator ORDER_SPENT_HOURS_ASC = Comparator.comparing(e -> e.spentHours); public static final Comparator ORDER_SPENT_HOURS_DEC = (e1, e2) -> e2.spentHours.compareTo(e1.spentHours); - public static final Comparator ORDER_TOTAL_PAID_AMOUNT_ASC = Comparator.comparing(e -> e.totalAmountPaid); - public static final Comparator ORDER_TOTAL_PAID_AMOUNT_DEC = (e1, e2) -> e2.totalAmountPaid.compareTo(e1.totalAmountPaid); + public static final Comparator ORDER_TOTAL_PAID_AMOUNT_ASC = Comparator.comparing(e -> e.totalPaidAmount); + public static final Comparator ORDER_TOTAL_PAID_AMOUNT_DEC = (e1, e2) -> e2.totalPaidAmount.compareTo(e1.totalPaidAmount); public static final String ID_FORMAT = "ID Format: 4~16 letters consisting of alphabets, digits, underscore(_)"; public static final String NAME_FORMAT = @@ -19,25 +19,25 @@ public class Customer { private static final String NAME_CHUCK = "[a-z]{2,32}"; private static final String NAME_PATTERN = '^' + NAME_CHUCK + "( " + NAME_CHUCK + "){0,3}$"; private static final int DEFAULT_SPENT_HOURS = 0; - private static final int DEFAULT_TOTAL_AMOUNT_PAID = 0; + private static final int DEFAULT_TOTAL_PAID_AMOUNT = 0; private static final Group DEFAULT_GROUP = Group.NONE; private String id; private String name; private Integer spentHours; - private Integer totalAmountPaid; + private Integer totalPaidAmount; private Group group; public Customer(String id, String name) { - this(id, name, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_AMOUNT_PAID, DEFAULT_GROUP); + this(id, name, DEFAULT_SPENT_HOURS, DEFAULT_TOTAL_PAID_AMOUNT, DEFAULT_GROUP); } - public Customer(String id, String name, Integer spentHours, Integer totalAmountPaid, Group group) { + public Customer(String id, String name, Integer spentHours, Integer totalPaidAmount, Group group) { this.id = id; this.name = name; this.spentHours = spentHours; - this.totalAmountPaid = totalAmountPaid; + this.totalPaidAmount = totalPaidAmount; this.group = group; } @@ -59,8 +59,8 @@ public void setSpentHours(Integer spentHours) { this.spentHours = spentHours; } - public void setTotalAmountPaid(Integer totalAmountPaid) { - this.totalAmountPaid = totalAmountPaid; + public void setTotalPaidAmount(Integer totalPaidAmount) { + this.totalPaidAmount = totalPaidAmount; } public static void checkIfIdIsValid(String id) throws InvalidCustomerIdException { @@ -92,7 +92,7 @@ public void copy(Customer e) { id = e.id; name = e.name; spentHours = e.spentHours; - totalAmountPaid = e.totalAmountPaid; + totalPaidAmount = e.totalPaidAmount; group = e.group; } @@ -101,6 +101,6 @@ public void copy(Customer e) { @Override public String toString() { return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d, group=%s}", - id, name, spentHours, totalAmountPaid, group.name()); + id, name, spentHours, totalPaidAmount, group.name()); } } diff --git a/src/me/smartstore/customer/CustomerRepository.java b/src/me/smartstore/customer/CustomerRepository.java index 90dd11d6..00adba02 100644 --- a/src/me/smartstore/customer/CustomerRepository.java +++ b/src/me/smartstore/customer/CustomerRepository.java @@ -58,8 +58,8 @@ public void setTempSpentHours(Integer spentHours) { tempCustomer.setSpentHours(spentHours); } - public void setTempTotalAmountPaid(Integer totalAmountPaid) { - tempCustomer.setTotalAmountPaid(totalAmountPaid); + public void setTempTotalPaidAmount(Integer totalPaidAmount) { + tempCustomer.setTotalPaidAmount(totalPaidAmount); } public String getTempInfo() { diff --git a/src/me/smartstore/group/Group.java b/src/me/smartstore/group/Group.java index 8590e70d..638cb718 100644 --- a/src/me/smartstore/group/Group.java +++ b/src/me/smartstore/group/Group.java @@ -33,7 +33,7 @@ private boolean isName(String s) { public void setGroupParameter(Integer[] groupParameterArguments) { this.groupParameter.setMinSpentHours(groupParameterArguments[0]); - this.groupParameter.setMinTotalAmountPaid(groupParameterArguments[1]); + this.groupParameter.setMinTotalPaidAmount(groupParameterArguments[1]); } @Override diff --git a/src/me/smartstore/group/GroupParameter.java b/src/me/smartstore/group/GroupParameter.java index d6ba8769..df28c62c 100644 --- a/src/me/smartstore/group/GroupParameter.java +++ b/src/me/smartstore/group/GroupParameter.java @@ -2,7 +2,7 @@ public class GroupParameter { private Integer minSpentHours; - private Integer minTotalAmountPaid; + private Integer minTotalPaidAmount; public GroupParameter() {} @@ -10,13 +10,13 @@ public void setMinSpentHours(Integer minSpentHours) { this.minSpentHours = minSpentHours; } - public void setMinTotalAmountPaid(Integer minTotalAmountPaid) { - this.minTotalAmountPaid = minTotalAmountPaid; + public void setMinTotalPaidAmount(Integer minTotalPaidAmount) { + this.minTotalPaidAmount = minTotalPaidAmount; } @Override public String toString() { - return String.format("Parameter{minSpentHours=%d, minTotalAmountPaid=%d}", - minSpentHours, minTotalAmountPaid); + return String.format("Parameter{minSpentHours=%d, minTotalPaidAmount=%d}", + minSpentHours, minTotalPaidAmount); } } diff --git a/src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java b/src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java index b2a98ffb..96f35859 100644 --- a/src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerPropertyMenu.java @@ -3,7 +3,6 @@ import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.Menu; import me.smartstore.menu.exception.InputIsEndException; -import me.smartstore.menu.topic.CustomerMenu; import java.util.InputMismatchException; diff --git a/src/me/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java b/src/me/smartstore/menu/customer/InputCustomerTotalPaidAmountMenu.java similarity index 60% rename from src/me/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java rename to src/me/smartstore/menu/customer/InputCustomerTotalPaidAmountMenu.java index f2020da6..f2281ac8 100644 --- a/src/me/smartstore/menu/customer/InputCustomerTotalAmountPaidMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerTotalPaidAmountMenu.java @@ -5,16 +5,16 @@ import java.util.InputMismatchException; -public class InputCustomerTotalAmountPaidMenu extends InputCustomerPropertyMenu { +public class InputCustomerTotalPaidAmountMenu extends InputCustomerPropertyMenu { - private static final String TOTAL_AMOUNT_PAID = + private static final String TOTAL_PAID_AMOUNT_INPUT = "Input " + "Customer" + "'s " + "Total Amount Paid" + ':'; private static class InstanceHolder { - private static final InputCustomerTotalAmountPaidMenu INSTANCE = new InputCustomerTotalAmountPaidMenu(); + private static final InputCustomerTotalPaidAmountMenu INSTANCE = new InputCustomerTotalPaidAmountMenu(); } - private InputCustomerTotalAmountPaidMenu() { super(TOTAL_AMOUNT_PAID); } - public static InputCustomerTotalAmountPaidMenu getInstance() { return InstanceHolder.INSTANCE; } + private InputCustomerTotalPaidAmountMenu() { super(TOTAL_PAID_AMOUNT_INPUT); } + public static InputCustomerTotalPaidAmountMenu getInstance() { return InstanceHolder.INSTANCE; } @Override protected Object inputProperty() throws InputIsEndException, InputMismatchException { @@ -23,6 +23,6 @@ protected Object inputProperty() throws InputIsEndException, InputMismatchExcept @Override protected void setTempProperty(Object property) throws IllegalArgumentException, IllegalStateException { - CustomerRepository.getInstance().setTempTotalAmountPaid((Integer) property); + CustomerRepository.getInstance().setTempTotalPaidAmount((Integer) property); } } diff --git a/src/me/smartstore/menu/group/SetParameterMenu.java b/src/me/smartstore/menu/group/SetParameterMenu.java index 100abb29..bc46939e 100644 --- a/src/me/smartstore/menu/group/SetParameterMenu.java +++ b/src/me/smartstore/menu/group/SetParameterMenu.java @@ -13,14 +13,14 @@ public class SetParameterMenu extends Menu { private static final String SET_GROUP_PARAMETER_OUTPUT = "===== Set Group Parameter ====" + '\n' + " 1. " + "Minimum Spent Hours" + '\n' + - " 2. " + "Minimum Total Amount Paid" + '\n' + + " 2. " + "Minimum Total Paid Amount" + '\n' + " 3. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; private static final String[] GROUP_PARAMETER_INPUT = { null, "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, - "\n" + "Input " + "Minimum Total Amount Paid" + ":\n" + END_INPUT + "\n" + "Input " + "Minimum Total Paid Amount" + ":\n" + END_INPUT }; private static class InstanceHolder { @@ -54,7 +54,7 @@ public Menu printAndInputAndGetNextMenu() { public void setNextMenus() { setNextMenus( null, // read minSpentHours - null, // read minTotalAmountPaid + null, // read minTotalPaidAmount GroupMenu.getInstance() // Back => GroupMenu ); } diff --git a/src/me/smartstore/menu/topic/AddCustomerMenu.java b/src/me/smartstore/menu/topic/AddCustomerMenu.java index 6c761b32..35d6f38f 100644 --- a/src/me/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/smartstore/menu/topic/AddCustomerMenu.java @@ -48,7 +48,7 @@ protected void setNextMenus() { InputCustomerIdMenu.getInstance(), // id InputCustomerNameMenu.getInstance(), // name InputCustomerSpentHoursMenu.getInstance(), // spent hours - InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid + InputCustomerTotalPaidAmountMenu.getInstance(), // total amount paid AddCustomerConfirmMenu.getInstance(), // confirm CustomerMenu.getInstance() // cancel(back) => CustomerMenu }; diff --git a/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java b/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java index d384fd76..4b473887 100644 --- a/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java +++ b/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java @@ -10,7 +10,7 @@ public class UpdateCustomerSelectPropertyMenu extends TopicIntroMenu { "===== Property to update =====" + '\n' + " 1. " + "Customer " + "Name" + '\n' + " 2. " + "Customer " + "Spent Hours" + '\n' + - " 3. " + "Customer " + "Total Amount Paid" + '\n' + + " 3. " + "Customer " + "Total Paid Amount" + '\n' + " 4. " + "Confirm" + '\n' + " 5. " + "Cancel(Back)" + '\n' + "==============================" + '\n' + @@ -29,7 +29,7 @@ protected void setNextMenus() { Menu[] nextMenus = { InputCustomerNameMenu.getInstance(), // name InputCustomerSpentHoursMenu.getInstance(), // spent hours - InputCustomerTotalAmountPaidMenu.getInstance(), // total amount paid + InputCustomerTotalPaidAmountMenu.getInstance(), // total paid amount UpdateCustomerConfirmMenu.getInstance(), // confirm CustomerMenu.getInstance() // cancel(back) => CustomerMenu }; From 25fb57cecc8ceb22552009c26ea55679862587cb Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Tue, 9 May 2023 17:03:16 +0900 Subject: [PATCH 58/61] feat: add `updateGroup()` of `Customer` --- src/me/smartstore/customer/Customer.java | 4 + .../customer/CustomerRepository.java | 10 ++- src/me/smartstore/group/Group.java | 20 +++++ src/me/smartstore/group/GroupParameter.java | 4 + .../menu/group/SetParameterMenu.java | 84 ------------------- .../menu/group/UpdateParameterMenu.java | 78 +++++++++++++++-- 6 files changed, 108 insertions(+), 92 deletions(-) delete mode 100644 src/me/smartstore/menu/group/SetParameterMenu.java diff --git a/src/me/smartstore/customer/Customer.java b/src/me/smartstore/customer/Customer.java index 9671a80d..c3441452 100644 --- a/src/me/smartstore/customer/Customer.java +++ b/src/me/smartstore/customer/Customer.java @@ -98,6 +98,10 @@ public void copy(Customer e) { public Group getGroup() { return group; } + public void updateGroup() { + group = Group.calculate(spentHours, totalPaidAmount); + } + @Override public String toString() { return String.format("Customer{id='%s', name='%s', spentHours=%d, totalAmountPaid=%d, group=%s}", diff --git a/src/me/smartstore/customer/CustomerRepository.java b/src/me/smartstore/customer/CustomerRepository.java index 00adba02..3cbd9e73 100644 --- a/src/me/smartstore/customer/CustomerRepository.java +++ b/src/me/smartstore/customer/CustomerRepository.java @@ -63,6 +63,7 @@ public void setTempTotalPaidAmount(Integer totalPaidAmount) { } public String getTempInfo() { + updateGroupOfTempCustomer(); return tempCustomer.toString(); } @@ -103,9 +104,14 @@ public void updateTempInRepository() { public String getUpdateBeforeAndAfterInfo() { Customer before = customerList.get(tempIdx); Customer after = tempCustomer; + updateGroupOfTempCustomer(); return String.format("\nNo. %2d\n", tempIdx) + - "Before: " + before.toString() + '\n'+ - "After : " + after.toString(); + "Before: " + before + '\n'+ + "After : " + after; + } + + public void updateGroupOfTempCustomer() { + tempCustomer.updateGroup(); } public String getSummary() { diff --git a/src/me/smartstore/group/Group.java b/src/me/smartstore/group/Group.java index 638cb718..c737d0f8 100644 --- a/src/me/smartstore/group/Group.java +++ b/src/me/smartstore/group/Group.java @@ -36,6 +36,26 @@ public void setGroupParameter(Integer[] groupParameterArguments) { this.groupParameter.setMinTotalPaidAmount(groupParameterArguments[1]); } + public static Group calculate(Integer spentHours, Integer totalPaidAmount) { + Group[] groups = values(); + Group ret = NONE; + int i = 1; + for (; i < groups.length; ++i) { + Group group = groups[i]; + GroupParameter parameter = group.groupParameter; + Integer minSpentHours = parameter.getMinSpentHours(); + Integer minTotalPaidAmount = parameter.getMinTotalPaidAmount(); + if (minSpentHours == null && minTotalPaidAmount == null) + continue; + if (minSpentHours != null) + if (spentHours == null || spentHours < minSpentHours) break; + if (minTotalPaidAmount != null) + if (totalPaidAmount == null || totalPaidAmount < minTotalPaidAmount) break; + ret = group; + } + return ret; + } + @Override public String toString() { return "\nGroupType: " + this.name() + '\n' diff --git a/src/me/smartstore/group/GroupParameter.java b/src/me/smartstore/group/GroupParameter.java index df28c62c..afa821c9 100644 --- a/src/me/smartstore/group/GroupParameter.java +++ b/src/me/smartstore/group/GroupParameter.java @@ -14,6 +14,10 @@ public void setMinTotalPaidAmount(Integer minTotalPaidAmount) { this.minTotalPaidAmount = minTotalPaidAmount; } + public Integer getMinSpentHours() { return minSpentHours; } + + public Integer getMinTotalPaidAmount() { return minTotalPaidAmount; } + @Override public String toString() { return String.format("Parameter{minSpentHours=%d, minTotalPaidAmount=%d}", diff --git a/src/me/smartstore/menu/group/SetParameterMenu.java b/src/me/smartstore/menu/group/SetParameterMenu.java deleted file mode 100644 index bc46939e..00000000 --- a/src/me/smartstore/menu/group/SetParameterMenu.java +++ /dev/null @@ -1,84 +0,0 @@ -package me.smartstore.menu.group; - -import me.smartstore.group.Group; -import me.smartstore.menu.exception.InputIsEndException; -import me.smartstore.menu.exception.InvalidGroupNameException; -import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.GroupMenu; - -import java.util.InputMismatchException; - -public class SetParameterMenu extends Menu { - - private static final String SET_GROUP_PARAMETER_OUTPUT = - "===== Set Group Parameter ====" + '\n' + - " 1. " + "Minimum Spent Hours" + '\n' + - " 2. " + "Minimum Total Paid Amount" + '\n' + - " 3. " + "Back" + '\n' + - "==============================" + '\n' + - "Choose One: "; - private static final String[] GROUP_PARAMETER_INPUT = { - null, - "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, - "\n" + "Input " + "Minimum Total Paid Amount" + ":\n" + END_INPUT - }; - - private static class InstanceHolder { - private static final SetParameterMenu INSTANCE = new SetParameterMenu(); - } - - private SetParameterMenu() { super(); } - - public static SetParameterMenu getInstance() { return InstanceHolder.INSTANCE; } - - @Override - public Menu printAndInputAndGetNextMenu() { - setNextMenus(); - while (true) { - print(GROUP_OUTPUT); - try { - String groupName = inputStringOrEnd(); - Group group = Group.getGroupByString(groupName); - print(group); - inputGroupParameter(group); - } catch (InputIsEndException e) { - print(e.getMessage()); - return getBackMenu(); - } catch (InvalidGroupNameException e) { - print(e.getMessage()); - } - } - } - - @Override - public void setNextMenus() { - setNextMenus( - null, // read minSpentHours - null, // read minTotalPaidAmount - GroupMenu.getInstance() // Back => GroupMenu - ); - } - - private void inputGroupParameter(Group group) { - Integer[] groupParameterArguments = { null, null }; - while (true) { - print(SET_GROUP_PARAMETER_OUTPUT); - try { - int menu = inputMenuIdx(); - if (menu <= 2) { - assert menu != 0; - print(GROUP_PARAMETER_INPUT[menu]); - groupParameterArguments[menu] = inputZeroOrPositiveIntegerOrEnd(); - } else { - group.setGroupParameter(groupParameterArguments); - break; - } - } catch (InputIsEndException e) { - print(e.getMessage()); - break; - } catch (InputMismatchException e) { - print(e.getMessage()); - } - } - } -} diff --git a/src/me/smartstore/menu/group/UpdateParameterMenu.java b/src/me/smartstore/menu/group/UpdateParameterMenu.java index ef7a0c97..bc46939e 100644 --- a/src/me/smartstore/menu/group/UpdateParameterMenu.java +++ b/src/me/smartstore/menu/group/UpdateParameterMenu.java @@ -1,18 +1,84 @@ package me.smartstore.menu.group; +import me.smartstore.group.Group; +import me.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.exception.InvalidGroupNameException; import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.GroupMenu; -public class UpdateParameterMenu extends Menu { +import java.util.InputMismatchException; - private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); - private UpdateParameterMenu() {} - public static UpdateParameterMenu getInstance() { return INSTANCE; } +public class SetParameterMenu extends Menu { + + private static final String SET_GROUP_PARAMETER_OUTPUT = + "===== Set Group Parameter ====" + '\n' + + " 1. " + "Minimum Spent Hours" + '\n' + + " 2. " + "Minimum Total Paid Amount" + '\n' + + " 3. " + "Back" + '\n' + + "==============================" + '\n' + + "Choose One: "; + private static final String[] GROUP_PARAMETER_INPUT = { + null, + "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, + "\n" + "Input " + "Minimum Total Paid Amount" + ":\n" + END_INPUT + }; + + private static class InstanceHolder { + private static final SetParameterMenu INSTANCE = new SetParameterMenu(); + } + + private SetParameterMenu() { super(); } + + public static SetParameterMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { - return null; + setNextMenus(); + while (true) { + print(GROUP_OUTPUT); + try { + String groupName = inputStringOrEnd(); + Group group = Group.getGroupByString(groupName); + print(group); + inputGroupParameter(group); + } catch (InputIsEndException e) { + print(e.getMessage()); + return getBackMenu(); + } catch (InvalidGroupNameException e) { + print(e.getMessage()); + } + } } @Override - protected void setNextMenus() {} + public void setNextMenus() { + setNextMenus( + null, // read minSpentHours + null, // read minTotalPaidAmount + GroupMenu.getInstance() // Back => GroupMenu + ); + } + + private void inputGroupParameter(Group group) { + Integer[] groupParameterArguments = { null, null }; + while (true) { + print(SET_GROUP_PARAMETER_OUTPUT); + try { + int menu = inputMenuIdx(); + if (menu <= 2) { + assert menu != 0; + print(GROUP_PARAMETER_INPUT[menu]); + groupParameterArguments[menu] = inputZeroOrPositiveIntegerOrEnd(); + } else { + group.setGroupParameter(groupParameterArguments); + break; + } + } catch (InputIsEndException e) { + print(e.getMessage()); + break; + } catch (InputMismatchException e) { + print(e.getMessage()); + } + } + } } From f093a622108c8d87c6099afa7c88be2c90af56a6 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Tue, 9 May 2023 17:28:58 +0900 Subject: [PATCH 59/61] feat: delete `SetParameterMenu` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 처음부터 Parameter가 null인 상태로 존재하기 때문에 Set과 Update를 둘 다 두기보다 Update 하나로 둘 모두의 역할을 수행하도록 합니다. 이를 위해 기존의 미구현 Update를 지우고 Set을 Update로 변경합니다. --- .../menu/group/UpdateParameterMenu.java | 29 +++++++++---------- src/me/smartstore/menu/topic/GroupMenu.java | 11 +++---- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/me/smartstore/menu/group/UpdateParameterMenu.java b/src/me/smartstore/menu/group/UpdateParameterMenu.java index bc46939e..7f520799 100644 --- a/src/me/smartstore/menu/group/UpdateParameterMenu.java +++ b/src/me/smartstore/menu/group/UpdateParameterMenu.java @@ -8,28 +8,28 @@ import java.util.InputMismatchException; -public class SetParameterMenu extends Menu { +public class UpdateParameterMenu extends Menu { private static final String SET_GROUP_PARAMETER_OUTPUT = - "===== Set Group Parameter ====" + '\n' + - " 1. " + "Minimum Spent Hours" + '\n' + - " 2. " + "Minimum Total Paid Amount" + '\n' + + '\n' + + "===== Set Group Parameter ====" + '\n' + + " 1. " + "Minimum " + "Spent Hours" + '\n' + + " 2. " + "Minimum " + "Total Paid Amount" + '\n' + " 3. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; private static final String[] GROUP_PARAMETER_INPUT = { - null, - "\n" + "Input " + "Minimum Spent Hours" + ":\n" + END_INPUT, - "\n" + "Input " + "Minimum Total Paid Amount" + ":\n" + END_INPUT + '\n' + "Input " + "Minimum " + "Spent Hours" + ":\n" + END_INPUT, + '\n' + "Input " + "Minimum " + "Total Paid Amount" + ":\n" + END_INPUT }; private static class InstanceHolder { - private static final SetParameterMenu INSTANCE = new SetParameterMenu(); + private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); } - private SetParameterMenu() { super(); } + private UpdateParameterMenu() { super(); } - public static SetParameterMenu getInstance() { return InstanceHolder.INSTANCE; } + public static UpdateParameterMenu getInstance() { return InstanceHolder.INSTANCE; } @Override public Menu printAndInputAndGetNextMenu() { @@ -64,11 +64,10 @@ private void inputGroupParameter(Group group) { while (true) { print(SET_GROUP_PARAMETER_OUTPUT); try { - int menu = inputMenuIdx(); - if (menu <= 2) { - assert menu != 0; - print(GROUP_PARAMETER_INPUT[menu]); - groupParameterArguments[menu] = inputZeroOrPositiveIntegerOrEnd(); + int menuIdx = inputMenuIdx(); + if (menuIdx <= 1) { + print(GROUP_PARAMETER_INPUT[menuIdx]); + groupParameterArguments[menuIdx] = inputZeroOrPositiveIntegerOrEnd(); } else { group.setGroupParameter(groupParameterArguments); break; diff --git a/src/me/smartstore/menu/topic/GroupMenu.java b/src/me/smartstore/menu/topic/GroupMenu.java index d7e415c1..e6fd205f 100644 --- a/src/me/smartstore/menu/topic/GroupMenu.java +++ b/src/me/smartstore/menu/topic/GroupMenu.java @@ -1,6 +1,5 @@ package me.smartstore.menu.topic; -import me.smartstore.menu.group.SetParameterMenu; import me.smartstore.menu.group.UpdateParameterMenu; import me.smartstore.menu.group.ViewParameterMenu; @@ -9,10 +8,9 @@ public class GroupMenu extends TopicIntroMenu { private static final String GROUP_MENU_OUTPUT = '\n' + "========= Group Menu =========" + '\n' + - "1. " + "Set " + "Parameter" + '\n' + + "1. " + "Update " + "Parameter" + '\n' + "2. " + "View " + "Parameter" + '\n' + - "3. " + "Update " + "Parameter" + '\n' + - "4. " + "Back" + '\n' + + "3. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; private static final GroupMenu INSTANCE = new GroupMenu(); @@ -24,10 +22,9 @@ public class GroupMenu extends TopicIntroMenu { @Override protected void setNextMenus() { setNextMenus( - SetParameterMenu.getInstance(), // 1 + UpdateParameterMenu.getInstance(), // 1 ViewParameterMenu.getInstance(), // 2 - UpdateParameterMenu.getInstance(), // 3 - StartMenu.getInstance() // 4 + StartMenu.getInstance() // 3 ); } } From 96a0a0eeb4888728b7bcff0fdebf8125b04801d3 Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Wed, 10 May 2023 12:58:50 +0900 Subject: [PATCH 60/61] fix: fix the architecture of `UpdateParameterMenu` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. parameter 업데이트할 때 입력 받는 구조를 변경했습니다. 2. parameter 업데이트했을 때 기존 유저들의 group에도 반영될 수 있도록 수정했습니다. 3. test를 진행할 수 있도록 테스트 데이터를 삽입했습니다. --- src/me/smartstore/Main.java | 4 +- src/me/smartstore/SmartStoreApp.java | 34 ++++++++++ .../customer/CustomerRepository.java | 15 +++++ src/me/smartstore/group/Group.java | 51 +++++++++++++-- src/me/smartstore/group/GroupParameter.java | 5 ++ src/me/smartstore/menu/Menu.java | 4 -- .../menu/group/GroupParameterMenu.java | 41 ++++++++++++ .../menu/group/InputGroupParmeterMenu.java | 35 ++++++++++ .../menu/group/InputMinSpentHoursMenu.java | 23 +++++++ .../group/InputMinTotalPaidAmountMenu.java | 23 +++++++ .../UpdateGroupParameterConfirmMenu.java | 47 ++++++++++++++ .../menu/group/UpdateParameterMenu.java | 65 ++++++------------- .../menu/group/ViewParameterMenu.java | 26 ++------ 13 files changed, 295 insertions(+), 78 deletions(-) create mode 100644 src/me/smartstore/menu/group/GroupParameterMenu.java create mode 100644 src/me/smartstore/menu/group/InputGroupParmeterMenu.java create mode 100644 src/me/smartstore/menu/group/InputMinSpentHoursMenu.java create mode 100644 src/me/smartstore/menu/group/InputMinTotalPaidAmountMenu.java create mode 100644 src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java diff --git a/src/me/smartstore/Main.java b/src/me/smartstore/Main.java index b40a15aa..8cd59151 100644 --- a/src/me/smartstore/Main.java +++ b/src/me/smartstore/Main.java @@ -2,7 +2,7 @@ public class Main { public static void main(String[] args) { -// SmartStoreApp.test().run(); - SmartStoreApp.getInstance().run(); + SmartStoreApp.getInstance().test().run(); +// SmartStoreApp.getInstance().run(); } } diff --git a/src/me/smartstore/SmartStoreApp.java b/src/me/smartstore/SmartStoreApp.java index ae310573..cc4e7aeb 100644 --- a/src/me/smartstore/SmartStoreApp.java +++ b/src/me/smartstore/SmartStoreApp.java @@ -1,5 +1,8 @@ package me.smartstore; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.group.Group; +import me.smartstore.group.GroupParameter; import me.smartstore.menu.Menu; import me.smartstore.menu.topic.StartMenu; @@ -10,6 +13,37 @@ private SmartStoreApp() {} public static SmartStoreApp getInstance() { return INSTANCE; } public SmartStoreApp test() { + Integer[][] groupParameters = new Integer[][] { + {10, 100_000}, + {20, 200_000}, + {30, 300_000} + }; + CustomerRepository repository = CustomerRepository.getInstance(); + + Group[] groups = Group.getUsedGroups(); + for (int i = 0; i < groups.length; i++) { + Group group = groups[i]; + Integer[] param = groupParameters[i]; + group.setGroupParameter(param); + for (int j = 0; j < 10; j++) { + repository.resetTempCustomer(); + + String id = String.format("%s_%02d", group.name(), j); + repository.setTempId(id); + + String name = String.format(Character.toString('a'+j).repeat(4)); + repository.setTempName(name); + + Integer spentHours = (int) (Math.random() * 10) + param[0]; + repository.setTempSpentHours(spentHours); + + Integer totalPaidAmount = (int) (Math.random() * 100_000) + param[1]; + repository.setTempTotalPaidAmount(totalPaidAmount); + + repository.updateGroupOfTempCustomer(); + repository.addTempIntoRepository(); + } + } return this; } diff --git a/src/me/smartstore/customer/CustomerRepository.java b/src/me/smartstore/customer/CustomerRepository.java index 3cbd9e73..1c897f74 100644 --- a/src/me/smartstore/customer/CustomerRepository.java +++ b/src/me/smartstore/customer/CustomerRepository.java @@ -170,6 +170,21 @@ public String getSummaryByTotalPaidAmount(Order order) { return getSummary(); } + public void updateGroupIn(Group group) { + Group[] groups = Group.values(); + int idx = 0; + while (groups[idx] != group) + idx++; + Group rightLowGroup = groups[idx - 1]; + int size = customerList.size(); + for (int i = 0; i < size; ++i) { + Customer customer = customerList.get(i); + Group g = customer.getGroup(); + if (g == group || g == rightLowGroup) + customer.updateGroup(); + } + } + @Override public String toString() { if (customerList.isEmpty()) return "No Customers." + " Please input one first.\n"; diff --git a/src/me/smartstore/group/Group.java b/src/me/smartstore/group/Group.java index c737d0f8..6919a229 100644 --- a/src/me/smartstore/group/Group.java +++ b/src/me/smartstore/group/Group.java @@ -1,5 +1,6 @@ package me.smartstore.group; +import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.exception.InvalidGroupNameException; import java.util.Arrays; @@ -11,6 +12,10 @@ public enum Group { VIP("V"), VVIP("VV"); + private static final Group[] USED_GROUPS = { GENERAL, VIP, VVIP }; + private static GroupParameter tempParameter; + private static Group tempGroup; + private final String shortcut; private final GroupParameter groupParameter; @@ -19,9 +24,11 @@ public enum Group { this.groupParameter = new GroupParameter(); } + public static Group[] getUsedGroups() { return USED_GROUPS; } + public static Group getGroupByString(String s) throws InvalidGroupNameException { - Group[] groups = Group.values(); - return Arrays.stream(groups, 1, groups.length) + Group[] groups = Group.getUsedGroups(); + return Arrays.stream(groups) .filter(group -> group.isName(s)) .findAny() .orElseThrow(() -> new InvalidGroupNameException("\nInvalid Group Name for Input. Please try again.\n")); @@ -37,9 +44,9 @@ public void setGroupParameter(Integer[] groupParameterArguments) { } public static Group calculate(Integer spentHours, Integer totalPaidAmount) { - Group[] groups = values(); + Group[] groups = getUsedGroups(); Group ret = NONE; - int i = 1; + int i = 0; for (; i < groups.length; ++i) { Group group = groups[i]; GroupParameter parameter = group.groupParameter; @@ -56,9 +63,43 @@ public static Group calculate(Integer spentHours, Integer totalPaidAmount) { return ret; } + public static void setTempMinSpentHours(Integer minSpentHours) { + tempParameter.setMinSpentHours(minSpentHours); + } + + public static void setTempMinTotalPaidAmount(Integer minTotalPaidAmount) { + tempParameter.setMinTotalPaidAmount(minTotalPaidAmount); + } + + public static void setTempParameter(Group group) { + GroupParameter param = group.groupParameter; + tempParameter = new GroupParameter(param.getMinSpentHours(), param.getMinTotalPaidAmount()); + tempGroup = group; + } + + public static String getUpdateBeforeAndAfterInfo() { + String before = tempGroup.groupParameter.toString(); + String after = tempParameter.toString(); + return getGroupNameInfo(tempGroup) + + "Before: " + before + '\n'+ + "After : " + after; + } + + public static void updateGroupParameter() { + GroupParameter param = tempGroup.groupParameter; + param.setMinSpentHours(tempParameter.getMinSpentHours()); + param.setMinTotalPaidAmount(tempParameter.getMinTotalPaidAmount()); + + CustomerRepository.getInstance().updateGroupIn(tempGroup); + } + @Override public String toString() { - return "\nGroupType: " + this.name() + '\n' + return getGroupNameInfo(this) + "Parameter: " + this.groupParameter + '\n'; } + + public static String getGroupNameInfo(Group group) { + return '\n' + "Group: " + group.name() + '\n'; + } } diff --git a/src/me/smartstore/group/GroupParameter.java b/src/me/smartstore/group/GroupParameter.java index afa821c9..4bf3aafb 100644 --- a/src/me/smartstore/group/GroupParameter.java +++ b/src/me/smartstore/group/GroupParameter.java @@ -6,6 +6,11 @@ public class GroupParameter { public GroupParameter() {} + public GroupParameter(Integer minSpentHours, Integer minTotalPaidAmount) { + this.minSpentHours = minSpentHours; + this.minTotalPaidAmount = minTotalPaidAmount; + } + public void setMinSpentHours(Integer minSpentHours) { this.minSpentHours = minSpentHours; } diff --git a/src/me/smartstore/menu/Menu.java b/src/me/smartstore/menu/Menu.java index 13400228..3e873d27 100644 --- a/src/me/smartstore/menu/Menu.java +++ b/src/me/smartstore/menu/Menu.java @@ -9,10 +9,6 @@ public abstract class Menu { private static final Reader reader = Reader.getInstance(); private static final Printer printer = Printer.getInstance(); protected static final String END_INPUT = "** Press 'end', if you want to exit! **\n"; - protected static final String GROUP_OUTPUT = - '\n' + - "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" - + END_INPUT; private Menu[] nextMenus; private Menu BACK_MENU; diff --git a/src/me/smartstore/menu/group/GroupParameterMenu.java b/src/me/smartstore/menu/group/GroupParameterMenu.java new file mode 100644 index 00000000..3c06c4e7 --- /dev/null +++ b/src/me/smartstore/menu/group/GroupParameterMenu.java @@ -0,0 +1,41 @@ +package me.smartstore.menu.group; + +import me.smartstore.group.Group; +import me.smartstore.menu.Menu; +import me.smartstore.menu.exception.InputIsEndException; +import me.smartstore.menu.exception.InvalidGroupNameException; +import me.smartstore.menu.topic.GroupMenu; + +public abstract class GroupParameterMenu extends Menu { + + private static final String GROUP_OUTPUT = + '\n' + + "Which group (GENERAL (G), VIP (V), VVIP (VV))?\n" + + END_INPUT; + private Group groupCache; + + @Override + public Menu printAndInputAndGetNextMenu() { + if (getPrevMenu() == GroupMenu.getInstance()) { + while (true) { + print(GROUP_OUTPUT); + try { + String groupName = inputStringOrEnd(); + groupCache = Group.getGroupByString(groupName); + break; + } catch (InputIsEndException e) { + print(e.getMessage()); + return GroupMenu.getInstance(); + } catch (InvalidGroupNameException e) { + print(e.getMessage()); + } + } + } + return handleAndMoveToNextMenu(groupCache); + } + + @Override + protected void setNextMenus() {} + + protected abstract Menu handleAndMoveToNextMenu(Group group); +} diff --git a/src/me/smartstore/menu/group/InputGroupParmeterMenu.java b/src/me/smartstore/menu/group/InputGroupParmeterMenu.java new file mode 100644 index 00000000..d11bebad --- /dev/null +++ b/src/me/smartstore/menu/group/InputGroupParmeterMenu.java @@ -0,0 +1,35 @@ +package me.smartstore.menu.group; + +import me.smartstore.menu.Menu; +import me.smartstore.menu.exception.InputIsEndException; + +import java.util.InputMismatchException; + +public abstract class InputGroupParmeterMenu extends Menu { + + private final String PARAMETER_INPUT; + + InputGroupParmeterMenu(String PARAMETER_INPUT) { this.PARAMETER_INPUT = PARAMETER_INPUT; } + + @Override + public Menu printAndInputAndGetNextMenu() { + while (true) { + print(PARAMETER_INPUT); + try { + Integer property = inputZeroOrPositiveIntegerOrEnd(); + setTempProperty(property); + return getPrevMenu(); + } catch (InputMismatchException e) { + print(e.getMessage()); + } catch (InputIsEndException e) { + print(e.getMessage()); + return getPrevMenu(); + } + } + } + + @Override + protected void setNextMenus() {} + + protected abstract void setTempProperty(Integer property); +} diff --git a/src/me/smartstore/menu/group/InputMinSpentHoursMenu.java b/src/me/smartstore/menu/group/InputMinSpentHoursMenu.java new file mode 100644 index 00000000..a138f229 --- /dev/null +++ b/src/me/smartstore/menu/group/InputMinSpentHoursMenu.java @@ -0,0 +1,23 @@ +package me.smartstore.menu.group; + +import me.smartstore.group.Group; + +public class InputMinSpentHoursMenu extends InputGroupParmeterMenu { + + private static final String MIN_SPENT_HOURS_INPUT = + '\n' + "Input " + "Minimum " + "Spent Hours" + ":\n" + END_INPUT; + + private static class InstanceHolder { + private static final InputMinSpentHoursMenu INSTANCE = new InputMinSpentHoursMenu(); + } + private InputMinSpentHoursMenu() { super(MIN_SPENT_HOURS_INPUT); } + + public static InputMinSpentHoursMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + protected void setNextMenus() {} + + protected void setTempProperty(Integer property) { + Group.setTempMinSpentHours(property); + } +} diff --git a/src/me/smartstore/menu/group/InputMinTotalPaidAmountMenu.java b/src/me/smartstore/menu/group/InputMinTotalPaidAmountMenu.java new file mode 100644 index 00000000..72b1da40 --- /dev/null +++ b/src/me/smartstore/menu/group/InputMinTotalPaidAmountMenu.java @@ -0,0 +1,23 @@ +package me.smartstore.menu.group; + +import me.smartstore.group.Group; + +public class InputMinTotalPaidAmountMenu extends InputGroupParmeterMenu { + + private static final String MIN_SPENT_HOURS_INPUT = + '\n' + "Input " + "Minimum " + "Total Paid Amount" + ":\n" + END_INPUT; + + private static class InstanceHolder { + private static final InputMinTotalPaidAmountMenu INSTANCE = new InputMinTotalPaidAmountMenu(); + } + private InputMinTotalPaidAmountMenu() { super(MIN_SPENT_HOURS_INPUT); } + + public static InputMinTotalPaidAmountMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + protected void setNextMenus() {} + + protected void setTempProperty(Integer property) { + Group.setTempMinTotalPaidAmount(property); + } +} diff --git a/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java b/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java new file mode 100644 index 00000000..3f22f233 --- /dev/null +++ b/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java @@ -0,0 +1,47 @@ +package me.smartstore.menu.group; + +import me.smartstore.group.Group; +import me.smartstore.menu.Menu; +import me.smartstore.menu.topic.GroupMenu; + +import java.util.InputMismatchException; + +public class UpdateGroupParameterConfirmMenu extends Menu { + + private static final String UPDATE_CUSTOMER_CONFIRM_OUTPUT = + '\n' + + "= Update Parameter Confirm ===" + '\n' + + " 1. " + "Yes (Update)" + '\n' + + " 2. " + "No (Back)" + '\n' + + "==============================" + '\n' + + "Choose One: "; + + private static class InstanceHolder { + private static final UpdateGroupParameterConfirmMenu INSTANCE = new UpdateGroupParameterConfirmMenu(); + } + private UpdateGroupParameterConfirmMenu() { super(); } + public static UpdateGroupParameterConfirmMenu getInstance() { return InstanceHolder.INSTANCE; } + + @Override + public Menu printAndInputAndGetNextMenu() { + setNextMenus(); + final String updateBeforeAndAfterInfo = Group.getUpdateBeforeAndAfterInfo(); + while (true) { + try { + print(updateBeforeAndAfterInfo); + print(UPDATE_CUSTOMER_CONFIRM_OUTPUT); + int menuIdx = inputMenuIdx(); + if (menuIdx == 0) + Group.updateGroupParameter(); + return getNextMenu(menuIdx); + } catch (InputMismatchException e) { + print(e.getMessage()); + } + } + } + + @Override + protected void setNextMenus() { + setNextMenus(GroupMenu.getInstance(), UpdateParameterMenu.getInstance()); + } +} diff --git a/src/me/smartstore/menu/group/UpdateParameterMenu.java b/src/me/smartstore/menu/group/UpdateParameterMenu.java index 7f520799..03adcc5b 100644 --- a/src/me/smartstore/menu/group/UpdateParameterMenu.java +++ b/src/me/smartstore/menu/group/UpdateParameterMenu.java @@ -1,80 +1,53 @@ package me.smartstore.menu.group; import me.smartstore.group.Group; -import me.smartstore.menu.exception.InputIsEndException; -import me.smartstore.menu.exception.InvalidGroupNameException; import me.smartstore.menu.Menu; import me.smartstore.menu.topic.GroupMenu; import java.util.InputMismatchException; -public class UpdateParameterMenu extends Menu { +public class UpdateParameterMenu extends GroupParameterMenu { - private static final String SET_GROUP_PARAMETER_OUTPUT = + private static final String UPDATE_PARAMETER_INPUT = '\n' + - "===== Set Group Parameter ====" + '\n' + + "======= Update Parameter =====" + '\n' + " 1. " + "Minimum " + "Spent Hours" + '\n' + " 2. " + "Minimum " + "Total Paid Amount" + '\n' + - " 3. " + "Back" + '\n' + + " 3. " + "Confirm" + '\n' + + " 4. " + "Cancel(Back)" + '\n' + "==============================" + '\n' + "Choose One: "; - private static final String[] GROUP_PARAMETER_INPUT = { - '\n' + "Input " + "Minimum " + "Spent Hours" + ":\n" + END_INPUT, - '\n' + "Input " + "Minimum " + "Total Paid Amount" + ":\n" + END_INPUT - }; private static class InstanceHolder { private static final UpdateParameterMenu INSTANCE = new UpdateParameterMenu(); } - private UpdateParameterMenu() { super(); } + private UpdateParameterMenu() {} public static UpdateParameterMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - public Menu printAndInputAndGetNextMenu() { - setNextMenus(); - while (true) { - print(GROUP_OUTPUT); - try { - String groupName = inputStringOrEnd(); - Group group = Group.getGroupByString(groupName); - print(group); - inputGroupParameter(group); - } catch (InputIsEndException e) { - print(e.getMessage()); - return getBackMenu(); - } catch (InvalidGroupNameException e) { - print(e.getMessage()); - } - } - } - @Override public void setNextMenus() { setNextMenus( - null, // read minSpentHours - null, // read minTotalPaidAmount - GroupMenu.getInstance() // Back => GroupMenu + InputMinSpentHoursMenu.getInstance(), + InputMinTotalPaidAmountMenu.getInstance(), + UpdateGroupParameterConfirmMenu.getInstance(), + GroupMenu.getInstance() ); } - private void inputGroupParameter(Group group) { - Integer[] groupParameterArguments = { null, null }; + @Override + protected Menu handleAndMoveToNextMenu(Group group) { + if (getPrevMenu() == GroupMenu.getInstance()) { + setNextMenus(); + print(group); + Group.setTempParameter(group); + } while (true) { - print(SET_GROUP_PARAMETER_OUTPUT); try { + print(UPDATE_PARAMETER_INPUT); int menuIdx = inputMenuIdx(); - if (menuIdx <= 1) { - print(GROUP_PARAMETER_INPUT[menuIdx]); - groupParameterArguments[menuIdx] = inputZeroOrPositiveIntegerOrEnd(); - } else { - group.setGroupParameter(groupParameterArguments); - break; - } - } catch (InputIsEndException e) { - print(e.getMessage()); - break; + return getNextMenu(menuIdx); } catch (InputMismatchException e) { print(e.getMessage()); } diff --git a/src/me/smartstore/menu/group/ViewParameterMenu.java b/src/me/smartstore/menu/group/ViewParameterMenu.java index 9051d76d..e548e9c0 100644 --- a/src/me/smartstore/menu/group/ViewParameterMenu.java +++ b/src/me/smartstore/menu/group/ViewParameterMenu.java @@ -1,12 +1,10 @@ package me.smartstore.menu.group; import me.smartstore.group.Group; -import me.smartstore.menu.exception.InputIsEndException; -import me.smartstore.menu.exception.InvalidGroupNameException; import me.smartstore.menu.Menu; import me.smartstore.menu.topic.GroupMenu; -public class ViewParameterMenu extends Menu { +public class ViewParameterMenu extends GroupParameterMenu { private static class InstanceHolder { private static final ViewParameterMenu INSTANCE = new ViewParameterMenu(); @@ -15,25 +13,11 @@ private ViewParameterMenu() {} public static ViewParameterMenu getInstance() { return InstanceHolder.INSTANCE; } @Override - public Menu printAndInputAndGetNextMenu() { - setNextMenus(); - while (true) { - print(GROUP_OUTPUT); - try { - String groupName = inputStringOrEnd(); - Group group = Group.getGroupByString(groupName); - print(group); - } catch (InputIsEndException e) { - print(e.getMessage()); - return getBackMenu(); - } catch (InvalidGroupNameException e) { - print(e.getMessage()); - } - } - } + protected void setNextMenus() {} @Override - protected void setNextMenus() { - setNextMenus(GroupMenu.getInstance()); + protected Menu handleAndMoveToNextMenu(Group group) { + print(group); + return GroupMenu.getInstance(); } } From fc7a8696f041f0c16e6dc0338cf79cdb42355ecb Mon Sep 17 00:00:00 2001 From: Joonhee Jeong Date: Thu, 11 May 2023 22:25:43 +0900 Subject: [PATCH 61/61] refactor: rename, extract, move some classes 1. rename `classification` -> `summary` 2. extract `Summary` 3. move `Order` and the static constant Comparators of `Customer` 4. `CustomerRepository` extends `List` 5. fix some typos --- src/me/smartstore/SmartStoreApp.java | 2 +- src/me/smartstore/customer/Customer.java | 59 ++++---- .../customer/CustomerRepository.java | 136 ++++-------------- src/me/smartstore/customer/List.java | 56 ++++++-- src/me/smartstore/customer/Order.java | 21 --- .../DuplicateCustomerIdException.java | 2 +- .../InvalidCustomerIdException.java | 2 +- .../InvalidCustomerNameException.java | 2 +- .../MaxCapacityReachedException.java | 2 +- src/me/smartstore/group/Group.java | 23 ++- .../AddCustomerIntoRepositoryMenu.java | 4 +- .../menu/customer/DeleteCustomerMenu.java | 4 +- .../menu/customer/InputCustomerIdMenu.java | 4 +- .../menu/customer/InputCustomerNameMenu.java | 2 +- .../customer/UpdateCustomerConfirmMenu.java | 2 +- .../UpdateCustomerIntoRepositoryMenu.java | 4 +- .../menu/customer/UpdateCustomerMenu.java | 4 +- .../menu/customer/ViewCustomerMenu.java | 4 +- .../menu/group/GroupParameterMenu.java | 6 +- .../UpdateGroupParameterConfirmMenu.java | 4 +- .../menu/group/UpdateParameterMenu.java | 6 +- .../menu/group/ViewParameterMenu.java | 4 +- .../SummaryByNameMenu.java | 11 +- .../SummaryBySpentHoursMenu.java | 11 +- .../SummaryByTotalPaidAmountMenu.java | 11 +- .../SummaryDefaultMenu.java | 8 +- .../SummaryMenu.java | 7 +- .../menu/topic/AddCustomerMenu.java | 8 +- ...stomerMenu.java => CustomerIntroMenu.java} | 8 +- .../{GroupMenu.java => GroupIntroMenu.java} | 8 +- src/me/smartstore/menu/topic/StartMenu.java | 6 +- ...icationMenu.java => SummaryIntroMenu.java} | 12 +- .../UpdateCustomerSelectPropertyMenu.java | 2 +- src/me/smartstore/summary/Order.java | 34 +++++ .../summary/SortedSummaryTemplate.java | 17 +++ src/me/smartstore/summary/Summary.java | 47 ++++++ src/me/smartstore/summary/SummaryByName.java | 19 +++ .../summary/SummaryBySpentHours.java | 19 +++ .../summary/SummaryByTotalPaidAmount.java | 19 +++ 39 files changed, 330 insertions(+), 270 deletions(-) delete mode 100644 src/me/smartstore/customer/Order.java rename src/me/smartstore/customer/{ => exception}/DuplicateCustomerIdException.java (77%) rename src/me/smartstore/customer/{ => exception}/InvalidCustomerIdException.java (77%) rename src/me/smartstore/customer/{ => exception}/InvalidCustomerNameException.java (77%) rename src/me/smartstore/customer/{ => exception}/MaxCapacityReachedException.java (77%) rename src/me/smartstore/menu/{classification => summary}/SummaryByNameMenu.java (59%) rename src/me/smartstore/menu/{classification => summary}/SummaryBySpentHoursMenu.java (60%) rename src/me/smartstore/menu/{classification => summary}/SummaryByTotalPaidAmountMenu.java (61%) rename src/me/smartstore/menu/{classification => summary}/SummaryDefaultMenu.java (67%) rename src/me/smartstore/menu/{classification => summary}/SummaryMenu.java (83%) rename src/me/smartstore/menu/topic/{CustomerMenu.java => CustomerIntroMenu.java} (79%) rename src/me/smartstore/menu/topic/{GroupMenu.java => GroupIntroMenu.java} (76%) rename src/me/smartstore/menu/topic/{ClassificationMenu.java => SummaryIntroMenu.java} (71%) create mode 100644 src/me/smartstore/summary/Order.java create mode 100644 src/me/smartstore/summary/SortedSummaryTemplate.java create mode 100644 src/me/smartstore/summary/Summary.java create mode 100644 src/me/smartstore/summary/SummaryByName.java create mode 100644 src/me/smartstore/summary/SummaryBySpentHours.java create mode 100644 src/me/smartstore/summary/SummaryByTotalPaidAmount.java diff --git a/src/me/smartstore/SmartStoreApp.java b/src/me/smartstore/SmartStoreApp.java index cc4e7aeb..15563d25 100644 --- a/src/me/smartstore/SmartStoreApp.java +++ b/src/me/smartstore/SmartStoreApp.java @@ -31,7 +31,7 @@ public SmartStoreApp test() { String id = String.format("%s_%02d", group.name(), j); repository.setTempId(id); - String name = String.format(Character.toString('a'+j).repeat(4)); + String name = (char) ('a'+j) + "zzz"; repository.setTempName(name); Integer spentHours = (int) (Math.random() * 10) + param[0]; diff --git a/src/me/smartstore/customer/Customer.java b/src/me/smartstore/customer/Customer.java index c3441452..0a0c2883 100644 --- a/src/me/smartstore/customer/Customer.java +++ b/src/me/smartstore/customer/Customer.java @@ -1,16 +1,11 @@ package me.smartstore.customer; +import me.smartstore.customer.exception.InvalidCustomerIdException; +import me.smartstore.customer.exception.InvalidCustomerNameException; import me.smartstore.group.Group; -import java.util.Comparator; public class Customer { - public static final Comparator ORDER_NAME_ASC = Comparator.comparing(e -> e.name); - public static final Comparator ORDER_NAME_DEC = (e1, e2) -> e2.name.compareTo(e1.name); - public static final Comparator ORDER_SPENT_HOURS_ASC = Comparator.comparing(e -> e.spentHours); - public static final Comparator ORDER_SPENT_HOURS_DEC = (e1, e2) -> e2.spentHours.compareTo(e1.spentHours); - public static final Comparator ORDER_TOTAL_PAID_AMOUNT_ASC = Comparator.comparing(e -> e.totalPaidAmount); - public static final Comparator ORDER_TOTAL_PAID_AMOUNT_DEC = (e1, e2) -> e2.totalPaidAmount.compareTo(e1.totalPaidAmount); public static final String ID_FORMAT = "ID Format: 4~16 letters consisting of alphabets, digits, underscore(_)"; public static final String NAME_FORMAT = @@ -22,7 +17,6 @@ public class Customer { private static final int DEFAULT_TOTAL_PAID_AMOUNT = 0; private static final Group DEFAULT_GROUP = Group.NONE; - private String id; private String name; private Integer spentHours; @@ -41,28 +35,24 @@ public Customer(String id, String name, Integer spentHours, Integer totalPaidAmo this.group = group; } - public Customer(Customer e) { - copy(e); + public Customer(Customer e) { copy(e); } + + public void copy(Customer e) { + id = e.id; + name = e.name; + spentHours = e.spentHours; + totalPaidAmount = e.totalPaidAmount; + group = e.group; } public String getId() { return id; } - public void setId(String id) throws InvalidCustomerIdException { + public void setId(String id, boolean checked) throws InvalidCustomerIdException { + if (!checked) + checkIfIdIsValid(id); this.id = id; } - public void setName(String name) throws InvalidCustomerNameException { - this.name = name; - } - - public void setSpentHours(Integer spentHours) { - this.spentHours = spentHours; - } - - public void setTotalPaidAmount(Integer totalPaidAmount) { - this.totalPaidAmount = totalPaidAmount; - } - public static void checkIfIdIsValid(String id) throws InvalidCustomerIdException { if (!isValidId(id)) throw new InvalidCustomerIdException("Invalid ID input.\n"); @@ -73,6 +63,13 @@ private static boolean isValidId(String id) { return id.matches(ID_PATTERN); } + public String getName() { return name; } + + public void setName(String name) throws InvalidCustomerNameException { + checkIfNameIsValid(name); + this.name = name; + } + public static void checkIfNameIsValid(String name) throws InvalidCustomerNameException { if (!isValidName(name)) throw new InvalidCustomerNameException("Invalid Name input.\n"); @@ -88,18 +85,18 @@ private static void throwIfNull(Object o, String title) { throw new IllegalArgumentException(title + " cannot be null.\n"); } - public void copy(Customer e) { - id = e.id; - name = e.name; - spentHours = e.spentHours; - totalPaidAmount = e.totalPaidAmount; - group = e.group; - } + public Integer getSpentHours() { return spentHours; } + + public void setSpentHours(Integer spentHours) { this.spentHours = spentHours; } + + public Integer getTotalPaidAmount() { return totalPaidAmount; } + + public void setTotalPaidAmount(Integer totalPaidAmount) { this.totalPaidAmount = totalPaidAmount; } public Group getGroup() { return group; } public void updateGroup() { - group = Group.calculate(spentHours, totalPaidAmount); + group = Group.getGroupByParameter(spentHours, totalPaidAmount); } @Override diff --git a/src/me/smartstore/customer/CustomerRepository.java b/src/me/smartstore/customer/CustomerRepository.java index 1c897f74..989d9bbd 100644 --- a/src/me/smartstore/customer/CustomerRepository.java +++ b/src/me/smartstore/customer/CustomerRepository.java @@ -1,10 +1,11 @@ package me.smartstore.customer; +import me.smartstore.customer.exception.DuplicateCustomerIdException; +import me.smartstore.customer.exception.InvalidCustomerIdException; +import me.smartstore.customer.exception.InvalidCustomerNameException; import me.smartstore.group.Group; -import java.util.Comparator; - -public class CustomerRepository { +public class CustomerRepository extends List { private static class InstanceHolder { private static final CustomerRepository INSTANCE = new CustomerRepository(); @@ -12,17 +13,10 @@ private static class InstanceHolder { public static CustomerRepository getInstance() { return InstanceHolder.INSTANCE; } private CustomerRepository() {} - private final List customerList = new List<>(); - private static Customer tempCustomer; - private static int tempIdx; - - public void checkIfCanAddMore() throws MaxCapacityReachedException { - customerList.checkIfReachedMaxCapacity(); - } + private Customer tempCustomer; + private int tempIdx; - public void resetTempCustomer() { - tempCustomer = new Customer(null, null); - } + public void resetTempCustomer() { tempCustomer = new Customer(null, null); } public void checkIfHasNoDuplicate(String id) throws DuplicateCustomerIdException { if (hasCustomerWithId(id)) @@ -30,37 +24,26 @@ public void checkIfHasNoDuplicate(String id) throws DuplicateCustomerIdException } private boolean hasCustomerWithId(String id) { - return findIdxById(id) >= 0; - } - - private int findIdxById(String id) { assert id != null; - - int size = customerList.size(); - for (int i = 0; i < size; ++i) - if (id.equals(customerList.get(i).getId())) - return i; - return -1; + for (Customer customer : this) + if (id.equals(customer.getId())) + return true; + return false; } public void setTempId(String id) throws InvalidCustomerIdException, DuplicateCustomerIdException { Customer.checkIfIdIsValid(id); checkIfHasNoDuplicate(id); - tempCustomer.setId(id); + tempCustomer.setId(id, true); } public void setTempName(String name) throws InvalidCustomerNameException { - Customer.checkIfNameIsValid(name); tempCustomer.setName(name); } - public void setTempSpentHours(Integer spentHours) { - tempCustomer.setSpentHours(spentHours); - } + public void setTempSpentHours(Integer spentHours) { tempCustomer.setSpentHours(spentHours); } - public void setTempTotalPaidAmount(Integer totalPaidAmount) { - tempCustomer.setTotalPaidAmount(totalPaidAmount); - } + public void setTempTotalPaidAmount(Integer totalPaidAmount) { tempCustomer.setTotalPaidAmount(totalPaidAmount); } public String getTempInfo() { updateGroupOfTempCustomer(); @@ -70,39 +53,31 @@ public String getTempInfo() { public void addTempIntoRepository() { // app logic에 따라 다음 두 구문이 true 임을 보장합니다. assert tempCustomer != null; - assert !customerList.isReachedMaxCapacity(); + assert !isReachedMaxCapacity(); - customerList.add(tempCustomer); + add(tempCustomer); tempCustomer = null; } - public boolean isTempIdNull() { - return tempCustomer.getId() == null; - } - - public int size() { - return customerList.size(); - } + public boolean isTempIdNull() {return tempCustomer.getId() == null; } public String deleteAndGetInfoOf(int num) { int idx = num - 1; - return customerList.remove(idx).toString(); + return remove(idx).toString(); } public String setTempAndGetInfoOf(int num) { int idx = num - 1; - Customer updatingCustomer = customerList.get(idx); + Customer updatingCustomer = get(idx); tempCustomer = new Customer(updatingCustomer); tempIdx = idx; return updatingCustomer.toString(); } - public void updateTempInRepository() { - customerList.get(tempIdx).copy(tempCustomer); - } + public void updateTempInRepository() { get(tempIdx).copy(tempCustomer); } public String getUpdateBeforeAndAfterInfo() { - Customer before = customerList.get(tempIdx); + Customer before = get(tempIdx); Customer after = tempCustomer; updateGroupOfTempCustomer(); return String.format("\nNo. %2d\n", tempIdx) + @@ -110,75 +85,16 @@ public String getUpdateBeforeAndAfterInfo() { "After : " + after; } - public void updateGroupOfTempCustomer() { - tempCustomer.updateGroup(); - } - - public String getSummary() { - Group[] groups = Group.values(); - int len = groups.length; - StringBuilder[] stringBuilders = new StringBuilder[len]; - int[] cnt = new int[len]; - for (int i = 0; i < len; ++i) { - StringBuilder sb = new StringBuilder(); - sb.append('\n').append("==============================") - .append(groups[i]) - .append("==============================").append('\n'); - stringBuilders[i] = sb; - } - - int size = customerList.size(); - for (int i = 0; i < size; ++i) { - Customer customer = customerList.get(i); - Group group = customer.getGroup(); - for (int j = 0; j < len; ++j) { - if (group == groups[j]) { - stringBuilders[j].append(customer).append('\n'); - cnt[j]++; - break; - } - } - } - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < len; ++i) { - sb.append(stringBuilders[i]); - if (cnt[i] == 0) - sb.append("No Customers.").append('\n'); - } - return sb.append('\n').toString(); - } - - public String getSummaryByName(Order order) { - Comparator cmp = order == Order.ASCENDING ? Customer.ORDER_NAME_ASC - : Customer.ORDER_NAME_DEC; - customerList.sort(cmp); - return getSummary(); - } - - public String getSummaryBySpentHours(Order order) { - Comparator cmp = order == Order.ASCENDING ? Customer.ORDER_SPENT_HOURS_ASC - : Customer.ORDER_SPENT_HOURS_DEC; - customerList.sort(cmp); - return getSummary(); - } - - public String getSummaryByTotalPaidAmount(Order order) { - Comparator cmp = order == Order.ASCENDING ? Customer.ORDER_TOTAL_PAID_AMOUNT_ASC - : Customer.ORDER_TOTAL_PAID_AMOUNT_DEC; - customerList.sort(cmp); - return getSummary(); - } + public void updateGroupOfTempCustomer() { tempCustomer.updateGroup(); } public void updateGroupIn(Group group) { Group[] groups = Group.values(); int idx = 0; while (groups[idx] != group) idx++; + assert idx > 0; Group rightLowGroup = groups[idx - 1]; - int size = customerList.size(); - for (int i = 0; i < size; ++i) { - Customer customer = customerList.get(i); + for (Customer customer : this) { Group g = customer.getGroup(); if (g == group || g == rightLowGroup) customer.updateGroup(); @@ -187,7 +103,7 @@ public void updateGroupIn(Group group) { @Override public String toString() { - if (customerList.isEmpty()) return "No Customers." + " Please input one first.\n"; - return customerList.toString(); + if (isEmpty()) return "No Customers." + " Please input one first.\n"; + return super.toString(); } } diff --git a/src/me/smartstore/customer/List.java b/src/me/smartstore/customer/List.java index 149ac51a..c32e521e 100644 --- a/src/me/smartstore/customer/List.java +++ b/src/me/smartstore/customer/List.java @@ -1,22 +1,25 @@ package me.smartstore.customer; +import me.smartstore.customer.exception.MaxCapacityReachedException; + import java.util.Arrays; import java.util.Comparator; +import java.util.Iterator; +import java.util.Spliterator; +import java.util.function.Consumer; -public class List { +public class List implements Iterable { - protected static final int DEFAULT_CAPACITY = 16; - protected static final int MAX_CAPACITY = 100; + private static final int DEFAULT_CAPACITY = 16; + private static final int MAX_CAPACITY = 100; private static final int MIN_CAPACITY = 16; private E[] list; private int size = 0; private int reduceCapacityThreshold; - List() { - this(DEFAULT_CAPACITY); - } + List() { this(DEFAULT_CAPACITY); } @SuppressWarnings("unchecked") List(int initCapacity) { @@ -26,18 +29,28 @@ public class List { reduceCapacityThreshold = initCapacity >>> 2; } + class ListIterator implements Iterator { + private int idx = 0; + + @Override + public boolean hasNext() { + return idx < size; + } + + @Override + public E next() { + return list[idx++]; + } + } + public void checkIfReachedMaxCapacity() throws MaxCapacityReachedException { if (isReachedMaxCapacity()) throw new MaxCapacityReachedException("The maximum capable number of elements was reached.\n"); } - public boolean isReachedMaxCapacity() { - return size == MAX_CAPACITY; - } + public boolean isReachedMaxCapacity() { return size == MAX_CAPACITY; } - public boolean isEmpty() { - return size == 0; - } + public boolean isEmpty() { return size == 0; } public int size() { return size; } @@ -59,9 +72,7 @@ private void checkIfNull(E e) { throw new IllegalArgumentException("Input element is null"); } - private boolean isFull() { - return size == list.length; - } + private boolean isFull() { return size == list.length; } private void increaseCapacity() { int newLength = Math.min(MAX_CAPACITY, list.length << 1); @@ -111,6 +122,21 @@ public void sort(Comparator comparator) { } } + @Override + public Iterator iterator() { + return new ListIterator(); + } + + @Override + public void forEach(Consumer action) { + Iterable.super.forEach(action); + } + + @Override + public Spliterator spliterator() { + return Iterable.super.spliterator(); + } + @Override public String toString() { StringBuilder sb = new StringBuilder("======= Stored Customers Info. =======\n"); diff --git a/src/me/smartstore/customer/Order.java b/src/me/smartstore/customer/Order.java deleted file mode 100644 index 0b6c5d39..00000000 --- a/src/me/smartstore/customer/Order.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.smartstore.customer; - -import java.util.Arrays; -import java.util.InputMismatchException; - -public enum Order { - ASCENDING("A"), DESCENDING("D"); - - private final String shortcut; - - Order(String shortcut) { - this.shortcut = shortcut; - } - - public static Order getOrderByName(String name) throws InputMismatchException { - return Arrays.stream(values()) - .filter(order -> order.shortcut.equalsIgnoreCase(name) || order.name().equalsIgnoreCase(name)) - .findFirst() - .orElseThrow(() -> new InputMismatchException("Invalid Order name for input. Please try again.\n")); - } -} diff --git a/src/me/smartstore/customer/DuplicateCustomerIdException.java b/src/me/smartstore/customer/exception/DuplicateCustomerIdException.java similarity index 77% rename from src/me/smartstore/customer/DuplicateCustomerIdException.java rename to src/me/smartstore/customer/exception/DuplicateCustomerIdException.java index 2de8221c..f6da1835 100644 --- a/src/me/smartstore/customer/DuplicateCustomerIdException.java +++ b/src/me/smartstore/customer/exception/DuplicateCustomerIdException.java @@ -1,4 +1,4 @@ -package me.smartstore.customer; +package me.smartstore.customer.exception; public class DuplicateCustomerIdException extends IllegalStateException { public DuplicateCustomerIdException(String msg) { super(msg); } diff --git a/src/me/smartstore/customer/InvalidCustomerIdException.java b/src/me/smartstore/customer/exception/InvalidCustomerIdException.java similarity index 77% rename from src/me/smartstore/customer/InvalidCustomerIdException.java rename to src/me/smartstore/customer/exception/InvalidCustomerIdException.java index 4e411e34..8db2d20e 100644 --- a/src/me/smartstore/customer/InvalidCustomerIdException.java +++ b/src/me/smartstore/customer/exception/InvalidCustomerIdException.java @@ -1,4 +1,4 @@ -package me.smartstore.customer; +package me.smartstore.customer.exception; public class InvalidCustomerIdException extends IllegalArgumentException { public InvalidCustomerIdException(String msg) { super(msg); } diff --git a/src/me/smartstore/customer/InvalidCustomerNameException.java b/src/me/smartstore/customer/exception/InvalidCustomerNameException.java similarity index 77% rename from src/me/smartstore/customer/InvalidCustomerNameException.java rename to src/me/smartstore/customer/exception/InvalidCustomerNameException.java index 8ebd451e..879d4d5e 100644 --- a/src/me/smartstore/customer/InvalidCustomerNameException.java +++ b/src/me/smartstore/customer/exception/InvalidCustomerNameException.java @@ -1,4 +1,4 @@ -package me.smartstore.customer; +package me.smartstore.customer.exception; public class InvalidCustomerNameException extends IllegalArgumentException { public InvalidCustomerNameException(String msg) { super(msg); } diff --git a/src/me/smartstore/customer/MaxCapacityReachedException.java b/src/me/smartstore/customer/exception/MaxCapacityReachedException.java similarity index 77% rename from src/me/smartstore/customer/MaxCapacityReachedException.java rename to src/me/smartstore/customer/exception/MaxCapacityReachedException.java index ece7c576..5d0c61bf 100644 --- a/src/me/smartstore/customer/MaxCapacityReachedException.java +++ b/src/me/smartstore/customer/exception/MaxCapacityReachedException.java @@ -1,4 +1,4 @@ -package me.smartstore.customer; +package me.smartstore.customer.exception; public class MaxCapacityReachedException extends IllegalStateException { public MaxCapacityReachedException(String msg) { super(msg); } diff --git a/src/me/smartstore/group/Group.java b/src/me/smartstore/group/Group.java index 6919a229..fc759a1a 100644 --- a/src/me/smartstore/group/Group.java +++ b/src/me/smartstore/group/Group.java @@ -12,10 +12,6 @@ public enum Group { VIP("V"), VVIP("VV"); - private static final Group[] USED_GROUPS = { GENERAL, VIP, VVIP }; - private static GroupParameter tempParameter; - private static Group tempGroup; - private final String shortcut; private final GroupParameter groupParameter; @@ -24,6 +20,11 @@ public enum Group { this.groupParameter = new GroupParameter(); } + private static final Group[] USED_GROUPS = { GENERAL, VIP, VVIP }; + + private static GroupParameter tempParameter; + private static Group tempGroup; + public static Group[] getUsedGroups() { return USED_GROUPS; } public static Group getGroupByString(String s) throws InvalidGroupNameException { @@ -38,20 +39,18 @@ private boolean isName(String s) { return this.shortcut.equalsIgnoreCase(s) || this.name().equalsIgnoreCase(s); } + // only for test public void setGroupParameter(Integer[] groupParameterArguments) { this.groupParameter.setMinSpentHours(groupParameterArguments[0]); this.groupParameter.setMinTotalPaidAmount(groupParameterArguments[1]); } - public static Group calculate(Integer spentHours, Integer totalPaidAmount) { - Group[] groups = getUsedGroups(); + public static Group getGroupByParameter(Integer spentHours, Integer totalPaidAmount) { Group ret = NONE; - int i = 0; - for (; i < groups.length; ++i) { - Group group = groups[i]; - GroupParameter parameter = group.groupParameter; - Integer minSpentHours = parameter.getMinSpentHours(); - Integer minTotalPaidAmount = parameter.getMinTotalPaidAmount(); + for (Group group : getUsedGroups()) { + GroupParameter param = group.groupParameter; + Integer minSpentHours = param.getMinSpentHours(); + Integer minTotalPaidAmount = param.getMinTotalPaidAmount(); if (minSpentHours == null && minTotalPaidAmount == null) continue; if (minSpentHours != null) diff --git a/src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java b/src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java index f47262cb..93c19759 100644 --- a/src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java +++ b/src/me/smartstore/menu/customer/AddCustomerIntoRepositoryMenu.java @@ -2,7 +2,7 @@ import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.CustomerMenu; +import me.smartstore.menu.topic.CustomerIntroMenu; public class AddCustomerIntoRepositoryMenu extends Menu { @@ -21,7 +21,7 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(CustomerMenu.getInstance()); + setNextMenus(CustomerIntroMenu.getInstance()); } private void addTempCustomerIntoRepository() { diff --git a/src/me/smartstore/menu/customer/DeleteCustomerMenu.java b/src/me/smartstore/menu/customer/DeleteCustomerMenu.java index d9b9a2d9..dc56f107 100644 --- a/src/me/smartstore/menu/customer/DeleteCustomerMenu.java +++ b/src/me/smartstore/menu/customer/DeleteCustomerMenu.java @@ -2,7 +2,7 @@ import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.CustomerMenu; +import me.smartstore.menu.topic.CustomerIntroMenu; import java.util.InputMismatchException; @@ -36,6 +36,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(CustomerMenu.getInstance()); + setNextMenus(CustomerIntroMenu.getInstance()); } } diff --git a/src/me/smartstore/menu/customer/InputCustomerIdMenu.java b/src/me/smartstore/menu/customer/InputCustomerIdMenu.java index fa9b8ac1..7178c557 100644 --- a/src/me/smartstore/menu/customer/InputCustomerIdMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerIdMenu.java @@ -1,8 +1,8 @@ package me.smartstore.menu.customer; import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.DuplicateCustomerIdException; -import me.smartstore.customer.InvalidCustomerIdException; +import me.smartstore.customer.exception.DuplicateCustomerIdException; +import me.smartstore.customer.exception.InvalidCustomerIdException; import me.smartstore.menu.exception.InputIsEndException; import static me.smartstore.customer.Customer.ID_FORMAT; diff --git a/src/me/smartstore/menu/customer/InputCustomerNameMenu.java b/src/me/smartstore/menu/customer/InputCustomerNameMenu.java index f28409f1..f4bf7e44 100644 --- a/src/me/smartstore/menu/customer/InputCustomerNameMenu.java +++ b/src/me/smartstore/menu/customer/InputCustomerNameMenu.java @@ -1,7 +1,7 @@ package me.smartstore.menu.customer; import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.InvalidCustomerNameException; +import me.smartstore.customer.exception.InvalidCustomerNameException; import me.smartstore.menu.exception.InputIsEndException; import static me.smartstore.customer.Customer.NAME_FORMAT; diff --git a/src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java b/src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java index c67d3c1a..eaf1c176 100644 --- a/src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java +++ b/src/me/smartstore/menu/customer/UpdateCustomerConfirmMenu.java @@ -18,7 +18,7 @@ public class UpdateCustomerConfirmMenu extends Menu { private static class InstanceHolder { private static final UpdateCustomerConfirmMenu INSTANCE = new UpdateCustomerConfirmMenu(); } - private UpdateCustomerConfirmMenu() { super(); } + private UpdateCustomerConfirmMenu() {} public static UpdateCustomerConfirmMenu getInstance() { return InstanceHolder.INSTANCE; } @Override diff --git a/src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java b/src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java index a1989094..d8fec3f3 100644 --- a/src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java +++ b/src/me/smartstore/menu/customer/UpdateCustomerIntoRepositoryMenu.java @@ -2,7 +2,7 @@ import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.CustomerMenu; +import me.smartstore.menu.topic.CustomerIntroMenu; public class UpdateCustomerIntoRepositoryMenu extends Menu { @@ -21,7 +21,7 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(CustomerMenu.getInstance()); + setNextMenus(CustomerIntroMenu.getInstance()); } private void updateTempCustomerInRepository() { diff --git a/src/me/smartstore/menu/customer/UpdateCustomerMenu.java b/src/me/smartstore/menu/customer/UpdateCustomerMenu.java index 47443fa0..bf61bf5d 100644 --- a/src/me/smartstore/menu/customer/UpdateCustomerMenu.java +++ b/src/me/smartstore/menu/customer/UpdateCustomerMenu.java @@ -2,7 +2,7 @@ import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.CustomerMenu; +import me.smartstore.menu.topic.CustomerIntroMenu; import me.smartstore.menu.topic.UpdateCustomerSelectPropertyMenu; import java.util.InputMismatchException; @@ -37,6 +37,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(CustomerMenu.getInstance()); + setNextMenus(CustomerIntroMenu.getInstance()); } } diff --git a/src/me/smartstore/menu/customer/ViewCustomerMenu.java b/src/me/smartstore/menu/customer/ViewCustomerMenu.java index 8511a540..0c7df663 100644 --- a/src/me/smartstore/menu/customer/ViewCustomerMenu.java +++ b/src/me/smartstore/menu/customer/ViewCustomerMenu.java @@ -2,7 +2,7 @@ import me.smartstore.customer.CustomerRepository; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.CustomerMenu; +import me.smartstore.menu.topic.CustomerIntroMenu; public class ViewCustomerMenu extends Menu { @@ -21,6 +21,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(CustomerMenu.getInstance()); + setNextMenus(CustomerIntroMenu.getInstance()); } } diff --git a/src/me/smartstore/menu/group/GroupParameterMenu.java b/src/me/smartstore/menu/group/GroupParameterMenu.java index 3c06c4e7..627f2f93 100644 --- a/src/me/smartstore/menu/group/GroupParameterMenu.java +++ b/src/me/smartstore/menu/group/GroupParameterMenu.java @@ -4,7 +4,7 @@ import me.smartstore.menu.Menu; import me.smartstore.menu.exception.InputIsEndException; import me.smartstore.menu.exception.InvalidGroupNameException; -import me.smartstore.menu.topic.GroupMenu; +import me.smartstore.menu.topic.GroupIntroMenu; public abstract class GroupParameterMenu extends Menu { @@ -16,7 +16,7 @@ public abstract class GroupParameterMenu extends Menu { @Override public Menu printAndInputAndGetNextMenu() { - if (getPrevMenu() == GroupMenu.getInstance()) { + if (getPrevMenu() == GroupIntroMenu.getInstance()) { while (true) { print(GROUP_OUTPUT); try { @@ -25,7 +25,7 @@ public Menu printAndInputAndGetNextMenu() { break; } catch (InputIsEndException e) { print(e.getMessage()); - return GroupMenu.getInstance(); + return GroupIntroMenu.getInstance(); } catch (InvalidGroupNameException e) { print(e.getMessage()); } diff --git a/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java b/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java index 3f22f233..0721ffa8 100644 --- a/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java +++ b/src/me/smartstore/menu/group/UpdateGroupParameterConfirmMenu.java @@ -2,7 +2,7 @@ import me.smartstore.group.Group; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.GroupMenu; +import me.smartstore.menu.topic.GroupIntroMenu; import java.util.InputMismatchException; @@ -42,6 +42,6 @@ public Menu printAndInputAndGetNextMenu() { @Override protected void setNextMenus() { - setNextMenus(GroupMenu.getInstance(), UpdateParameterMenu.getInstance()); + setNextMenus(GroupIntroMenu.getInstance(), UpdateParameterMenu.getInstance()); } } diff --git a/src/me/smartstore/menu/group/UpdateParameterMenu.java b/src/me/smartstore/menu/group/UpdateParameterMenu.java index 03adcc5b..f1a535c4 100644 --- a/src/me/smartstore/menu/group/UpdateParameterMenu.java +++ b/src/me/smartstore/menu/group/UpdateParameterMenu.java @@ -2,7 +2,7 @@ import me.smartstore.group.Group; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.GroupMenu; +import me.smartstore.menu.topic.GroupIntroMenu; import java.util.InputMismatchException; @@ -32,13 +32,13 @@ public void setNextMenus() { InputMinSpentHoursMenu.getInstance(), InputMinTotalPaidAmountMenu.getInstance(), UpdateGroupParameterConfirmMenu.getInstance(), - GroupMenu.getInstance() + GroupIntroMenu.getInstance() ); } @Override protected Menu handleAndMoveToNextMenu(Group group) { - if (getPrevMenu() == GroupMenu.getInstance()) { + if (getPrevMenu() == GroupIntroMenu.getInstance()) { setNextMenus(); print(group); Group.setTempParameter(group); diff --git a/src/me/smartstore/menu/group/ViewParameterMenu.java b/src/me/smartstore/menu/group/ViewParameterMenu.java index e548e9c0..e191e883 100644 --- a/src/me/smartstore/menu/group/ViewParameterMenu.java +++ b/src/me/smartstore/menu/group/ViewParameterMenu.java @@ -2,7 +2,7 @@ import me.smartstore.group.Group; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.GroupMenu; +import me.smartstore.menu.topic.GroupIntroMenu; public class ViewParameterMenu extends GroupParameterMenu { @@ -18,6 +18,6 @@ protected void setNextMenus() {} @Override protected Menu handleAndMoveToNextMenu(Group group) { print(group); - return GroupMenu.getInstance(); + return GroupIntroMenu.getInstance(); } } diff --git a/src/me/smartstore/menu/classification/SummaryByNameMenu.java b/src/me/smartstore/menu/summary/SummaryByNameMenu.java similarity index 59% rename from src/me/smartstore/menu/classification/SummaryByNameMenu.java rename to src/me/smartstore/menu/summary/SummaryByNameMenu.java index 0965c1f3..66077c01 100644 --- a/src/me/smartstore/menu/classification/SummaryByNameMenu.java +++ b/src/me/smartstore/menu/summary/SummaryByNameMenu.java @@ -1,7 +1,7 @@ -package me.smartstore.menu.classification; +package me.smartstore.menu.summary; -import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.Order; +import me.smartstore.summary.Order; +import me.smartstore.summary.SummaryByName; public class SummaryByNameMenu extends SummaryMenu { @@ -11,11 +11,8 @@ private static class InstanceHolder { private SummaryByNameMenu() {} public static SummaryByNameMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - protected void setNextMenus() {} - @Override protected String getSummary(Order order) { - return CustomerRepository.getInstance().getSummaryByName(order); + return SummaryByName.getInstance().get(order); } } diff --git a/src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java b/src/me/smartstore/menu/summary/SummaryBySpentHoursMenu.java similarity index 60% rename from src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java rename to src/me/smartstore/menu/summary/SummaryBySpentHoursMenu.java index 717c32ee..0b5ca8de 100644 --- a/src/me/smartstore/menu/classification/SummaryBySpentHoursMenu.java +++ b/src/me/smartstore/menu/summary/SummaryBySpentHoursMenu.java @@ -1,7 +1,7 @@ -package me.smartstore.menu.classification; +package me.smartstore.menu.summary; -import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.Order; +import me.smartstore.summary.Order; +import me.smartstore.summary.SummaryBySpentHours; public class SummaryBySpentHoursMenu extends SummaryMenu { @@ -11,11 +11,8 @@ private static class InstanceHolder { private SummaryBySpentHoursMenu() {} public static SummaryBySpentHoursMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - protected void setNextMenus() {} - @Override protected String getSummary(Order order) { - return CustomerRepository.getInstance().getSummaryBySpentHours(order); + return SummaryBySpentHours.getInstance().get(order); } } diff --git a/src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java b/src/me/smartstore/menu/summary/SummaryByTotalPaidAmountMenu.java similarity index 61% rename from src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java rename to src/me/smartstore/menu/summary/SummaryByTotalPaidAmountMenu.java index e8e5251a..dc1ef70b 100644 --- a/src/me/smartstore/menu/classification/SummaryByTotalPaidAmountMenu.java +++ b/src/me/smartstore/menu/summary/SummaryByTotalPaidAmountMenu.java @@ -1,7 +1,7 @@ -package me.smartstore.menu.classification; +package me.smartstore.menu.summary; -import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.Order; +import me.smartstore.summary.Order; +import me.smartstore.summary.SummaryByTotalPaidAmount; public class SummaryByTotalPaidAmountMenu extends SummaryMenu { @@ -11,11 +11,8 @@ private static class InstanceHolder { private SummaryByTotalPaidAmountMenu() {} public static SummaryByTotalPaidAmountMenu getInstance() { return InstanceHolder.INSTANCE; } - @Override - protected void setNextMenus() {} - @Override protected String getSummary(Order order) { - return CustomerRepository.getInstance().getSummaryByTotalPaidAmount(order); + return SummaryByTotalPaidAmount.getInstance().get(order); } } diff --git a/src/me/smartstore/menu/classification/SummaryDefaultMenu.java b/src/me/smartstore/menu/summary/SummaryDefaultMenu.java similarity index 67% rename from src/me/smartstore/menu/classification/SummaryDefaultMenu.java rename to src/me/smartstore/menu/summary/SummaryDefaultMenu.java index 6c158bed..b5453789 100644 --- a/src/me/smartstore/menu/classification/SummaryDefaultMenu.java +++ b/src/me/smartstore/menu/summary/SummaryDefaultMenu.java @@ -1,9 +1,7 @@ -package me.smartstore.menu.classification; +package me.smartstore.menu.summary; -import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.Order; +import me.smartstore.summary.Summary; import me.smartstore.menu.Menu; -import me.smartstore.menu.topic.CustomerMenu; public class SummaryDefaultMenu extends Menu { @@ -15,7 +13,7 @@ private SummaryDefaultMenu() {} @Override public Menu printAndInputAndGetNextMenu() { - print(CustomerRepository.getInstance().getSummary()); + print(Summary.get()); return getPrevMenu(); } diff --git a/src/me/smartstore/menu/classification/SummaryMenu.java b/src/me/smartstore/menu/summary/SummaryMenu.java similarity index 83% rename from src/me/smartstore/menu/classification/SummaryMenu.java rename to src/me/smartstore/menu/summary/SummaryMenu.java index 325c6f9d..968decf1 100644 --- a/src/me/smartstore/menu/classification/SummaryMenu.java +++ b/src/me/smartstore/menu/summary/SummaryMenu.java @@ -1,13 +1,12 @@ -package me.smartstore.menu.classification; +package me.smartstore.menu.summary; -import me.smartstore.customer.Order; +import me.smartstore.summary.Order; import me.smartstore.menu.Menu; import me.smartstore.menu.exception.InputIsEndException; -import me.smartstore.menu.topic.ClassificationMenu; import java.util.InputMismatchException; -import static me.smartstore.customer.Order.getOrderByName; +import static me.smartstore.summary.Order.getOrderByName; public abstract class SummaryMenu extends Menu { private static final String ORDER_INPUT = diff --git a/src/me/smartstore/menu/topic/AddCustomerMenu.java b/src/me/smartstore/menu/topic/AddCustomerMenu.java index 35d6f38f..5d24a474 100644 --- a/src/me/smartstore/menu/topic/AddCustomerMenu.java +++ b/src/me/smartstore/menu/topic/AddCustomerMenu.java @@ -1,7 +1,7 @@ package me.smartstore.menu.topic; import me.smartstore.customer.CustomerRepository; -import me.smartstore.customer.MaxCapacityReachedException; +import me.smartstore.customer.exception.MaxCapacityReachedException; import me.smartstore.menu.Menu; import me.smartstore.menu.customer.*; @@ -32,12 +32,12 @@ public Menu printAndInputAndGetNextMenu() { CustomerRepository repository = CustomerRepository.getInstance(); setNextMenus(); try { - repository.checkIfCanAddMore(); + repository.checkIfReachedMaxCapacity(); } catch (MaxCapacityReachedException e) { print(e.getMessage()); return getBackMenu(); } - if (getPrevMenu() == CustomerMenu.getInstance()) + if (getPrevMenu() == CustomerIntroMenu.getInstance()) repository.resetTempCustomer(); return inputMenuAndMoveToNextMenu(); } @@ -50,7 +50,7 @@ protected void setNextMenus() { InputCustomerSpentHoursMenu.getInstance(), // spent hours InputCustomerTotalPaidAmountMenu.getInstance(), // total amount paid AddCustomerConfirmMenu.getInstance(), // confirm - CustomerMenu.getInstance() // cancel(back) => CustomerMenu + CustomerIntroMenu.getInstance() // cancel(back) => CustomerMenu }; for (int i = 0; i <= 3; ++i) nextMenus[i].setNextMenus(null, this); diff --git a/src/me/smartstore/menu/topic/CustomerMenu.java b/src/me/smartstore/menu/topic/CustomerIntroMenu.java similarity index 79% rename from src/me/smartstore/menu/topic/CustomerMenu.java rename to src/me/smartstore/menu/topic/CustomerIntroMenu.java index ae721c41..ba09ebb5 100644 --- a/src/me/smartstore/menu/topic/CustomerMenu.java +++ b/src/me/smartstore/menu/topic/CustomerIntroMenu.java @@ -4,7 +4,7 @@ import me.smartstore.menu.customer.UpdateCustomerMenu; import me.smartstore.menu.customer.ViewCustomerMenu; -public class CustomerMenu extends TopicIntroMenu { +public class CustomerIntroMenu extends TopicIntroMenu { private static final String CUSTOMER_MENU_OUTPUT = '\n' + @@ -16,11 +16,11 @@ public class CustomerMenu extends TopicIntroMenu { " 5. " + "Back" + '\n' + "==============================\n" + "Choose One: "; - private static final CustomerMenu INSTANCE = new CustomerMenu(); + private static final CustomerIntroMenu INSTANCE = new CustomerIntroMenu(); - private CustomerMenu() { super(CUSTOMER_MENU_OUTPUT); } + private CustomerIntroMenu() { super(CUSTOMER_MENU_OUTPUT); } - public static CustomerMenu getInstance() { return INSTANCE; } + public static CustomerIntroMenu getInstance() { return INSTANCE; } @Override protected void setNextMenus() { diff --git a/src/me/smartstore/menu/topic/GroupMenu.java b/src/me/smartstore/menu/topic/GroupIntroMenu.java similarity index 76% rename from src/me/smartstore/menu/topic/GroupMenu.java rename to src/me/smartstore/menu/topic/GroupIntroMenu.java index e6fd205f..4563e19a 100644 --- a/src/me/smartstore/menu/topic/GroupMenu.java +++ b/src/me/smartstore/menu/topic/GroupIntroMenu.java @@ -3,7 +3,7 @@ import me.smartstore.menu.group.UpdateParameterMenu; import me.smartstore.menu.group.ViewParameterMenu; -public class GroupMenu extends TopicIntroMenu { +public class GroupIntroMenu extends TopicIntroMenu { private static final String GROUP_MENU_OUTPUT = '\n' + @@ -13,11 +13,11 @@ public class GroupMenu extends TopicIntroMenu { "3. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; - private static final GroupMenu INSTANCE = new GroupMenu(); + private static final GroupIntroMenu INSTANCE = new GroupIntroMenu(); - private GroupMenu() { super(GROUP_MENU_OUTPUT); } + private GroupIntroMenu() { super(GROUP_MENU_OUTPUT); } - public static GroupMenu getInstance() { return INSTANCE; } + public static GroupIntroMenu getInstance() { return INSTANCE; } @Override protected void setNextMenus() { diff --git a/src/me/smartstore/menu/topic/StartMenu.java b/src/me/smartstore/menu/topic/StartMenu.java index ad1baf5d..9aff9d9f 100644 --- a/src/me/smartstore/menu/topic/StartMenu.java +++ b/src/me/smartstore/menu/topic/StartMenu.java @@ -23,9 +23,9 @@ public class StartMenu extends TopicIntroMenu { @Override protected void setNextMenus() { setNextMenus( - GroupMenu.getInstance(), // 1 - CustomerMenu.getInstance(), // 2 - ClassificationMenu.getInstance(), // 3 + GroupIntroMenu.getInstance(), // 1 + CustomerIntroMenu.getInstance(), // 2 + SummaryIntroMenu.getInstance(), // 3 QuitMenu.getInstance() // 4 ); } diff --git a/src/me/smartstore/menu/topic/ClassificationMenu.java b/src/me/smartstore/menu/topic/SummaryIntroMenu.java similarity index 71% rename from src/me/smartstore/menu/topic/ClassificationMenu.java rename to src/me/smartstore/menu/topic/SummaryIntroMenu.java index 39e5458a..1d6d0e32 100644 --- a/src/me/smartstore/menu/topic/ClassificationMenu.java +++ b/src/me/smartstore/menu/topic/SummaryIntroMenu.java @@ -1,12 +1,12 @@ package me.smartstore.menu.topic; -import me.smartstore.menu.classification.*; +import me.smartstore.menu.summary.*; -public class ClassificationMenu extends TopicIntroMenu { +public class SummaryIntroMenu extends TopicIntroMenu { private static final String SUMMARY_MENU_OUTPUT = '\n' + - "===== Classification Menu ====" + '\n' + + "========= Summary Menu =======" + '\n' + " 1. " + "Summary " + '\n' + " 2. " + "Summary " + "(Sorted By " + "Name" + ")\n" + " 3. " + "Summary " + "(Sorted By " + "Spent Hours" + ")\n" + @@ -14,11 +14,11 @@ public class ClassificationMenu extends TopicIntroMenu { " 5. " + "Back" + '\n' + "==============================" + '\n' + "Choose One: "; - private static final ClassificationMenu INSTANCE = new ClassificationMenu(); + private static final SummaryIntroMenu INSTANCE = new SummaryIntroMenu(); - private ClassificationMenu() { super(SUMMARY_MENU_OUTPUT); } + private SummaryIntroMenu() { super(SUMMARY_MENU_OUTPUT); } - public static ClassificationMenu getInstance() { return INSTANCE; } + public static SummaryIntroMenu getInstance() { return INSTANCE; } @Override protected void setNextMenus() { diff --git a/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java b/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java index 4b473887..a03e8aea 100644 --- a/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java +++ b/src/me/smartstore/menu/topic/UpdateCustomerSelectPropertyMenu.java @@ -31,7 +31,7 @@ protected void setNextMenus() { InputCustomerSpentHoursMenu.getInstance(), // spent hours InputCustomerTotalPaidAmountMenu.getInstance(), // total paid amount UpdateCustomerConfirmMenu.getInstance(), // confirm - CustomerMenu.getInstance() // cancel(back) => CustomerMenu + CustomerIntroMenu.getInstance() // cancel(back) => CustomerMenu }; for (int i = 0; i <= 2; ++i) nextMenus[i].setNextMenus(null, this); diff --git a/src/me/smartstore/summary/Order.java b/src/me/smartstore/summary/Order.java new file mode 100644 index 00000000..1fee07d1 --- /dev/null +++ b/src/me/smartstore/summary/Order.java @@ -0,0 +1,34 @@ +package me.smartstore.summary; + +import me.smartstore.customer.Customer; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.InputMismatchException; + +public enum Order { + + ASCENDING("A"), DESCENDING("D"); + + private final String shortcut; + + Order(String shortcut) { this.shortcut = shortcut; } + + public static final Comparator ORDER_BY_NAME_ASC = Comparator.comparing(Customer::getName); + public static final Comparator ORDER_BY_NAME_DEC = ORDER_BY_NAME_ASC.reversed(); + public static final Comparator ORDER_BY_SPENT_HOURS_ASC = Comparator.comparing(Customer::getSpentHours); + public static final Comparator ORDER_BY_SPENT_HOURS_DEC = ORDER_BY_SPENT_HOURS_ASC.reversed(); + public static final Comparator ORDER_BY_TOTAL_PAID_AMOUNT_ASC = Comparator.comparing(Customer::getTotalPaidAmount); + public static final Comparator ORDER_BY_TOTAL_PAID_AMOUNT_DEC = ORDER_BY_TOTAL_PAID_AMOUNT_ASC.reversed(); + + public static Order getOrderByName(String name) throws InputMismatchException { + return Arrays.stream(values()) + .filter(order -> order.isName(name)) + .findFirst() + .orElseThrow(() -> new InputMismatchException("Invalid Order name for input. Please try again.\n")); + } + + private boolean isName(String name) { + return shortcut.equalsIgnoreCase(name) || name().equalsIgnoreCase(name); + } +} diff --git a/src/me/smartstore/summary/SortedSummaryTemplate.java b/src/me/smartstore/summary/SortedSummaryTemplate.java new file mode 100644 index 00000000..6554f169 --- /dev/null +++ b/src/me/smartstore/summary/SortedSummaryTemplate.java @@ -0,0 +1,17 @@ +package me.smartstore.summary; + +import me.smartstore.customer.Customer; + +import java.util.Comparator; + +public abstract class SortedSummaryTemplate extends Summary { + + @Override + public String get(Order order) { + Comparator cmp = getComparator(order); + repository.sort(cmp); + return getSummary(); + } + + protected abstract Comparator getComparator(Order order); +} diff --git a/src/me/smartstore/summary/Summary.java b/src/me/smartstore/summary/Summary.java new file mode 100644 index 00000000..352ed1f4 --- /dev/null +++ b/src/me/smartstore/summary/Summary.java @@ -0,0 +1,47 @@ +package me.smartstore.summary; + +import me.smartstore.customer.Customer; +import me.smartstore.customer.CustomerRepository; +import me.smartstore.group.Group; + +public abstract class Summary { + + protected static CustomerRepository repository = CustomerRepository.getInstance(); + + public static String get() { return getSummary(); } + + public abstract String get(Order order); + + protected static String getSummary() { + Group[] groups = Group.values(); + int len = groups.length; + StringBuilder[] stringBuilders = new StringBuilder[len]; + for (int i = 0; i < len; ++i) { + StringBuilder sb = new StringBuilder(); + sb.append('\n').append("==============================") + .append(groups[i]) + .append("==============================").append('\n'); + stringBuilders[i] = sb; + } + + int[] cnt = new int[len]; + for (Customer customer : repository) { + Group group = customer.getGroup(); + for (int i = 0; i < len; ++i) { + if (group == groups[i]) { + stringBuilders[i].append(customer).append('\n'); + cnt[i]++; + break; + } + } + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < len; ++i) { + sb.append(stringBuilders[i]); + if (cnt[i] == 0) + sb.append("No Customers.").append('\n'); + } + return sb.append('\n').toString(); + } +} diff --git a/src/me/smartstore/summary/SummaryByName.java b/src/me/smartstore/summary/SummaryByName.java new file mode 100644 index 00000000..541ad56e --- /dev/null +++ b/src/me/smartstore/summary/SummaryByName.java @@ -0,0 +1,19 @@ +package me.smartstore.summary; + +import me.smartstore.customer.Customer; + +import java.util.Comparator; + +public class SummaryByName extends SortedSummaryTemplate { + + private static class InstanceHolder { + private static final SummaryByName INSTANCE = new SummaryByName(); + } + public static SummaryByName getInstance() { return InstanceHolder.INSTANCE; } + private SummaryByName() {} + + protected Comparator getComparator(Order order) { + return (order == Order.ASCENDING) ? Order.ORDER_BY_NAME_ASC + : Order.ORDER_BY_NAME_DEC; + } +} diff --git a/src/me/smartstore/summary/SummaryBySpentHours.java b/src/me/smartstore/summary/SummaryBySpentHours.java new file mode 100644 index 00000000..9c8d4339 --- /dev/null +++ b/src/me/smartstore/summary/SummaryBySpentHours.java @@ -0,0 +1,19 @@ +package me.smartstore.summary; + +import me.smartstore.customer.Customer; + +import java.util.Comparator; + +public class SummaryBySpentHours extends SortedSummaryTemplate { + + private static class InstanceHolder { + private static final SummaryBySpentHours INSTANCE = new SummaryBySpentHours(); + } + public static SummaryBySpentHours getInstance() { return InstanceHolder.INSTANCE; } + private SummaryBySpentHours() {} + + protected Comparator getComparator(Order order) { + return (order == Order.ASCENDING) ? Order.ORDER_BY_SPENT_HOURS_ASC + : Order.ORDER_BY_SPENT_HOURS_DEC; + } +} diff --git a/src/me/smartstore/summary/SummaryByTotalPaidAmount.java b/src/me/smartstore/summary/SummaryByTotalPaidAmount.java new file mode 100644 index 00000000..d0f8b0d6 --- /dev/null +++ b/src/me/smartstore/summary/SummaryByTotalPaidAmount.java @@ -0,0 +1,19 @@ +package me.smartstore.summary; + +import me.smartstore.customer.Customer; + +import java.util.Comparator; + +public class SummaryByTotalPaidAmount extends SortedSummaryTemplate { + + private static class InstanceHolder { + private static final SummaryByTotalPaidAmount INSTANCE = new SummaryByTotalPaidAmount(); + } + public static SummaryByTotalPaidAmount getInstance() { return InstanceHolder.INSTANCE; } + private SummaryByTotalPaidAmount() {} + + protected Comparator getComparator(Order order) { + return (order == Order.ASCENDING) ? Order.ORDER_BY_TOTAL_PAID_AMOUNT_ASC + : Order.ORDER_BY_TOTAL_PAID_AMOUNT_DEC; + } +}