Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
589 changes: 122 additions & 467 deletions README.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,9 @@ dependencies {
test {
useJUnitPlatform()
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
15 changes: 13 additions & 2 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package subway;

import java.util.Scanner;
import subway.command.line.LineMenuCommandRegistry;
import subway.command.main.MainMenuCommandRegistry;
import subway.command.section.SectionMenuCommandRegistry;
import subway.command.station.StationMenuCommandRegistry;
import subway.controller.SubwayController;
import subway.service.SubwayService;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
SubwayService service = new SubwayService();
StationMenuCommandRegistry stationRegistry = StationMenuCommandRegistry.from(service);
LineMenuCommandRegistry lineRegistry = LineMenuCommandRegistry.from(service);
SectionMenuCommandRegistry sectionRegistry = SectionMenuCommandRegistry.from(service);
MainMenuCommandRegistry mainRegistry = MainMenuCommandRegistry.from(service, stationRegistry, lineRegistry, sectionRegistry);
SubwayController controller = new SubwayController(mainRegistry, service);
controller.run();
}
}
5 changes: 5 additions & 0 deletions src/main/java/subway/command/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package subway.command;

public interface Command {
void execute();
}
29 changes: 29 additions & 0 deletions src/main/java/subway/command/line/LineMenuCommandRegistry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package subway.command.line;

import java.util.EnumMap;
import subway.command.Command;
import subway.command.line.impl.LineDeleteCommand;
import subway.command.line.impl.LineQueryCommand;
import subway.command.line.impl.LineRegistrationCommand;
import subway.service.SubwayService;

public class LineMenuCommandRegistry {

private final EnumMap<LineMenuOption, Command> commands;

private LineMenuCommandRegistry(EnumMap<LineMenuOption, Command> commands) {
this.commands = commands;
}

public static LineMenuCommandRegistry from(SubwayService service) {
EnumMap<LineMenuOption, Command> map = new EnumMap<>(LineMenuOption.class);
map.put(LineMenuOption.A, new LineRegistrationCommand(service));
map.put(LineMenuOption.B, new LineDeleteCommand(service));
map.put(LineMenuOption.C, new LineQueryCommand(service));
return new LineMenuCommandRegistry(map);
}

public void execute(LineMenuOption option) {
commands.get(option).execute();
}
}
25 changes: 25 additions & 0 deletions src/main/java/subway/command/line/LineMenuOption.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package subway.command.line;

import java.util.Arrays;
import subway.constant.ErrorMessage;

public enum LineMenuOption {
A("1"),
B("2"),
C("3"),
BACK("B");

private final String code;

LineMenuOption(String code) {
this.code = code;
}

public static LineMenuOption from(String command) {
String normalized = command.trim();
return Arrays.stream(values())
.filter(opt -> opt.code.equals(normalized))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_OPTION.getErrorMessage()));
}
}
29 changes: 29 additions & 0 deletions src/main/java/subway/command/line/impl/LineDeleteCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package subway.command.line.impl;

import subway.command.Command;
import subway.constant.Constant;
import subway.service.SubwayService;
import subway.util.InputParser;
import subway.util.Retry;
import subway.view.InputView;
import subway.view.OutputView;

public class LineDeleteCommand implements Command {

private final SubwayService service;

public LineDeleteCommand(SubwayService service) {
this.service = service;
}

@Override
public void execute() {
Retry.retryUntilSuccess(() -> {
String readLine = InputView.readLineForDelete();
String lineName = InputParser.parseLine(readLine);
service.deleteLine(lineName);
});

OutputView.printDelete(Constant.LINE.getMessage());
}
}
22 changes: 22 additions & 0 deletions src/main/java/subway/command/line/impl/LineQueryCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package subway.command.line.impl;

import java.util.List;
import subway.command.Command;
import subway.service.SubwayService;
import subway.view.OutputView;

