diff --git a/README.md b/README.md index 450e7753a..7445305b1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,62 @@ # 지하철 노선도 미션 - 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다. +## 구현할 기능 목록 +* 데이터 초기 값 설정 기능 + * 지하철 역 초기값 설정 기능 + * 노선 초기값 설정 기능 +* 메인 메뉴를 출력한다. +* 원하는 메인 메뉴를 입력 받는다. + * 선택할 수 없는 메뉴인지 검증한다. +* 지하철 역 메뉴를 출력한다. +* 지하철 역 메뉴를 입력 받는다. + * 선택할 수 없는 메뉴인지 검증한다. +* 지하철 역을 등록한다. + * 지하철 역 이름이 중복 되는지 검증한다. + * 지하철 역 이름이 2글자 이상인지 검증한다. +* 지하철 역을 삭제한다. + * 등록된 지하철 역인지 확인한다. +* 지하철 역 목록을 출력한다. +* 노선 메뉴를 출력한다. +* 원하는 노션 메뉴를 입력 받는다. + * 선택할 수 없는 메뉴인지 검증한다. +* 지하철 노선을 등록한다. + * 노선 이름이 중복 되는지 검증한다. + * 노선 이름이 2글자 이상인지 검증한다. +* 노선 종점역을 초기화 한다. + * 노선 상행 종점역을 등록한다. + * 노선 하행 종점역을 등록한다. + * 하행과 상행 종점에 등록된 역이 있는지 검증한다. + * 노선 하행과 상행 종점이 같은지 검증한다. +* 노선의 목록을 출력한다. +* 노선에 역을 추가한다. + * 같은 노선에 중복 된 역이 등록 되는지 검증한다. + * 노선의 상행 종점역 보다 앞에 역 등록을 하는지 검증한다. + * 노선의 하행 종점역 보다 뒤에 역 등록을 하는지 검증한다. +* 노선을 제거한다. + * 등록 된 노선인지 확인한다. +* 노선에 등록 된 역을 제거한다. + * 노선에서 제거 된 역이 종점인지 검증한다. +* 구간 메뉴를 출력한다. +* 원하는 메인 메뉴를 입력 받는다. + * 선택할 수 없는 메뉴인지 검증한다. + +## 미구현 기능 목록 +* 구간을 등록한다. + * 노선에 등록 된 지하철 역 보다 큰 숫자인지 검증 + * 음수 입력 검증 +* 구간을 삭제한다. + * 노선에 포함 된 역이 2개 이하인지 검증한다. + * 노선에 등록 된 역의 범위를 확인한다. +* 노선에 등록된 지하철인지 검증한다. ( 노선에 등록 된 역은 삭제 불가) +* 종점이 제거 될 경우 마지막 노선이 종점이 된다. +* 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 출력한다. +
## 🚀 기능 요구사항 +
+더보기 ### 초기 설정 - 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅할 수 있다. @@ -397,6 +450,7 @@ B. 돌아가기 ### 프로그래밍 요구사항 - Application - Application 클래스를 활용해 구현해야 한다. - Application의 패키지 구조는 변경하지 않는다. +- 주석을 참고하여 구현할 수 있으며 주석대로 구현하지 않아도 되고 삭제해도 무관하다. ```java public class Application { public static void main(String[] args) { @@ -453,6 +507,8 @@ public class StationRepository { } ``` +
+
## 📈 진행 요구사항 diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..47c9184e7 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -6,5 +6,7 @@ public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); // TODO: 프로그램 구현 + SubwayMap subway = new SubwayMap(); + subway.run(scanner); } } diff --git a/src/main/java/subway/SubwayMap.java b/src/main/java/subway/SubwayMap.java new file mode 100644 index 000000000..a8fa2c849 --- /dev/null +++ b/src/main/java/subway/SubwayMap.java @@ -0,0 +1,36 @@ +package subway; + +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.manager.MainManager; +import subway.utils.InitLine; +import subway.utils.InitStation; +import subway.view.Input; +import java.util.Arrays; +import java.util.Scanner; + +public class SubwayMap { + + public void run(Scanner scanner) { + init(scanner); + MainManager.run(); + } + + private void init(Scanner scanner) { + Input.init(scanner); + initStations(); + initLines(); + } + + private void initStations() { + Arrays.stream(InitStation.values()) + .forEach(station -> StationRepository.addStation(new Station(station.name()))); + } + + private void initLines() { + Arrays.stream(InitLine.values()) + .forEach(line -> LineRepository.addLine(new Line(line.getName()))); + } +} diff --git a/src/main/java/subway/controller/LineController.java b/src/main/java/subway/controller/LineController.java new file mode 100644 index 000000000..a5ae052c3 --- /dev/null +++ b/src/main/java/subway/controller/LineController.java @@ -0,0 +1,43 @@ +package subway.controller; + +import subway.domain.Line; +import subway.service.LineService; +import subway.view.Input; +import subway.view.Output; + +public class LineController { + + private LineController() { + } + + public void save() { + try { + LineService.save(new Line(Input.input(Input.PLEASE_INPUT_LINE_NAME))); + } catch (IllegalArgumentException e) { + Output.printNewLine(); + System.out.println(e.getMessage()); + } + } + + public void remove() { + try { + LineService.remove(Input.input(Input.PLEASE_INPUT_REMOVE_LINE_NAME)); + } catch (IllegalArgumentException e) { + Output.printNewLine(); + System.out.println(e.getMessage()); + } + } + + public void getList() { + Output.print(Output.LINE_LIST); + Output.printByList(LineService.getAllLines()); + } + + public static LineController getInstance() { + return LineController.LazyHolder.INSTANCE; + } + + private static class LazyHolder { + private static final LineController INSTANCE = new LineController(); + } +} diff --git a/src/main/java/subway/controller/SectionController.java b/src/main/java/subway/controller/SectionController.java new file mode 100644 index 000000000..121fe4143 --- /dev/null +++ b/src/main/java/subway/controller/SectionController.java @@ -0,0 +1,21 @@ +package subway.controller; + +public class SectionController { + + private SectionController () { + } + + public void save() { + } + + public void remove() { + } + + public static SectionController getInstance() { + return SectionController.LazyHolder.INSTANCE; + } + + private static class LazyHolder { + private static final SectionController INSTANCE = new SectionController(); + } +} diff --git a/src/main/java/subway/controller/StationController.java b/src/main/java/subway/controller/StationController.java new file mode 100644 index 000000000..60523fd74 --- /dev/null +++ b/src/main/java/subway/controller/StationController.java @@ -0,0 +1,44 @@ +package subway.controller; + +import subway.domain.Station; +import subway.service.StationService; +import subway.view.Input; +import subway.view.Output; + +public class StationController { + + private StationController() { + } + + public void save() { + try { + StationService.save(new Station(Input.input(Input.PLEASE_INPUT_STATION_NAME))); + } catch (IllegalArgumentException e) { + Output.printNewLine(); + System.out.println(e.getMessage()); + } + } + + public void remove() { + try { + Output.printNewLine(); + StationService.remove(Input.input(Input.PLEASE_INPUT_REMOVE_STATION_NAME)); + } catch (IllegalArgumentException e) { + Output.printNewLine(); + System.out.println(e.getMessage()); + } + } + + public void getList() { + Output.print(Output.STATION_LIST); + Output.printByList(StationService.getAllStations()); + } + + public static StationController getInstance() { + return LazyHolder.INSTANCE; + } + + private static class LazyHolder { + private static final StationController INSTANCE = new StationController(); + } +} diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..e3b19daec 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,7 +1,13 @@ package subway.domain; +import subway.exception.TerminalNamesOverlapException; +import subway.service.StationService; +import subway.view.Input; + public class Line { private String name; + private Station upwardTerminalStation; + private Station downTerminalStation; public Line(String name) { this.name = name; @@ -12,4 +18,23 @@ public String getName() { } // 추가 기능 구현 + public void initTerminalStations() { + Station upwardTerminalStation = StationService.isExists( + Input.input(Input.PLEASE_INPUT_UPWARD_TERMINAL_STATION_NAME)); + + Station downTerminalStation = StationService.isExists( + Input.input(Input.PLEASE_INPUT_DOWN_TERMINAL_STATION_NAME)); + + if (upwardTerminalStation.equals(downTerminalStation)) { + throw new TerminalNamesOverlapException(); + } + + this.upwardTerminalStation = upwardTerminalStation; + this.downTerminalStation = downTerminalStation; + } + + @Override + public String toString() { + return name; + } } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 49132ddb6..6eedfee98 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; public class LineRepository { private static final List lines = new ArrayList<>(); @@ -19,4 +20,10 @@ public static void addLine(Line line) { public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } + + public static Optional findByName(String name) { + return lines().stream() + .filter(line -> line.getName().equals(name)) + .findFirst(); + } } diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..bc2dac960 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -12,4 +12,24 @@ public String getName() { } // 추가 기능 구현 + + @Override + public String toString() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Station station = (Station) o; + + return name != null ? name.equals(station.name) : station.name == null; + } + + @Override + public int hashCode() { + return name != null ? name.hashCode() : 0; + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index b7245c0f3..678875394 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; public class StationRepository { private static final List stations = new ArrayList<>(); @@ -19,4 +20,10 @@ public static void addStation(Station station) { public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } + + public static Optional findByName(String name) { + return stations().stream() + .filter(station -> station.getName().equals(name)) + .findFirst(); + } } diff --git a/src/main/java/subway/exception/LineNameDuplicateException.java b/src/main/java/subway/exception/LineNameDuplicateException.java new file mode 100644 index 000000000..9ba3ec58e --- /dev/null +++ b/src/main/java/subway/exception/LineNameDuplicateException.java @@ -0,0 +1,9 @@ +package subway.exception; + +public class LineNameDuplicateException extends IllegalArgumentException { + private static final String message = "[ERROR] 이미 등록된 노선 이름입니다."; + + public LineNameDuplicateException() { + super(message); + } +} diff --git a/src/main/java/subway/exception/LineNameNotFoundException.java b/src/main/java/subway/exception/LineNameNotFoundException.java new file mode 100644 index 000000000..35a36eeba --- /dev/null +++ b/src/main/java/subway/exception/LineNameNotFoundException.java @@ -0,0 +1,9 @@ +package subway.exception; + +public class LineNameNotFoundException extends IllegalArgumentException { + private static final String message = "[ERROR] 등록 되어 있지 않은 노선입니다."; + + public LineNameNotFoundException() { + super(message); + } +} diff --git a/src/main/java/subway/exception/NameLengthException.java b/src/main/java/subway/exception/NameLengthException.java new file mode 100644 index 000000000..cfa94241f --- /dev/null +++ b/src/main/java/subway/exception/NameLengthException.java @@ -0,0 +1,9 @@ +package subway.exception; + +public class NameLengthException extends IllegalArgumentException { + private static final String message = "[ERROR] 이름은 2글자 이상입니다."; + + public NameLengthException() { + super(message); + } +} diff --git a/src/main/java/subway/exception/StationNameDuplicateException.java b/src/main/java/subway/exception/StationNameDuplicateException.java new file mode 100644 index 000000000..a6982389b --- /dev/null +++ b/src/main/java/subway/exception/StationNameDuplicateException.java @@ -0,0 +1,9 @@ +package subway.exception; + +public class StationNameDuplicateException extends IllegalArgumentException{ + private static final String message = "[ERROR] 이미 등록된 역 이름입니다."; + + public StationNameDuplicateException() { + super(message); + } +} diff --git a/src/main/java/subway/exception/StationNameNotFoundException.java b/src/main/java/subway/exception/StationNameNotFoundException.java new file mode 100644 index 000000000..ccd96ba06 --- /dev/null +++ b/src/main/java/subway/exception/StationNameNotFoundException.java @@ -0,0 +1,9 @@ +package subway.exception; + +public class StationNameNotFoundException extends IllegalArgumentException { + private static final String message = "[ERROR] 등록 되어 있지 않은 역입니다."; + + public StationNameNotFoundException() { + super(message); + } +} diff --git a/src/main/java/subway/exception/TerminalNamesOverlapException.java b/src/main/java/subway/exception/TerminalNamesOverlapException.java new file mode 100644 index 000000000..1556735d0 --- /dev/null +++ b/src/main/java/subway/exception/TerminalNamesOverlapException.java @@ -0,0 +1,9 @@ +package subway.exception; + +public class TerminalNamesOverlapException extends IllegalArgumentException { + private static final String message = "[ERROR] 하행 종점과 상행 종점이 같은 역입니다."; + + public TerminalNamesOverlapException() { + super(message); + } +} diff --git a/src/main/java/subway/manager/LineManager.java b/src/main/java/subway/manager/LineManager.java new file mode 100644 index 000000000..23cc62e0a --- /dev/null +++ b/src/main/java/subway/manager/LineManager.java @@ -0,0 +1,26 @@ +package subway.manager; + +import subway.controller.LineController; +import subway.manager.menu.LineMenu; +import subway.view.Input; +import subway.view.Output; + +public class LineManager { + + public static void run() { + do { + LineMenu.initMenuStatus(); + LineMenu.printMenu(); + chooseMenu().execute(LineController.getInstance()); + } while (LineMenu.isRestart()); + } + + private static LineMenu chooseMenu() { + try { + return LineMenu.getLineMenuType(Input.input(Input.CHOOSE_FUNCTION)); + } catch (IllegalArgumentException e) { + Output.print(e.getMessage()); + return chooseMenu(); + } + } +} diff --git a/src/main/java/subway/manager/MainManager.java b/src/main/java/subway/manager/MainManager.java new file mode 100644 index 000000000..5b16a3908 --- /dev/null +++ b/src/main/java/subway/manager/MainManager.java @@ -0,0 +1,27 @@ +package subway.manager; + +import subway.view.Input; +import subway.manager.menu.MainMenu; +import subway.view.Output; + +public class MainManager { + + private MainManager() { + } + + public static void run() { + do { + MainMenu.printMenu(); + chooseMenu().execute(); + } while (MainMenu.isExit()); + } + + private static MainMenu chooseMenu() { + try { + return MainMenu.getMainMenuType(Input.input(Input.CHOOSE_FUNCTION)); + } catch (IllegalArgumentException e) { + Output.print(e.getMessage()); + return chooseMenu(); + } + } +} diff --git a/src/main/java/subway/manager/SectionManager.java b/src/main/java/subway/manager/SectionManager.java new file mode 100644 index 000000000..4b59593f6 --- /dev/null +++ b/src/main/java/subway/manager/SectionManager.java @@ -0,0 +1,27 @@ +package subway.manager; + +import subway.controller.SectionController; +import subway.manager.menu.LineMenu; +import subway.manager.menu.SectionMenu; +import subway.view.Input; +import subway.view.Output; + +public class SectionManager { + + public static void run() { + do { + SectionMenu.initMenuStatus(); + SectionMenu.printMenu(); + chooseMenu().execute(SectionController.getInstance()); + } while (SectionMenu.isRestart()); + } + + private static SectionMenu chooseMenu() { + try { + return SectionMenu.getSectionMenuType(Input.input(Input.CHOOSE_FUNCTION)); + } catch (IllegalArgumentException e) { + Output.print(e.getMessage()); + return chooseMenu(); + } + } +} diff --git a/src/main/java/subway/manager/StationManager.java b/src/main/java/subway/manager/StationManager.java new file mode 100644 index 000000000..994789902 --- /dev/null +++ b/src/main/java/subway/manager/StationManager.java @@ -0,0 +1,26 @@ +package subway.manager; + +import subway.controller.StationController; +import subway.view.Input; +import subway.view.Output; +import subway.manager.menu.StationMenu; + +public class StationManager { + + public static void run() { + do { + StationMenu.initMenuStatus(); + StationMenu.printMenu(); + chooseMenu().execute(StationController.getInstance()); + } while (StationMenu.isRestart()); + } + + private static StationMenu chooseMenu() { + try { + return StationMenu.getStationMenuType(Input.input(Input.CHOOSE_FUNCTION)); + } catch (IllegalArgumentException e) { + Output.print(e.getMessage()); + return chooseMenu(); + } + } +} diff --git a/src/main/java/subway/manager/menu/LineMenu.java b/src/main/java/subway/manager/menu/LineMenu.java new file mode 100644 index 000000000..a537ac42c --- /dev/null +++ b/src/main/java/subway/manager/menu/LineMenu.java @@ -0,0 +1,60 @@ +package subway.manager.menu; + +import subway.controller.LineController; +import subway.view.Output; +import java.util.Arrays; +import java.util.function.Consumer; + +public enum LineMenu { + ADD("1", "1. 노선 등록", LineController::save), + REMOVE("2", "2. 노선 삭제", LineController::remove), + MANAGEMENT("3", "3. 노선 조회", LineController::getList), + BACK("B", "B. 돌아가기", (LineController) -> LineMenu.goBackMenu()); + + private static final String menu = "## 노선 관리 화면"; + private static boolean restart = true; + private String number; + private String name; + private Consumer nextAction; + + + LineMenu(String number, String name, Consumer nextAction) { + this.number = number; + this.name = name; + this.nextAction = nextAction; + } + + public static void printMenu() { + Output.print(menu); + Arrays.stream(LineMenu.values()) + .forEach(System.out::println); + } + + public static LineMenu getLineMenuType(String selectMenu) { + return Arrays.stream(LineMenu.values()) + .filter(lineMenu -> lineMenu.number.equals(selectMenu)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다.")); + } + + public void execute(LineController lineController) { + nextAction.accept(lineController); + } + + public static void initMenuStatus() { + restart = true; + } + + private static void goBackMenu() { + restart = false; + } + + public static boolean isRestart() { + return restart; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/subway/manager/menu/MainMenu.java b/src/main/java/subway/manager/menu/MainMenu.java new file mode 100644 index 000000000..5a80ad541 --- /dev/null +++ b/src/main/java/subway/manager/menu/MainMenu.java @@ -0,0 +1,58 @@ +package subway.manager.menu; + +import subway.manager.LineManager; +import subway.manager.RouteMapManager; +import subway.manager.SectionManager; +import subway.manager.StationManager; +import subway.view.Output; +import java.util.Arrays; + +public enum MainMenu { + STATION_MENU("1", "1. 역 관리", StationManager::run), + LINE_MENU("2", "2. 노선 관리", LineManager::run), + SECTION_MENU("3", "3. 구간 관리", SectionManager::run), + ROUTE_MAP_MENU("4", "4. 지하철 노선도 출력", RouteMapManager::run), + EXIT("Q", "Q. 종료", MainMenu::exitGame); + + private static final String menu = "## 메인 화면"; + private static boolean gameExit = true; + private String number; + private String name; + private Runnable nextAction; + + MainMenu(String number, String name, Runnable nextAction) { + this.number = number; + this.name = name; + this.nextAction = nextAction; + } + + public static void printMenu() { + Output.print(menu); + Arrays.stream(MainMenu.values()) + .forEach(System.out::println); + } + + public static MainMenu getMainMenuType(String selectMenu) { + return Arrays.stream(MainMenu.values()) + .filter(mainMenu -> mainMenu.number.equals(selectMenu)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다.")); + } + + private static void exitGame() { + gameExit = false; + } + + public void execute() { + nextAction.run(); + } + + public static boolean isExit() { + return gameExit; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/subway/manager/menu/SectionMenu.java b/src/main/java/subway/manager/menu/SectionMenu.java new file mode 100644 index 000000000..6361cac34 --- /dev/null +++ b/src/main/java/subway/manager/menu/SectionMenu.java @@ -0,0 +1,58 @@ +package subway.manager.menu; + +import subway.controller.SectionController; +import subway.view.Output; +import java.util.Arrays; +import java.util.function.Consumer; + +public enum SectionMenu { + ADD("1", "1. 구간 등록", SectionController::save), + REMOVE("2", "2. 구간 삭제", SectionController::remove), + BACK("B", "B. 돌아가기", (sectionController) -> SectionMenu.goBackMenu()); + + private static final String menu = "## 구간 관리 화면"; + private static boolean restart = true; + private String number; + private String name; + private Consumer nextAction; + + SectionMenu(String number, String name, Consumer nextAction) { + this.number = number; + this.name = name; + this.nextAction = nextAction; + } + + public static void printMenu() { + Output.print(menu); + Arrays.stream(SectionMenu.values()) + .forEach(System.out::println); + } + + public static SectionMenu getSectionMenuType(String selectMenu) { + return Arrays.stream(SectionMenu.values()) + .filter(SectionMenu -> SectionMenu.number.equals(selectMenu)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다.")); + } + + public void execute(SectionController sectionController) { + nextAction.accept(sectionController); + } + + public static void initMenuStatus() { + restart = true; + } + + private static void goBackMenu() { + restart = false; + } + + public static boolean isRestart() { + return restart; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/subway/manager/menu/StationMenu.java b/src/main/java/subway/manager/menu/StationMenu.java new file mode 100644 index 000000000..50b133f9a --- /dev/null +++ b/src/main/java/subway/manager/menu/StationMenu.java @@ -0,0 +1,59 @@ +package subway.manager.menu; + +import subway.controller.StationController; +import subway.view.Output; +import java.util.Arrays; +import java.util.function.Consumer; + +public enum StationMenu { + ADD("1", "1. 역 등록", StationController::save), + REMOVE("2", "2. 역 삭제", StationController::remove), + MANAGEMENT("3", "3. 역 조회", StationController::getList), + BACK("B", "B. 돌아가기", (StationController) -> goBackMenu()); + + private static final String menu = "## 역 관리 화면"; + private static boolean restart = true; + private String number; + private String name; + private Consumer nextAction; + + StationMenu(String number, String name, Consumer nextAction) { + this.number = number; + this.name = name; + this.nextAction = nextAction; + } + + public static void printMenu() { + Output.print(menu); + Arrays.stream(StationMenu.values()) + .forEach(System.out::println); + } + + public static StationMenu getStationMenuType(String selectMenu) { + return Arrays.stream(StationMenu.values()) + .filter(stationMenu -> stationMenu.number.equals(selectMenu)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 선택할 수 없는 기능입니다.")); + } + + public void execute(StationController stationController) { + nextAction.accept(stationController); + } + + public static void initMenuStatus() { + restart = true; + } + + private static void goBackMenu() { + restart = false; + } + + public static boolean isRestart() { + return restart; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/subway/service/LineService.java b/src/main/java/subway/service/LineService.java new file mode 100644 index 000000000..66fd79aaa --- /dev/null +++ b/src/main/java/subway/service/LineService.java @@ -0,0 +1,45 @@ +package subway.service; + +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.exception.LineNameDuplicateException; +import subway.exception.LineNameNotFoundException; +import subway.exception.NameLengthException; +import java.util.List; + +public class LineService { + private static final int MIN_NAME_LENGTH = 2; + + public static void save(Line line) { + validateNameLength(line.getName()); + validateDuplicateName(line.getName()); + line.initTerminalStations(); + LineRepository.addLine(line); + } + + public static void remove(String name) { + validateNameLength(name); + LineRepository.deleteLineByName(isExists(name).getName()); + } + + public static Line isExists(String name) { + return LineRepository.findByName(name) + .orElseThrow(LineNameNotFoundException::new); + } + + private static void validateNameLength(String name) { + if (name.length() < MIN_NAME_LENGTH) { + throw new NameLengthException(); + } + } + + private static void validateDuplicateName(String name) { + if (LineRepository.findByName(name).isPresent()) { + throw new LineNameDuplicateException(); + } + } + + public static List getAllLines() { + return LineRepository.lines(); + } +} diff --git a/src/main/java/subway/service/StationService.java b/src/main/java/subway/service/StationService.java new file mode 100644 index 000000000..aac66d08e --- /dev/null +++ b/src/main/java/subway/service/StationService.java @@ -0,0 +1,44 @@ +package subway.service; + +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.exception.NameLengthException; +import subway.exception.StationNameDuplicateException; +import subway.exception.StationNameNotFoundException; +import java.util.List; + +public class StationService { + private static final int MIN_NAME_LENGTH = 2; + + public static void save(Station station) { + validateNameLength(station.getName()); + validateDuplicateName(station.getName()); + StationRepository.addStation(station); + } + + public static void remove(String name) { + validateNameLength(name); + StationRepository.deleteStation(isExists(name).getName()); + } + + public static Station isExists(String name) { + return StationRepository.findByName(name) + .orElseThrow(StationNameNotFoundException::new); + } + + private static void validateNameLength(String name) { + if (name.length() < MIN_NAME_LENGTH) { + throw new NameLengthException(); + } + } + + private static void validateDuplicateName(String name) { + if (StationRepository.findByName(name).isPresent()) { + throw new StationNameDuplicateException(); + } + } + + public static List getAllStations() { + return StationRepository.stations(); + } +} diff --git a/src/main/java/subway/utils/InitLine.java b/src/main/java/subway/utils/InitLine.java new file mode 100644 index 000000000..e18734654 --- /dev/null +++ b/src/main/java/subway/utils/InitLine.java @@ -0,0 +1,15 @@ +package subway.utils; + +public enum InitLine { + LINE2("2호선"), LINE3("3호선"), SINBUNDANG("신분당선"); + + private String name; + + InitLine(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/subway/utils/InitStation.java b/src/main/java/subway/utils/InitStation.java new file mode 100644 index 000000000..b29e2a2d7 --- /dev/null +++ b/src/main/java/subway/utils/InitStation.java @@ -0,0 +1,5 @@ +package subway.utils; + +public enum InitStation { + 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역 +} diff --git a/src/main/java/subway/view/Input.java b/src/main/java/subway/view/Input.java new file mode 100644 index 000000000..f90f47ae3 --- /dev/null +++ b/src/main/java/subway/view/Input.java @@ -0,0 +1,30 @@ +package subway.view; + +import java.util.Scanner; + +public class Input { + private static Scanner scanner; + + public static final String CHOOSE_FUNCTION = "## 원하는 기능을 선택하세요."; + public static final String PLEASE_INPUT_STATION_NAME = "## 등록할 역 이름을 입력하세요."; + public static final String PLEASE_INPUT_REMOVE_STATION_NAME = "## 삭제할 역 이름을 입력하세요."; + public static final String PLEASE_INPUT_LINE_NAME = "## 등록할 노선 이름을 입력하세요."; + public static final String PLEASE_INPUT_UPWARD_TERMINAL_STATION_NAME = "## 등록할 노선의 상행 종점역 이름을 입력하세요."; + public static final String PLEASE_INPUT_DOWN_TERMINAL_STATION_NAME = "## 등록할 노선의 하행 종점역 이름을 입력하세요."; + public static final String PLEASE_INPUT_REMOVE_LINE_NAME = "## 삭제할 노션 이름을 입력하세요."; + + private Input() { + } + + public static void init(Scanner scanner) { + if (Input.scanner == null) { + Input.scanner = scanner; + } + } + + public static String input(String message) { + Output.printNewLine(); + System.out.println(message); + return Input.scanner.nextLine(); + } +} diff --git a/src/main/java/subway/view/Output.java b/src/main/java/subway/view/Output.java new file mode 100644 index 000000000..dedec4908 --- /dev/null +++ b/src/main/java/subway/view/Output.java @@ -0,0 +1,26 @@ +package subway.view; + +import java.util.List; + +public class Output { + + private static final String INFO_MESSAGE = "[INFO] %s\n"; + public static final String STATION_LIST = "## 역 목록"; + public static final String LINE_LIST = "## 역 노선"; + + private Output() { + } + + public static void print(String message) { + printNewLine(); + System.out.println(message); + } + + public static void printByList(List list) { + list.forEach(obj -> System.out.printf(INFO_MESSAGE, obj)); + } + + public static void printNewLine() { + System.out.println(); + } +}