From 823effa775fb250d467d40c2983a566f1d3ca9bf Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 11:38:39 +0900 Subject: [PATCH 01/18] =?UTF-8?q?docs(readme):=20=EC=82=AC=EC=A0=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=84=EC=B2=98=EB=A6=AC=EC=99=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=ED=95=9C=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..1b52803eb --- /dev/null +++ b/docs/README.md @@ -0,0 +1,6 @@ +- 사전 제공 정보 +* [ ] 크루 목록이 담긴 파일을 읽어 리스트에 저장한다. +* [ ] 미션 목록을 리스트에 저장한다. +* [ ] 페어 정보를 관리하는 저장소를 설계한다. + +- \ No newline at end of file From a8c1848c6133bd06c9fb4a99db754590c5a7f8ed Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 12:03:39 +0900 Subject: [PATCH 02/18] =?UTF-8?q?feat(crew):=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=9D=B4=20=EB=8B=B4=EA=B8=B4=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=9D=84=20=EC=9D=BD=EC=96=B4=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/controller/Controller.java | 7 ++ .../ReadingCrewsFileController.java | 66 +++++++++++++++++++ src/main/java/model/Course.java | 14 ++++ src/main/java/model/Crew.java | 11 ++++ src/main/java/pairmatching/Application.java | 4 ++ src/main/java/repository/CrewRepository.java | 14 ++++ src/main/java/system/PairApplication.java | 26 ++++++++ .../convertion/NamesToCrewConverter.java | 17 +++++ src/test/java/system/PairApplicationTest.java | 5 ++ 10 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 src/main/java/controller/Controller.java create mode 100644 src/main/java/controller/ReadingCrewsFileController.java create mode 100644 src/main/java/model/Course.java create mode 100644 src/main/java/model/Crew.java create mode 100644 src/main/java/repository/CrewRepository.java create mode 100644 src/main/java/system/PairApplication.java create mode 100644 src/main/java/system/convertion/NamesToCrewConverter.java create mode 100644 src/test/java/system/PairApplicationTest.java diff --git a/docs/README.md b/docs/README.md index 1b52803eb..6bf94d00a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,5 @@ - 사전 제공 정보 -* [ ] 크루 목록이 담긴 파일을 읽어 리스트에 저장한다. +* [x] 크루 목록이 담긴 파일을 읽어 리스트에 저장한다. * [ ] 미션 목록을 리스트에 저장한다. * [ ] 페어 정보를 관리하는 저장소를 설계한다. diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java new file mode 100644 index 000000000..8f876be32 --- /dev/null +++ b/src/main/java/controller/Controller.java @@ -0,0 +1,7 @@ +package controller; + +import java.util.Map; + +public interface Controller { + void process(Map model); +} diff --git a/src/main/java/controller/ReadingCrewsFileController.java b/src/main/java/controller/ReadingCrewsFileController.java new file mode 100644 index 000000000..bee984c06 --- /dev/null +++ b/src/main/java/controller/ReadingCrewsFileController.java @@ -0,0 +1,66 @@ +package controller; + +import model.Course; +import model.Crew; +import repository.CrewRepository; +import system.convertion.NamesToCrewConverter; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ReadingCrewsFileController implements Controller { + + public static final String BACKEND_CREWS_FILE_DIRECTORY = "src/main/resources/backend-crew.md"; + public static final String FRONTEND_CREWS_FILE_DIRECTORY = "src/main/resources/frontend-crew.md"; + + private final CrewRepository crewRepository; + + public ReadingCrewsFileController(CrewRepository crewRepository) { + this.crewRepository = crewRepository; + } + + @Override + public void process(Map model) { + try { + List backEndCrews = NamesToCrewConverter.convert(readBackEndCrews(), Course.BACKEND); + crewRepository.saveAll(backEndCrews); + + List frontEndCrews = NamesToCrewConverter.convert(readFrontEndCrews(), Course.FRONTEND); + crewRepository.saveAll(frontEndCrews); + } catch (IOException e) { + throw new IllegalStateException("크루 파일 읽기에 문제가 발생했습니다."); + } + } + + private static List readBackEndCrews() throws IOException { + List crewNames = new ArrayList<>(); + readFile(crewNames, BACKEND_CREWS_FILE_DIRECTORY); + return crewNames; + } + + private static List readFrontEndCrews() throws IOException { + List crewNames = new ArrayList<>(); + readFile(crewNames, FRONTEND_CREWS_FILE_DIRECTORY); + return crewNames; + } + + private static void readFile(List crewNames, String fileDirectory) throws IOException { + File file = new File(fileDirectory); + FileReader fileReader = new FileReader(file); + BufferedReader bufferedReader = new BufferedReader(fileReader); + readLine(crewNames, bufferedReader); + bufferedReader.close(); + } + + private static void readLine(List crewNames, BufferedReader bufferedReader) throws IOException { + String line = ""; + while ((line = bufferedReader.readLine()) != null) { + crewNames.add(line); + } + } +} diff --git a/src/main/java/model/Course.java b/src/main/java/model/Course.java new file mode 100644 index 000000000..5edd63d6e --- /dev/null +++ b/src/main/java/model/Course.java @@ -0,0 +1,14 @@ +package model; + +public enum Course { + BACKEND("백엔드"), + FRONTEND("프론트엔드"); + + private final String name; + + Course(String name) { + this.name = name; + } + + // 추가 기능 구현 +} diff --git a/src/main/java/model/Crew.java b/src/main/java/model/Crew.java new file mode 100644 index 000000000..5a99c5f8c --- /dev/null +++ b/src/main/java/model/Crew.java @@ -0,0 +1,11 @@ +package model; + +public class Crew { + private final Course course; + private final String name; + + public Crew(Course course, String name) { + this.course = course; + this.name = name; + } +} diff --git a/src/main/java/pairmatching/Application.java b/src/main/java/pairmatching/Application.java index 6f56e741c..8877baebc 100644 --- a/src/main/java/pairmatching/Application.java +++ b/src/main/java/pairmatching/Application.java @@ -1,7 +1,11 @@ package pairmatching; +import system.PairApplication; + public class Application { public static void main(String[] args) { // TODO 구현 진행 + PairApplication pairApplication = new PairApplication(); + pairApplication.run(); } } diff --git a/src/main/java/repository/CrewRepository.java b/src/main/java/repository/CrewRepository.java new file mode 100644 index 000000000..ad07a7ac0 --- /dev/null +++ b/src/main/java/repository/CrewRepository.java @@ -0,0 +1,14 @@ +package repository; + +import model.Crew; + +import java.util.ArrayList; +import java.util.List; + +public class CrewRepository { + private final List crews = new ArrayList<>(); + + public void saveAll(List crews) { + this.crews.addAll(crews); + } +} diff --git a/src/main/java/system/PairApplication.java b/src/main/java/system/PairApplication.java new file mode 100644 index 000000000..53eaf70de --- /dev/null +++ b/src/main/java/system/PairApplication.java @@ -0,0 +1,26 @@ +package system; + +import controller.Controller; +import controller.ReadingCrewsFileController; +import repository.CrewRepository; + +import java.util.HashMap; +import java.util.Map; + +public class PairApplication { + public static final String READING_CREW_FILE_CONTROLLER_PATH = "readCrewFile"; + private final Map controllers = new HashMap<>(); + + public PairApplication() { + controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(new CrewRepository())); + } + + public void run() { + HashMap model = new HashMap<>(); + readFileAndSaveCrews(model); + } + + private void readFileAndSaveCrews(HashMap model) { + controllers.get(READING_CREW_FILE_CONTROLLER_PATH).process(model); + } +} diff --git a/src/main/java/system/convertion/NamesToCrewConverter.java b/src/main/java/system/convertion/NamesToCrewConverter.java new file mode 100644 index 000000000..36cf2378d --- /dev/null +++ b/src/main/java/system/convertion/NamesToCrewConverter.java @@ -0,0 +1,17 @@ +package system.convertion; + +import model.Course; +import model.Crew; + +import java.util.List; +import java.util.stream.Collectors; + +public class NamesToCrewConverter { + + public static List convert(List crewNames, Course course) { + // TODO: 변환 검증 필요하다 + return crewNames.stream() + .map(crewName -> new Crew(course, crewName)) + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/system/PairApplicationTest.java b/src/test/java/system/PairApplicationTest.java new file mode 100644 index 000000000..ccd207960 --- /dev/null +++ b/src/test/java/system/PairApplicationTest.java @@ -0,0 +1,5 @@ +package system; + +class PairApplicationTest { + +} \ No newline at end of file From 4784324f4fbcdf4fe4ced40846b99198f721953b Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 12:17:23 +0900 Subject: [PATCH 03/18] =?UTF-8?q?feat(mission):=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=9D=84=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../controller/SavingMissionsController.java | 39 +++++++++++++++++++ src/main/java/model/Level.java | 17 ++++++++ src/main/java/model/Mission.java | 11 ++++++ .../java/repository/MissionRepository.java | 18 +++++++++ src/main/java/system/PairApplication.java | 5 +++ 6 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/main/java/controller/SavingMissionsController.java create mode 100644 src/main/java/model/Level.java create mode 100644 src/main/java/model/Mission.java create mode 100644 src/main/java/repository/MissionRepository.java diff --git a/docs/README.md b/docs/README.md index 6bf94d00a..fede2944e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ - 사전 제공 정보 * [x] 크루 목록이 담긴 파일을 읽어 리스트에 저장한다. -* [ ] 미션 목록을 리스트에 저장한다. +* [x] 미션 목록을 리스트에 저장한다. * [ ] 페어 정보를 관리하는 저장소를 설계한다. - \ No newline at end of file diff --git a/src/main/java/controller/SavingMissionsController.java b/src/main/java/controller/SavingMissionsController.java new file mode 100644 index 000000000..2d15224e6 --- /dev/null +++ b/src/main/java/controller/SavingMissionsController.java @@ -0,0 +1,39 @@ +package controller; + +import model.Level; +import repository.MissionRepository; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class SavingMissionsController implements Controller { + private final MissionRepository missionRepository; + + public SavingMissionsController(MissionRepository missionRepository) { + this.missionRepository = missionRepository; + } + + @Override + public void process(Map model) { + saveMissions(getLevelOneMissionNames(), Level.LEVEL1); + saveMissions(getLevelTwoMissionNames(), Level.LEVEL2); + saveMissions(getLevelFiveMissionNames(), Level.LEVEL4); + } + + private static List getLevelFiveMissionNames() { + return Arrays.asList("성능개선", "배포"); + } + + private static List getLevelTwoMissionNames() { + return Arrays.asList("장바구니", "결제", "지하철노선도"); + } + + private static List getLevelOneMissionNames() { + return Arrays.asList("자동차경주", "로또", "숫자야구게임"); + } + + private void saveMissions(List missionNames, Level level) { + missionRepository.saveAllNamesWithLevel(missionNames, level); + } +} diff --git a/src/main/java/model/Level.java b/src/main/java/model/Level.java new file mode 100644 index 000000000..33c7847fe --- /dev/null +++ b/src/main/java/model/Level.java @@ -0,0 +1,17 @@ +package model; + +public enum Level { + LEVEL1("레벨1"), + LEVEL2("레벨2"), + LEVEL3("레벨3"), + LEVEL4("레벨4"), + LEVEL5("레벨5"); + + private final String name; + + Level(String name) { + this.name = name; + } + + // 추가 기능 구현 +} diff --git a/src/main/java/model/Mission.java b/src/main/java/model/Mission.java new file mode 100644 index 000000000..3a7f63654 --- /dev/null +++ b/src/main/java/model/Mission.java @@ -0,0 +1,11 @@ +package model; + +public class Mission { + private final Level level; + private final String name; + + public Mission(Level level, String name) { + this.level = level; + this.name = name; + } +} diff --git a/src/main/java/repository/MissionRepository.java b/src/main/java/repository/MissionRepository.java new file mode 100644 index 000000000..264a8623a --- /dev/null +++ b/src/main/java/repository/MissionRepository.java @@ -0,0 +1,18 @@ +package repository; + +import model.Level; +import model.Mission; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class MissionRepository { + private final List missions = new ArrayList<>(); + + public void saveAllNamesWithLevel(List missionNames, Level level) { + missions.addAll(missionNames.stream() + .map(missionName -> new Mission(level, missionName)) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/system/PairApplication.java b/src/main/java/system/PairApplication.java index 53eaf70de..64c171a9f 100644 --- a/src/main/java/system/PairApplication.java +++ b/src/main/java/system/PairApplication.java @@ -2,17 +2,21 @@ import controller.Controller; import controller.ReadingCrewsFileController; +import controller.SavingMissionsController; import repository.CrewRepository; +import repository.MissionRepository; import java.util.HashMap; import java.util.Map; public class PairApplication { public static final String READING_CREW_FILE_CONTROLLER_PATH = "readCrewFile"; + public static final String SAVE_MISSIONS_CONTROLLER_PATH = "saveMissions"; private final Map controllers = new HashMap<>(); public PairApplication() { controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(new CrewRepository())); + controllers.put(SAVE_MISSIONS_CONTROLLER_PATH, new SavingMissionsController(new MissionRepository())); } public void run() { @@ -22,5 +26,6 @@ public void run() { private void readFileAndSaveCrews(HashMap model) { controllers.get(READING_CREW_FILE_CONTROLLER_PATH).process(model); + controllers.get(SAVE_MISSIONS_CONTROLLER_PATH).process(model); } } From 52365e64f4da60632c6ffe136b2a459d8f5d2945 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 12:20:25 +0900 Subject: [PATCH 04/18] =?UTF-8?q?feat(pairmatch):=20=ED=8E=98=EC=96=B4=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/model/Pair.java | 11 +++++++++++ src/main/java/repository/PairMatchingRepository.java | 12 ++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main/java/model/Pair.java create mode 100644 src/main/java/repository/PairMatchingRepository.java diff --git a/docs/README.md b/docs/README.md index fede2944e..89e642235 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ - 사전 제공 정보 * [x] 크루 목록이 담긴 파일을 읽어 리스트에 저장한다. * [x] 미션 목록을 리스트에 저장한다. -* [ ] 페어 정보를 관리하는 저장소를 설계한다. +* [x] 페어 정보를 관리하는 저장소를 설계한다. - \ No newline at end of file diff --git a/src/main/java/model/Pair.java b/src/main/java/model/Pair.java new file mode 100644 index 000000000..72ba46f0c --- /dev/null +++ b/src/main/java/model/Pair.java @@ -0,0 +1,11 @@ +package model; + +import java.util.List; + +public class Pair { + private final List crews; + + public Pair(List crews) { + this.crews = crews; + } +} diff --git a/src/main/java/repository/PairMatchingRepository.java b/src/main/java/repository/PairMatchingRepository.java new file mode 100644 index 000000000..59c272db4 --- /dev/null +++ b/src/main/java/repository/PairMatchingRepository.java @@ -0,0 +1,12 @@ +package repository; + +import model.Mission; +import model.Pair; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PairMatchingRepository { + private final Map> matchedPairs = new HashMap<>(); +} From e09784d3a91e748c0c0a3b80ab0d3d3f126c1946 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 12:22:25 +0900 Subject: [PATCH 05/18] =?UTF-8?q?docs(readme):=20=EC=95=A0=ED=94=8C?= =?UTF-8?q?=EB=A6=AC=EC=BC=80=EC=9D=B4=EC=85=98=EA=B3=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=ED=95=9C=20=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 89e642235..be630d3d2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,4 +3,8 @@ * [x] 미션 목록을 리스트에 저장한다. * [x] 페어 정보를 관리하는 저장소를 설계한다. -- \ No newline at end of file +- 애플리케이션 +* [ ] 기능의 종류를 출력한다. +* [ ] 기능 중 하나의 입력을 받는다. +* [ ] 과정과 미션을 출력한다. +* [ ] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. \ No newline at end of file From 0a2beb825ac4cb651d99b0409feb26d5740c48a1 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 12:42:53 +0900 Subject: [PATCH 06/18] =?UTF-8?q?feature(featurecommand):=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=98=20=EC=A2=85=EB=A5=98=EB=A5=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EA=B3=A0,=20=EA=B7=B8=20=EC=A4=91=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EC=9D=98=20=EC=9E=85=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- .../SelectingFeatureController.java | 23 ++++++++++++++++++ .../GettingFeatureCommandInputView.java | 17 +++++++++++++ src/main/java/inputview/InputView.java | 5 ++++ src/main/java/outputview/OutputView.java | 8 +++++++ .../SelectingFeatureOutputView.java | 19 +++++++++++++++ src/main/java/system/PairApplication.java | 10 ++++++++ .../StringToFeatureCommandConverter.java | 18 ++++++++++++++ src/main/java/vo/FeatureCommand.java | 24 +++++++++++++++++++ 9 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 src/main/java/controller/SelectingFeatureController.java create mode 100644 src/main/java/inputview/GettingFeatureCommandInputView.java create mode 100644 src/main/java/inputview/InputView.java create mode 100644 src/main/java/outputview/OutputView.java create mode 100644 src/main/java/outputview/SelectingFeatureOutputView.java create mode 100644 src/main/java/system/convertion/StringToFeatureCommandConverter.java create mode 100644 src/main/java/vo/FeatureCommand.java diff --git a/docs/README.md b/docs/README.md index be630d3d2..a015854ed 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ * [x] 페어 정보를 관리하는 저장소를 설계한다. - 애플리케이션 -* [ ] 기능의 종류를 출력한다. -* [ ] 기능 중 하나의 입력을 받는다. +* [x] 기능의 종류를 출력한다. +* [x] 기능 중 하나의 입력을 받는다. * [ ] 과정과 미션을 출력한다. * [ ] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. \ No newline at end of file diff --git a/src/main/java/controller/SelectingFeatureController.java b/src/main/java/controller/SelectingFeatureController.java new file mode 100644 index 000000000..f78333d0d --- /dev/null +++ b/src/main/java/controller/SelectingFeatureController.java @@ -0,0 +1,23 @@ +package controller; + +import inputview.InputView; +import outputview.OutputView; +import vo.FeatureCommand; + +import java.util.Map; + +public class SelectingFeatureController implements Controller { + private final OutputView outputView; + private final InputView inputView; + + public SelectingFeatureController(OutputView outputView, InputView inputView) { + this.outputView = outputView; + this.inputView = inputView; + } + + @Override + public void process(Map model) { + outputView.print(model); + model.put("featureCommand", inputView.getInput()); + } +} diff --git a/src/main/java/inputview/GettingFeatureCommandInputView.java b/src/main/java/inputview/GettingFeatureCommandInputView.java new file mode 100644 index 000000000..3a793976a --- /dev/null +++ b/src/main/java/inputview/GettingFeatureCommandInputView.java @@ -0,0 +1,17 @@ +package inputview; + +import camp.nextstep.edu.missionutils.Console; +import system.convertion.StringToFeatureCommandConverter; +import vo.FeatureCommand; + +public class GettingFeatureCommandInputView implements InputView { + @Override + public FeatureCommand getInput() { + String input = readInput(); + return StringToFeatureCommandConverter.convert(input); + } + + protected static String readInput() { + return Console.readLine(); + } +} diff --git a/src/main/java/inputview/InputView.java b/src/main/java/inputview/InputView.java new file mode 100644 index 000000000..c56ee70d9 --- /dev/null +++ b/src/main/java/inputview/InputView.java @@ -0,0 +1,5 @@ +package inputview; +@FunctionalInterface +public interface InputView { + E getInput(); +} diff --git a/src/main/java/outputview/OutputView.java b/src/main/java/outputview/OutputView.java new file mode 100644 index 000000000..6dea1349a --- /dev/null +++ b/src/main/java/outputview/OutputView.java @@ -0,0 +1,8 @@ +package outputview; + +import java.util.Map; + +@FunctionalInterface +public interface OutputView { + void print(Map model); +} diff --git a/src/main/java/outputview/SelectingFeatureOutputView.java b/src/main/java/outputview/SelectingFeatureOutputView.java new file mode 100644 index 000000000..a028496c8 --- /dev/null +++ b/src/main/java/outputview/SelectingFeatureOutputView.java @@ -0,0 +1,19 @@ +package outputview; + +import vo.FeatureCommand; + +import java.util.Map; + +public class SelectingFeatureOutputView implements OutputView { + + public static final String SELECT_FEATURE_MESSAGE = "기능을 선택하세요."; + public static final String FEATURE_FORMAT = "%s. %s%n"; + + @Override + public void print(Map model) { + System.out.println(SELECT_FEATURE_MESSAGE); + for (FeatureCommand featureCommand : FeatureCommand.values()) { + System.out.printf(FEATURE_FORMAT, featureCommand.getCommand(), featureCommand.getDescription()); + } + } +} diff --git a/src/main/java/system/PairApplication.java b/src/main/java/system/PairApplication.java index 64c171a9f..dc6966ef5 100644 --- a/src/main/java/system/PairApplication.java +++ b/src/main/java/system/PairApplication.java @@ -3,6 +3,9 @@ import controller.Controller; import controller.ReadingCrewsFileController; import controller.SavingMissionsController; +import controller.SelectingFeatureController; +import inputview.GettingFeatureCommandInputView; +import outputview.SelectingFeatureOutputView; import repository.CrewRepository; import repository.MissionRepository; @@ -12,11 +15,17 @@ public class PairApplication { public static final String READING_CREW_FILE_CONTROLLER_PATH = "readCrewFile"; public static final String SAVE_MISSIONS_CONTROLLER_PATH = "saveMissions"; + public static final String SELECT_FEATURE_CONTROLLER_PATH = "selectFeature"; private final Map controllers = new HashMap<>(); public PairApplication() { controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(new CrewRepository())); controllers.put(SAVE_MISSIONS_CONTROLLER_PATH, new SavingMissionsController(new MissionRepository())); + controllers.put(SELECT_FEATURE_CONTROLLER_PATH, new SelectingFeatureController( + new SelectingFeatureOutputView(), + new GettingFeatureCommandInputView() + ) + ); } public void run() { @@ -27,5 +36,6 @@ public void run() { private void readFileAndSaveCrews(HashMap model) { controllers.get(READING_CREW_FILE_CONTROLLER_PATH).process(model); controllers.get(SAVE_MISSIONS_CONTROLLER_PATH).process(model); + controllers.get(SELECT_FEATURE_CONTROLLER_PATH).process(model); } } diff --git a/src/main/java/system/convertion/StringToFeatureCommandConverter.java b/src/main/java/system/convertion/StringToFeatureCommandConverter.java new file mode 100644 index 000000000..e8de07902 --- /dev/null +++ b/src/main/java/system/convertion/StringToFeatureCommandConverter.java @@ -0,0 +1,18 @@ +package system.convertion; + +import vo.FeatureCommand; + +import java.util.Arrays; + +public class StringToFeatureCommandConverter { + + public static final String WRONG_COMMAND_MESSAGE = "잘못된 커멘드를 입력하였습니다."; + + public static FeatureCommand convert(String target) { + // TODO: 값 검증 + return Arrays.stream(FeatureCommand.values()) + .filter(featureCommand -> featureCommand.getCommand().equals(target)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(WRONG_COMMAND_MESSAGE)); + } +} diff --git a/src/main/java/vo/FeatureCommand.java b/src/main/java/vo/FeatureCommand.java new file mode 100644 index 000000000..d4f959381 --- /dev/null +++ b/src/main/java/vo/FeatureCommand.java @@ -0,0 +1,24 @@ +package vo; + +public enum FeatureCommand { + MATCHING("1", "페어 매칭"), + FIND("2", "페어 조회"), + RESET("3", "페어 초기화"), + QUIT("Q", "종료"); + + private final String command; + private final String description; + + FeatureCommand(String command, String description) { + this.command = command; + this.description = description; + } + + public String getCommand() { + return command; + } + + public String getDescription() { + return description; + } +} From 0443fa412ba6fe6817b0b71fcfdaa41d7c5795c3 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 13:22:21 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feature(outputview):=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=EA=B3=BC=20=EB=AF=B8=EC=85=98=EC=9D=84=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/model/Course.java | 14 ---- src/main/java/pairmatching/Application.java | 2 +- .../controller/Controller.java | 2 +- .../ReadingCrewsFileController.java | 10 +-- .../controller/SavingMissionsController.java | 6 +- .../SelectingFeatureController.java | 8 +-- .../SelectingMissionController.java | 42 +++++++++++ .../GettingFeatureCommandInputView.java | 6 +- .../inputview/InputView.java | 2 +- src/main/java/pairmatching/model/Course.java | 28 ++++++++ .../java/{ => pairmatching}/model/Crew.java | 2 +- .../java/{ => pairmatching}/model/Level.java | 6 +- .../{ => pairmatching}/model/Mission.java | 10 ++- .../java/{ => pairmatching}/model/Pair.java | 2 +- .../outputview/OutputView.java | 2 +- .../SelectingFeatureOutputView.java | 4 +- .../SelectingMissionOutputView.java | 71 +++++++++++++++++++ .../repository/CrewRepository.java | 4 +- .../repository/MissionRepository.java | 13 +++- .../repository/PairMatchingRepository.java | 6 +- .../pairmatching/system/PairApplication.java | 71 +++++++++++++++++++ .../convertion/NamesToCrewConverter.java | 6 +- .../StringToFeatureCommandConverter.java | 4 +- .../{ => pairmatching}/vo/FeatureCommand.java | 2 +- src/main/java/system/PairApplication.java | 41 ----------- 26 files changed, 271 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/model/Course.java rename src/main/java/{ => pairmatching}/controller/Controller.java (75%) rename src/main/java/{ => pairmatching}/controller/ReadingCrewsFileController.java (91%) rename src/main/java/{ => pairmatching}/controller/SavingMissionsController.java (90%) rename src/main/java/{ => pairmatching}/controller/SelectingFeatureController.java (77%) create mode 100644 src/main/java/pairmatching/controller/SelectingMissionController.java rename src/main/java/{ => pairmatching}/inputview/GettingFeatureCommandInputView.java (72%) rename src/main/java/{ => pairmatching}/inputview/InputView.java (69%) create mode 100644 src/main/java/pairmatching/model/Course.java rename src/main/java/{ => pairmatching}/model/Crew.java (87%) rename src/main/java/{ => pairmatching}/model/Level.java (74%) rename src/main/java/{ => pairmatching}/model/Mission.java (57%) rename src/main/java/{ => pairmatching}/model/Pair.java (84%) rename src/main/java/{ => pairmatching}/outputview/OutputView.java (78%) rename src/main/java/{ => pairmatching}/outputview/SelectingFeatureOutputView.java (88%) create mode 100644 src/main/java/pairmatching/outputview/SelectingMissionOutputView.java rename src/main/java/{ => pairmatching}/repository/CrewRepository.java (77%) rename src/main/java/{ => pairmatching}/repository/MissionRepository.java (55%) rename src/main/java/{ => pairmatching}/repository/PairMatchingRepository.java (65%) create mode 100644 src/main/java/pairmatching/system/PairApplication.java rename src/main/java/{ => pairmatching}/system/convertion/NamesToCrewConverter.java (77%) rename src/main/java/{ => pairmatching}/system/convertion/StringToFeatureCommandConverter.java (87%) rename src/main/java/{ => pairmatching}/vo/FeatureCommand.java (95%) delete mode 100644 src/main/java/system/PairApplication.java diff --git a/docs/README.md b/docs/README.md index a015854ed..bc114ea7f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,5 +6,5 @@ - 애플리케이션 * [x] 기능의 종류를 출력한다. * [x] 기능 중 하나의 입력을 받는다. -* [ ] 과정과 미션을 출력한다. +* [x] 과정과 미션을 출력한다. * [ ] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. \ No newline at end of file diff --git a/src/main/java/model/Course.java b/src/main/java/model/Course.java deleted file mode 100644 index 5edd63d6e..000000000 --- a/src/main/java/model/Course.java +++ /dev/null @@ -1,14 +0,0 @@ -package model; - -public enum Course { - BACKEND("백엔드"), - FRONTEND("프론트엔드"); - - private final String name; - - Course(String name) { - this.name = name; - } - - // 추가 기능 구현 -} diff --git a/src/main/java/pairmatching/Application.java b/src/main/java/pairmatching/Application.java index 8877baebc..fc3679032 100644 --- a/src/main/java/pairmatching/Application.java +++ b/src/main/java/pairmatching/Application.java @@ -1,6 +1,6 @@ package pairmatching; -import system.PairApplication; +import pairmatching.system.PairApplication; public class Application { public static void main(String[] args) { diff --git a/src/main/java/controller/Controller.java b/src/main/java/pairmatching/controller/Controller.java similarity index 75% rename from src/main/java/controller/Controller.java rename to src/main/java/pairmatching/controller/Controller.java index 8f876be32..e6b5c4ece 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/pairmatching/controller/Controller.java @@ -1,4 +1,4 @@ -package controller; +package pairmatching.controller; import java.util.Map; diff --git a/src/main/java/controller/ReadingCrewsFileController.java b/src/main/java/pairmatching/controller/ReadingCrewsFileController.java similarity index 91% rename from src/main/java/controller/ReadingCrewsFileController.java rename to src/main/java/pairmatching/controller/ReadingCrewsFileController.java index bee984c06..5a04eee4e 100644 --- a/src/main/java/controller/ReadingCrewsFileController.java +++ b/src/main/java/pairmatching/controller/ReadingCrewsFileController.java @@ -1,9 +1,9 @@ -package controller; +package pairmatching.controller; -import model.Course; -import model.Crew; -import repository.CrewRepository; -import system.convertion.NamesToCrewConverter; +import pairmatching.model.Course; +import pairmatching.model.Crew; +import pairmatching.repository.CrewRepository; +import pairmatching.system.convertion.NamesToCrewConverter; import java.io.BufferedReader; import java.io.File; diff --git a/src/main/java/controller/SavingMissionsController.java b/src/main/java/pairmatching/controller/SavingMissionsController.java similarity index 90% rename from src/main/java/controller/SavingMissionsController.java rename to src/main/java/pairmatching/controller/SavingMissionsController.java index 2d15224e6..33f931f78 100644 --- a/src/main/java/controller/SavingMissionsController.java +++ b/src/main/java/pairmatching/controller/SavingMissionsController.java @@ -1,7 +1,7 @@ -package controller; +package pairmatching.controller; -import model.Level; -import repository.MissionRepository; +import pairmatching.model.Level; +import pairmatching.repository.MissionRepository; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/controller/SelectingFeatureController.java b/src/main/java/pairmatching/controller/SelectingFeatureController.java similarity index 77% rename from src/main/java/controller/SelectingFeatureController.java rename to src/main/java/pairmatching/controller/SelectingFeatureController.java index f78333d0d..c54b44eab 100644 --- a/src/main/java/controller/SelectingFeatureController.java +++ b/src/main/java/pairmatching/controller/SelectingFeatureController.java @@ -1,8 +1,8 @@ -package controller; +package pairmatching.controller; -import inputview.InputView; -import outputview.OutputView; -import vo.FeatureCommand; +import pairmatching.inputview.InputView; +import pairmatching.outputview.OutputView; +import pairmatching.vo.FeatureCommand; import java.util.Map; diff --git a/src/main/java/pairmatching/controller/SelectingMissionController.java b/src/main/java/pairmatching/controller/SelectingMissionController.java new file mode 100644 index 000000000..5fff854f2 --- /dev/null +++ b/src/main/java/pairmatching/controller/SelectingMissionController.java @@ -0,0 +1,42 @@ +package pairmatching.controller; + +import pairmatching.inputview.InputView; +import pairmatching.model.Course; +import pairmatching.model.Level; +import pairmatching.outputview.OutputView; +import pairmatching.repository.MissionRepository; + +import java.util.Map; + +public class SelectingMissionController implements Controller { + private final OutputView outputView; + private final InputView inputView; + private final MissionRepository missionRepository; + + public SelectingMissionController(OutputView outputView, InputView inputView, MissionRepository missionRepository) { + this.outputView = outputView; + this.inputView = inputView; + this.missionRepository = missionRepository; + } + + @Override + public void process(Map model) { + putCoursesNameToModel(model); + putMissionNamesToModel(model); + outputView.print(model); + } + + private static Object putCoursesNameToModel(Map model) { + return model.put("courses", Course.getCourseNames()); + } + + private void putMissionNamesToModel(Map model) { + model.put("level1Missions", missionRepository.findAllNamesByLevel(Level.LEVEL1)); + model.put("level2Missions", missionRepository.findAllNamesByLevel(Level.LEVEL2)); + model.put("level3Missions", missionRepository.findAllNamesByLevel(Level.LEVEL3)); + model.put("level4Missions", missionRepository.findAllNamesByLevel(Level.LEVEL4)); + model.put("level5Missions", missionRepository.findAllNamesByLevel(Level.LEVEL5)); + } + + +} diff --git a/src/main/java/inputview/GettingFeatureCommandInputView.java b/src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java similarity index 72% rename from src/main/java/inputview/GettingFeatureCommandInputView.java rename to src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java index 3a793976a..ac52cd938 100644 --- a/src/main/java/inputview/GettingFeatureCommandInputView.java +++ b/src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java @@ -1,8 +1,8 @@ -package inputview; +package pairmatching.inputview; import camp.nextstep.edu.missionutils.Console; -import system.convertion.StringToFeatureCommandConverter; -import vo.FeatureCommand; +import pairmatching.system.convertion.StringToFeatureCommandConverter; +import pairmatching.vo.FeatureCommand; public class GettingFeatureCommandInputView implements InputView { @Override diff --git a/src/main/java/inputview/InputView.java b/src/main/java/pairmatching/inputview/InputView.java similarity index 69% rename from src/main/java/inputview/InputView.java rename to src/main/java/pairmatching/inputview/InputView.java index c56ee70d9..9bec5b19f 100644 --- a/src/main/java/inputview/InputView.java +++ b/src/main/java/pairmatching/inputview/InputView.java @@ -1,4 +1,4 @@ -package inputview; +package pairmatching.inputview; @FunctionalInterface public interface InputView { E getInput(); diff --git a/src/main/java/pairmatching/model/Course.java b/src/main/java/pairmatching/model/Course.java new file mode 100644 index 000000000..a387d04f5 --- /dev/null +++ b/src/main/java/pairmatching/model/Course.java @@ -0,0 +1,28 @@ +package pairmatching.model; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public enum Course { + BACKEND("백엔드"), + FRONTEND("프론트엔드"); + + private final String name; + + Course(String name) { + this.name = name; + } + + // 추가 기능 구현 + + public String getName() { + return name; + } + + public static List getCourseNames() { + return Arrays.stream(Course.values()) + .map(Course::getName) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/model/Crew.java b/src/main/java/pairmatching/model/Crew.java similarity index 87% rename from src/main/java/model/Crew.java rename to src/main/java/pairmatching/model/Crew.java index 5a99c5f8c..b031941dd 100644 --- a/src/main/java/model/Crew.java +++ b/src/main/java/pairmatching/model/Crew.java @@ -1,4 +1,4 @@ -package model; +package pairmatching.model; public class Crew { private final Course course; diff --git a/src/main/java/model/Level.java b/src/main/java/pairmatching/model/Level.java similarity index 74% rename from src/main/java/model/Level.java rename to src/main/java/pairmatching/model/Level.java index 33c7847fe..9c58ec02e 100644 --- a/src/main/java/model/Level.java +++ b/src/main/java/pairmatching/model/Level.java @@ -1,4 +1,4 @@ -package model; +package pairmatching.model; public enum Level { LEVEL1("레벨1"), @@ -14,4 +14,8 @@ public enum Level { } // 추가 기능 구현 + + public String getName() { + return name; + } } diff --git a/src/main/java/model/Mission.java b/src/main/java/pairmatching/model/Mission.java similarity index 57% rename from src/main/java/model/Mission.java rename to src/main/java/pairmatching/model/Mission.java index 3a7f63654..b1e3bb90b 100644 --- a/src/main/java/model/Mission.java +++ b/src/main/java/pairmatching/model/Mission.java @@ -1,4 +1,4 @@ -package model; +package pairmatching.model; public class Mission { private final Level level; @@ -8,4 +8,12 @@ public Mission(Level level, String name) { this.level = level; this.name = name; } + + public Level getLevel() { + return level; + } + + public String getName() { + return name; + } } diff --git a/src/main/java/model/Pair.java b/src/main/java/pairmatching/model/Pair.java similarity index 84% rename from src/main/java/model/Pair.java rename to src/main/java/pairmatching/model/Pair.java index 72ba46f0c..3cd376e27 100644 --- a/src/main/java/model/Pair.java +++ b/src/main/java/pairmatching/model/Pair.java @@ -1,4 +1,4 @@ -package model; +package pairmatching.model; import java.util.List; diff --git a/src/main/java/outputview/OutputView.java b/src/main/java/pairmatching/outputview/OutputView.java similarity index 78% rename from src/main/java/outputview/OutputView.java rename to src/main/java/pairmatching/outputview/OutputView.java index 6dea1349a..c2cf8b91f 100644 --- a/src/main/java/outputview/OutputView.java +++ b/src/main/java/pairmatching/outputview/OutputView.java @@ -1,4 +1,4 @@ -package outputview; +package pairmatching.outputview; import java.util.Map; diff --git a/src/main/java/outputview/SelectingFeatureOutputView.java b/src/main/java/pairmatching/outputview/SelectingFeatureOutputView.java similarity index 88% rename from src/main/java/outputview/SelectingFeatureOutputView.java rename to src/main/java/pairmatching/outputview/SelectingFeatureOutputView.java index a028496c8..48423f7e4 100644 --- a/src/main/java/outputview/SelectingFeatureOutputView.java +++ b/src/main/java/pairmatching/outputview/SelectingFeatureOutputView.java @@ -1,6 +1,6 @@ -package outputview; +package pairmatching.outputview; -import vo.FeatureCommand; +import pairmatching.vo.FeatureCommand; import java.util.Map; diff --git a/src/main/java/pairmatching/outputview/SelectingMissionOutputView.java b/src/main/java/pairmatching/outputview/SelectingMissionOutputView.java new file mode 100644 index 000000000..514b9992d --- /dev/null +++ b/src/main/java/pairmatching/outputview/SelectingMissionOutputView.java @@ -0,0 +1,71 @@ +package pairmatching.outputview; + +import pairmatching.model.Level; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class SelectingMissionOutputView implements OutputView { + + public static final String SELECT_COURSE_LEVEL_MISSION_MESSAGE = "과정, 레벨, 미션을 선택하세요."; + public static final String SELECTION_EXAMPLE_MESSAGE = "ex) 백엔드, 레벨1, 자동차경주"; + public static final String PRINTING_MISSION_MESSAGE_FORMAT = " - %s: "; + public static final String PRINTING_COURSE_PREFIX = "과정: "; + public static final String SEPARATOR_FORMAT = " %s "; + public static final String MISSION_MESSAGE_PREFIX = "미션:"; + public static final String LINE_SEPARATOR = "#############################################"; + public static final String VALUE_SEPARATOR = "|"; + + @Override + public void print(Map model) { + printLineSeparator(); + printCourses((List) model.get("courses")); + printMissions(model); + printLineSeparator(); + printSelectCourseLevelMissionSelectionMessage(); + } + + private static void printSelectCourseLevelMissionSelectionMessage() { + System.out.println(SELECT_COURSE_LEVEL_MISSION_MESSAGE); + System.out.println(SELECTION_EXAMPLE_MESSAGE); + } + + private static void printLineSeparator() { + System.out.println(LINE_SEPARATOR); + } + + private void printMissions(Map model) { + System.out.println(MISSION_MESSAGE_PREFIX); + printMissionsOfEachLevel(Level.LEVEL1, (List) model.get("level1Missions")); + printMissionsOfEachLevel(Level.LEVEL2, (List) model.get("level2Missions")); + printMissionsOfEachLevel(Level.LEVEL3, (List) model.get("level3Missions")); + printMissionsOfEachLevel(Level.LEVEL4, (List) model.get("level4Missions")); + printMissionsOfEachLevel(Level.LEVEL5, (List) model.get("level5Missions")); + } + + private void printMissionsOfEachLevel(Level level, List missions) { + System.out.printf(PRINTING_MISSION_MESSAGE_FORMAT, level.getName()); + printValues(missions); + } + + private void printCourses(List courses) { + System.out.print(PRINTING_COURSE_PREFIX); + printValues(courses); + } + + private void printValues(List values) { + Iterator iterator = values.iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next()); + if (iterator.hasNext()) { + addSeparator(VALUE_SEPARATOR); + } + } + System.out.println(); + } + + private void addSeparator(String separator) { + System.out.printf(SEPARATOR_FORMAT, separator); + } +} diff --git a/src/main/java/repository/CrewRepository.java b/src/main/java/pairmatching/repository/CrewRepository.java similarity index 77% rename from src/main/java/repository/CrewRepository.java rename to src/main/java/pairmatching/repository/CrewRepository.java index ad07a7ac0..93a0e9fe3 100644 --- a/src/main/java/repository/CrewRepository.java +++ b/src/main/java/pairmatching/repository/CrewRepository.java @@ -1,6 +1,6 @@ -package repository; +package pairmatching.repository; -import model.Crew; +import pairmatching.model.Crew; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/repository/MissionRepository.java b/src/main/java/pairmatching/repository/MissionRepository.java similarity index 55% rename from src/main/java/repository/MissionRepository.java rename to src/main/java/pairmatching/repository/MissionRepository.java index 264a8623a..a696bbf2b 100644 --- a/src/main/java/repository/MissionRepository.java +++ b/src/main/java/pairmatching/repository/MissionRepository.java @@ -1,7 +1,7 @@ -package repository; +package pairmatching.repository; -import model.Level; -import model.Mission; +import pairmatching.model.Level; +import pairmatching.model.Mission; import java.util.ArrayList; import java.util.List; @@ -15,4 +15,11 @@ public void saveAllNamesWithLevel(List missionNames, Level level) { .map(missionName -> new Mission(level, missionName)) .collect(Collectors.toList())); } + + public List findAllNamesByLevel(Level level) { + return missions.stream() + .filter(mission -> mission.getLevel() == level) + .map(Mission::getName) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/repository/PairMatchingRepository.java b/src/main/java/pairmatching/repository/PairMatchingRepository.java similarity index 65% rename from src/main/java/repository/PairMatchingRepository.java rename to src/main/java/pairmatching/repository/PairMatchingRepository.java index 59c272db4..7d49c175e 100644 --- a/src/main/java/repository/PairMatchingRepository.java +++ b/src/main/java/pairmatching/repository/PairMatchingRepository.java @@ -1,7 +1,7 @@ -package repository; +package pairmatching.repository; -import model.Mission; -import model.Pair; +import pairmatching.model.Mission; +import pairmatching.model.Pair; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java new file mode 100644 index 000000000..59feaad50 --- /dev/null +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -0,0 +1,71 @@ +package pairmatching.system; + +import pairmatching.controller.*; +import pairmatching.inputview.GettingFeatureCommandInputView; +import pairmatching.outputview.SelectingFeatureOutputView; +import pairmatching.outputview.SelectingMissionOutputView; +import pairmatching.repository.CrewRepository; +import pairmatching.repository.MissionRepository; +import pairmatching.vo.FeatureCommand; + +import java.util.HashMap; +import java.util.Map; + +public class PairApplication { + public static final String READING_CREW_FILE_CONTROLLER_PATH = "readCrewFile"; + public static final String SAVE_MISSIONS_CONTROLLER_PATH = "saveMissions"; + public static final String SELECT_FEATURE_CONTROLLER_PATH = "selectFeature"; + public static final String SELECTING_MISSION_PATH = "selectMission"; + private final Map controllers = new HashMap<>(); + + public PairApplication() { + MissionRepository missionRepository = new MissionRepository(); + + controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(new CrewRepository())); + controllers.put(SAVE_MISSIONS_CONTROLLER_PATH, new SavingMissionsController(missionRepository)); + controllers.put(SELECT_FEATURE_CONTROLLER_PATH, new SelectingFeatureController( + new SelectingFeatureOutputView(), + new GettingFeatureCommandInputView() + )); + controllers.put(SELECTING_MISSION_PATH, new SelectingMissionController( + new SelectingMissionOutputView(), null, missionRepository + )); + } + + public void run() { + HashMap model = new HashMap<>(); + readFileAndSaveCrews(model); + saveMissions(model); + getFeatureCommand(model); + + doFeature(model); + } + + private void doFeature(HashMap model) { + FeatureCommand featureCommand = (FeatureCommand) model.get("featureCommand"); + if (featureCommand == FeatureCommand.MATCHING) { + controllers.get(SELECTING_MISSION_PATH).process(model); + } + if (featureCommand == FeatureCommand.FIND) { + + } + if (featureCommand == FeatureCommand.RESET) { + + } + if (featureCommand == FeatureCommand.QUIT) { + + } + } + + private void getFeatureCommand(HashMap model) { + controllers.get(SELECT_FEATURE_CONTROLLER_PATH).process(model); + } + + private void saveMissions(HashMap model) { + controllers.get(SAVE_MISSIONS_CONTROLLER_PATH).process(model); + } + + private void readFileAndSaveCrews(HashMap model) { + controllers.get(READING_CREW_FILE_CONTROLLER_PATH).process(model); + } +} diff --git a/src/main/java/system/convertion/NamesToCrewConverter.java b/src/main/java/pairmatching/system/convertion/NamesToCrewConverter.java similarity index 77% rename from src/main/java/system/convertion/NamesToCrewConverter.java rename to src/main/java/pairmatching/system/convertion/NamesToCrewConverter.java index 36cf2378d..ba2d5db48 100644 --- a/src/main/java/system/convertion/NamesToCrewConverter.java +++ b/src/main/java/pairmatching/system/convertion/NamesToCrewConverter.java @@ -1,7 +1,7 @@ -package system.convertion; +package pairmatching.system.convertion; -import model.Course; -import model.Crew; +import pairmatching.model.Course; +import pairmatching.model.Crew; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/system/convertion/StringToFeatureCommandConverter.java b/src/main/java/pairmatching/system/convertion/StringToFeatureCommandConverter.java similarity index 87% rename from src/main/java/system/convertion/StringToFeatureCommandConverter.java rename to src/main/java/pairmatching/system/convertion/StringToFeatureCommandConverter.java index e8de07902..b796b4846 100644 --- a/src/main/java/system/convertion/StringToFeatureCommandConverter.java +++ b/src/main/java/pairmatching/system/convertion/StringToFeatureCommandConverter.java @@ -1,6 +1,6 @@ -package system.convertion; +package pairmatching.system.convertion; -import vo.FeatureCommand; +import pairmatching.vo.FeatureCommand; import java.util.Arrays; diff --git a/src/main/java/vo/FeatureCommand.java b/src/main/java/pairmatching/vo/FeatureCommand.java similarity index 95% rename from src/main/java/vo/FeatureCommand.java rename to src/main/java/pairmatching/vo/FeatureCommand.java index d4f959381..05baa7955 100644 --- a/src/main/java/vo/FeatureCommand.java +++ b/src/main/java/pairmatching/vo/FeatureCommand.java @@ -1,4 +1,4 @@ -package vo; +package pairmatching.vo; public enum FeatureCommand { MATCHING("1", "페어 매칭"), diff --git a/src/main/java/system/PairApplication.java b/src/main/java/system/PairApplication.java deleted file mode 100644 index dc6966ef5..000000000 --- a/src/main/java/system/PairApplication.java +++ /dev/null @@ -1,41 +0,0 @@ -package system; - -import controller.Controller; -import controller.ReadingCrewsFileController; -import controller.SavingMissionsController; -import controller.SelectingFeatureController; -import inputview.GettingFeatureCommandInputView; -import outputview.SelectingFeatureOutputView; -import repository.CrewRepository; -import repository.MissionRepository; - -import java.util.HashMap; -import java.util.Map; - -public class PairApplication { - public static final String READING_CREW_FILE_CONTROLLER_PATH = "readCrewFile"; - public static final String SAVE_MISSIONS_CONTROLLER_PATH = "saveMissions"; - public static final String SELECT_FEATURE_CONTROLLER_PATH = "selectFeature"; - private final Map controllers = new HashMap<>(); - - public PairApplication() { - controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(new CrewRepository())); - controllers.put(SAVE_MISSIONS_CONTROLLER_PATH, new SavingMissionsController(new MissionRepository())); - controllers.put(SELECT_FEATURE_CONTROLLER_PATH, new SelectingFeatureController( - new SelectingFeatureOutputView(), - new GettingFeatureCommandInputView() - ) - ); - } - - public void run() { - HashMap model = new HashMap<>(); - readFileAndSaveCrews(model); - } - - private void readFileAndSaveCrews(HashMap model) { - controllers.get(READING_CREW_FILE_CONTROLLER_PATH).process(model); - controllers.get(SAVE_MISSIONS_CONTROLLER_PATH).process(model); - controllers.get(SELECT_FEATURE_CONTROLLER_PATH).process(model); - } -} From 6bbe90f628fa02a5c75c012a1a46d92867bb44b5 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 13:49:58 +0900 Subject: [PATCH 08/18] =?UTF-8?q?feature(pairmatchinginfo):=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=ED=95=98=EA=B3=A0=EC=9E=90=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=95,=20=EB=A0=88=EB=B2=A8,=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../SelectingFeatureController.java | 2 +- .../SelectingMissionController.java | 19 ++++++++-- .../GettingFeatureCommandInputView.java | 4 ++- .../pairmatching/inputview/InputView.java | 5 ++- .../inputview/SelectingMissionInputView.java | 21 +++++++++++ src/main/java/pairmatching/model/Course.java | 8 +++++ .../repository/MissionRepository.java | 5 +++ .../pairmatching/system/PairApplication.java | 5 ++- .../StringToPairMatchingInfoConverter.java | 36 +++++++++++++++++++ .../pairmatching/vo/PairMatchingInfo.java | 14 ++++++++ 11 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 src/main/java/pairmatching/inputview/SelectingMissionInputView.java create mode 100644 src/main/java/pairmatching/system/convertion/StringToPairMatchingInfoConverter.java create mode 100644 src/main/java/pairmatching/vo/PairMatchingInfo.java diff --git a/docs/README.md b/docs/README.md index bc114ea7f..0d7074065 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,4 +7,4 @@ * [x] 기능의 종류를 출력한다. * [x] 기능 중 하나의 입력을 받는다. * [x] 과정과 미션을 출력한다. -* [ ] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. \ No newline at end of file +* [x] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. \ No newline at end of file diff --git a/src/main/java/pairmatching/controller/SelectingFeatureController.java b/src/main/java/pairmatching/controller/SelectingFeatureController.java index c54b44eab..ab58ed6c0 100644 --- a/src/main/java/pairmatching/controller/SelectingFeatureController.java +++ b/src/main/java/pairmatching/controller/SelectingFeatureController.java @@ -18,6 +18,6 @@ public SelectingFeatureController(OutputView outputView, InputView model) { outputView.print(model); - model.put("featureCommand", inputView.getInput()); + model.put("featureCommand", inputView.getInput(model)); } } diff --git a/src/main/java/pairmatching/controller/SelectingMissionController.java b/src/main/java/pairmatching/controller/SelectingMissionController.java index 5fff854f2..f0b194eaa 100644 --- a/src/main/java/pairmatching/controller/SelectingMissionController.java +++ b/src/main/java/pairmatching/controller/SelectingMissionController.java @@ -5,15 +5,16 @@ import pairmatching.model.Level; import pairmatching.outputview.OutputView; import pairmatching.repository.MissionRepository; +import pairmatching.vo.PairMatchingInfo; import java.util.Map; public class SelectingMissionController implements Controller { private final OutputView outputView; - private final InputView inputView; + private final InputView inputView; private final MissionRepository missionRepository; - public SelectingMissionController(OutputView outputView, InputView inputView, MissionRepository missionRepository) { + public SelectingMissionController(OutputView outputView, InputView inputView, MissionRepository missionRepository) { this.outputView = outputView; this.inputView = inputView; this.missionRepository = missionRepository; @@ -21,11 +22,25 @@ public SelectingMissionController(OutputView outputView, InputView inputView, Mi @Override public void process(Map model) { + printMessage(model); + readInputIntoModel(model); + } + + private void readInputIntoModel(Map model) { + putAllMissionsToModel(model); + model.put("pairMatchingInfo", inputView.getInput(model)); + } + + private void printMessage(Map model) { putCoursesNameToModel(model); putMissionNamesToModel(model); outputView.print(model); } + private Object putAllMissionsToModel(Map model) { + return model.put("missions", missionRepository.findAll()); + } + private static Object putCoursesNameToModel(Map model) { return model.put("courses", Course.getCourseNames()); } diff --git a/src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java b/src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java index ac52cd938..7f1b9b01f 100644 --- a/src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java +++ b/src/main/java/pairmatching/inputview/GettingFeatureCommandInputView.java @@ -4,9 +4,11 @@ import pairmatching.system.convertion.StringToFeatureCommandConverter; import pairmatching.vo.FeatureCommand; +import java.util.Map; + public class GettingFeatureCommandInputView implements InputView { @Override - public FeatureCommand getInput() { + public FeatureCommand getInput(Map model) { String input = readInput(); return StringToFeatureCommandConverter.convert(input); } diff --git a/src/main/java/pairmatching/inputview/InputView.java b/src/main/java/pairmatching/inputview/InputView.java index 9bec5b19f..4390ec9ab 100644 --- a/src/main/java/pairmatching/inputview/InputView.java +++ b/src/main/java/pairmatching/inputview/InputView.java @@ -1,5 +1,8 @@ package pairmatching.inputview; + +import java.util.Map; + @FunctionalInterface public interface InputView { - E getInput(); + E getInput(Map model); } diff --git a/src/main/java/pairmatching/inputview/SelectingMissionInputView.java b/src/main/java/pairmatching/inputview/SelectingMissionInputView.java new file mode 100644 index 000000000..0f794ceb2 --- /dev/null +++ b/src/main/java/pairmatching/inputview/SelectingMissionInputView.java @@ -0,0 +1,21 @@ +package pairmatching.inputview; + +import camp.nextstep.edu.missionutils.Console; +import pairmatching.model.Mission; +import pairmatching.system.convertion.StringToPairMatchingInfoConverter; +import pairmatching.vo.PairMatchingInfo; + +import java.util.List; +import java.util.Map; + +public class SelectingMissionInputView implements InputView { + @Override + public PairMatchingInfo getInput(Map model) { + String input = readInput(); + return StringToPairMatchingInfoConverter.convert(input, (List) model.get("missions")); + } + + protected static String readInput() { + return Console.readLine(); + } +} diff --git a/src/main/java/pairmatching/model/Course.java b/src/main/java/pairmatching/model/Course.java index a387d04f5..ea16a530a 100644 --- a/src/main/java/pairmatching/model/Course.java +++ b/src/main/java/pairmatching/model/Course.java @@ -8,12 +8,20 @@ public enum Course { BACKEND("백엔드"), FRONTEND("프론트엔드"); + public static final String INVALID_COURSE_NAME_MESSAGE = "주어진 이름과 일치하는 코스가 없습니다."; private final String name; Course(String name) { this.name = name; } + public static Course findByName(String courseName) { + return Arrays.stream(values()) + .filter(course -> course.name.equals(courseName)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(INVALID_COURSE_NAME_MESSAGE)); + } + // 추가 기능 구현 public String getName() { diff --git a/src/main/java/pairmatching/repository/MissionRepository.java b/src/main/java/pairmatching/repository/MissionRepository.java index a696bbf2b..b5e195442 100644 --- a/src/main/java/pairmatching/repository/MissionRepository.java +++ b/src/main/java/pairmatching/repository/MissionRepository.java @@ -4,6 +4,7 @@ import pairmatching.model.Mission; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -22,4 +23,8 @@ public List findAllNamesByLevel(Level level) { .map(Mission::getName) .collect(Collectors.toList()); } + + public List findAll() { + return Collections.unmodifiableList(missions); + } } diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index 59feaad50..4e8b81643 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -2,6 +2,7 @@ import pairmatching.controller.*; import pairmatching.inputview.GettingFeatureCommandInputView; +import pairmatching.inputview.SelectingMissionInputView; import pairmatching.outputview.SelectingFeatureOutputView; import pairmatching.outputview.SelectingMissionOutputView; import pairmatching.repository.CrewRepository; @@ -28,7 +29,9 @@ public PairApplication() { new GettingFeatureCommandInputView() )); controllers.put(SELECTING_MISSION_PATH, new SelectingMissionController( - new SelectingMissionOutputView(), null, missionRepository + new SelectingMissionOutputView(), + new SelectingMissionInputView(), + missionRepository )); } diff --git a/src/main/java/pairmatching/system/convertion/StringToPairMatchingInfoConverter.java b/src/main/java/pairmatching/system/convertion/StringToPairMatchingInfoConverter.java new file mode 100644 index 000000000..550646862 --- /dev/null +++ b/src/main/java/pairmatching/system/convertion/StringToPairMatchingInfoConverter.java @@ -0,0 +1,36 @@ +package pairmatching.system.convertion; + +import pairmatching.model.Course; +import pairmatching.model.Mission; +import pairmatching.vo.PairMatchingInfo; + +import java.util.List; + +public class StringToPairMatchingInfoConverter { + + public static final String INVALID_MISSION_INPUT_MESSAGE = "입력한 값과 일치하는 미션이 없습니다."; + + public static PairMatchingInfo convert(String input, List missions) { + // TODO: 검증 필요하다. + String[] splitedInput = input + .replaceAll(" ", "") + .split(","); + return new PairMatchingInfo( + getCourse(splitedInput), + getMission(missions, splitedInput) + ); + } + + private static Course getCourse(String[] splitedInput) { + return Course.findByName(splitedInput[0]); + } + + private static Mission getMission(List missions, String[] splitedInput) { + return missions.stream() + .filter(mission -> + mission.getLevel().getName().equals(splitedInput[1]) && + mission.getName().equals(splitedInput[2])) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(INVALID_MISSION_INPUT_MESSAGE)); + } +} diff --git a/src/main/java/pairmatching/vo/PairMatchingInfo.java b/src/main/java/pairmatching/vo/PairMatchingInfo.java new file mode 100644 index 000000000..4b7cb9387 --- /dev/null +++ b/src/main/java/pairmatching/vo/PairMatchingInfo.java @@ -0,0 +1,14 @@ +package pairmatching.vo; + +import pairmatching.model.Course; +import pairmatching.model.Mission; + +public class PairMatchingInfo { + private final Course course; + private final Mission mission; + + public PairMatchingInfo(Course course, Mission mission) { + this.course = course; + this.mission = mission; + } +} From 758efa0c0f22a1c4f8d3f55c259d2550b19491cd Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 13:53:44 +0900 Subject: [PATCH 09/18] =?UTF-8?q?docs(readme):=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=EA=B3=BC=20=EA=B4=80=EB=A0=A8=EB=90=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 0d7074065..d0060f92a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,4 +7,10 @@ * [x] 기능의 종류를 출력한다. * [x] 기능 중 하나의 입력을 받는다. * [x] 과정과 미션을 출력한다. -* [x] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. \ No newline at end of file +* [x] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. + +* [ ] 크루 목록의 순서를 랜덤으로 섞는다. +* [ ] 랜덤으로 섞인 페어 목록에서 페어 매칭을 할 때 앞에서부터 순서대로 두명씩 페어를 맺는다. +* [ ] 홀수인 경우 마지막 남은 크루는 마지막 페어에 포함시킨다. +* [ ] 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. +* [ ] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. \ No newline at end of file From bc26be2de88eef7986ec5966b7592098bbca576f Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 14:17:57 +0900 Subject: [PATCH 10/18] =?UTF-8?q?feat(pairsmaker):=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=9D=84=20=EC=84=9E=EC=9D=80=20=ED=9B=84=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=ED=95=B4=20=EC=A0=80=EC=9E=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 ++-- .../controller/MatchingPairController.java | 36 +++++++++++++++++++ src/main/java/pairmatching/model/Crew.java | 4 +++ .../repository/CrewRepository.java | 8 +++++ .../repository/PairMatchingRepository.java | 8 +++-- .../pairmatching/system/PairApplication.java | 10 +++++- .../pairmatching/system/util/PairsMaker.java | 31 ++++++++++++++++ .../pairmatching/vo/PairMatchingInfo.java | 4 +++ 8 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 src/main/java/pairmatching/controller/MatchingPairController.java create mode 100644 src/main/java/pairmatching/system/util/PairsMaker.java diff --git a/docs/README.md b/docs/README.md index d0060f92a..571d94921 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,8 +9,8 @@ * [x] 과정과 미션을 출력한다. * [x] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다. -* [ ] 크루 목록의 순서를 랜덤으로 섞는다. -* [ ] 랜덤으로 섞인 페어 목록에서 페어 매칭을 할 때 앞에서부터 순서대로 두명씩 페어를 맺는다. -* [ ] 홀수인 경우 마지막 남은 크루는 마지막 페어에 포함시킨다. +* [x] 크루 목록의 순서를 랜덤으로 섞는다. +* [x] 랜덤으로 섞인 페어 목록에서 페어 매칭을 할 때 앞에서부터 순서대로 두명씩 페어를 맺는다. +* [x] 홀수인 경우 마지막 남은 크루는 마지막 페어에 포함시킨다. * [ ] 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. * [ ] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. \ No newline at end of file diff --git a/src/main/java/pairmatching/controller/MatchingPairController.java b/src/main/java/pairmatching/controller/MatchingPairController.java new file mode 100644 index 000000000..72c620662 --- /dev/null +++ b/src/main/java/pairmatching/controller/MatchingPairController.java @@ -0,0 +1,36 @@ +package pairmatching.controller; + +import camp.nextstep.edu.missionutils.Randoms; +import pairmatching.model.Crew; +import pairmatching.model.Pair; +import pairmatching.repository.CrewRepository; +import pairmatching.repository.PairMatchingRepository; +import pairmatching.system.util.PairsMaker; +import pairmatching.vo.PairMatchingInfo; + +import java.util.List; +import java.util.Map; + +public class MatchingPairController implements Controller { + private final CrewRepository crewRepository; + private final PairMatchingRepository pairMatchingRepository; + private final PairsMaker pairsMaker; + + public MatchingPairController(CrewRepository crewRepository, PairMatchingRepository pairMatchingRepository, PairsMaker pairsMaker) { + this.crewRepository = crewRepository; + this.pairMatchingRepository = pairMatchingRepository; + this.pairsMaker = pairsMaker; + } + + @Override + public void process(Map model) { + PairMatchingInfo pairMatchingInfo = (PairMatchingInfo) model.get("pairMatchingInfo"); + List crews = crewRepository.findByCourse(pairMatchingInfo.getCourse()); + List pairs = pairsMaker.makePairs(getShuffledCrews(crews)); + pairMatchingRepository.save(pairMatchingInfo, pairs); + } + + private List getShuffledCrews(List crews) { + return Randoms.shuffle(crews); + } +} diff --git a/src/main/java/pairmatching/model/Crew.java b/src/main/java/pairmatching/model/Crew.java index b031941dd..f053d18df 100644 --- a/src/main/java/pairmatching/model/Crew.java +++ b/src/main/java/pairmatching/model/Crew.java @@ -8,4 +8,8 @@ public Crew(Course course, String name) { this.course = course; this.name = name; } + + public Course getCourse() { + return course; + } } diff --git a/src/main/java/pairmatching/repository/CrewRepository.java b/src/main/java/pairmatching/repository/CrewRepository.java index 93a0e9fe3..7dbbb467b 100644 --- a/src/main/java/pairmatching/repository/CrewRepository.java +++ b/src/main/java/pairmatching/repository/CrewRepository.java @@ -1,9 +1,11 @@ package pairmatching.repository; +import pairmatching.model.Course; import pairmatching.model.Crew; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class CrewRepository { private final List crews = new ArrayList<>(); @@ -11,4 +13,10 @@ public class CrewRepository { public void saveAll(List crews) { this.crews.addAll(crews); } + + public List findByCourse(Course course) { + return crews.stream() + .filter(crew -> crew.getCourse() == course) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/pairmatching/repository/PairMatchingRepository.java b/src/main/java/pairmatching/repository/PairMatchingRepository.java index 7d49c175e..89457a686 100644 --- a/src/main/java/pairmatching/repository/PairMatchingRepository.java +++ b/src/main/java/pairmatching/repository/PairMatchingRepository.java @@ -1,12 +1,16 @@ package pairmatching.repository; -import pairmatching.model.Mission; import pairmatching.model.Pair; +import pairmatching.vo.PairMatchingInfo; import java.util.HashMap; import java.util.List; import java.util.Map; public class PairMatchingRepository { - private final Map> matchedPairs = new HashMap<>(); + private final Map> matchedPairs = new HashMap<>(); + + public void save(PairMatchingInfo pairMatchingInfo, List pairs) { + matchedPairs.put(pairMatchingInfo, pairs); + } } diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index 4e8b81643..6464c3686 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -7,6 +7,8 @@ import pairmatching.outputview.SelectingMissionOutputView; import pairmatching.repository.CrewRepository; import pairmatching.repository.MissionRepository; +import pairmatching.repository.PairMatchingRepository; +import pairmatching.system.util.PairsMaker; import pairmatching.vo.FeatureCommand; import java.util.HashMap; @@ -17,12 +19,14 @@ public class PairApplication { public static final String SAVE_MISSIONS_CONTROLLER_PATH = "saveMissions"; public static final String SELECT_FEATURE_CONTROLLER_PATH = "selectFeature"; public static final String SELECTING_MISSION_PATH = "selectMission"; + public static final String MATCHING_PAIR = "matchPair"; private final Map controllers = new HashMap<>(); public PairApplication() { MissionRepository missionRepository = new MissionRepository(); + CrewRepository crewRepository = new CrewRepository(); - controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(new CrewRepository())); + controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(crewRepository)); controllers.put(SAVE_MISSIONS_CONTROLLER_PATH, new SavingMissionsController(missionRepository)); controllers.put(SELECT_FEATURE_CONTROLLER_PATH, new SelectingFeatureController( new SelectingFeatureOutputView(), @@ -33,6 +37,9 @@ public PairApplication() { new SelectingMissionInputView(), missionRepository )); + controllers.put(MATCHING_PAIR, new MatchingPairController( + crewRepository, new PairMatchingRepository(), new PairsMaker()) + ); } public void run() { @@ -48,6 +55,7 @@ private void doFeature(HashMap model) { FeatureCommand featureCommand = (FeatureCommand) model.get("featureCommand"); if (featureCommand == FeatureCommand.MATCHING) { controllers.get(SELECTING_MISSION_PATH).process(model); + controllers.get(MATCHING_PAIR).process(model); } if (featureCommand == FeatureCommand.FIND) { diff --git a/src/main/java/pairmatching/system/util/PairsMaker.java b/src/main/java/pairmatching/system/util/PairsMaker.java new file mode 100644 index 000000000..d3233fdba --- /dev/null +++ b/src/main/java/pairmatching/system/util/PairsMaker.java @@ -0,0 +1,31 @@ +package pairmatching.system.util; + +import pairmatching.model.Crew; +import pairmatching.model.Pair; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class PairsMaker { + public List makePairs(List crews) { + ArrayList pairs = new ArrayList<>(); + while (2 <= crews.size()) { + List matchedCrews = getMatchedCrews(crews); + pairs.add(new Pair(matchedCrews)); + } + return pairs; + } + + private static List getMatchedCrews(List crews) { + List matchedCrews = new ArrayList<>(Arrays.asList(crews.remove(0), crews.remove(0))); + handleOddCrewSizeCase(crews, matchedCrews); + return matchedCrews; + } + + private static void handleOddCrewSizeCase(List crews, List matchedCrews) { + if (crews.size() == 1) { + matchedCrews.add(crews.remove(0)); + } + } +} diff --git a/src/main/java/pairmatching/vo/PairMatchingInfo.java b/src/main/java/pairmatching/vo/PairMatchingInfo.java index 4b7cb9387..990feef74 100644 --- a/src/main/java/pairmatching/vo/PairMatchingInfo.java +++ b/src/main/java/pairmatching/vo/PairMatchingInfo.java @@ -11,4 +11,8 @@ public PairMatchingInfo(Course course, Mission mission) { this.course = course; this.mission = mission; } + + public Course getCourse() { + return course; + } } From 59bc36ad655d047686cd264ea1c0cec41988f9d7 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 14:46:18 +0900 Subject: [PATCH 11/18] =?UTF-8?q?feat(paircontroller):=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=20=ED=8E=98=EC=96=B4=EB=A1=9C=20=EB=A7=8C=EB=82=9C?= =?UTF-8?q?=EC=A0=81=EC=9D=B4=20=EC=9E=88=EB=8A=94=20=ED=81=AC=EB=A3=A8?= =?UTF-8?q?=EB=81=BC=EB=A6=AC=20=EB=A7=A4=EC=B9=AD=20=EB=90=9C=EB=8B=A4?= =?UTF-8?q?=EB=A9=B4=20=EB=8B=A4=EC=8B=9C=20=EB=9E=9C=EB=8D=A4=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=84=9E=EC=96=B4=EC=84=9C=20=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +- .../controller/MatchingPairController.java | 13 ++++- .../repository/PairMatchingRepository.java | 47 +++++++++++++++++++ .../exception/DuplicationPairsException.java | 7 +++ .../pairmatching/vo/PairMatchingInfo.java | 5 ++ 5 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 src/main/java/pairmatching/system/exception/DuplicationPairsException.java diff --git a/docs/README.md b/docs/README.md index 571d94921..a867ae444 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,5 +12,5 @@ * [x] 크루 목록의 순서를 랜덤으로 섞는다. * [x] 랜덤으로 섞인 페어 목록에서 페어 매칭을 할 때 앞에서부터 순서대로 두명씩 페어를 맺는다. * [x] 홀수인 경우 마지막 남은 크루는 마지막 페어에 포함시킨다. -* [ ] 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. -* [ ] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. \ No newline at end of file +* [x] 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. +* [x] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. \ No newline at end of file diff --git a/src/main/java/pairmatching/controller/MatchingPairController.java b/src/main/java/pairmatching/controller/MatchingPairController.java index 72c620662..f24396506 100644 --- a/src/main/java/pairmatching/controller/MatchingPairController.java +++ b/src/main/java/pairmatching/controller/MatchingPairController.java @@ -12,6 +12,7 @@ import java.util.Map; public class MatchingPairController implements Controller { + public static final String CREW_MATCHING_FAILED_THREE_TIMES_MESSAGE = "크루 매칭이 3회 이상 실패하였습니다."; private final CrewRepository crewRepository; private final PairMatchingRepository pairMatchingRepository; private final PairsMaker pairsMaker; @@ -26,7 +27,17 @@ public MatchingPairController(CrewRepository crewRepository, PairMatchingReposit public void process(Map model) { PairMatchingInfo pairMatchingInfo = (PairMatchingInfo) model.get("pairMatchingInfo"); List crews = crewRepository.findByCourse(pairMatchingInfo.getCourse()); - List pairs = pairsMaker.makePairs(getShuffledCrews(crews)); + List pairs; + + int notMatchedCount = 0; + do { + pairs = pairsMaker.makePairs(getShuffledCrews(crews)); + notMatchedCount++; + if (notMatchedCount == 3) { + throw new IllegalStateException(CREW_MATCHING_FAILED_THREE_TIMES_MESSAGE); + } + } while (pairMatchingRepository.hasDuplicatingAtSameLevel(pairMatchingInfo, pairs)); + pairMatchingRepository.save(pairMatchingInfo, pairs); } diff --git a/src/main/java/pairmatching/repository/PairMatchingRepository.java b/src/main/java/pairmatching/repository/PairMatchingRepository.java index 89457a686..639189f81 100644 --- a/src/main/java/pairmatching/repository/PairMatchingRepository.java +++ b/src/main/java/pairmatching/repository/PairMatchingRepository.java @@ -1,8 +1,11 @@ package pairmatching.repository; +import pairmatching.model.Level; import pairmatching.model.Pair; +import pairmatching.system.exception.DuplicationPairsException; import pairmatching.vo.PairMatchingInfo; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -13,4 +16,48 @@ public class PairMatchingRepository { public void save(PairMatchingInfo pairMatchingInfo, List pairs) { matchedPairs.put(pairMatchingInfo, pairs); } + + public boolean hasDuplicatingAtSameLevel(PairMatchingInfo pairMatchingInfo, List pairs) { + List> matchedPairsAtSameLevel = findAllByLevel(pairMatchingInfo.getLevel()); + + try { + checkHavingDuplicatingPairs(pairs, matchedPairsAtSameLevel); + } catch (DuplicationPairsException e) { + return true; + } + + return false; + } + + private static void checkHavingDuplicatingPairs(List pairs, List> matchedPairsAtSameLevel) throws DuplicationPairsException { + for (List pairsAtSameLevel : matchedPairsAtSameLevel) { + checkDuplicationByEachPairMatchingInfo(pairs, pairsAtSameLevel); + } + } + + private static void checkDuplicationByEachPairMatchingInfo(List pairs, List pairsAtSameLevel) throws DuplicationPairsException { + for (Pair pair : pairsAtSameLevel) { + checkDuplication(pairs, pair); + } + } + + private static void checkDuplication(List pairs, Pair pair) throws DuplicationPairsException { + if (pairs.contains(pair)) { + throw new DuplicationPairsException(); + } + } + + private List> findAllByLevel(Level level) { + List> matchedPairsAtSameLevel = new ArrayList<>(); + getPairsAtSameLevel(level, matchedPairsAtSameLevel); + return matchedPairsAtSameLevel; + } + + private void getPairsAtSameLevel(Level level, List> matchedPairsAtSameLevel) { + matchedPairs.forEach((pairMatchingInfo, pairs) -> { + if (pairMatchingInfo.getLevel() == level) { + matchedPairsAtSameLevel.add(pairs); + } + }); + } } diff --git a/src/main/java/pairmatching/system/exception/DuplicationPairsException.java b/src/main/java/pairmatching/system/exception/DuplicationPairsException.java new file mode 100644 index 000000000..6af7db3f9 --- /dev/null +++ b/src/main/java/pairmatching/system/exception/DuplicationPairsException.java @@ -0,0 +1,7 @@ +package pairmatching.system.exception; + +public class DuplicationPairsException extends Exception { + public DuplicationPairsException() { + super(); + } +} diff --git a/src/main/java/pairmatching/vo/PairMatchingInfo.java b/src/main/java/pairmatching/vo/PairMatchingInfo.java index 990feef74..896670f2e 100644 --- a/src/main/java/pairmatching/vo/PairMatchingInfo.java +++ b/src/main/java/pairmatching/vo/PairMatchingInfo.java @@ -1,6 +1,7 @@ package pairmatching.vo; import pairmatching.model.Course; +import pairmatching.model.Level; import pairmatching.model.Mission; public class PairMatchingInfo { @@ -15,4 +16,8 @@ public PairMatchingInfo(Course course, Mission mission) { public Course getCourse() { return course; } + + public Level getLevel() { + return mission.getLevel(); + } } From 1de38de75251220d7a0196453d900598f09c6d16 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 15:04:06 +0900 Subject: [PATCH 12/18] =?UTF-8?q?feat(outputview):=20=ED=8E=98=EC=96=B4?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++- .../controller/MatchingPairController.java | 17 ++++++++-- src/main/java/pairmatching/model/Crew.java | 4 +++ src/main/java/pairmatching/model/Pair.java | 7 ++++ .../outputview/MatchingResultOutputView.java | 33 +++++++++++++++++++ .../repository/PairMatchingRepository.java | 13 ++++++++ .../pairmatching/system/PairApplication.java | 6 +++- 7 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/main/java/pairmatching/outputview/MatchingResultOutputView.java diff --git a/docs/README.md b/docs/README.md index a867ae444..6ed3dd507 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,4 +13,6 @@ * [x] 랜덤으로 섞인 페어 목록에서 페어 매칭을 할 때 앞에서부터 순서대로 두명씩 페어를 맺는다. * [x] 홀수인 경우 마지막 남은 크루는 마지막 페어에 포함시킨다. * [x] 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. -* [x] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. \ No newline at end of file +* [x] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. + +* [x] 페어 매칭 결과를 출력한다. \ No newline at end of file diff --git a/src/main/java/pairmatching/controller/MatchingPairController.java b/src/main/java/pairmatching/controller/MatchingPairController.java index f24396506..ceee735a1 100644 --- a/src/main/java/pairmatching/controller/MatchingPairController.java +++ b/src/main/java/pairmatching/controller/MatchingPairController.java @@ -3,6 +3,7 @@ import camp.nextstep.edu.missionutils.Randoms; import pairmatching.model.Crew; import pairmatching.model.Pair; +import pairmatching.outputview.OutputView; import pairmatching.repository.CrewRepository; import pairmatching.repository.PairMatchingRepository; import pairmatching.system.util.PairsMaker; @@ -16,11 +17,13 @@ public class MatchingPairController implements Controller { private final CrewRepository crewRepository; private final PairMatchingRepository pairMatchingRepository; private final PairsMaker pairsMaker; + private final OutputView outputView; - public MatchingPairController(CrewRepository crewRepository, PairMatchingRepository pairMatchingRepository, PairsMaker pairsMaker) { + public MatchingPairController(CrewRepository crewRepository, PairMatchingRepository pairMatchingRepository, PairsMaker pairsMaker, OutputView outputView) { this.crewRepository = crewRepository; this.pairMatchingRepository = pairMatchingRepository; this.pairsMaker = pairsMaker; + this.outputView = outputView; } @Override @@ -29,6 +32,15 @@ public void process(Map model) { List crews = crewRepository.findByCourse(pairMatchingInfo.getCourse()); List pairs; + pairs = makePairs(pairMatchingInfo, crews); + pairMatchingRepository.save(pairMatchingInfo, pairs); + + model.put("matchedPairNames", pairMatchingRepository.findAllNamesByPairMatchingInfo(pairMatchingInfo)); + outputView.print(model); + } + + private List makePairs(PairMatchingInfo pairMatchingInfo, List crews) { + List pairs; int notMatchedCount = 0; do { pairs = pairsMaker.makePairs(getShuffledCrews(crews)); @@ -37,8 +49,7 @@ public void process(Map model) { throw new IllegalStateException(CREW_MATCHING_FAILED_THREE_TIMES_MESSAGE); } } while (pairMatchingRepository.hasDuplicatingAtSameLevel(pairMatchingInfo, pairs)); - - pairMatchingRepository.save(pairMatchingInfo, pairs); + return pairs; } private List getShuffledCrews(List crews) { diff --git a/src/main/java/pairmatching/model/Crew.java b/src/main/java/pairmatching/model/Crew.java index f053d18df..be2bd4815 100644 --- a/src/main/java/pairmatching/model/Crew.java +++ b/src/main/java/pairmatching/model/Crew.java @@ -12,4 +12,8 @@ public Crew(Course course, String name) { public Course getCourse() { return course; } + + public String getName() { + return name; + } } diff --git a/src/main/java/pairmatching/model/Pair.java b/src/main/java/pairmatching/model/Pair.java index 3cd376e27..23427db32 100644 --- a/src/main/java/pairmatching/model/Pair.java +++ b/src/main/java/pairmatching/model/Pair.java @@ -1,6 +1,7 @@ package pairmatching.model; import java.util.List; +import java.util.stream.Collectors; public class Pair { private final List crews; @@ -8,4 +9,10 @@ public class Pair { public Pair(List crews) { this.crews = crews; } + + public List getCrewNames() { + return crews.stream() + .map(Crew::getName) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/pairmatching/outputview/MatchingResultOutputView.java b/src/main/java/pairmatching/outputview/MatchingResultOutputView.java new file mode 100644 index 000000000..a6417a02d --- /dev/null +++ b/src/main/java/pairmatching/outputview/MatchingResultOutputView.java @@ -0,0 +1,33 @@ +package pairmatching.outputview; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class MatchingResultOutputView implements OutputView { + public static final String SEPARATOR_FORMAT = " %s "; + public static final String VALUE_SEPARATOR = ":"; + + @Override + public void print(Map model) { + System.out.println("페어 매칭 결과입니다."); + for (List matchedPairNames : (List>) model.get("matchedPairNames")) { + printValues(matchedPairNames); + } + } + + private void printValues(List values) { + Iterator iterator = values.iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next()); + if (iterator.hasNext()) { + addSeparator(); + } + } + System.out.println(); + } + + private void addSeparator() { + System.out.printf(SEPARATOR_FORMAT, VALUE_SEPARATOR); + } +} diff --git a/src/main/java/pairmatching/repository/PairMatchingRepository.java b/src/main/java/pairmatching/repository/PairMatchingRepository.java index 639189f81..1531cb345 100644 --- a/src/main/java/pairmatching/repository/PairMatchingRepository.java +++ b/src/main/java/pairmatching/repository/PairMatchingRepository.java @@ -60,4 +60,17 @@ private void getPairsAtSameLevel(Level level, List> matchedPairsAtSam } }); } + + public List> findAllNamesByPairMatchingInfo(PairMatchingInfo pairMatchingInfo) { + List pairs = findByPairMatchingInfo(pairMatchingInfo); + List> pairNamesArray = new ArrayList<>(); + for (Pair pair : pairs) { + pairNamesArray.add(pair.getCrewNames()); + } + return pairNamesArray; + } + + private List findByPairMatchingInfo(PairMatchingInfo pairMatchingInfo) { + return matchedPairs.get(pairMatchingInfo); + } } diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index 6464c3686..16d9a6492 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -3,6 +3,7 @@ import pairmatching.controller.*; import pairmatching.inputview.GettingFeatureCommandInputView; import pairmatching.inputview.SelectingMissionInputView; +import pairmatching.outputview.MatchingResultOutputView; import pairmatching.outputview.SelectingFeatureOutputView; import pairmatching.outputview.SelectingMissionOutputView; import pairmatching.repository.CrewRepository; @@ -38,7 +39,10 @@ public PairApplication() { missionRepository )); controllers.put(MATCHING_PAIR, new MatchingPairController( - crewRepository, new PairMatchingRepository(), new PairsMaker()) + crewRepository, + new PairMatchingRepository(), + new PairsMaker(), + new MatchingResultOutputView()) ); } From 80b4a20a2e4fb62362907a9191e92024ceba3d75 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 15:33:18 +0900 Subject: [PATCH 13/18] =?UTF-8?q?feat(findpaircontroller):=20=ED=8E=98?= =?UTF-8?q?=EC=96=B4=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++-- .../controller/FindPairController.java | 24 +++++++++++++++++ src/main/java/pairmatching/model/Mission.java | 19 +++++++++++++ .../repository/PairMatchingRepository.java | 15 ++++++++++- .../pairmatching/system/PairApplication.java | 27 +++++++++++++------ .../exception/DuplicationPairsException.java | 2 +- .../EmptyPairMatchingInfoException.java | 6 +++++ .../pairmatching/vo/PairMatchingInfo.java | 19 +++++++++++++ 8 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 src/main/java/pairmatching/controller/FindPairController.java create mode 100644 src/main/java/pairmatching/system/exception/EmptyPairMatchingInfoException.java diff --git a/docs/README.md b/docs/README.md index 6ed3dd507..e3c0bf32d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ * [x] 미션 목록을 리스트에 저장한다. * [x] 페어 정보를 관리하는 저장소를 설계한다. -- 애플리케이션 +- 페어 매칭 * [x] 기능의 종류를 출력한다. * [x] 기능 중 하나의 입력을 받는다. * [x] 과정과 미션을 출력한다. @@ -15,4 +15,10 @@ * [x] 같은 레벨에서 이미 페어로 만난적이 있는 크루끼리 다시 페어로 매칭 된다면 크루 목록의 순서를 다시 랜덤으로 섞어서 매칭을 시도한다. * [x] 3회 시도까지 매칭이 되지 않거나 매칭을 할 수 있는 경우의 수가 없으면 에러 메시지를 출력한다. -* [x] 페어 매칭 결과를 출력한다. \ No newline at end of file +* [x] 페어 매칭 결과를 출력한다. + +- 페어 조회 +* [x] 과정과 미션을 출력한다. +* [x] 조회하고자 하는 과정, 레벨, 미션을 입력 받는다. + +- 페어 초기화 \ No newline at end of file diff --git a/src/main/java/pairmatching/controller/FindPairController.java b/src/main/java/pairmatching/controller/FindPairController.java new file mode 100644 index 000000000..9ebfdd358 --- /dev/null +++ b/src/main/java/pairmatching/controller/FindPairController.java @@ -0,0 +1,24 @@ +package pairmatching.controller; + +import pairmatching.outputview.OutputView; +import pairmatching.repository.PairMatchingRepository; +import pairmatching.vo.PairMatchingInfo; + +import java.util.Map; + +public class FindPairController implements Controller { + private final OutputView outputView; + private final PairMatchingRepository pairMatchingRepository; + + public FindPairController(OutputView outputView, PairMatchingRepository pairMatchingRepository) { + this.outputView = outputView; + this.pairMatchingRepository = pairMatchingRepository; + } + + @Override + public void process(Map model) { + PairMatchingInfo pairMatchingInfo = (PairMatchingInfo) model.get("pairMatchingInfo"); + model.put("matchedPairNames", pairMatchingRepository.findAllNamesByPairMatchingInfo(pairMatchingInfo)); + outputView.print(model); + } +} diff --git a/src/main/java/pairmatching/model/Mission.java b/src/main/java/pairmatching/model/Mission.java index b1e3bb90b..72f7f22b6 100644 --- a/src/main/java/pairmatching/model/Mission.java +++ b/src/main/java/pairmatching/model/Mission.java @@ -1,5 +1,7 @@ package pairmatching.model; +import java.util.Objects; + public class Mission { private final Level level; private final String name; @@ -16,4 +18,21 @@ public Level getLevel() { public String getName() { return name; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Mission mission = (Mission) o; + return level == mission.level && name.equals(mission.name); + } + + @Override + public int hashCode() { + return Objects.hash(level, name); + } } diff --git a/src/main/java/pairmatching/repository/PairMatchingRepository.java b/src/main/java/pairmatching/repository/PairMatchingRepository.java index 1531cb345..e16f1ca7c 100644 --- a/src/main/java/pairmatching/repository/PairMatchingRepository.java +++ b/src/main/java/pairmatching/repository/PairMatchingRepository.java @@ -3,6 +3,7 @@ import pairmatching.model.Level; import pairmatching.model.Pair; import pairmatching.system.exception.DuplicationPairsException; +import pairmatching.system.exception.EmptyPairMatchingInfoException; import pairmatching.vo.PairMatchingInfo; import java.util.ArrayList; @@ -63,11 +64,23 @@ private void getPairsAtSameLevel(Level level, List> matchedPairsAtSam public List> findAllNamesByPairMatchingInfo(PairMatchingInfo pairMatchingInfo) { List pairs = findByPairMatchingInfo(pairMatchingInfo); + if (pairs == null) { + throw new EmptyPairMatchingInfoException(); + } + + return findAllNamesFromPairs(pairs); + } + + private static List> findAllNamesFromPairs(List pairs) { List> pairNamesArray = new ArrayList<>(); + findAllNamesFromPair(pairs, pairNamesArray); + return pairNamesArray; + } + + private static void findAllNamesFromPair(List pairs, List> pairNamesArray) { for (Pair pair : pairs) { pairNamesArray.add(pair.getCrewNames()); } - return pairNamesArray; } private List findByPairMatchingInfo(PairMatchingInfo pairMatchingInfo) { diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index 16d9a6492..0d4cea859 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -21,11 +21,15 @@ public class PairApplication { public static final String SELECT_FEATURE_CONTROLLER_PATH = "selectFeature"; public static final String SELECTING_MISSION_PATH = "selectMission"; public static final String MATCHING_PAIR = "matchPair"; + public static final String FIND_PAIR_PATH = "findPair"; private final Map controllers = new HashMap<>(); public PairApplication() { MissionRepository missionRepository = new MissionRepository(); CrewRepository crewRepository = new CrewRepository(); + PairMatchingRepository pairMatchingRepository = new PairMatchingRepository(); + + MatchingResultOutputView matchingResultOutputView = new MatchingResultOutputView(); controllers.put(READING_CREW_FILE_CONTROLLER_PATH, new ReadingCrewsFileController(crewRepository)); controllers.put(SAVE_MISSIONS_CONTROLLER_PATH, new SavingMissionsController(missionRepository)); @@ -40,29 +44,36 @@ public PairApplication() { )); controllers.put(MATCHING_PAIR, new MatchingPairController( crewRepository, - new PairMatchingRepository(), + pairMatchingRepository, new PairsMaker(), - new MatchingResultOutputView()) + matchingResultOutputView) ); + controllers.put(FIND_PAIR_PATH, new FindPairController( + matchingResultOutputView, pairMatchingRepository + )); } public void run() { HashMap model = new HashMap<>(); readFileAndSaveCrews(model); saveMissions(model); - getFeatureCommand(model); - doFeature(model); + FeatureCommand featureCommand; + do { + readFeatureCommand(model); + featureCommand = (FeatureCommand) model.get("featureCommand"); + doFeature(featureCommand, model); + } while (featureCommand != FeatureCommand.QUIT); } - private void doFeature(HashMap model) { - FeatureCommand featureCommand = (FeatureCommand) model.get("featureCommand"); + private void doFeature(FeatureCommand featureCommand, HashMap model) { if (featureCommand == FeatureCommand.MATCHING) { controllers.get(SELECTING_MISSION_PATH).process(model); controllers.get(MATCHING_PAIR).process(model); } if (featureCommand == FeatureCommand.FIND) { - + controllers.get(SELECTING_MISSION_PATH).process(model); + controllers.get(FIND_PAIR_PATH).process(model); } if (featureCommand == FeatureCommand.RESET) { @@ -72,7 +83,7 @@ private void doFeature(HashMap model) { } } - private void getFeatureCommand(HashMap model) { + private void readFeatureCommand(HashMap model) { controllers.get(SELECT_FEATURE_CONTROLLER_PATH).process(model); } diff --git a/src/main/java/pairmatching/system/exception/DuplicationPairsException.java b/src/main/java/pairmatching/system/exception/DuplicationPairsException.java index 6af7db3f9..ad547d7ac 100644 --- a/src/main/java/pairmatching/system/exception/DuplicationPairsException.java +++ b/src/main/java/pairmatching/system/exception/DuplicationPairsException.java @@ -1,6 +1,6 @@ package pairmatching.system.exception; -public class DuplicationPairsException extends Exception { +public class DuplicationPairsException extends IllegalStateException { public DuplicationPairsException() { super(); } diff --git a/src/main/java/pairmatching/system/exception/EmptyPairMatchingInfoException.java b/src/main/java/pairmatching/system/exception/EmptyPairMatchingInfoException.java new file mode 100644 index 000000000..92f3c8fb4 --- /dev/null +++ b/src/main/java/pairmatching/system/exception/EmptyPairMatchingInfoException.java @@ -0,0 +1,6 @@ +package pairmatching.system.exception; + +public class EmptyPairMatchingInfoException extends IllegalStateException { + public EmptyPairMatchingInfoException() { + } +} diff --git a/src/main/java/pairmatching/vo/PairMatchingInfo.java b/src/main/java/pairmatching/vo/PairMatchingInfo.java index 896670f2e..4fb0be153 100644 --- a/src/main/java/pairmatching/vo/PairMatchingInfo.java +++ b/src/main/java/pairmatching/vo/PairMatchingInfo.java @@ -4,6 +4,8 @@ import pairmatching.model.Level; import pairmatching.model.Mission; +import java.util.Objects; + public class PairMatchingInfo { private final Course course; private final Mission mission; @@ -20,4 +22,21 @@ public Course getCourse() { public Level getLevel() { return mission.getLevel(); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PairMatchingInfo that = (PairMatchingInfo) o; + return course == that.course && mission.equals(that.mission); + } + + @Override + public int hashCode() { + return Objects.hash(course, mission); + } } From 1769c1ce20924412fde14f5ea8e6b02684d9c939 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 15:42:00 +0900 Subject: [PATCH 14/18] =?UTF-8?q?feat(resetpaircontroller):=20=ED=8E=98?= =?UTF-8?q?=EC=96=B4=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 7 +++++- .../controller/ResetPairController.java | 22 +++++++++++++++++++ .../outputview/ResetOutputView.java | 13 +++++++++++ .../repository/PairMatchingRepository.java | 4 ++++ .../pairmatching/system/PairApplication.java | 6 ++++- 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/java/pairmatching/controller/ResetPairController.java create mode 100644 src/main/java/pairmatching/outputview/ResetOutputView.java diff --git a/docs/README.md b/docs/README.md index e3c0bf32d..fcc8d8a59 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,4 +21,9 @@ * [x] 과정과 미션을 출력한다. * [x] 조회하고자 하는 과정, 레벨, 미션을 입력 받는다. -- 페어 초기화 \ No newline at end of file +- 페어 초기화 +* [x] 커맨드를 호출하면 저장된 페어 매칭을 제거한다. +* [x] 초기화 완료 메시지를 출력한다. + +- 종료 +* [ ] 종료 커맨드를 입력하면 애플리케이션이 종료된다. \ No newline at end of file diff --git a/src/main/java/pairmatching/controller/ResetPairController.java b/src/main/java/pairmatching/controller/ResetPairController.java new file mode 100644 index 000000000..8208d9b9f --- /dev/null +++ b/src/main/java/pairmatching/controller/ResetPairController.java @@ -0,0 +1,22 @@ +package pairmatching.controller; + +import pairmatching.outputview.OutputView; +import pairmatching.repository.PairMatchingRepository; + +import java.util.Map; + +public class ResetPairController implements Controller { + private final PairMatchingRepository pairMatchingRepository; + private final OutputView outputView; + + public ResetPairController(PairMatchingRepository pairMatchingRepository, OutputView outputView) { + this.pairMatchingRepository = pairMatchingRepository; + this.outputView = outputView; + } + + @Override + public void process(Map model) { + pairMatchingRepository.resetAll(); + outputView.print(model); + } +} diff --git a/src/main/java/pairmatching/outputview/ResetOutputView.java b/src/main/java/pairmatching/outputview/ResetOutputView.java new file mode 100644 index 000000000..13a373eca --- /dev/null +++ b/src/main/java/pairmatching/outputview/ResetOutputView.java @@ -0,0 +1,13 @@ +package pairmatching.outputview; + +import java.util.Map; + +public class ResetOutputView implements OutputView { + + public static final String RESET_COMPLETED_MESSAGE = "초기화 되었습니다."; + + @Override + public void print(Map model) { + System.out.println(RESET_COMPLETED_MESSAGE); + } +} diff --git a/src/main/java/pairmatching/repository/PairMatchingRepository.java b/src/main/java/pairmatching/repository/PairMatchingRepository.java index e16f1ca7c..feb4f12f3 100644 --- a/src/main/java/pairmatching/repository/PairMatchingRepository.java +++ b/src/main/java/pairmatching/repository/PairMatchingRepository.java @@ -86,4 +86,8 @@ private static void findAllNamesFromPair(List pairs, List> pa private List findByPairMatchingInfo(PairMatchingInfo pairMatchingInfo) { return matchedPairs.get(pairMatchingInfo); } + + public void resetAll() { + matchedPairs.clear(); + } } diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index 0d4cea859..847f424d1 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -4,6 +4,7 @@ import pairmatching.inputview.GettingFeatureCommandInputView; import pairmatching.inputview.SelectingMissionInputView; import pairmatching.outputview.MatchingResultOutputView; +import pairmatching.outputview.ResetOutputView; import pairmatching.outputview.SelectingFeatureOutputView; import pairmatching.outputview.SelectingMissionOutputView; import pairmatching.repository.CrewRepository; @@ -22,6 +23,7 @@ public class PairApplication { public static final String SELECTING_MISSION_PATH = "selectMission"; public static final String MATCHING_PAIR = "matchPair"; public static final String FIND_PAIR_PATH = "findPair"; + public static final String RESET_PAIR_CONTROLLER_PATH = "resetPair"; private final Map controllers = new HashMap<>(); public PairApplication() { @@ -51,6 +53,8 @@ public PairApplication() { controllers.put(FIND_PAIR_PATH, new FindPairController( matchingResultOutputView, pairMatchingRepository )); + controllers.put(RESET_PAIR_CONTROLLER_PATH, new ResetPairController( + pairMatchingRepository, new ResetOutputView())); } public void run() { @@ -76,7 +80,7 @@ private void doFeature(FeatureCommand featureCommand, HashMap mo controllers.get(FIND_PAIR_PATH).process(model); } if (featureCommand == FeatureCommand.RESET) { - + controllers.get(RESET_PAIR_CONTROLLER_PATH).process(model); } if (featureCommand == FeatureCommand.QUIT) { From dd79965afb4762414aedaa2882ffbee5c5b4b1da Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 15:43:18 +0900 Subject: [PATCH 15/18] =?UTF-8?q?feat(pairapplication):=20=EC=95=A0?= =?UTF-8?q?=ED=94=8C=EB=A6=AC=EC=BC=80=EC=9D=B4=EC=85=98=EC=9D=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/pairmatching/system/PairApplication.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index fcc8d8a59..42903af20 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,4 +26,4 @@ * [x] 초기화 완료 메시지를 출력한다. - 종료 -* [ ] 종료 커맨드를 입력하면 애플리케이션이 종료된다. \ No newline at end of file +* [x] 종료 커맨드를 입력하면 애플리케이션이 종료된다. \ No newline at end of file diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index 847f424d1..dcb975964 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -82,9 +82,6 @@ private void doFeature(FeatureCommand featureCommand, HashMap mo if (featureCommand == FeatureCommand.RESET) { controllers.get(RESET_PAIR_CONTROLLER_PATH).process(model); } - if (featureCommand == FeatureCommand.QUIT) { - - } } private void readFeatureCommand(HashMap model) { From 278fd48f784105c88916e90389355630a5654f70 Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 16:09:44 +0900 Subject: [PATCH 16/18] =?UTF-8?q?fix(pairmaker):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=EC=9D=98=20=EB=AA=A8=ED=82=B9=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=97=90=20=EB=B6=80=ED=95=A9=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MatchingPairController.java | 11 ++++++++--- src/main/java/pairmatching/model/Pair.java | 10 ++++------ .../pairmatching/system/util/PairsMaker.java | 18 +++++++++++------- src/test/java/system/PairApplicationTest.java | 5 ----- 4 files changed, 23 insertions(+), 21 deletions(-) delete mode 100644 src/test/java/system/PairApplicationTest.java diff --git a/src/main/java/pairmatching/controller/MatchingPairController.java b/src/main/java/pairmatching/controller/MatchingPairController.java index ceee735a1..e74972dce 100644 --- a/src/main/java/pairmatching/controller/MatchingPairController.java +++ b/src/main/java/pairmatching/controller/MatchingPairController.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class MatchingPairController implements Controller { public static final String CREW_MATCHING_FAILED_THREE_TIMES_MESSAGE = "크루 매칭이 3회 이상 실패하였습니다."; @@ -43,7 +45,7 @@ private List makePairs(PairMatchingInfo pairMatchingInfo, List crews List pairs; int notMatchedCount = 0; do { - pairs = pairsMaker.makePairs(getShuffledCrews(crews)); + pairs = pairsMaker.makePairs(getShuffledCrewNames(crews)); notMatchedCount++; if (notMatchedCount == 3) { throw new IllegalStateException(CREW_MATCHING_FAILED_THREE_TIMES_MESSAGE); @@ -52,7 +54,10 @@ private List makePairs(PairMatchingInfo pairMatchingInfo, List crews return pairs; } - private List getShuffledCrews(List crews) { - return Randoms.shuffle(crews); + private List getShuffledCrewNames(List crews) { + List crewNames = crews.stream() + .map(Crew::getName) + .collect(Collectors.toList()); + return Randoms.shuffle(crewNames); } } diff --git a/src/main/java/pairmatching/model/Pair.java b/src/main/java/pairmatching/model/Pair.java index 23427db32..4a05106ba 100644 --- a/src/main/java/pairmatching/model/Pair.java +++ b/src/main/java/pairmatching/model/Pair.java @@ -1,18 +1,16 @@ package pairmatching.model; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; public class Pair { - private final List crews; + private final List crews; - public Pair(List crews) { + public Pair(List crews) { this.crews = crews; } public List getCrewNames() { - return crews.stream() - .map(Crew::getName) - .collect(Collectors.toList()); + return Collections.unmodifiableList(crews); } } diff --git a/src/main/java/pairmatching/system/util/PairsMaker.java b/src/main/java/pairmatching/system/util/PairsMaker.java index d3233fdba..95d18b8fc 100644 --- a/src/main/java/pairmatching/system/util/PairsMaker.java +++ b/src/main/java/pairmatching/system/util/PairsMaker.java @@ -8,22 +8,26 @@ import java.util.List; public class PairsMaker { - public List makePairs(List crews) { + public List makePairs(List crewNames) { ArrayList pairs = new ArrayList<>(); - while (2 <= crews.size()) { - List matchedCrews = getMatchedCrews(crews); + List modifiableCrews = new ArrayList<>(crewNames); + while (2 <= modifiableCrews.size()) { + List matchedCrews = getMatchedCrews(modifiableCrews); pairs.add(new Pair(matchedCrews)); } return pairs; } - private static List getMatchedCrews(List crews) { - List matchedCrews = new ArrayList<>(Arrays.asList(crews.remove(0), crews.remove(0))); - handleOddCrewSizeCase(crews, matchedCrews); + private static List getMatchedCrews(List crewNames) { + List matchedCrews = Arrays.asList( + crewNames.remove(0), crewNames.remove(0) + ); + + handleOddCrewSizeCase(crewNames, matchedCrews); return matchedCrews; } - private static void handleOddCrewSizeCase(List crews, List matchedCrews) { + private static void handleOddCrewSizeCase(List crews, List matchedCrews) { if (crews.size() == 1) { matchedCrews.add(crews.remove(0)); } diff --git a/src/test/java/system/PairApplicationTest.java b/src/test/java/system/PairApplicationTest.java deleted file mode 100644 index ccd207960..000000000 --- a/src/test/java/system/PairApplicationTest.java +++ /dev/null @@ -1,5 +0,0 @@ -package system; - -class PairApplicationTest { - -} \ No newline at end of file From 923ce8e40208cbc4d1059e796f7e3f55f157643d Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 16:20:14 +0900 Subject: [PATCH 17/18] =?UTF-8?q?feat(exceptionhandling):=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=EC=8B=9C=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EA=B0=92=EC=9D=84=20=EB=8B=A4=EC=8B=9C=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AbstractController.java | 24 +++++++++++++++++++ .../controller/FindPairController.java | 4 ++-- .../controller/MatchingPairController.java | 5 ++-- .../ReadingCrewsFileController.java | 4 ++-- .../controller/ResetPairController.java | 4 ++-- .../controller/SavingMissionsController.java | 4 ++-- .../SelectingFeatureController.java | 4 ++-- .../SelectingMissionController.java | 4 ++-- .../outputview/ErrorMessageOutputView.java | 11 +++++++++ 9 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 src/main/java/pairmatching/controller/AbstractController.java create mode 100644 src/main/java/pairmatching/outputview/ErrorMessageOutputView.java diff --git a/src/main/java/pairmatching/controller/AbstractController.java b/src/main/java/pairmatching/controller/AbstractController.java new file mode 100644 index 000000000..19db19479 --- /dev/null +++ b/src/main/java/pairmatching/controller/AbstractController.java @@ -0,0 +1,24 @@ +package pairmatching.controller; + +import pairmatching.outputview.ErrorMessageOutputView; +import pairmatching.outputview.OutputView; + +import java.util.Map; + +public abstract class AbstractController implements Controller { + private final OutputView outputView = new ErrorMessageOutputView(); + + @Override + public void process(Map model) { + try { + doProcess(model); + } catch (IllegalArgumentException e) { + model.put("errorMessage", e.getMessage()); + outputView.print(model); + + doProcess(model); + } + } + + abstract void doProcess(Map model); +} diff --git a/src/main/java/pairmatching/controller/FindPairController.java b/src/main/java/pairmatching/controller/FindPairController.java index 9ebfdd358..a970bb8cd 100644 --- a/src/main/java/pairmatching/controller/FindPairController.java +++ b/src/main/java/pairmatching/controller/FindPairController.java @@ -6,7 +6,7 @@ import java.util.Map; -public class FindPairController implements Controller { +public class FindPairController extends AbstractController { private final OutputView outputView; private final PairMatchingRepository pairMatchingRepository; @@ -16,7 +16,7 @@ public FindPairController(OutputView outputView, PairMatchingRepository pairMatc } @Override - public void process(Map model) { + public void doProcess(Map model) { PairMatchingInfo pairMatchingInfo = (PairMatchingInfo) model.get("pairMatchingInfo"); model.put("matchedPairNames", pairMatchingRepository.findAllNamesByPairMatchingInfo(pairMatchingInfo)); outputView.print(model); diff --git a/src/main/java/pairmatching/controller/MatchingPairController.java b/src/main/java/pairmatching/controller/MatchingPairController.java index e74972dce..95da16241 100644 --- a/src/main/java/pairmatching/controller/MatchingPairController.java +++ b/src/main/java/pairmatching/controller/MatchingPairController.java @@ -12,9 +12,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import java.util.stream.Stream; -public class MatchingPairController implements Controller { +public class MatchingPairController extends AbstractController { public static final String CREW_MATCHING_FAILED_THREE_TIMES_MESSAGE = "크루 매칭이 3회 이상 실패하였습니다."; private final CrewRepository crewRepository; private final PairMatchingRepository pairMatchingRepository; @@ -29,7 +28,7 @@ public MatchingPairController(CrewRepository crewRepository, PairMatchingReposit } @Override - public void process(Map model) { + public void doProcess(Map model) { PairMatchingInfo pairMatchingInfo = (PairMatchingInfo) model.get("pairMatchingInfo"); List crews = crewRepository.findByCourse(pairMatchingInfo.getCourse()); List pairs; diff --git a/src/main/java/pairmatching/controller/ReadingCrewsFileController.java b/src/main/java/pairmatching/controller/ReadingCrewsFileController.java index 5a04eee4e..922b7f9b9 100644 --- a/src/main/java/pairmatching/controller/ReadingCrewsFileController.java +++ b/src/main/java/pairmatching/controller/ReadingCrewsFileController.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Map; -public class ReadingCrewsFileController implements Controller { +public class ReadingCrewsFileController extends AbstractController { public static final String BACKEND_CREWS_FILE_DIRECTORY = "src/main/resources/backend-crew.md"; public static final String FRONTEND_CREWS_FILE_DIRECTORY = "src/main/resources/frontend-crew.md"; @@ -25,7 +25,7 @@ public ReadingCrewsFileController(CrewRepository crewRepository) { } @Override - public void process(Map model) { + public void doProcess(Map model) { try { List backEndCrews = NamesToCrewConverter.convert(readBackEndCrews(), Course.BACKEND); crewRepository.saveAll(backEndCrews); diff --git a/src/main/java/pairmatching/controller/ResetPairController.java b/src/main/java/pairmatching/controller/ResetPairController.java index 8208d9b9f..330e6d458 100644 --- a/src/main/java/pairmatching/controller/ResetPairController.java +++ b/src/main/java/pairmatching/controller/ResetPairController.java @@ -5,7 +5,7 @@ import java.util.Map; -public class ResetPairController implements Controller { +public class ResetPairController extends AbstractController { private final PairMatchingRepository pairMatchingRepository; private final OutputView outputView; @@ -15,7 +15,7 @@ public ResetPairController(PairMatchingRepository pairMatchingRepository, Output } @Override - public void process(Map model) { + public void doProcess(Map model) { pairMatchingRepository.resetAll(); outputView.print(model); } diff --git a/src/main/java/pairmatching/controller/SavingMissionsController.java b/src/main/java/pairmatching/controller/SavingMissionsController.java index 33f931f78..5b37ac357 100644 --- a/src/main/java/pairmatching/controller/SavingMissionsController.java +++ b/src/main/java/pairmatching/controller/SavingMissionsController.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Map; -public class SavingMissionsController implements Controller { +public class SavingMissionsController extends AbstractController { private final MissionRepository missionRepository; public SavingMissionsController(MissionRepository missionRepository) { @@ -15,7 +15,7 @@ public SavingMissionsController(MissionRepository missionRepository) { } @Override - public void process(Map model) { + public void doProcess(Map model) { saveMissions(getLevelOneMissionNames(), Level.LEVEL1); saveMissions(getLevelTwoMissionNames(), Level.LEVEL2); saveMissions(getLevelFiveMissionNames(), Level.LEVEL4); diff --git a/src/main/java/pairmatching/controller/SelectingFeatureController.java b/src/main/java/pairmatching/controller/SelectingFeatureController.java index ab58ed6c0..62767afc1 100644 --- a/src/main/java/pairmatching/controller/SelectingFeatureController.java +++ b/src/main/java/pairmatching/controller/SelectingFeatureController.java @@ -6,7 +6,7 @@ import java.util.Map; -public class SelectingFeatureController implements Controller { +public class SelectingFeatureController extends AbstractController { private final OutputView outputView; private final InputView inputView; @@ -16,7 +16,7 @@ public SelectingFeatureController(OutputView outputView, InputView model) { + public void doProcess(Map model) { outputView.print(model); model.put("featureCommand", inputView.getInput(model)); } diff --git a/src/main/java/pairmatching/controller/SelectingMissionController.java b/src/main/java/pairmatching/controller/SelectingMissionController.java index f0b194eaa..449d4acc2 100644 --- a/src/main/java/pairmatching/controller/SelectingMissionController.java +++ b/src/main/java/pairmatching/controller/SelectingMissionController.java @@ -9,7 +9,7 @@ import java.util.Map; -public class SelectingMissionController implements Controller { +public class SelectingMissionController extends AbstractController { private final OutputView outputView; private final InputView inputView; private final MissionRepository missionRepository; @@ -21,7 +21,7 @@ public SelectingMissionController(OutputView outputView, InputView model) { + public void doProcess(Map model) { printMessage(model); readInputIntoModel(model); } diff --git a/src/main/java/pairmatching/outputview/ErrorMessageOutputView.java b/src/main/java/pairmatching/outputview/ErrorMessageOutputView.java new file mode 100644 index 000000000..f1158b2d3 --- /dev/null +++ b/src/main/java/pairmatching/outputview/ErrorMessageOutputView.java @@ -0,0 +1,11 @@ +package pairmatching.outputview; + +import java.util.Map; + +public class ErrorMessageOutputView implements OutputView { + @Override + public void print(Map model) { + String errorMessage = (String) model.get("errorMessage"); + System.out.printf("%s %s", "[ERROR]", errorMessage); + } +} From f0d92e2a410331ce9b6681e1f6e200fe83ea194c Mon Sep 17 00:00:00 2001 From: BackFoxx Date: Sun, 4 Dec 2022 16:23:09 +0900 Subject: [PATCH 18/18] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=97=AD=ED=95=A0=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EC=84=B8=EB=B6=80=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pairmatching/system/PairApplication.java | 22 ++++++++++++++----- .../pairmatching/system/util/PairsMaker.java | 1 - 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/pairmatching/system/PairApplication.java b/src/main/java/pairmatching/system/PairApplication.java index dcb975964..d4edbab2a 100644 --- a/src/main/java/pairmatching/system/PairApplication.java +++ b/src/main/java/pairmatching/system/PairApplication.java @@ -72,18 +72,30 @@ public void run() { private void doFeature(FeatureCommand featureCommand, HashMap model) { if (featureCommand == FeatureCommand.MATCHING) { - controllers.get(SELECTING_MISSION_PATH).process(model); - controllers.get(MATCHING_PAIR).process(model); + doMatchingProcess(model); } if (featureCommand == FeatureCommand.FIND) { - controllers.get(SELECTING_MISSION_PATH).process(model); - controllers.get(FIND_PAIR_PATH).process(model); + doFindingProcess(model); } if (featureCommand == FeatureCommand.RESET) { - controllers.get(RESET_PAIR_CONTROLLER_PATH).process(model); + doResetProcess(model); } } + private void doResetProcess(HashMap model) { + controllers.get(RESET_PAIR_CONTROLLER_PATH).process(model); + } + + private void doFindingProcess(HashMap model) { + controllers.get(SELECTING_MISSION_PATH).process(model); + controllers.get(FIND_PAIR_PATH).process(model); + } + + private void doMatchingProcess(HashMap model) { + controllers.get(SELECTING_MISSION_PATH).process(model); + controllers.get(MATCHING_PAIR).process(model); + } + private void readFeatureCommand(HashMap model) { controllers.get(SELECT_FEATURE_CONTROLLER_PATH).process(model); } diff --git a/src/main/java/pairmatching/system/util/PairsMaker.java b/src/main/java/pairmatching/system/util/PairsMaker.java index 95d18b8fc..0c7a256f1 100644 --- a/src/main/java/pairmatching/system/util/PairsMaker.java +++ b/src/main/java/pairmatching/system/util/PairsMaker.java @@ -1,6 +1,5 @@ package pairmatching.system.util; -import pairmatching.model.Crew; import pairmatching.model.Pair; import java.util.ArrayList;