public class LineQueryCommand implements Command {

private final SubwayService service;

public LineQueryCommand(SubwayService service) {
this.service = service;
}

@Override
public void execute() {
List<String> lines = service.getLines();

OutputView.printLines(lines);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package subway.command.line.impl;

import subway.command.Command;
import subway.constant.Constant;
import subway.domain.Line;
import subway.service.SubwayService;
import subway.util.InputParser;
import subway.util.Retry;
import subway.view.InputView;
import subway.view.OutputView;

public class LineRegistrationCommand implements Command {

private final SubwayService service;

public LineRegistrationCommand(SubwayService service) {
this.service = service;
}

@Override
public void execute() {
Line line = getLine();

registerFirstStationName(line);
registerLastStationName(line);

OutputView.printRegistration(Constant.LINE.getMessage());
}

private Line getLine() {
return Retry.retryUntilSuccess(() -> {
String readLine = InputView.readLineForRegistration();
String lineName = InputParser.parseLine(readLine);
return service.registerLine(lineName);
});
}

private void registerFirstStationName(Line line) {
Retry.retryUntilSuccess(() -> {
String readStation = InputView.readFirstStationForRegistration();
String firstStationName = InputParser.parseStation(readStation);
service.registerLineWithStation(line, firstStationName);
});
}

private void registerLastStationName(Line line) {
Retry.retryUntilSuccess(() -> {
String readStation = InputView.readLastStationForRegistration();
String lastStationName = InputParser.parseStation(readStation);
service.registerLineWithStation(line, lastStationName);
});
}
}
36 changes: 36 additions & 0 deletions src/main/java/subway/command/main/MainMenuCommandRegistry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package subway.command.main;

import java.util.EnumMap;
import subway.command.Command;
import subway.command.line.LineMenuCommandRegistry;
import subway.command.main.impl.LineCommand;
import subway.command.main.impl.RouteCommand;
import subway.command.main.impl.SectionCommand;
import subway.command.main.impl.StationCommand;
import subway.command.section.SectionMenuCommandRegistry;
import subway.command.station.StationMenuCommandRegistry;
import subway.service.SubwayService;

public class MainMenuCommandRegistry {

private final EnumMap<MainMenuOption, Command> commands;

private MainMenuCommandRegistry(EnumMap<MainMenuOption, Command> commands) {
this.commands = commands;
}

public static MainMenuCommandRegistry from(SubwayService service, StationMenuCommandRegistry stationRegistry,
LineMenuCommandRegistry lineRegistry,
SectionMenuCommandRegistry sectionRegistry) {
EnumMap<MainMenuOption, Command> map = new EnumMap<>(MainMenuOption.class);
map.put(MainMenuOption.A, new StationCommand(stationRegistry));
map.put(MainMenuOption.B, new LineCommand(lineRegistry));
map.put(MainMenuOption.C, new SectionCommand(sectionRegistry));
map.put(MainMenuOption.D, new RouteCommand(service));
return new MainMenuCommandRegistry(map);
}

public void execute(MainMenuOption option) {
commands.get(option).execute();
}
}
26 changes: 26 additions & 0 deletions src/main/java/subway/command/main/MainMenuOption.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package subway.command.main;

import java.util.Arrays;
import subway.constant.ErrorMessage;

public enum MainMenuOption {
A("1"),
B("2"),
C("3"),
D("4"),
QUIT("Q");

private final String code;

MainMenuOption(String code) {
this.code = code;
}

public static MainMenuOption from(String command) {
String normalized = command.trim();
return Arrays.stream(values())
.filter(opt -> opt.code.equals(normalized))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_OPTION.getErrorMessage()));
}
}
34 changes: 34 additions & 0 deletions src/main/java/subway/command/main/impl/LineCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package subway.command.main.impl;

import subway.command.Command;
import subway.command.line.LineMenuCommandRegistry;
import subway.command.line.LineMenuOption;
import subway.util.Retry;
import subway.view.InputView;

public class LineCommand implements Command {

private final LineMenuCommandRegistry lineRegistry;

public LineCommand(LineMenuCommandRegistry lineRegistry) {
this.lineRegistry = lineRegistry;
}

@Override
public void execute() {
LineMenuOption option = getOption();

if (option.equals(LineMenuOption.BACK)) {
return;
}

lineRegistry.execute(option);
}

private static LineMenuOption getOption() {
return Retry.retryUntilSuccess(() -> {
String selection = InputView.readLineMenuSelection();
return LineMenuOption.from(selection);
});
}
}
23 changes: 23 additions & 0 deletions src/main/java/subway/command/main/impl/RouteCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package subway.command.main.impl;

import java.util.List;
import java.util.Map;
import subway.command.Command;
import subway.service.SubwayService;
import subway.view.OutputView;

public class RouteCommand implements Command {

private final SubwayService service;

public RouteCommand(SubwayService service) {
this.service = service;
}

@Override
public void execute() {
Map<String, List<String>> routes = service.getRoutes();

OutputView.printRoutes(routes);
}
}
34 changes: 34 additions & 0 deletions src/main/java/subway/command/main/impl/SectionCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package subway.command.main.impl;

import subway.command.Command;
import subway.command.section.SectionMenuCommandRegistry;
import subway.command.section.SectionMenuOption;
import subway.util.Retry;
import subway.view.InputView;

public class SectionCommand implements Command {

private final SectionMenuCommandRegistry sectionRegistry;

public SectionCommand(SectionMenuCommandRegistry sectionRegistry) {
this.sectionRegistry = sectionRegistry;
}

@Override
public void execute() {
SectionMenuOption option = getOption();

if (option.equals(SectionMenuOption.BACK)) {
return;
}

sectionRegistry.execute(option);
}

private static SectionMenuOption getOption() {
return Retry.retryUntilSuccess(() -> {
String selection = InputView.readSectionMenuSelection();
return SectionMenuOption.from(selection);
});
}
}
Loading